Gérer les dossiers de stockages de données

29 avril 2008

Voici une petite note à mon attention, directement inspirée de l’article de Jamis Buck et du code source de attachement_fu (un superbe plugin Rails pour l’upload de fichiers joints).

Dans une application qui stocke des fichiers uploadés par les utilisateurs, je souhaite que les fichiers soient organisés proprement et que chaque compte ait son propre dossier de premier niveau au lieu de tout mélanger + ou – en vrac.

Le principe de attachement_fu est celui-ci, avec par exemple un fichier ayant l’ID 12345 dans la base de données : 

/0001/2345/mon_fichier.jpg

NB : tout est relatif à “RAILS_ROOT/public/fichiers_joints”

Comme chaque fichier est lié à un enregistrement dans la base de données, il n’y a pas de risque d’écrasement, mais si je dois sortir rapidement tous les fichiers d’un compte par FTP, je suis très embêté.

J’aimerai faire ceci :

/compte_482/0001/2345/mon_fichier.jpg

Mais comme les fichiers sont eux-mêmes classés par “groupe” au sein d’un compte et que le nombre de fichiers ne devrait pas excéder quelques petits milliers par groupe (le plus souvent quelques centaines), je peux simplifier

/compte_482/groupe_047/12345/mon_fichier.jpg

La limite est donc à ~100 000 fichiers par groupe, ~1 000 groupes par compte et ~1 000 comptes.
Si ma petite appli atteint 5% de ces volumes je serais déjà assez riche.

Et puis après tout, si se limiter à 100 000 fichiers par groupe est trop réducteur, reprenons le découpage en sous-dossiers selon l’ID sur x chiffres.
Et si le nombre de groupes par client ou le nombre de client devait exploser, on y ferait de même.

Bon, passons au choses sérieuses ; coder la méthode qui va surclasser celle de attachement_fu (exemple avec des découpes à 6 chiffres).

# La méthode doit renvoyer un tableau où chaque élément
# est un segment du path à utiliser, à partir du dossier
# principal de stockage "RAILS_ROOT/public/fichiers_joints/".
# "attachment_path_id" est une méthode interne du plugin
def partitioned_path(*args)
  a = []
  a << ("%06d" % @client_id).scan(/.../)
  a << ("%06d" % @group_id).scan(/.../)
  a << ("%06d" % attachment_path_id).scan(/.../)
  a <<  args
end

Du code dans un post

23 avril 2008

Et oui, je me suis bien pris la tête à chercher un thème pour WordPress.com qui affiche correctement le code source.

Il suffisait de chercher dans la FAQ pour trouver.

En gros il suffit d’encadrer son code par \

(sans les \) et le tour est joué, en plus ça marche avec tous les thèmes (a priori).


Bannir des IP avec Ruby

23 avril 2008

J’ai souvent besoin de bannir des adresses IP pour la connexion SSH sur mes serveurs.

Au delà de la question du choix de ne pas (plus) utiliser d’outils à la Fail2ban, je propose un petit script qui permet de facilement ajouter des adresses dans la blacklist de iptables. Je le poste ici tant pour m’en souvenir que pour le partager en vue d’améliorations possibles.

Pourquoi Ruby ? Parce que je suis pas assez fort en bash (ou autre shell) pour faire le test de regexp avec, alors qu’avec Ruby, de toutes façons installé sur mes serveurs) j’y arrive assez rapidement.

#!/usr/bin/env ruby

IPT_CTL = "/sbin/iptables"

REGEXP = /\A(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)(?:\.(?:25[0-5]|(?:2[0-4]|1\d|[1-9])?\d)){3}\z/

def ban(ip)
  if ip.match(REGEXP)
    system IPT_CTL + " -A INPUT -s #{ip} -p tcp -m tcp --dport 22 -j DROP"
    puts "L'adresse IP '#{ip}' a été blacklistée."
  else
    puts "L'adresse IP '#{ip}' n'est pas valide, rien n'a été fait."
  end
end

if ARGV.size > 1
  ARGV.each {|ip| ban(ip)}
else
  ban(ARGV[0])
end

Il lui manque certainement quelques test d’erreurs, un test sur l’utilisateur qui l’exécute, … Je suis tout ouïe.


Retrouvez le PLUG à La Boate le 2 mai 2008

22 avril 2008

Le PLUG tient sa réunion mensuelle à La Bo[a]te le 2 mai 2008 à partir de 19h00, en cette période de jours fériés et de ponts où vous aurez l’esprit libre pour passer une bonne soirée.

C’est l’occasion, entre autre, de venir discuter des usages de l’informatique dans tous les domaines et de ce que les logiciels libres peuvent nous apporter.

Discussions informelles autour des traditionnelles pizzas/sodas/bières où se rencontrent des étudiants en informatiques, des développeurs et professionnels de l’informatique, ainsi que des débutants avides de conseils et coups de main.

C’est dans cette atmosphère confortable de La Boate que les canapés moëlleux et le bar équipé (et rempli par les participants) se marient avec la technologie (wifi ouvert, videoprojecteur, postes en libre service, …).

Tous les détails sont sur le site du PLUG et sur celui de La Bo[a]te