python

Un bot IRC à la CIA en python

date
9 / 5 / 2010
comments
0

Quand vous utilisez git à plusieurs et qu'en plus vous utilisez IRC pour en discuter, il peut être agréable d'avoir un bot qui informe le canal des commit sur le serveur. En particulier pour éviter des merge branch à tout va si on oublie de pull avant de commit. Il y a un service sur le net qui propose de tels bots IRC, c'est CIA.vc. Sauf que le service est à des fins de statistiques sur les logiciels libres et j'aime pas trop que ces données sortent du serveur même si elles sont publiques, puis leur bot on sait pas trop ce qu'il fait.

Donc je me suis mis à coder ce petit bot en python qui se connecte sur le canal IRC et attend des ordre via xmlrpc, cet ordre est lancé à chaque commit via un hooks sur le serveur git.

Pour ça, tout est dans la librairie python standard, sauf irclib et gitpython.

Le serveur (j'ai enlevé toutes les fonctionnalités qui ne rentrent pas dans le cadre de ce billet) :

#!/usr/bin/env python

import threading
import irclib

chan = '#staff'
nick = 'napalm0'
server = ('irc.philpep.org', 6667)
xmlrpcserver = ('localhost', 8888)

class PbotIRCClient(irclib.SimpleIRCClient):
    def on_welcome(self, s, e):
        s.join(chan)

# Classe de contrôle du bot par xmlrpc
class PbotControl:
        def commit(self, name, files, summary, base, id):
                # On formate la chaine de commit (Projet: Commiter (fichiers_touchés) sommaire_du_commit
                str = '%s: %s (\x0323%s\x03) %s' % (base, name, files, summary)
                pbot.connection.privmsg(chan, str)
                # Et un lien vers le commit diff
                pbot.connection.privmsg(chan, 'http://git.philpep.org/'+base+'.git/commit/?id='+id)

# Le serveur xmlrpc
class PbotXMLRPCServer(threading.Thread):
        def run(self):
                obj = PbotControl()
                srv = SimpleXMLRPCServer(xmlrpcserver, allow_none=True)
                srv.register_instance(obj)
                srv.serve_forever()

if __name__ == '__main__':
    pbot = PbotIRCClient()
    pbot.connect(server[0], server[1], nick)
    t = PbotXMLRPCServer()
    t.start()
    pbot.start()

Et le hooks à mettre dans le bare repo hooks/post-commit :

#!/usr/bin/env python

from sys import argv
from git import Repo
from xmlrpclib import ServerProxy

# Path vers le bare repo (peut être avec '.' ça marche aussi ?)
r = Repo('/usr/home/git/repositories/pblog2.git')
c = r.commit(argv[1])
s = ServerProxy('http://localhost:8888', allow_none=True)
# Liste des fichiers touchés par le commit
try:
        file = ' '.join([e.a_blob.path for e in c.diff(r, c.parents[0])])
except:
        file = ''
# Appel de la méthode xmlrpc
s.commit(c.author.name, file, c.summary, 'pblog2', argv[1])

Voilà, en quelques lignes de python vous avez un bot sympa et vous savez comment il fonctionne laissez parler votre imagination pour l'améliorer.

blog.philpep.org rune pblog2

date
2 / 5 / 2010
comments
0

Ça bouge beaucoup sur le git de pblog2 en ce moment. Même si on est encore loin d'avoir une version stable, il est pleinement utilisable et apporte son lot de nouveautés :

  • Interface d'administration très complète
  • Gestion de pages statiques
  • Possibilité de changer et de créer des nouveaux templates
  • Gestionnaire de médias (pour uploader quand on peut pas scp)
  • Post différés
  • Interface d'édition markdown convi en javascript
  • Installation en HTTP
  • Plus de fichier de configuration (tout se fait par HTTP)

Bender s'est mis à fond sur le javascript, pblog2 utilise maintenant jQuery qui permet de faire des petites choses sympa (bien entendu pblog2 restera au maximum utilisable sans javascript).

On peut maintenant créer son propre design (et donc choisir l'emplacement des divers éléments, nuage de tags, archives etc). Pour l'instant pblog2 est distribué avec deux designs (White-line et ouverta le petit nouveau que vous voyez sur ce blog).

Grand changement notable : pblog2, à contrario de pblog, utilise SQLAlchemy, ce qui permet d'avoir un code plus court, plus simple et en même temps plus optimisé. En plus pblog2 peut tourner maintenant sous toutes les bases de données gérés par sqlalchemy et il y en a un paquet.

Pour la migration de pblog1 vers pblog2 j'ai codé une petite fonction, vous avez juste à donner le chemin d'installation de pblog1 et pblog2 va importer tous vos posts/commentaires/tags.

Il reste beaucoup de travail pour corriger les quelques bugs et rendre l'interface plus cohérente, en attendant n'hésitez pas à filer un coup de main, donner des idées de ce que vous aimeriez bien voir sur pblog2.

git clone git://git.philpep.org/pblog2.git

Pblog 1.0 RELEASED

date
8 / 1 / 2010
comments
0

Je parlais il y a un mois d'une probable release de pblog. Et en cette belle nuit du 8 janvier 2010 c'est chose faite.

Les plus observateurs (ou ceux qui ont vraiment du temps à perdre) d'entre vous auront remarqué que le git et taggé 1.0 depuis fort longtemps. Mais on voulait faire durer un peu histoire de fixer quelques trucs, et surtout de documenter.

Quoi de neuf depuis la dernière fois, pas grand chose et beaucoup à la fois, des finitions des tests etc. Maintenant pblog a été testé avec succès (et non sans mal) sur trois serveurs web libres que sont Apache2 (pas testé avec le 1.3 à vous de jouer), Lighttpd et Nginx. Des exemples de configurations sont disponibles dans le code.

Comme toujours lisez bien le README, il y a un script d'installation rapide mais personnellement (et parce que c'est moi qui ai codé ce script d'install qui bug dans de nombreux cas) je vous recommande une installation manuelle (c'est expliqué dans le README).

La config est assez souple et permet de faire beaucoup de choses, lisez donc config.py.example et vous verrez c'est simple.

Quand je vous parlais de documentation c'est du lourd, pblog a maintenant un site dédié vous y trouverez le pourquoi du comment, et aussi une section sur notre wiki.

Bon voilà il ne me reste plus qu'à vous inviter à télécharger cette release et surtout n'hésitez pas à nous contacter (voir comment dans le README) pour des retours, ce qui vous plaît, ce que vous détestez etc.

Site de pblog

Vers pblog 2.0 ?

L'équipe est bien motivée (mais ça peut changer très vite ...) et pense déjà à pblog 2.0 , le développement prend une allure de totale réécriture, nous avons découvert les vertues de SQLAlchemy et du coup webpy ne servira plus des masses, on pense aller vers CherryPy qui ne fait que de la gestion URL et qui est plus robuste.

Pblog une release qui s'annonce

date
21 / 12 / 2009
comments
0

Comme vous savez, j'utilise maintenant un blog que j'ai codé avec mes petites mains et avec celles de Bender.

Ce blog était assez pauvre et buggé, jusqu'il y a quelques jours où nous avons décidés de faire une release sans trop de bugs et avec un peu plus de fonctionnalité. Ce blog tourne toujours tout en python, avec webpy, makotemplates, markdown, pygments, et une base de donnée SQL.

Voilà rapidement ce qui à changé :

  • MySQL était la seule DB utilisable, maintenant pblog tourne aussi avec sqlite3 (pour Postgresql les patchs seront grandement appréciés)

  • Nuage de tags (a votre droite)

  • Archives (aussi à votre droite)
  • liens (toujours et encore à votre droite)
  • Les <title> de pages sont plus explicites
  • les commentaires gèrent les erreurs
  • captcha (merci à rhaamo)
  • Le design (entièrement géré par Bender) est super classe, il évolue en fonction de pblog.
  • Une barre de recherche (en haut à droite)
  • Des pages quand il y a trop de résultats

links

  • Liens vers billet suivant et précédent

precsuiv

  • Niveau édition (post et commentaires), on peut maintenant faire des aperçus, c'est en javascript + XMLHttpRequest. Mais je vous rassure, le site est toujours testé sans javascript pour éviter qu'une fonction 'vitale' ne soit plus possible sans javascript. D'une manière générale on utilise javascript uniquement quand ça semble plus pertinent au niveau du code.

preview

Le code est pour l'instant en 1.0-rc3, on a fait en sorte que les images soient libre de droit, donc c'est tout libre (faut qu'on mette rapidement une licence d'ailleurs, mais ce sera sans doute une BSD).

Bref, ça sent la release pour bientôt, donc si vous avez un peu de temps trouvez des bugs (si si c'est facile je vous assure), envoyez vos patchs, demandes de features, "ce serait pas mieux si ...." etc.

Il n'y a pas assez de doc (seulement un petit README et des commentaires dans le fichier de conf), mais ça tourne sur du lighttpd/nginx/apache assez facilement.

Pour ceux qui chercheraient un blog super léger tout en C et surtout sans base de données je ne saurais trop vous conseiller Cblog.

Nouveau blog

date
13 / 9 / 2009
comments
0

J'ai du mal à utiliser un logiciel sans savoir exactement comment il marche. En l'occurrence j'utilisais dotclear, un moteur de blog en php, je l'utilisais de façon basique sans les nombreuses fonctionnalités à coté (dont je ne connais pas plus le sens que le nom).

Quand un jour Bender B. Rodriguez me montre un template CSS qui me plait bien, j'avais déjà l'idée de coder mon propre blog derrière la tête et c'est parti pour coder ce nouveau blog from scratch en python bien sûr avec webpy.

Maintenant quand j'ai un bug ou un problème je peux régler le problème rapidement.

Pour ceux qui veulent essayer chez eux mon blog, le code est disponible via git :

$ git clone git://git.philpep.org/pblog.git

Pblog est donc écris en python avec le framework minimaliste webpy, avec des templates générés par makotemplates, le générateur html est markdown couplé avec pygments pour la coloration syntaxique, la base de données utilisé est MySQL mais ça doit pas être trop dur de l'utiliser avec d'autres DB.

Toute contribution est bienvenue, c'est fort probable que le code comporte une maxi faille donc noble hacker si tu la trouve merci de m'en faire part avant de l'avoir exploité :-)

Si vous trouvez que les pages mettent un temps fou à se générer j'ai ma petite idée là dessus, en fait j'utilise des jails, donc nous avons :

  • lenine.philpep.org avec les sites en php et le serveur MySQL
  • marx.philpep.org avec les sites en python

Donc, les requettes sql ne se font pas en localhost et il y a des latences non négligeables (le code n'étant pas super optimisé ça amplifie le truc).

La solution que j'envisage (à moins de tout optimiser avec du cache), c'est d'utiliser une db plus adaptée à cette petite appli web toute simple : sqlite.