sysutils/conky

Tags: , , , ,
3 Comments »

Tout ça, c’est la faute à Guigui2. Et à Nils aussi.

Y’a quoi, 2/3 semaines, ces deux là me disent que ce serait tellement bieeeen si on avait conky dans pkgsrc et que patati le challeeenge et que patata tellement c’est beau tellement y’a des thèmes de ouf et j’en passe et des meilleures.

Et je regarde.

Et c’est l’engrenage.

Deux semaines plus tard donc, je viens d’importer sysutils/conky dans pkgsrc current avec le support des sensors usuels, CPU (SMP), load, mémoire, réseau, disque ainsi que batterie et température. Et ces deux derniers, c’étaient pas les plus simples.

En effet, si par exemple FreeBSD dispose de sysctl fort conviviaux du type hw.acpi.battery.time ou hw.acpi.battery.life, bin nous non. Nous on préfère se faire chier avec envsys(3) dont l’utilisation est expliquée de manière parfaite par ce commentaire trouvé dans sysutils/torsmo:

    /*
     * Using the envsys API is like pulling teeth without anesthetic.
     * so just popen envstat and parse the output instead.
     */

Ça résume assez bien la situation.
Mais comme je suis un peu sado-maso sur les bords, et que je souhaitais présenter un peu plus que le pourcentage de charge de la batterie, je me suis lancé dans l’écriture d’une petite fonction qui simplifie grandement l’accès aux ressources d’envsys. En gros ça donne ça:

#include <sys /envsys.h>
#include <prop /proplib.h>

#define _DEV_SYSMON "/dev/sysmon"

#define P_BOOL      0
#define P_UINT8     1
#define P_INT64     2
#define P_STRING    3

typedef struct Devquery {
    int         type;
    char        *dev;
    char        *key;
    char        *row;
} Devquery;

int             sysmon_fd;

int8_t envsys_get_val(Devquery, void *);

void
sysmon_open()
{
    sysmon_fd = open(_DEV_SYSMON, O_RDONLY);
}

void
sysmon_close()
{
    if (sysmon_fd > -1)
        close(sysmon_fd);
}

int8_t
envsys_get_val(Devquery dq, void *val)
{
    char *descr;
    const char *cval;
    prop_dictionary_t dict;
    prop_object_t device;
    prop_object_iterator_t iter;
    prop_object_t obj;
    bool rc = false;

    if (sysmon_fd < 0)
        return -1;

    if (prop_dictionary_recv_ioctl(sysmon_fd, ENVSYS_GETDICTIONARY, &dict)
        != 0)
        return -1;

    if ((device = prop_dictionary_get(dict, dq.dev)) == NULL)
        return -1;

    iter = prop_array_iterator(device);

    while((obj = prop_object_iterator_next(iter)))  {
        descr = (char *)prop_string_cstring_nocopy(prop_dictionary_get(obj,
                "description"));
        if (descr != NULL && *descr) {
            if(strcmp(descr, dq.key) == 0) {
                switch(dq.type) {
                case P_BOOL:
                    rc = prop_dictionary_get_bool(obj,
                        dq.row, (bool *)val);
                case P_UINT8:
                    rc = prop_dictionary_get_uint8(obj,
                        dq.row, (uint8_t *)val);
                    break;
                case P_INT64:
                    rc = prop_dictionary_get_int64(obj, dq.row,
                        (int64_t *)val);
                    break;
                case P_STRING:
                    rc = prop_dictionary_get_cstring_nocopy(obj,
                        dq.row, &cval);
                    val = (void *)cval;
                    break;
                }
            }
        }
    }

    prop_object_iterator_release(iter);
    prop_object_release(dict);

    if (rc == false) {
        val = NULL;
        return -1;
    }

    return 0;
}

On utilise la fonction de cette façon:

    Devquery dq_ac = { P_BOOL, "acpiacad0", "connected", "cur-value" };

    if (envsys_get_val(dq_ac, (void *)&connected) < 0)

Dans cet exemple, connected sera placé à 1 si l'élément acpiacad0 est connecté, 0 autrement.

Le package n'est pas encore parfait, mais il est désormais tout à fait utilisable. Upstream a été contacté et l'integration de mes patchs est en cours.

Mandatory screenshot:

Une brêve histoire de design

Tags: , , ,
1 Comment »

Tout commence la semaine dernière, un innocent freelance que nous faisons bosser sur un projet secret de domination des informations galactiques me montre son boulot et ne résiste pas à l’envie de me montrer des bouts de code. Je ne manque pas de remarquer que son éditeur de texte ne ressemble à rien de connu, mais brille par sa simplicité et son élégance. Il m’annonce fièrement qu’il travaille sous Sublime Text 2.
Curieux, je recherche l’outil en question et m’aperçois avec effroi que non seulement il n’est pas Libre, mais qu’en plus que son prix est exorbitant: 59$ pour *une* licence utilisateur, on se croirait revenu à l’âge d’or des shareware.
Mais il est sexy son truc. En particulier les couleurs. Bien choisies, harmonieuses. Sexy.

Je fais mon C sous emacs en console, il en a toujours été ainsi, j’ai mes habitudes de programmation sur cet éditeur, et si je préfère vim pour le scripting et l’édition de texte simple, emacs, depuis 15 ans maintenant, accompagne la totalité de mes projets en C.
Jusqu’à ce week-end, je ne m’étais jamais vraiment préoccupé de problématiques liées aux couleurs, aux thèmes où autres considérations futiles. Jusqu’à ce week-end.

D’abord, je comprend que mon terminal screené n’affiche pas plus de 8 couleurs, cela parce que l’option PKG_OPTIONS.screen+= ncurses n’est pas présente dans mon /etc/mk.conf, et que cela a pour conséquence que cette condition:

.if !empty(PKG_OPTIONS:Mncurses)
CURSES_DEFAULT= ncurses
CONFIGURE_ARGS+=        --enable-colors256
.endif

n’est pas remplie. Résultat, toute tentative d’utiliser un quelconque thème muni de couleurs un peu originales se solde par un vague pâté difforme à 8 couleurs.
L’utilisation du script 256colors2.pl me confirme qu’à l’issue de la recompilation de screen avec les bonnes options, on obtient bien de jolis dégradés:

Emacs refusait de m’annoncer plus de 8 couleurs à son tour, quand bien même le terminal qui l’héberge était désormais muni de super pouvoirs. Rien à faire, M-x list-colors-display ne m’affichait que 8 ignobles couleurs standard.
Deux choses à faire ici, ajouter un ~/.termcap décrivant un terminal de type xterm-256color, et ensuite, démarrer le monsieur de cette façon:

$ TERM=xterm-256color emacs

N’exportez pas cette variable dans votre ~/.profile, bien d’autres emmerdes vous attendraient au tournant. J’ai préféré un vilain alias.

Finalement, je me rend compte que les couleurs présentées par un emacs screené sont assez différentes d’un emacs non screené. De fil en aiguille, je tombe sur cette page sur laquelle on trouve ce fichier à placer dans votre ~/.emacs.d/term afin de retrouver des couleurs adéquates.

Après des heures de bataille, j’ai enfin pu bidouiller un des thèmes présents sur emacswiki pour obtenir ceci:

Je suis pas fâché du résultat.

Et comme j’aime bien partager, voici le thème et le init.el.

Ça va pas être possible avec vos baskets

Tags: , , ,
No Comments »

Dans ma boîte, l’équipe sécurité a publié voila quelques mois de cela un module pour nginx: un firewall applicatif du nom de naxsi.

Ce module, sous licence GPLv2, je viens de le publier dans pkgsrc current sous la forme d’une option de www/nginx. Je me propose de vous montrer ici comment sécuriser simplement votre serveur web / proxy inverse nginx grâce à naxsi.

Premièrement, si comme moi (et comme il se doit) vous utilisez une branche stable de pkgsrc, mettez simplement à jour www/nginx comme ceci:

$ cd /usr/pkgsrc/www/nginx
# cvs up -rHEAD -dP

Puis spécifiez à pkgsrc que vous souhaitez activer l’option naxsi pour le paquet nginx:

$ grep nginx /etc/mk.conf
PKG_OPTIONS.nginx+=     naxsi

Ceci fait, reconstruisez le paquet comme d’habitude:

$ cd /usr/pkgsrc/www/nginx
$ sudo make update clean

Dans la configuration de nginx, incluez les règles par défaut de naxsi de cette façon:

http {
    include       /usr/pkg/etc/nginx/mime.types;
    include       /usr/pkg/etc/nginx/naxsi_core.rules; # < --- ici
    default_type  application/octet-stream;

Comme vous pourrez le constater, le fichier /usr/pkg/etc/nginx/naxsi_core.rules contient un set de règles déjà très efficaces contre bon nombre d'attaques connues.
Reste alors à activer le filtrage sur une location et choisir quels types d'attaques vous souhaitez bloquer; par exemple:

        location / {
            SecRulesEnabled;
            CheckRule "$SQL >= 8" BLOCK;
            CheckRule "$RFI >= 8" BLOCK;
            CheckRule "$TRAVERSAL >= 4" BLOCK;
            CheckRule "$EVADE >= 4" BLOCK;
            CheckRule "$XSS >= 8" BLOCK;

Un redémarrage de nginx plus loin, on essayera par exemple d’accéder à une adresse louche:

$ wget -O- http://coruscant/?../../etc/passwd
--2012-04-22 10:21:01--  http://coruscant/?../../etc/passwd
Resolving coruscant... 192.168.1.2
Connecting to coruscant|192.168.1.2|:80... connected.
HTTP request sent, awaiting response... No data received.

Et de constater dans /var/log/nginx/error.log:

2012/04/22 10:21:01 [error] 25353#0: *15 NAXSI_FMT: ip=192.168.1.1&server=192.168.1.2&uri=/&total_processed=1&total_blocked=1&zone0=ARGS&id0=1200&var_name0=, client: 192.168.1.1, server: localhost, request: "GET /?../../etc/passwd HTTP/1.0", host: "192.168.1.2"

Moi j’trouve ça assez classe tout de même.

Toutes les infos relatives à la configuration de naxsi sont disponibles sur le Wiki de ce dernier.

pkgin 0.5.2.3

Tags: , ,
No Comments »

!@#!@# de bug.

Des mois que je cherchais au mauvais endroit, en effet, uniquement chez certains utilisateurs (évidemment), un pkgin up / fug proposait d’installer l’univers. Problème dans le moteur de dépendances me dis-je; que de temps perdu à décortiquer ce qui fonctionnait parfaitement, pour finalement tomber sur ceci:

static const struct Summary {
	const int	type;
	const char	*tbl_name;
	const char	*deps;
	const char	*conflicts;
	const char	*requires;
	const char	*provides;
	const char	*end;
} sumsw[] = {
	{
		LOCAL_SUMMARY,
		"LOCAL_PKG",
		"LOCAL_DEPS",
		"LOCAL_CONFLICTS",
		"LOCAL_REQUIRES",
		"LOCAL_PROVIDES",
		NULL
	},
	{
		REMOTE_SUMMARY,
		"REMOTE_PKG",
		"REMOTE_DEPS",
		"REMOTE_CONFLICTS",
		"REMOTE_REQUIRES",
		"REMOTE_PROVIDES",
		NULL
	},
};

[...]

	for (ptbl = __UNCONST(sum.tbl_name), i = 0;
		 i < nelms;
		 ptbl += ((strlen(ptbl) + 1) * sizeof(char)), i++) {

Il ne faut PAaaaaaaas coder avec de l'alcool dans le sang, il ne faut pas, parce qu'après, on se retrouve avec des bouts de trucs ni faits ni à faire qui supposent que les membres d'une structure seront forcément alignés, et des effets de bords qui n'ont rien à voir.

Bref, stacktic m'a proposé cette méthode, bien plus élégante:

static const struct Summary {
	const int	type;
	const char	*tbl_name;
	const char	*deps;
	const char	*conflicts;
	const char	*requires;
	const char	*provides;
	const char	*end;
} sumsw[] = {
	[LOCAL_SUMMARY] = {
		LOCAL_SUMMARY,
		"LOCAL_PKG",
		"LOCAL_DEPS",
		"LOCAL_CONFLICTS",
		"LOCAL_REQUIRES",
		"LOCAL_PROVIDES",
		NULL
	},
	[REMOTE_SUMMARY] = {
		REMOTE_SUMMARY,
		"REMOTE_PKG",
		"REMOTE_DEPS",
		"REMOTE_CONFLICTS",
		"REMOTE_REQUIRES",
		"REMOTE_PROVIDES",
		NULL
	},
};

[...]

	/* (REMOTE[LOCAL)_PKG is first -> skip */
	for (arr = &(sum.tbl_name) + 1; *arr != NULL; ++arr) {

Aaah, bah oui, tout de suite c’est moins dégueulasse hein.

0.5.2.3 est dans current, et le pullup request vient de partir.

meh.

@SFR: Vous avez dépassé votre forfait illimité

Tags: ,
4 Comments »

FINI! Fini ces pathétiques SMS chaque mois me signalant que j’ai dépassé mon forfait “illimité” (oui, chez SFR ils savent diviser par 0). J’exulte de savoir que les 3 opérateurs mobile historique bavent de la bile lorsqu’ils entendent le mot “Free”. C’est toujours déplaisant de se faire mettre le nez dans son caca, l’acharnement des affairistes de tout poil contre Wikileaks en est l’exemple le plus choquant.
Mais je diverge.
Fini SFR donc. Et je devrais les remercier pour leur dernier fait d’armes; en effet, depuis quelques temps, lorsque l’on demande à cet opérateur hors de tout soupçons de nous fournir le code de désimlockage de son téléphone portable, ce dernier vous renvoie ceci:
Votre référence Client / Contrat : XXX462

Monsieur HEITOR,

Nous faisons suite à votre demande de désimlockage.

La clé désimlockage de votre mobile est 366209146922791 .

[procédure à suivre]
“Excellent” me dis-je, c’est fair play… mais attendez… il me dit quelque chose ce code… ils seront donc minables jusqu’au bout, le “code de desimlockage” ci-dessus n’est autre que le code IMEI que j’avais déjà fourni lors de la demande initiale (le fameux code identifiant votre mobile, obtenu à l’aide de la séquence *#06#).
Évidemment, un appel au support vous informe qu’ils ne disposent finalement pas de votre code (mythos de merde) et qu’il vont ouvrir un dossier chez HTC (le constructeur de mon téléphone) afin de me communiquer le fameux code… et que cela prend environ 4 semaines. Beaucoup d’insultes me viennent à l’esprit, mais finalement, je me console en imaginant l’immense manque à gagner que Free leur à mis à travers la gueule. Oui je sais, mon langage est peu châtié dans ce post, je trouve ces pratiques tellement pitoyables…

Mais alors, pourquoi donc devrais-je les remercier ? Et bien parce que cela m’a obligé à faire quelque chose que j’avais envie de réaliser depuis un moment déjà, rooter mon Desire HD.
Franchement, ce fut d’une simplicité déconcertante, tellement simple que j’éprouve une petite frustration, je n’ai même pas de tips à vous fournir, rien de croustillant, non, tout est et . Et, oui, le Ace Advanced Hack Kit fonctionne parfaitement sous GNU/Linux (et aussi sous osx et l’autre machin 4 couleurs mais on s’en fout).

Initialement, j’avais prévu de rooter mon mobile afin de faire sauter le simlockage, mais dans la foulée, je me dis qu’une ROM vierge, épurée de toutes les saloperies estampillées SFR et lancées par défaut serait du meilleur effet, et après un minimum de recherche, il m’a semblé que Android Revolution HD était le bon candidat. Et je ne suis pas déçu. Mon téléphone mobile n’est simplement plus le même device. Rapide, fluide, épuré, et affublé de la ROM radio 12.65.60.29_26.14.04.28_M tel que préconisé dans la documentation. Contrairement à ce que j’ai pu lire ici et là, non, la capacité de ma batterie ne descend pas plus vite chez Free que chez SFR. Au contraire en fait. Peut-être est-ce lié à cette fameuse ROM radio, mais aussi et surtout, m’est avis que l’absence de la flopée d’utilitaires aussi inutiles que SFR musique/TV/concerts que je retrouvais souvent dans la task list doit jouer un rôle :)

Attention, on ne le répétera jamais assez, si vous tentez l’aventure: lisez les documentations. Ces dernières sont très bien faites et répondent à 99% des questions utiles, pour le pourcent restant, il y a l’excellent site xda-developers peuplé de poilus de l’android.

Comme j’étais chaud, j’ai réalisé la même opération sur ma tablette EeePad Transformer, résultat similaire, avec ce petit plus: Android Revolution HD edition Transformer est doté d’ICS (Ice Cream Sandwitch, aka Android 4.0, la dernière version de l’OS de google).

Comme je le disais sur G+ hier soir, je comprend pourquoi des milliers de hackers passent des nuits à trafiquer leur ROM, c’est assez addictif…

Kidnapping de CPU

2 Comments »

Avec les petits amis de NetBSDfr, nous préparons un projet secret de domination des paquets pkgsrc impliquant de la compilation, beaucoup de compilation. Je dispose pour ce faire d’une tripotée de machines virtuelles, ne fonctionnant pas forcemment sous NetBSD, mais toutes munies d’un ou plusieurs CPUs pas forcemment sollicités. Aussi, me suis-je mis dans la tête d’utiliser distcc couplé aux outils de compilation croisée disponibles dans l’arbre des sources de NetBSD.
L’opération est étonemment simple.

Je prendrai pour exemple une machine Debian GNU/Linux 6.0. La première étape consiste à installer l’ensemble des outils nécessaires à la compilation sur cette machine dédiée à la compilation distribuée:

  • gcc
  • g++
  • zlib1g-dev
  • ncurses-base

On récupère ensuite l’arbre des sources, par exemple pour cross-compiler NetBSD 5.1.2:

# pwd
/home/netbsd
# cvs -d anoncvs@anoncvs.fr.netbsd.org:/cvsroot co -rnetbsd-5-1-2-RELEASE src

Puis on utilise build.sh afin de construire les outils de compilation croisée déstinés à compiler des binaires NetBSD sur GNU/Linux. Contrairement à ce que dit la documentation officielle, il ne faut pas ajouter le flag -u, qui empêcherait l’autoconfiguration de nbcompat (oui, on va corriger):

# ./build.sh -m amd64 tools

À l’issue de cette construction, vous devriez disposer d’un nouveau repertoire de type:

tooldir.Linux-2.6.32-5-xen-amd64-x86_64

Il faut alors evidemment installer distcc de cette façon:

# apt-get install distcc

Et modifier le fichier /etc/default/distcc:

STARTDISTCC="true"
# [...]
# Liste des réseaux autorisés à utiliser distcc
ALLOWEDNETS="127.0.0.1 192.168.0.0/24"
# IP d'écoute
LISTENER="192.168.0.7"
###
# IMPORTANT: on modifie le chemin par défaut afin distcc cherche d'abord cpp / gcc / g++ / ar / ld
# dans le repertoire contenant les outils de compilation croisée
###
PATH=/home/netbsd/src/tooldir.Linux-2.6.32-5-xen-amd64-x86_64/x86_64--netbsd/bin:$PATH

On démarre distcc simplement:

/etc/init.d/distcc start

C’est prêt !
Il ne reste plus qu’à indiquer à notre machine NetBSD qu’elle peut désormais utiliser notre nouvelle machine de compilation, par exemple en ajoutant au fichier /etc/mk.conf:

PKGSRC_COMPILER=ccache distcc gcc
MAKE_JOBS=4
DISTCC_HOSTS=192.168.0.7 localhost

Vous pouvez vous référer à cette documentation de votre serviteur pour apprendre à préparer distcc sur une machine NetBSD.

WP Theme & Icons based on GlossyBlue by N.Design Studio
Banner from www.trynthlas.com
Entries RSS Comments RSS Log in
Performance Optimization WordPress Plugins by W3 EDGE