Posts dans "Documentation"

Chrome, CACert et Gentoo

Ajouté le 07.03.2010 - 15:03  •  Commentaires (0)

Pour celles et ceux qui utilisent Google Chrome sur leur Gentoo, et qui veulent profiter des sites SSL employant CACert, voici comment faire les choses :

s'assurer que le USE "utils" est activé pour le package dev-libs/nss
télécharger le ROOT et Class3 de CACert
ajouter ces deux certificats dans l'env user

certutil -d sql:$HOME/.pki/nssdb -A -t "TCu,Cu,Tuw" -n "CACert Class 1 Root Certificate" -i root.crt
certutil -d sql:$HOME/.pki/nssdb -A -t "TCu,Cu,Tuw" -n "CACert Class 3 Root Certificate" -i class3.crt


Et voilà. Même pas besoin de relancer Chromium ;).

Enjoy!

Tengu

Lire plus

Yubikey - Reprogrammer

Ajouté le 09.12.2009 - 19:48  •  Commentaires (3)

J'en avais parlé dans un autre post, en disant que Yubikey était pas mal, opensource etc.

Après avoir réussi à convaincre des collègues que ça pouvait avoir une réelle utilité pour éviter des brut-force et ajouter une clef de validation pour le login, je me suis penché sur la partie "faire un serveur de validation".

Après pas mal de recherches sur le net, je suis tombé sur une petite librairie python qui me semble très intéressantes : http://code.google.com/p/yubikey-python.

En deux temps trois mouvements, vous pouvez sans autre monter votre petit serveur de validation d'OTP. Enfin... presque.

Le presque tient au fait que Yubico ne fournit plus les clefs AES des yubikey (je n'ai pas cherché à savoir, j'imagine que les gens savaient pas comment lire un mail crypté gpg, et que Yubico avait un peu de peine à faire valoir leur sécurité si les clefs AES se balladaient en clair dans des mails ;) ).

Mais, bien entendu, il y a une parade : http://code.google.com/p/yubikey-personalization/
Ce programme permet de changer les données de sa yubikey, à savoir son ID publique, son ID privée et la fameuse clef AES.
Il va sans dire qu'un fois reprogrammée, on ne peut pas retrouver la clef d'origine.

Quoi qu'il en soit, Yubico a prévu la chose, et permet de mettre ses propres infos sur leur site, dans le cas où on voudrait employer leurs serveurs de validation. Bien que je n'en vois pas trop l'intérêt, en fait. 'Fin bon, tout est ouvert ;).

Fort de ces 2-3 choses, j'ai commencé à vouloir reprogrammer une de mes clefs. J'ai donc créé un petit script python qui va me générer du petch me permettant de refaire ma clef :
#!/usr/bin/env python
from random import seed, choice
from datetime import datetime
from string import letters

__string = 'abcdef0123456789'
__aes_size = 32
__priv_size = 12
__pub_size = 6


__hexHexChars = '0123456789abcdef'
__modHexChars = 'cbdefghijklnrtuv'

__hex2ModDict = dict(zip(__hexHexChars, __modHexChars))
__mod2HexDict = dict(zip(__modHexChars, __hexHexChars))

def __modhex_encode(s):
    return ''.join(
        [ __hex2ModDict[c] for c in s.encode('hex') ]
    )
# end def modhex_encode

def __modhex_decode(m):
    return ''.join(
        [ __mod2HexDict[c] for c in m ]
    ).decode('hex')
# end def modhex_decode

def __rand(size,array):
  seed(datetime.now())
  return ''.join([choice(array) for x in xrange(size)])

__aes  =  __rand(__aes_size, __string)
__priv = __rand(__priv_size, __string)
__pub  = __modhex_encode(__rand(__pub_size, letters))

print '''ykpersonalize -a%s -ouid=%s -ofixed=%s''' % (__aes, __priv, __pub)


Et j'en ai profité pour employer la lib python permettant de valider, ce qui me permettra de faire des checks :
#!/usr/bin/env python

import sys
from yubikey import decrypt

__aes = raw_input(Please enter your AES Key)

__otp = raw_input('Please enter your OTP: ')


try:
  yubikey = decrypt.YubikeyToken(__otp, __aes)
except decrypt.InvalidAESKey:
  print 'Wrong AES'
  sys.exit(1)
except decrypt.InvalidToken:
  print 'Wrong Token'
  sys.exit(2)

for d in dir(yubikey):
  print d, eval("yubikey.%s"%d)


Une fois cela fait.... Il ne reste plus qu'à trouver une application à tout cela. Dans le cadre de mon travail au Bureau, c'est le cas. Pour le privé par contre, c'est un peu plus gadget, mais j'aurais aussi de quoi jouer un peu.

Bref. De belles soirées de geeks en perspective ;)

A+

Tengu

Lire plus

Yubikey

Ajouté le 15.10.2009 - 19:00  •  Commentaires (0)

Je suis tombé il y a quelques temps sur http://yubico.com

le principe est simple : le dongle USB (yubikey) génère une chaine de caractère aléatoire, pouvant servir à l'authentification sur des services, tant internets que locaux (sous réserve d'avoir un accès internet).

En ayant commandé une, j'ai de suite commencé à jouer avec.

Premier truc fait : l'employer comme moyen de login alternatif sur shumira, mon laptop.
Pour cela, il y a http://code.google.com/p/yubico-pam/. Ce projet permet de modifier PAM pour qu'il supporte la yubikey.
!! ATTENTION !! il faut une connexion internet pour que cela marche !

Deuxième truc : employer la yubikey comme méthode de login sur mes administrations.
J'ai dû fouiller un peu le net pour trouver des exemples, la doc yubico est un peu moisie... Voici 2-3 bouts de code servant dans mon application pylons.

Définition de la fonction yubilogin :
def yubilogin(otp):
  api_key = 'create your one'
  s = u'id=%s&otp=%s'%('your id',otp)
  args = hmac.new(base64.decodestring(api_key), s, digestmod=sha1) #,hashlib.sha1)
  sign = urllib2.quote(base64.b64encode(args.digest()))
  yubi_url = '[url]https://api.yubico.com/wsapi/verify?id=3131&otp=%s&h=%s[/url]' % (otp,sign)
  yubi = urllib2.urlopen(yubi_url).readlines()
  hash = {}
  for line in yubi:
    if '=' in line:
      t = line.strip().split('=')
      hash[t[0]] = t[1]
  if hash['status'] == 'OK':
    return [True, hash]
  else:
    return [False, hash['status']]


Et côté controlleur de login:
def login(self):
    if 'login' not in request.params:
      return redirect_to(action='index')
    if len(request.params['login']) == 0 or len(request.params['pwd']) == 0 or len(request.params['yubi']) == 0:
      return redirect_to(action='index')
    login = yubilogin(request.params['yubi'])
    if login[0] and request.params['yubi'][:-32] == 'your pub_id':
      # check what you want and do what you want


Dans mon cas, j'ai trois clefs de login : username, password et la yubikey. Le mot de passe n'est pas trop utile, dans ce cas précis. On peut facilement le désactiver, et se baser uniquement sur la yubikey.

Ne pas oublier de dire QUELLE yubikey est valide, sinon n'importe qui pourra rentrer avec sa yubikey ;)

C'est tout con, mais les applications possibles sont immences :

login sur des portails web
login sur des serveurs physiques (ssh, direct)
login dans des applications (je crois que ça pourra fortement intéresser du monde à mon boulot)
....


Bref... chuis très content d'être tombé dessus, et d'avoir eu l'occasion de tester le truc. C'est tout con, en plus, si on a des bons exemples ;)

Happy coding

Tengu

Lire plus

JQuery - Divers codes

Ajouté le 24.08.2009 - 21:39  •  Commentaires (0)

Lors de mon développement de galerie avec Pylons, j'ai décidé de planter un peu de javascripts pour rendre la navigation plus agréable et avec 1-2 effets cools.

Tout est basé sur JQuery, une librairie très pratique, et légère.

Voici les bouts de codes utiles, en vrac.

Scrolling des thumbs


Pour lui, j'ai ajouté quelques plugins à JQuery:

ScrollTo
MouseWheel


Ensuite, le code qui va bien:

//borrowed from jQuery easing plugin
//[url]http://gsgd.co.uk/sandbox/jquery.easing.php[/url]
$.easing.elasout = function(x, t, b, c, d) {
  var s=1.70158;var p=0;var a=c;
  if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
  if (a < Math.abs(c)) { a=c; var s=p/4; }
  else var s = p/(2*Math.PI) * Math.asin (c/a);
  return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
};
$(document).ready(function() {
  $('#mini').css('overflow','hidden');
  $('#mini').mousewheel(function(event, delta) {
    var mv;
    if (delta > 0) {
      mv = '-='+offset+'px';
    } else {
      mv = '+='+offset+'px';
    }
    $('#mini').scrollTo(mv,500, {easing:'elasout'});
    return false;
  });
  $('#bottom_lnk').click(function() {
    $('#mini').scrollTo('+='+offset+'px',1000, {easing:'elasout'});
  });
  $('#top_lnk').click(function() {
    $('#mini').scrollTo('-='+offset+'px', 1000, {easing:'elasout'});
  });
});


En gros, #mini correspond à la div contenant les miniatures; via javascript, je mets l'overflow à "hidden", de manière à supprimer les barres de scrolling.
J'ajoute 3 "listeners": un sur la roulette de la souri dans #mini, et deux sur des clics sur des éléments de la page (en l'occurence, deux divs).

Affichage de l'image "moyenne"


Là, c'est plus simple:

$(document).ready(function() {
  $('.mini_lnk').click(function() {
    path = String(this);
    img = basename(path.replace('^http:\/',''));
    $('#big_img_lnk').attr( {href: '/imager/Munich 20.09.2008/'+img+'/full', title: 'Open '+img+' in 1024x px' } );
    $.get('/getExif/Munich 20.09.2008/'+img,{}, function(data) { $('#exifs').html(data);});
    // if we rotated the previous image, it's now a "canvas" element.. have to remove canvas, ans put "img" instead
    $('#big_img_lnk').html('<img id="big_img" src="/imager/Munich 20.09.2008/'+img+'/750" alt="'+img+'" />');
    $('#quickurl').val('[url]http://gallery.internux.ch/gallery/Munich+20.09.2008/[/url]'+img);

    return false;
  });
}

En gros, je catch l'event "click" des miniatures, et je réécris à la volée l'URL de l'image moyenne; du fait que j'ai ajouté la possibilité de faire des rotations d'image, il m'a fallu faire un petit hack pour retomber sur mes pattes.
Je profite aussi pour aller chercher les informations exifs de l'image, et afficher son URL direct dans le champs prévu à cet effet.

Rien de bien compliqué en soi. Voire que du très simple, mais j'ai pas mal cherché, surtout pour l'histoire du scroll. Il y a une floppée de trucs déjà prêts, employant JQuery, mais ils ne me plaisaient pas.
Donc j'apporte ma Nième contribution ;)

Vous pouvez sans autre aller voir le code javascript in situ.

Happy coding (oupa, le JS, c'est un peu chiant quand même ;) )

Lire plus

x200t - 3g + gps

Ajouté le 27.07.2009 - 20:07  •  Commentaires (1)

Grande nouvelle (dont tout le monde se fout en fait) : j'ai réussi à faire marcher le modem 3G et la puce GPS de mon x200t !

Après m'être battu quelques temps avec, j'ai fini par me rappeler l'existance de http://www.thinkwiki.org. Après une rapide recherche et deux clics sur des liens, je suis tombé ici.
Autant dire que c'est exactement ce dont j'avais besoin.

Après 2-3 lectures rapides, un peu de réflexion (sisi), et pas mal de tests, voici ce que j'ai fini par faire :

GPSDPID="/var/run/gpsd.pid"
CONTROL_DEVICE="/dev/ttyACM1"
GPS_DEVICE="/dev/ttyACM2"
PIN=""
APN="gprs.swisscom.ch"

powerup_F3507g () {
  echo -n "Powering up F3507g card.."
  echo 1 > /sys/devices/platform/thinkpad_acpi/wwan_enable
  while [ ! -c $CONTROL_DEVICE ]; do sleep 0.5; echo -n "."; done
  echo "done"
  echo -n "Turning on F3507g card..."
  sleep 3
  if [ -n "$PIN" ]; then
      /usr/sbin/chat -v "" "AT+CPIN?" "SIM PIN" "AT" "OK" "AT+CPIN=\"$PIN\"" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
  fi
  /usr/sbin/chat -v "" "AT+CPIN?" "READY" "AT+CFUN=1" "+PACSP0" "AT" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
  echo "done"
}

powerdown_F3507g () {
  echo -n "Turning off F3507g card..."
  /usr/sbin/chat -v "" "AT+CFUN=4" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
  echo "done"
  echo -n "Powering down F3507g card.."
  echo 0 > /sys/devices/platform/thinkpad_acpi/wwan_enable
  while [ -c $CONTROL_DEVICE ]; do sleep 0.5; echo -n "."; done
  echo "done"
}

configure_GPS () {
  /usr/sbin/chat -v "" "AT*E2GPSCTL=$1,$2,$3" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
}

turnon_GPS () {
  echo -n "Starting NMEA stream on $GPS_DEVICE..."
  configure_GPS 1 1 1
  sleep 1
  /usr/sbin/chat -v "" "AT*E2GPSNPD" "GPGGA" > $GPS_DEVICE < $GPS_DEVICE
  start-stop-daemon --start --exec /usr/sbin/gpsd -- -P $GPSDPID $GPS_DEVICE
  echo "done"
}

turnoff_GPS () {
  echo -n "Stopping NMEA stream on $GPS_DEVICE..."
  start-stop-daemon --stop --pidfile $GPSDPID
  configure_GPS 0 1 0
  echo "done"
  turnoff_F3507g
}

turnon_usbnet () {
  echo -n "Starting usbnet connection..."
  /usr/sbin/chat -v "" "AT+CGDCONT=1,\"IP\",\"$APN\"" "OK" "AT*ENAP=1,1" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
  echo "done"
}

turnoff_usbnet () {
  echo -n "Stopping usbnet connection..."
  /usr/sbin/chat -v "" "AT*ENAP=0" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE
  echo "done"
  turnoff_F3507g
}

turnoff_F3507g () {
  ifdown_F3507g
}

ifdown_F3507g () {
  powerdown_F3507g
}

usage () {
  echo "$0 <action>"
  echo "  start-wwan: start your modem"
  echo "  stop-wwan:  stop your modem"
  echo "  start-gps:  start your GPS and gpsd"
  echo "  stop-gps:   stop xour GPS and gpsd"
}

if [ $# -eq 1 ]; then
  case $1 in
  'start-wwan')
    powerup_F3507g
    turnon_usbnet
    dhclient usb0 &>/dev/null
  ;;
  'start-gps')
    powerup_F3507g
    turnon_GPS
  ;;
  'stop-wwan')
    turnoff_usbnet
  ;;
  'stop-gps')
    turnoff_GPS
  ;;
  *)
    usage
  ;;
  esac
else
  usage
fi
exit 0


Certes, c'est long. Certes, c'est du bash. Mais devoir faire un simple "sudo wwan start-wwan" pour se retrouver connecter, c'est juste le pied, non? ;)

Bref. Là, ça marche. Et bien.
J'en connais en tous cas un qui sera heureux de l'apprendre :)

A+

Tengu

Lire plus

LaTeX et les factures

Ajouté le 02.05.2009 - 09:30  •  Commentaires (0)

Hier soir, enfin cette nuit, OpenOffice a planté une fois de trop à mon goût.
J'ai donc un peu prospecté sur IRC, et ai fini par me dire "bah, j'ai fait du LaTeX une fois, j'dois bien pouvoir en refaire un peu!".

De là, j'ai installé kile, et me suis lancé dans la recherche d'un package pour faire des factures et des devis sans trop me prendre la tête.

Je suis tombé sur le package Invoice. Il m'a de suite plu, vu qu'il fait exactement ce que je veux : il plante des tableaux sans bordure avec le blabla mis en page de manière propre et simple.

Une fois le petit jouet plus ou moins pigé et appliqué (super dur, vous verrez plus bas ;) ), je suis arrivé au problème des polices.
En effet, à mon goût la police par défaut est juste hideuse. J'ai donc été re-prospecter sur IRC, et un pote m'a sorti le package Bera.

De là, tout est allé plus simple. Encore un peu de mise en page avec l'intégration de mon logo... Un petit pied de page propre (merci Fancyhdr), et hop.

Au final, il me reste encore à rendre plus propre la partie de l'adresse du destinataire, pour le moment c'est codé n'importe comment.

Voici donc ma première facture en LaTeX :
\documentclass[french,10pt]{article}
\usepackage{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{invoice}
\usepackage[a4paper]{geometry}
\usepackage{units}
\usepackage{moreverb}
\usepackage{bera}
\usepackage{graphicx}
\usepackage{wrapfig}
\usepackage{fancyhdr}

\geometry{verbose,tmargin=4em,bmargin=8em,lmargin=6em,rmargin=6em}
\setlength{\parindent}{0pt}
\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex}

\thispagestyle{fancy}
\pagestyle{fancy}
\setlength{\parindent}{0pt}

\renewcommand{\headrulewidth}{0pt}
\cfoot{Tel: <censored> - Email: <censored> - CCP: <censored> - facture payable dans les \textbf{10 jours} }

\begin{document}
  \begin{wrapfigure}{l}{15mm}
    \includegraphics[width=15mm]{Logo_Internux.png}
  \end{wrapfigure}
  Jeanneret Internux\\
  Av. des Alpes 123\\
  1814 La Tour-de-Peilz\\
  <censored>\\
  Fact. ###\\


  {\addtolength{\leftskip}{10.5cm} %in ERT
    la super\\
    adresse \\
    de votre débiteur\\

  } %in ERT


  \hspace*{10.5cm}
    La Tour, le \today


  \paragraph{Concerne : facture ``<project name>''\\}
  \bigskip
  \paragraph{\noindent
  \textnormal{
  blah,\\
  blablablibliblubla
  }
  }

  \begin{invoice}{CHF}{0}
    \ProjectTitle{}
    \Fee{le job fait} {300} {1}
    \Fee{un autre truc} {100} {1}
  \end{invoice}


  Merci d'avoir fait appel à nos services.\\

  \par

  \hspace*{10.5cm}
    Pour Jeanneret Internux\\

  \hspace*{10.5cm}
    C. Jeanneret

\end{document}


Comme vous pouvez le constater, c'est d'une simplicité enfantine.
Merci à LaTeX, et merci à tous ces contributeurs, anonymes ou non, qui nous simplifient la vie. Il ne me reste plus qu'à me faire un truc pour les BVR (spécialité suisse s'il en est...), et je serai simplement heureux.
D'ailleurs si quelqu'un a un modèle LaTeX pour les BVR... ;)

A+

C.

Lire plus

Backup postgres

Ajouté le 13.01.2009 - 23:26  •  Commentaires (0)

Suite à me petite mésaventure, j'ai fouillé le net pour avoir un script de backup cool pour mon postgres.

Je suis tombé ici
Le script est cool, mais ne me permettait pas d'avoir en plus le moyen de remonter dans le temps. Donc j'ai sorti mon plus beau vim, et y ai collé une notion de date.
Ainsi, je peux remonter d'un mois dans les backups postgres. Ce qui est un gain non-négligeable par rapport au script d'origine.

Voici donc le petit bébé:

#!/bin/bash

BACKUP_DIR="/where/you/want"

function pg_backup_database
{
  DB=$1
  /usr/bin/pg_dump -f ${BACKUP_DIR}/${DB} -Fc ${DB}
  tar jcfp ${BACKUP_DIR}/$(date +%d)-${DB}.tar.bz2 ${BACKUP_DIR}/${DB}
  rm ${BACKUP_DIR}/${DB}
}

if [ -n "$1" ]; then
  pg_backup_database $1
else
  DB_LIST=`/usr/bin/psql -l -t | awk '{print $1}' | egrep -v '^template'`
  for DB in ${DB_LIST}
  do
      pg_backup_database ${DB}
  done
fi


Certes, j'aurais pu faire un pg_dump | gzip date-db.gz... mais un tar.bz2, c'est cool :D

Lire plus

3G sur gentoo

Ajouté le 01.11.2008 - 17:43  •  Commentaires (5)

Après avoir configuré Hayate pour qu'elle marche sur gentoo sans le moindre soucis, il est venu LE truc trop utile : faire marcher une de ces clefs 3G fournies par notre cher (très cher...) fournisseur national : Swisscom.
Il s'agit d'une clef 3G tout à fait conventionnelle, marchant toute seule sur certains Linux tels qu'Ubuntu, Debian, en utilisant un programme opensource développé et fourni par Vodafone (disponible ici).

Après pas mal de tentatives, il s'est avèré que je devais descendre les 3/4 des packages gnome pour faire marcher ce programme. Il est donc venu le moment de trouver comment faire marcher sans !

Et là commencent les recherches sur google etc. Evidemment, gentoo-wiki est toujours mort, le miroir présent sur zugaina date de mathusalem... Reste google-cache. Je trouve donc 2-3 infos cools qui me permettent de déjà faire comprendre à mon système ce qu'est ce machin space que je lui plante dans un port USB.
Il faut activer 2-3 trucs dans le kernel s'ils ne le sont pas déjà:
Device Drivers 
  ---> USB Support 
    ---> OHCI HCD support
Device Drivers  
  ---> USB Support 
    ---> [M] USB Serial Converter support 
      ---> [*] USB Generic Serial Driver

Et bien sûr le PPP (dans device drivers -> networking).

Une fois votre nouveau kernel compilé avec amour et passion, installé comme il se doit, il faut ajouter 2-3 petites choses dans udev:

/etc/udev/rules.d/50-vodafone.rules :
SUBSYSTEM=="usb", SYSFS{idProduct}=="1003", SYSFS{idVendor}=="12d1", RUN+="/sbin/modprobe usbserial vendor=0x12d1 product=0x1003"


Les valeurs pour vendor et product sont facilement trouvables :
brancher votre clef 3G, puis dans un shell :
$ lsubs -v | less

Et trouvez la partie en référence à votre clef USB.

Cela va faire la chose suivante :
dès que vous plantez votre clef, udev chargera le module usbserial avec les options passées.

Redémarrez votre ordinateur une fois cela fait.

Ensuite, il faut install pppd et ses dépendances; une fois cela fait, il faut juste planter 2 fichiers de config:

/etc/ppp/peers/vodafone
#Set this to the device allocated to the Datacard
/dev/ttyUSB0
#Baudrate -- Note that setting this to 384000 yields an error message
# about this speed not being supported!
460800
#Idle time for closing connection
idle   7200
#Lock the device for this PPPD process use only
lock
#Use normal handshaking
crtscts
#Assume it is a modem device and force modem control methods
modem
#Any user can start the connection
noauth
#If a default route exists replace it with the ppp link
#You get an error if this command is not supported
#by your version of PPPD
#replacedefaultroute
#Make the ppp link the default root
defaultroute
#Username and Password for computer/GlobeTrotter ppp link
#Normally ignored. Change if GSM Operator requires it
user               gprs
password           gprs
#Change the path to chat if required for your version of Linux
connect "/usr/sbin/chat -V -f /etc/ppp/vodafone-chat"
#Accept IP address provided by network
noipdefault
#Detach PPPD from console used to run the program {optional}
#updetach
#Get DNS addresses from operator
usepeerdns
#Don't use VJ compression for ppp link
novj


IMPORTANT : le username et le mot de passe sont valables pour la Suisse. Sisi, faut les mettre !! Renseignez-vous auprès de votre fournisseur de service 3G. J'ai passé genre 30 minutes au tél avec un mec de swisscom avant d'avoir ce truc. Il pigeait pas comment je pouvais faire marcher ma clef sous linux... boulet.

Deuxième fichier :

/etc/ppp/vodafone-chat
ABORT BUSY 
ABORT 'NO CARRIER'
ABORT ERROR
REPORT CONNECT
TIMEOUT 120
"" "AT&F"
OK "ATZ"
OK "ATQ0 V1 E0 S0=0 &C1 &D2 +FCLASS=0"
OK 'AT+CGDCONT=1,"IP","gprs.swisscom.ch"'
SAY "Calling Vodafone GPRSn"
TIMEOUT 60
OK "ATD*99***1#"
CONNECT c


Une bonne partie de ce code m'a été gracieusement fourni par un grep sauvage dans les sources du machin de vodafone.
Là encore, attention : il s'agit de la configuration pour la Suisse. Dans votre pays, il faudra remplacer gprs.swisscom.ch par le bon paramètre. Là encore, faudra aller tirer les vers du nez de votre fournisseur de service :P.

Petite astuce en plus : virer le code PIN de votre carte SIM :
Installez minicom, puis configurez-le pour se connecter sur ttyUSB0;
une fois connecté, entrez ceci :
AT+CPIN="xxxx"
AT+CLCK="SC",0,"xxxx"

Remplacez xxx par votre code PIN. Quittez le minicom... et hop. Vous venez de désactiver la demande de code PIN.

Et voilà ;)

Lire plus

nginx & Pylons

Ajouté le 03.08.2008 - 10:22  •  Commentaires (0)

Comme dit il y a quelques jours, j'ai opté pour une solution pylons/nginx pour mon pseudo-blog.

Pylons, je ne le présente plus (quoique si, allez : framework web en python, dans le même genre que catalyst ou ror).

Nginx, quant à lui, est un serveur web russe 'achement très puissant et propre. Son principal atout est la simplicité déconcertante de la configuration. Il est de plus très orienté "proxypass" et "load balancer", ce qui le met en première ligne pour héberger du pylons, ror ou encore catalyst.

Voici donc comment faire un truc rapide, propre et simple, pour afficher votre site pylons :

user nginx nginx;
worker_processes 1;
error_log /var/log/nginx/error_log info;
events {
  worker_connections  8192;
  use epoll;
}

http {
  include         /etc/nginx/mime.types;
  default_type    application/octet-stream;
# snip-snip
  server {
    listen 80;
    server_name nimo.internux.ch illyasviel.internux.ch;
    access_log /var/log/nginx/nimo.access main;
    error_log /var/log/nginx/nimo.error info;
    location / {
      proxy_pass h ttp://localhost:9090;
    }
  }
# snip-snip
}


(attention ! la lib que j'emploie pour les bbcode est un peu pourrie, et ne prend pas garde à certains détails.. comme par exemple si je mets une url entre deux balises code -.-' -> j'ai dû tricher et ajouter un espace.)

Simple non? Par rapport à apache... Et encore, c'est vraiment le truc basique de la base, à ce niveau. Après, imaginez mettre non pas 1, mais 2, 3, 4 serveurs pylons, et employer nginx comme load balancer...

A vos claviers !

Liens :
http://nginx.net/
http://www.rkblog.rk.edu.pl/w/p/pylons-and-nginx/

Lire plus

Un petit firewall cool

Ajouté le 02.08.2008 - 18:50  •  Commentaires (0)

- "Je veux un firewall, mais chais pas comment faire??"
- "Easy, iptables est là pour toi"



Certains vont de suite commenter et dire "iptables pue, c'est pas lisible".
je répondrai "retournez faire du ruby" :P

Pour revenir à nos moutons, voici en 2-3 lignes de quoi vous faire un firewall efficace et cool avec iptables :

#!/bin/bash

ipt=$(which iptables)

#### on commence par cleaner complètement les règles existantes
$ipt -F
$ipt -X
$ipt -P INPUT ACCEPT
$ipt -P OUTPUT ACCEPT

#### On laisse les connexions établies
$ipt -A INPUT -m state --state established,related -j ACCEPT

#### On va être cool et mettre 2-3 trucs en whitelist
$ipt -N SCAN_WHITELIST
$ipt -A SCAN_WHITELIST -m iprange --src-range xx.xx.xx.xx-yy.yy.yy.yy -j ACCEPT
$ipt -A SCAN_WHITELIST -s zz.zz.zz.zz -j ACCEPT

#### Filtre des packets : on veut du propre uniquement
$ipt -N badPacks
## on fait passer dans la whitelist...
$ipt -A badPacks -j SCAN_WHITELIST
$ipt -A badPacks -p tcp -m state --state NEW -m tcp ! --tcp-flags \
SYN,RST,ACK SYN -j REJECT --reject-with tcp-reset
$ipt -A badPacks -m state --state invalid -j REJECT
$ipt -A badPacks -j RETURN

#### De quoi ralentir les scan 
#### (radical contre la majorité des scriptkiddies)
$ipt -N scanning
## on fait passer dans la whitelist...
$ipt -A scanning -j SCAN_WHITELIST
$ipt -A scanning -i eth0 -m state --state NEW -m recent --set --name SCAN1
$ipt -A scanning -i eth0 -m state --state NEW -m recent --update \
--seconds 90 --hitcount 10 --rttl --name SCAN1 -j REJECT
$ipt -A scanning -i eth0 -m state --state NEW -m recent --set --name SCAN2
$ipt -A scanning -i eth0 -m state --state NEW -m recent --update \
--seconds 180 --hitcount 10 --rttl --name SCAN2 -j REJECT
$ipt -A scanning -j RETURN

#### Et on applique
$ipt -A INPUT -j scanning
$ipt -A INPUT -j badPacks

#### Tout ce qui vient de localhost : Ok
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A OUTPUT -o lo -j ACCEPT
$ipt -A INPUT -i 127.0.0.1 -j ACCEPT
$ipt -A OUTPUT -o 127.0.0.1 -j ACCEPT

#### On ouvre quelques ports
$ipt -A INPUT -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 53 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT


Et Voilà! un petit firewall monté en deux minutes. J'ai mis deux règles pour filtrer les scans, au cas où un petit malin voudrait monter les temps entre les requêtes. Mais en l'occurence, la majorité s'écrasent déjà au niveau de SCAN1...

Simple, efficace...

Enjoy :->

Lire plus

Swish-E

Ajouté le 03.04.2008 - 00:00  •  Commentaires (0)

Swish-e, ou LE petit moteur de recherche qui poutre tout!
Je m'explique :
j'ai reçu pour mission au boulot de leur fournir un moteur de recherche capable d'indexer un peu tout et n'importe quoi, comme par exemple :
1- des wiki "moin-moin"
2- le contenu d'une bdd
3- le contenu d'un serveur de fichiers (et de là, plein de formats comme pdf, od*, doc, xls, xml.... etc)

Bref, j'ai pas hésité une seconde, je me suis précipité sur swish-e, que je ne connaissais que de nom, mais qui me semblait prometteur.
Après 2-3 recherches sur leurs mailing list et dans leurs documentations, j'ai fini par créer le spider capable d'aller chercher les informations pour le système de ticketting Request Tracker :
#!/usr/bin/perl -w
use strict;

use DBI;
use Compress::Zlib;
use Time::Local;

my $dbh = DBI->connect( "dbi:Pg:dbname=rtdb;host=HOST","USER","PASS", { RaiseError => 1 } );

my $sth = $dbh->prepare("select ti.id,ti.subject,at.content,at.created from 
tickets ti, transactions tr, attachments at where ti.status <> 'deleted' and 
tr.objectid=ti.id and at.transactionid=tr.id and at.contenttype like 'text/%' and
 (tr.type= 'Comment' or tr.type = 'CommentEmailRecord' or tr.type = 'Create')");

$sth->execute();

while ( my( $id, $title,$ticket,$date) = $sth->fetchrow_array ) {

  my $uncompressed = uncompress( $ticket );
  my $unix_date = unixtime( $date );
  my $content = <<EOF;
        warn $unix_date;
        <html>
          <head>
            <title>
              RT - $title
            </title>
          </head>
          <body>
            $ticket
          </body>
        </html>
EOF
  my $length = length $content;
  print <<EOF;
Content-Length: $length
Last-Mtime: $unix_date
Path-Name: [url]http://myhost.com/Ticket/Display.html?id=$id[/url]
Document-Type: HTML

EOF
  print $content;

}

sub unixtime {
  my ( $y, $m, $dh ) = split /-/, shift;
  my ($d, $hms) = split / /, $dh;
  my ($h,$i,$s) = split /:/,$hms;
  return timelocal($s,$i,$h,$d,$m-1,$y-1900);
};

En gros, je génère à la volée des pages html simples avec le contenu des tickets, et je les balance à swish-e de cette manière :

swish-e -c swish.conf -S prog -i rt_spider.pl


Le contenu de swish.conf :
IndexFile ./indexes/rt.swish-e
DefaultContents HTML
StoreDescription HTML <body> 200000
MetaNames swishdocpath swishtitle
MinWordLimit 3


Pour ce qui est du fileserver, ce fut un peu plus compliqué :
contenu de swish.conf :
# replace /var/local/fileserver/commun with file://
ReplaceRules regex #/var/local/fileserver/commun/#/mnt/mountpoint/commun/#ig

IndexOnly .txt .htm .html .pdf .ods .odt .doc .xls .ppt .pps .sxw .sxc .sxg .xml
IndexDir /var/local/fileserver/commun/

FileRules filename contains /.$/
IndexFile /var/local/fileserver/search_engine/fileserver.swish-e
MinWordLimit 3


# XML files and associated
FileFilterMatch "/usr/bin/unzip" "-p %p content.xml" /.(sxw|sxc|sxg|ods|odt)$/i

IndexContents XML* .sxw .sxc .sxg .ods .odt .xml
StoreDescription XML* <text> 20000

IndexContents TXT* .xls .doc .pps .ppt .txt .pdf
StoreDescription TXT* 20000

IndexContents HTML* .html .htm
StoreDescription HTML* <body> 20000

# DOC files
FileFilterMatch "/usr/bin/catdoc" "-8 -a -b %p " /.(doc)$/i
# XLS files
FileFilterMatch "/usr/bin/xls2csv" "-x %p " /.(xls)$/i
# PPT/PPS
FileFilterMatch "/usr/bin/catppt" " %p " /.(ppt|pps)$/i
# PDF files
FileFilterMatch "/usr/bin/pdftotext" "-q %p - " /.(pdf)$/i


En gros, simple, efficace, mais faut connaitre un peu le truc quoi :)

Plus d'infos sur : http://swish-e.org/docs/swish-config.html

Enjoy :)

Lire plus

Screen - Commandes

Ajouté le 27.02.2008 - 00:00  •  Commentaires (0)

Petite intro sur les commandes vitales de screen:

screen -S name : lance une instance de screen appelé name
screen -rd name : force de détachement distant et reprend le screen "name"

Une fois dans screen :
C^a-c : crée un nouveau screen (create)
C^a-A : renommer le screen actuel
C^a-p : va au screen précédent (previous)
C^a-n : va au screen suivant (next)
C^a-space : va au screen suivant
C^a-d : détache le screen

C^a-K : tue le screen visible (kill)

C^a-S : partage screen en deux (horizontalement) (split)
C^a-tab : dans un screen partagé, se déplace entre les cases (sens des aiguilles de la montre)
C^a-shift-tab : dans un screen partagé, se déplace entre les cases (sens inverse des aiguilles de la montre)
C^a-Q : réinitialise screen en enlevant les splits

Dans le cadre de screen version CVS :
C^a-| : partage screen dans le sens vertical
C^a-tab : dans un screen partagé, se déplace entre les cases (sens des aiguilles de la montre)
C^a-shift-tab : dans un screen partagé, se déplace entre les cases (sens inverse des aiguilles de la montre)

Pour les screens "splittés", on peut redimensioner les cases :
C^a + : agrandir celle qui a le focus
C^a - : réduire celle qui a le focus

Il va de soi qu'on peut fort bien partager screen dans les deux sens.

Petit exemple de ~/.screenrc :
hardstatus alwayslastline "%{= kg}[%{+b kM}%d/%m/%Y,%c:%s%{-b kg}]-[%{+b kY}%l%{-b kg}] \
%{-b kG}%-Lw%{+b rY}%50>%n%f* %t%{-b kG}%+Lw%< %=%{-b kg}[%{+b kB}%H %{-b kg}]"
encoding UTF-8
log on
vbell off
screen zsh
screen zsh

1- met une ligne en bas de votre screen avec la liste des fenêtres, la date, l'heure, le load et le nom de l'hôte. !! doit être sur une seule ligne, sans le \ !!
2- force l'encoding en utf-8
3- fait en sorte que les commandes lancées dans le screen soient enregistrées
4- vire l'alerte visuelle
5/6- lance deux screen avec zsh loadé

Lire plus

Irssi - Split

Ajouté le 01.02.2008 - 00:00  •  Commentaires (0)

Après avoir vu chez un pote son irssi splitté en deux, j'ai pris mon irssi à moi pour tenter de trouver comment faire ce truc, et planter la fenêtre 1 dans la partie supérieure, tout en ayant les autres fenêtres de chat disponibles dans la partie inférieure.

Voici comment faire :
/window new split
alt-haut
/window size 10
alt-bas
/window 1
/window move up
/save
/layout save

Explications :
1- on crée une nouvelle fenêtre, en indiquant qu'on la split
2- on se déplace dans la fenêtre du haut
3- on resize la partie supérieure à 10 lignes (à vous de voir la taille que vous voulez)
4- on revient dans la fenêtre du bas
5- on focus sur la fenêtre 1
6- on déplace la-dite fenêtre dans la partie du haut
7- on sauve
8- on sauve le layout

et voilà!

Résultat :

Lire plus

T::P::HTML::BBCode

Ajouté le 13.01.2008 - 00:00  •  Commentaires (1)

Pour les bbcodes à venir :
ici

Vu que je compte permettre deux-trois libertés pour les commentaires (chose qui n'est pas encore faite pour le moment).

Lire plus