cvs co ya7ans

Tags: , ,
No Comments »

fouyou, ce voyage dans le passé…

Il y a 7 ans, je commettais ceci. EasyLDAP était une librairie qui permettait d’implémenter une interaction LDAP en C assez simplement. Mais son but final était plus concret; en effet, en 2001, FreeBSD ne possédait pas de port nss_ldap, son architecture nss était quelque peu aride, et l’un de mes projets dans mon job de l’époque, c’était de trouver le moyen de centraliser l’authentification de nos serveurs FreeBSD, et de préférence, via LDAP.
La sale magouille que j’avais trouvé à l’époque, c’était d’utiliser la variable LD_PRELOAD et de préloader, donc, la librairie eldap dans laquelle j’avais redéfini les fonctions getpwnam, getpwuid, getgrnam etc etc…
Et ça marchait ! :)

Aujourd’hui, FreeBSD et NetBSD sont tous deux capables de loader des plugins nss_ldap et pam_ldap, c’est tout beau tout propre, et il n’y a plus besoin de bidouiller de trucs infames pour centraliser ses utilisateurs.
Sauf sous OpenBSD.
Et c’est la que les vapeurs du passé ressurgissent; deux des domU de zone0 sont des OpenBSD, l’un d’eux plus particulièrement, est destiné à heberger moult shells des membres contributeurs du groupe. jusqu’à présent, nous avions jeté notre dévolu sur cette methode, qui présente le désavantage de devoir tout de même ajouter l’utilisateur au fichier /etc/passwd. Et puis de fil en aiguille, je me rappelle de mon “fameux” EasyLDAP.
D’abord à tatons, je regarde mon code de loin, je fixe les autotrucs permettant sa compilation, et apres quelques ajustements, ce dernier compile. J’ecris sans trop y croire ce bout de code de verification :

#include <stdio.h>

#include <sys/types.h>
#include <pwd.h>

int
main(int argc, char *argv[])
{
        if (getpwnam(argv[1]) != NULL)
                printf("%s exists\\n", argv[1]);
        else
                printf("%s does NOT exists\\n", argv[1]);

        return 0;
}

Je compile puis quelques SEGFAULT / corrections plus loin, je tente ma chance :

[~/src/eldap] LD_PRELOAD=.libs/libeldap.so.1.1 ./testpw pinpin
pinpin exists

Je n’en crois pas mes yeux, ça fonctionne toujours !
Quelques ajustements plus tard, j’arrivais à me connecter via OpenSSH-lpk (clé publique dans une db LDAP, donc) avec un utilisateur absent du fichier /etc/passwd.

J’ai donc entrepris de faire subir à ce vieux code mal indenté, peu sur et emprunt de vapeurs de gin, un bon gros lifting. Le site est de nouveau en ligne, le CVS ne nouveau accessible, et j’ai revampé un peu le codebase. Il est à peu près certain que ce travail n’aura d’interet que le temps qu’OpenBSD n’integre une vraie abstraction dans la libc, mais il est toujours agréable de jouer avec ces notions. Si le cÅ“ur vous en dit, vous savez ou me trouver.

à peine classe

Tags:
2 Comments »

Bon c’est pas encore super brillant, j’imagine que ça fera hurler les puristes, mais au cas ou quelqu’un aurait besoin d’une toute petite classe de rien du tout pour manipuler des fichiers de conf “basiques” du type :

# ce genre de format
clé: valeur
# ou celui-ci
clé= valeur
# ou encore celui lÃ
clé	valeur

J’ai pondu un truc ici.
Ça s’utilise comme ça :

>>> import simpleconf
>>> cf = simpleconf.SimpleConf()
>>> test = cf.read('/etc/nsswitch.conf')
>>> cf.valueupdate('group', 'pwetpwet')
>>> cf.write('/tmp/out.tmp')

et magie :

$ grep ^group /tmp/out.tmp
group:       pwetpwet

Améliorations bienvenues toussa.

fsHhshhhshhhHHh tsssk tssk fFSShhhsh

Tags:
1 Comment »

Alors voila. Y’a bien quoi, 3 ans ? 4 ans ? que moult lutins me chantaient les louanges de python, mais flemme, manque de proj et de temps aidant, je snobais le langage au serpent, tout juste capable de gentiment hacker quelques codes existants, rien d’excitant. Et puis arrive ce petit proj au boulot, un truc sympa, pas bien méchant, qui me ferait manipuler des IO, des connexions interactives, un proj avec un potentiel futur relativement interessant. Du coup, moi qui aime me coller dans la merde, je dis fièrement “ouais allez en python”. Coup’d'pression coup’d'pression.
Evidemment, je commence par Dive Into Python, que j’accroche pas, mais alors _pas_du_tout_. Puis je m’attaque au classique Apprendre à programmer avec python. Juste enorme, excellente ressource qui met les idées bien au clair, ce fût ma révélation. J’ai poursuivi en achetant ce bouquin, et là, je dois marcher en me penchant quand je sors du metro et que je finis la lecture de 3/4 pages. Programmation reseau, Twisted, multithreading et autres sujets plus kiffants les uns que les autres. Là dessus arrivent les délicieux conseils des experimentés pythonneurs tahorg, dzen, yota, mial, anhj, Klyr et j’en passe, et je finis par claquer un code pas-si-dégueu pour un coup d’essai. Allez, je résiste pas au plaisir de paster la dernière astuce issue du canal, une boucle qui construit des noms de fonctions en addictionnant des strings puis les rend callable, une tuerie “classique” :

# des trucs avant

argsmap = {
	'truc': 'bla',
# plein d'autres comme ça
}

# [...]
# d'autres trucs
#

def process_es(data, action):
        switch = {}

        for section in argsmap.keys():
                switch[section] = getattr(modules["__main__"], section + '_func')
	# et encore plein de trucs super bien
	switch[key](value.rstrip()) # on appelle la fonction

L’astuce reside dans le paramètre modules["__main__"], qui informe l’incroyable getattr que l’objet auquel juxtaposer la fonction construite n’est autre que le code courant.

Pour finir, un petit tour de passe-passe avec getattr()

Python 2.5.1 (r251:54863, May  2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> toto = "pwet"
>>> getattr(toto, "split")('e')
['pw', 't']

Sans déconner…

back to c0daze

Tags: , , ,
4 Comments »

Pour déconner j’ai pondu ça ce soir: infon.c
Il s’agit d’un bête petit serveur TCP à compiler avec l’environnement de developpement de la Fonera et qui répond pour le moment aux requetes l[oad] et m[em]. Genre comme ça :

imil@tatooine:~$ telnet fonera 1702
Trying 192.168.10.1...
Connected to fonera.
Escape character is '^]'.
type h for help
fonera> l
1.16
fonera> l
1.14
fonera> m
724
fonera> l
1.13
fonera> m
724
fonera> m
736
fonera> l
1.12
fonera> q
Connection closed by foreign host.

Tu l’auras compris ami lecteur, tout ce qui manque à ce bidule, c’est un frontend sur un desktop qui se glissera gentiment dans un gnome-panel ou equivalent. Tu t’ennuies ?

NB: la commande de compil qui va bien: mips-linux-uclibc-gcc -Os -pedantic -Wall -o infon infon.c

update

Un peu de cleanage de code, et maintenant on peut avoir la qualité du link wifi sur ath0 et ath1.

update

fonera> h
l: load average
m: memory info (total / free)
k: link quality (ath0 / ath1)
t: ath0 rx / ath0 tx | ath1 rx / ath1 tx
q: exit console
fonera> t
103811786 / 876388 | 959653066 / 835499

ça peut servir… :)

mangemoish

Tags: , ,
No Comments »

Trop lourd ssh ? qu’à cela ne tienne ! tsh et son serveur tshd ne pesent chacun que 60K tout mouillés :)
Avec eux, retournez en 1978 et hardcodez un password dans un .h, à mort les fichiers de conf ! port d’ecoute et shell pat defaut à changer ? on recompile.

Allez, juste pour le f[ou]n, on ajoute :

fonera:
        mips-linux-uclibc-gcc -O -W -Wall -o tsh  $(CLIENT_OBJ)
        mips-linux-uclibc-gcc -O -W -Wall -o tshd $(SERVER_OBJ) -lutil -DLINUX
        mips-linux-uclibc-strip tsh tshd

au Makefile fourni.
On edite tsh.h, on modifie char *secret = “gnagnagna” avec son mot de passe spéciale lose favori, on remplace :

: tsh_runshell( server, "exec bash --login" ) );

par

: tsh_runshell( server, "exec sh --login" ) );

Et le tour est joué

blagounette du dimanche

Tags: , ,
1 Comment »

Alors que je me disais qu’il serait assez convivial d’avoir un serveur ssh un peu plus costaud que dropbear sur ma Fonera, je me lance dans la cross-compil d’OpenSSH. Dans les grandes lignes ça donne ça :

CFLAGS=-I/home/imil/fonera/src/fonera-src/staging_dir_mips/usr/include LDFLAGS="-L/home/imil/fonera/src/fonera-src/staging_dir_mips/usr/lib -lcrypt" CC=mips-linux-uclibc-gcc ./configure --disable-largefile --enable-strip --disable-lastlog --disable-utmp --disable-utmpx --disable-wtmp --disable-wtmpx --disable-pututline --disable-pututxline --without-pam --without-ssl-engine --without-sectok --without-selinux --without-md5-passwords --without-4in6 --host=mips

En ayant préalablement installé l’environnement de compilation comme expliqué trois posts plus bas.
Je me retrouve donc avec ssh, sshd etc compilés, et comme l’espace memoire est particulièrement restreint (c’est ce qui motive la foultitude de flags du configure), je strip puis du -sh

imil@tatooine:~/fonera/src/fonera-src/port$ du -sh openssh-4.5p1/sshd
596K    openssh-4.5p1/sshd

“rhaa.. bien trop gros” me dis-je. Et puis comme ça pour voir, je me dis que je tenterais bien le coup avec le ssh de ssh.com. Ni une ni deux :

CFLAGS=-I/home/imil/fonera/src/fonera-src/staging_dir_mips/usr/include LDFLAGS="-L/home/imil/fonera/src/fonera-src/staging_dir_mips/usr/lib -lcrypt" CC=mips-linux-uclibc-gcc ./configure --disable-debug --disable-debug-heavy --disable-efence --without-ipv6 --without-pgp --without-ssh-f-configd --without-x --without-daemonpam --without-clientpam --without-serversecurid --without-clientsecurid --disable-server-kbd-interactive --disable-client-kbd-interactive --without-tis --without-libwrap --disable-group-writeability --disable-suid-ssh-signer --without-ansi-rng --host=mips

Puis :

imil@tatooine:~/fonera/src/fonera-src/port$ du -sh ssh-3.2.9.1/apps/ssh/sshd2
1.2M    ssh-3.2.9.1/apps/ssh/sshd2

Alors je… pardon mais.. brkfffprpr.. excu..*mHHFmHFMkrkrk* je.. AHAHAHAHAHAHAHAHAH

bravo ssh.com.

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