photo of devloop

devloop :: blog

sécurité informatique, programmation, Linux et plus encore

Subscribe to RSS feed

Posts tagged with "coding"

DVScreencast : un frontend à VLC et FFmpeg pour faire des screencast

, , , ...

Premier petit utilitaire de 2013, DVScreencast est une interface graphique codée en Python + GTK qui permet de réaliser des screencast (capture vidéo de votre écran) sous Linux à l'aide soit de VLC, soit de FFmpeg.

Le code est sous licence GPL 3 et récupérable à cette adresse.

Comme vous pouvez le voir, l'interface est très simple et se compose d'un panneau unique avec quelques boutons.
L'interface est très directive, vous choisissez le fichier vidéo où enregistrer le screencast (extension .mp4), si vous souhaitez enregistrer tout l'écran ou seulement une fenêtre puis vous lancer l'enregistrement.

En cas d'erreur, vous pouvez remettre à zéro (reset) vos choix. Les informations des boutons et leur fonctionnement changent au fur et à mesure de l'utilisation du logiciel (une fois une fenêtre choisie, le bouton de sélection de fenêtre devient grisé et affiche les coordonnées de la fenêtre concernée).

Une vidéo étant plus explicite qu'un long discours, une vidéo de démonstration est visible sur Vimeo.

La sélection du moteur d'enregistrement se fait en éditant le script (mettre soit vlc soit ffmpeg comme valeur pour "application").

Objective-C : implementation base64

,

Deux méthodes de classes, l'une décode une NSString encodée en base64 pour générer un objet NSData, l'autre prend un objet NSData pour l'encoder en base64 (dans un NSString).
Le code est fortement basé sur celui de base64.sf.net.

On commence par le décodage :

@interface NSData (Base64Decoding)
static const char cd64[]="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
static void decodeblock( unsigned char *in, unsigned char *out );

+ (NSData*)dataByDecodingBase64:(NSString*)encodedString ;
@end

@implementation NSData (Base64Decoding)
// decode 4 caracteres ASCII vers 3 octets
static void decodeblock( unsigned char *in, unsigned char *out )
{
    out[0] = (unsigned char) (in[0] << 2 | in[1] >> 4);
    out[1] = (unsigned char) (in[1] << 4 | in[2] >> 2);
    out[2] = (unsigned char) (((in[2] << 6) & 0xc0) | in[3]);
}

+ (NSData*)dataByDecodingBase64:(NSString*)encodedString
{
  NSMutableData * ret = [[NSMutableData alloc] init] ;
  int d = [encodedString length] / 4 ;
  int i, j;
  unsigned char buff_M[4] ;
  unsigned char buff_C[5] ;
  buff_C[4] = 0;
  buff_M[3] = 0;
  int v;
  int n;
  NSRange r = NSMakeRange(0, 4);

  for(i=0; i<d; i++)
  {
    [[encodedString substringWithRange:r] getCString:buff_C maxLength:5 encoding:NSUTF8StringEncoding] ;
    v = 0;
    n = 0;
    for(j=0; j<4; j++)
    {
      if(buff_C[j] == '=') n++;
      v = buff_C[j];
      v = ((v < 43 || v > 122) ? 0 : (int) cd64[ v - 43 ]);
      if(v) v = ((v == (int)'$') ? 0 : v - 61);
      buff_C[j] = (unsigned char) (v - 1);
    }
    decodeblock(buff_C, buff_M);
    if(n == 2)
      [ret appendBytes:buff_M length:1] ;
    else if(n == 1)
      [ret appendBytes:buff_M length:2] ;
    else
      [ret appendBytes:buff_M length:3] ;
    r.location += 4;
  }
  return [ret autorelease] ;
}
@end


et pour l'encodage :
@interface NSString (Base64Encoding)
static const char cb64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static void encodeblock( unsigned char *in, unsigned char *out, int len );

+ (NSString*)stringByEncodingBase64:(NSData*)data ;
@end

@implementation NSString (Base64Encoding)
// encode 3 octets vers 4 caracteres ASCII
static void encodeblock( unsigned char *in, unsigned char *out, int len )
{
    out[0] = (unsigned char) cb64[ (int)(in[0] >> 2) ];
    out[1] = (unsigned char) cb64[ (int)(((in[0] & 0x03) << 4) | ((in[1] & 0xf0) >> 4)) ];
    out[2] = (unsigned char) (len > 1 ? cb64[ (int)(((in[1] & 0x0f) << 2) | ((in[2] & 0xc0) >> 6)) ] : '=');
    out[3] = (unsigned char) (len > 2 ? cb64[ (int)(in[2] & 0x3f) ] : '=');
}

+ (NSString*)stringByEncodingBase64:(NSData*)data
{
  NSMutableString * ret = [[NSMutableString alloc] init] ;
  int d = [data length] / 3 ;
  int r = [data length] % 3 ;
  int i;
  unsigned char buff_C[5] ;
  unsigned char buff_M[4] ;
  NSRange range = NSMakeRange(0, 3);
  buff_M[3] = 0;
  buff_C[4] = 0;

  for(i=0; i<d; i++)
  {
    [data getBytes:buff_M range:range] ;
    encodeblock(buff_M, buff_C, 3);
    [ret appendString:[NSString stringWithUTF8String:buff_C]] ;
    range.location += 3;
  }
  if(r)
  {
    range.length = r;
    [data getBytes:buff_M range:range] ;
    memset(buff_C, 0, 4);
    encodeblock(buff_M, buff_C, r);
    [ret appendString:[NSString stringWithUTF8String:buff_C]] ;
  }
  return [ret autorelease] ;
}
@end

Objective-C : Unescape characters from a NSString

,

Voici un morceau de code permettant de dé-échapper (unescape) des caractères échappés (avec un antislash) sur une chaine de caractères Objective-C (NSString).
En plus des caractères de contrôle habituels (retour à la ligne, tabulation etc), cette méthode dé-échappe aussi les caractères en notation unicode (\uXXXX).
Si une erreur est rencontrée alors une exception est levée.

L'interface :
@interface NSString (Unescape)
- (NSString*)unescapedString ;
@end


Son implémentation :
@implementation NSString (Unescape)
- (NSString*)unescapedString
{
  NSMutableString * ret = [[NSMutableString alloc] initWithString:self] ;
  NSArray * escapedSequences = [NSArray arrayWithObjects:@"\\\\", @"\\t", @"\\n", @"\\r", @"\\\"", nil] ;
  NSArray * nonEscapedSequences = [NSArray arrayWithObjects:@"\\", @"\t", @"\n", @"\r", @"\"", nil] ;
  NSRange r ;
  NSString * seq ;
  NSString * error = nil ;
  int i ;

  // On de-echappe les sequences non-unicode
  for(i = 0; i < [escapedSequences count]; i++)
  {
    for(;;)
    {
      r = [ret rangeOfString:[escapedSequences objectAtIndex:i]] ;
      if(r.location == NSNotFound) break;
      [ret replaceCharactersInRange:r withString:[nonEscapedSequences objectAtIndex:i]] ;
    }
  }

  // On de-echappe les sequences unicode
  for(;;)
  {
    NSString * unicodeNumbers ;
    int code = 0;
    BOOL valid = YES ;
    int n;

    r = [ret rangeOfString:@"\\u"] ;
    if(r.location == NSNotFound) break;
    r.location += 2;
    r.length = 4;

    if(r.location + r.length > [ret length])
    {
      error = @"caractere unicode echappe invalide";
      break;
    }

    unicodeNumbers = [ret substringWithRange:r] ;
    for(n=0; n<4; n++)
    {
      unichar c = [unicodeNumbers characterAtIndex:n] ;
      if(!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f')))
      {
        valid = NO;
        error = @"caractere unicode echappe invalide";
        break;
      }
    }
    if(valid)
    {
      unichar c;
      [[NSScanner scannerWithString:unicodeNumbers] scanHexInt:&code] ;
      c = code;
      r.location -= 2;
      r.length = 6;
      [ret replaceCharactersInRange:r withString:[NSString stringWithCharacters:(const unichar*)&c length:1]] ;
    }
  }
  if(error)
  {
    [ret release] ;
    [NSException raise:NSGenericException format:@"unescapedString: %@", error] ;
  }
  else return [ret autorelease] ;
}
@end


Un exemple d'utilisation :
int main(int argc, char *argv[])
{
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init] ;
  NSString * str = @"Ceci est une \\\"chaine\\\".\\n\\tSeconde ligne c\\u00F4t\\u00E9 droit" ;
  NSLog(@"resultat : %@", [str unescapedString]);
  [pool release];
  return 0;
}


Le résultat affiché :
resultat : Ceci est une "chaine".
         Seconde ligne côté droit


Toute critique sur le code (erreurs, améliorations etc) est la bienvenue smile

Pthreads-win32 et fuite de mémoire sur le tas

Un petit post pour indiquer que récemment j'ai du me servir de la bibliothèque pthreads-win32 sous MingW.

Cette librairie de threads est tout simplement un wrapper pour les fonctions de l'API Windows (SetEvent, EnterCriticalSection, CreateSemaphore etc) permettant de travailler avec des fonctions de type pthread_mutex_lock, pthread_cond_signal etc.

C'est utile pour les programmeurs qui souhaitent porter rapidement du code threadé Linux vers Windows mais pour avoir bidouillé un peu avec cette librairie et malgré ce qu'en disent certain, j'ai constaté des fuites de mémoire sur le tas qui peuvent devenir très gênantes pour peu que le code ait beaucoup de travail à effectuer.

Vraisemblablement l'auteur n'a pas prévu certains cas d'utilisation de sa librairie (ce qui est difficilement envisageable avec ce type de wrapper) et des malloc (comprendre HeapAlloc, LocalAlloc... Windows oblige) doivent faire des allocations sur le heap sans jamais être libérés (free).

A raison d'environ 4ko perdus à chaque boucle de thread, on peut facilement mettre en rade une machine vieillissante...
La programmation de threads sous Windows est loin d'être désagréable et s'avérera moins agressive avec votre RAM p

VXcloud v2 : Mise à jour de l'antivirus sur le cloud pour Linux

, , , ...

Aujourd'hui j'ai pris le temps de mettre à jour mon script VXcloud dont la dernière version date de presque un an.

Parmi les changements, la correction d'un bug dans l'exploration récursive des dossiers et le passage à la nouvelle version de l'API VirusTotal.

Grâce à cette nouvelle API la soumission des hashs est plus rapide : 4 hashs MD5 sont envoyés dans une même requête HTTP smile

Aussi, pour chaque binaire détecté comme dangereux ou suspicieux par au moins un des antivirus, le taux de détection sera affiché (du style 25/40 antivirus détectent un danger).
Le taux de détection était déjà présent pour la base de données de la Team-Cymru mais non intégré pour VirusTotal.

Et enfin les résultats sont plus lisibles.

Vous pouvez télécharger cette nouvelle version ici.

Script : Dictionnaire anglais-russe avec accentuation

, , , ...

Je me suis mis au russe. J'avance tout doucement en autodidacte et il faut avouer que c'est pas toujours facile p

L'une des plus grande difficulté dans cette langue c'est l'accentuation des mots : déterminer où se trouve l'accent (stress).
Pour des langues comme l'espagnol ou le français c'est facile puisque les lettres sont marquées : accent grave, aigu, circonflexe, tilde...
Mais les russes ne marquent pas les accents, sauf avec deux mots différents ayant exactement la même orthographe.

Par exemple les mots château et verrou (de porte) s'écrivent tout les deux замок. Sauf que selon la place de l'accent, la prononciation est complètement différente.
Pour le premier on lira zamak et pour le second zamok.

Histoire de compliquer encore plus les choses, il n'y a (en dehors de quelques cas particuliers) pas de règles pour déterminer la place de l'accent dans un mot. Pour faire court : pour connaître l'emplacement de l'accent, il faut connaître le mot. Le russe est une langue très orale.

Pour déterminer la place des accents on peut s'armer d'un dictionnaire en dur. Ceux en ligne ne spécifiant pas toujours la place de l'accent.

Il y avait bien un site (http://www.biais.org/russian-stress/) qui permettait d'obtenir l'emplacement de l'accent mais il n'existe plus sad

Après des recherches j'ai trouvé un vieux dictionnaire russe sous licence GPL, la 7ème édition du dictionnaire V.K.Mueller qui utilise l'encodage KOI8-R.

J'ai écrit un script Python en2ru.py qui exploite ce dictionnaire et pour un mot donné en anglais donne sa correspondance en russe avec le marquage de l'accent.

Pour l'utiliser vous devez récupérer l'archive contenant le dico anglais-russe avec sa table de hashage. La décompresser et placer mon script dans le même répertoire.

On lance ensuite avec python en2ru.py mot en anglais.

Exemple :
python en2ru.py castle
castle :
1. _n. 1> зАмок; дворЕц 2> твердЫня; убЕжище 3> _шахм. ладьЯ; castles in the air (или in the sky, in Spain) воздУшные зАмки 2. _v. _шахм. рокировАть(ся)

Ici on remarque l'accent indiqué par la lettre en majuscule (A)

vxcloud : Un petit antivirus utilisant des services en ligne

, , ,

J'ai écris un script Python faisant office d'antivirus. Il scanne les fichiers, calcule leur hash md5 et utilise des services d'antivirus en ligne (sur le cloud) pour déterminer s'ils sont connus des antivirus.
Le fonctionnement pourrait donc être comparé à un Hitman Pro... en moins puissant bien sûr p

Les services utilisés sont ceux de la Team Cymru et de VirusTotal. Pour profiter du second il faut s'enregistrer sur leur site et récupérer une clé d'API à rajouter dans le code du script.
Le service de VirusTotal ne permet que de vérifier 20 hashs sur un laps de temps de 5 minutes. Inutile donc d'utiliser ce script comme un gros antivirus. Il peut toutefois être utile quand on a besoin de vérifier une poignée de fichiers sur lesquels on a un doute.

Pour utiliser le script il suffit de lui passer en argument les fichiers et répertoires à scanner. Par défaut le scan de répertoire n'est pas récursif (ne scanne que les fichiers du dossier mais pas les sous-dossiers) à moins que le répertoire soit précédé de l'option -r.

A titre d'exemmple voici le résultat d'un scan sur un répertoire contenant 3 fichiers malicieux :
        - vxcloud - devloop.users.sf.net / 2011 -
  == Team Cymru Hash check ==
../malware/malware.exe (b4f3f938ef77ae369c13fcc26006658b): First seen Sun Mar  8 11:03:09 2009, detection = 44%
../malware/unpacked.dll (70e2780a0ecce1ec7755397381bb5606): First seen Tue Apr 21 10:14:42 2009, detection = 44%
../malware/dll_malware.dll (1154378d77d4dd1eb83d40a3a0b6982f): First seen Sun Jul 13 12:17:00 2008, detection = 58%

  == VirusTotal Hash check ==
../malware/malware.exe (b4f3f938ef77ae369c13fcc26006658b): First seen 2009-03-05 05:14:46
McAfee+Artemis: Generic Dropper
CAT-QuickHeal: Win32.Rootkit.Podnuha.eg.3
McAfee: Generic Dropper
TheHacker: Trojan/Podnuha.ql
K7AntiVirus: Rootkit.Win32.Podnuha.ql
VirusBuster: Rootkit.Podnuha.EJ
NOD32: a variant of Win32/Rootkit.Podnuha.IR
Symantec: Trojan.Adclicker
Avast: Win32:Rootkit-gen
Kaspersky: Rootkit.Win32.Podnuha.ql
BitDefender: Rootkit.2141
Comodo: TrojWare.Win32.Rootkit.Podnuha.ql
F-Secure: Rootkit.Win32.Podnuha.ql
DrWeb: Trojan.MulDrop.10114
NOD32Beta: a variant of Win32/Rootkit.Podnuha.IR
AntiVir: TR/Dropper.Gen
Sophos: Mal/Generic-A
eTrust-Vet: Win32/Kvol!generic
Prevx1: High Risk Worm
a-squared: Trojan.Win32.BHO!IK
SecureWeb-Gateway: Trojan.Dropper.Gen
Microsoft: TrojanDropper:Win32/Boaxxe.D
GData: Rootkit.2141
AhnLab-V3: Win-Trojan/Podnuha.135168
VBA32: Trojan.MulDrop.10114
Sunbelt: Rootkit.Win32.Podnuha.ql
Ikarus: Trojan.Win32.BHO
Fortinet: PossibleThreat
AVG: BackDoor.Generic9.AZFP
More info: http://www.virustotal.com/file-scan/report.html?id=8fde4482b9721678fbd93678bd718d24f50f16a5bd520fdc38bac061f14c76ae-1236226486

../malware/unpacked.dll (70e2780a0ecce1ec7755397381bb5606): First seen 2008-07-11 00:26:17
VirusBuster: Rootkit.Podnuha.Gen.2
Microsoft: Trojan:Win32/Boaxxe.B
NOD32v2: probably a variant of Win32/Agent.NSG
Rising: Trojan.Clicker.Win32.Delf.mm
Ikarus: Virus.Trojan.Win32.Pakes.cdw
Panda: Suspicious file
More info: http://www.virustotal.com/file-scan/report.html?id=71004a4b02f905d6c182db5c0f4b9bc4cb32568a4979c3cd06f1998d5b172932-1215728777

../malware/dll_malware.dll (1154378d77d4dd1eb83d40a3a0b6982f): First seen 2008-08-05 13:51:21
VirusBuster: Rootkit.Podnuha.Gen.2
eSafe: Suspicious File
Kaspersky: Rootkit.Win32.Podnuha.ph
AntiVir: TR/ATRAPS.Gen
TrendMicro: PAK_Generic.005
eTrust-Vet: Win32/Kvol!generic
Prevx1: Fraudulent Security Program
Microsoft: Trojan:Win32/Boaxxe.B
GData: Rootkit.Win32.Podnuha.ph
NOD32v2: probably a variant of Win32/Agent.NSG
Rising: Trojan.Clicker.Win32.Delf.mm
Ikarus: Virus.Trojan.Win32.Pakes.cdw
Panda: Suspicious file
Webwasher-Gateway: Trojan.ATRAPS.Gen
More info: http://www.virustotal.com/file-scan/report.html?id=33088dd41a6fdeb0765939c7961793ad4eeb7d0d9cd9536dc94e883d8900148a-1217937081


Le script affiche parfois des erreurs de threads à la fin de son exécution. Avis à ceux qui voudraient me donner un coup de main pour ces quelques erreurs.

Télécharger vxcloud.py

Script graphique (GUI) pour EncFS

, , , ...

Pour que le script fonctionne vous devez créez un fichier baptisé .mounted à la racine du volume EncFS monté. Sa présence est testée par le script pour savoir si le volume EncFS est monté ou non.

Voici le code (variables à adapter à votre configuration) :
#!/bin/bash
# Le dossier qui contiendra les fichiers chiffres
VAULT_DIR=~/Vault

# Le dossier ou sera monte les fichiers accessibles en clair
MOUNT_DIR=~/Mount

# Le chemin de l'executable qui demandera le password (locate askpass)
ASK_PASS=/usr/lib64/ssh/ssh-askpass

if [ -f $MOUNT_DIR/.mounted ]
then
  fusermount -u $MOUNT_DIR
  xmessage "Le volume a ete demonte." -center -timeout 2
else
  encfs --extpass=$ASK_PASS $VAULT_DIR $MOUNT_DIR
  if [ -f $MOUNT_DIR/.mounted ]
  then
    xmessage "Le volume a ete monte avec succes." -center -timeout 2
  else
    xmessage "Mot de passe incorrect. Montage impossible." -center -timeout 2
  fi
fi


et un exemple (à adapter) de fichier .desktop pour lancer l'application (qui appellera gui-encfs.sh) :
[Desktop Entry]
Version=1.0
Type=Application
Name=EncFS
GenericName=Chiffrement de fichiers
Icon=/usr/share/icons/oxygen/64x64/apps/preferences-desktop-cryptography.png
Categories=Security
Exec=/home/devloop/bin/gui-encfs.sh
Terminal=false


Vous enregistrez par exemple ça sous le nom EncFS_GUI.desktop dans votre dossier Bureau et vous avez une icône permettant facilement de monter/démonter le volume smile

dvbackup : Archivez vos données en ligne de commande sous Linux

, , , ...

J'ai fait le tour des logiciels de sauvegarde sous Linux, j'ai croisé quelques solutions intéressantes comme Areca Backup ou Back In Time mais j'ai surtout découvert qu'aucun logiciel existant ne correspondait à mes besoins en terme de système de sauvegarde.

J'avais besoin d'un logiciel très simple, léger, permettant de créer des backups quand je le souhaite, loin des grosses solutions de sauvegarde incrémentale ou différentielle.

Je voulais donc un simple logiciel d'archivage mais je ne voulais pas avoir à aller rechercher les fichiers à archiver à chaque création de sauvegarde, surtout si c'est les même fichiers : Je voulais piocher au fur et à mesure les fichiers qui m'intéressent quand je le souhaite et qu'ils soient mémorisés pour la prochaine sauvegarde idea

Je voulais un système fonctionnant en ligne de commande pour ne pas avoir à cliquer dans une GUI et naviguer dans l'arborescence pour ajouter et retirer des fichiers zzz

Je voulais un système de gestion des fichiers proche de la ligne de commande de svn (commandes add, rm etc) mais avec une base de données centralisée (pas de fichiers cachés style .svn).

C'est comme ça que je me suis lancé dans la création du script Python dvbackup.py.

Le logiciel fonctionne grace à une base de données au format SQLite3 qui est placée dans ~/.config/dvbackup.rc sous Linux et Application Data\dvbackup.rc sous Windows.
Cette base de données est générée dès le premier lancement du programme et y conservera les fichiers que vous souhaitez sauvegarder avec leurs caractéristiques : date de dernière modification, taille du fichier et somme de contrôle md5 (cette dernière caractéristique n'est pas exploitée pour le moment mais tout de même stockée).

Pour indiquer que l'on souhaite sauvegarder un fichier, c'est très simple avec la commande add :
dvbackup.py add ~/.vimrc

Si on souhaite ajouter le contenu d'un répertoire de manière récursive, on fait de la même façon :
dvbackup.py add .gnupg/


On obtient la liste des fichiers à sauvegarder avec la commande list :
dvbackup.py list

/home/devloop/.vimrc
/home/devloop/.gnupg/pubring.gpg~
/home/devloop/.gnupg/secring.gpg
/home/devloop/.gnupg/gpg-agent.conf
/home/devloop/.gnupg/pubring.gpg
/home/devloop/.gnupg/gpgsm.conf
/home/devloop/.gnupg/agent.pid
/home/devloop/.gnupg/scdaemon.conf
/home/devloop/.gnupg/dirmngr.conf
/home/devloop/.gnupg/gpg.conf
/home/devloop/.gnupg/random_seed
/home/devloop/.gnupg/trustdb.gpg
/home/devloop/.gnupg/pubring.kbx
/home/devloop/.gnupg/agent.info


Pour retirer un fichier de la liste on utilise la commande del. Le chemin des fichiers pour chaque commande peut être aussi bien relatif que absolu. Ainsi si on est dans le dossier personnel il suffira de taper
dvbackup.py del .gnupg/agent.info


La commande check permet de lister les fichiers qui ont été modifiés depuis la dernière fois qu'ils ont été ajoutés à la base de données. dvbackup peut donc aussi être utilisé comme un logiciel de vérification d'intégrité ninja
Il faut toutefois tenir compte du fait que dvbackup ne gère que les fichiers et pas les répertoires. Il ne sera pas en mesure de voir si un fichier a été rajouté dans un répertoire. En revanche il signalera si un fichier a été supprimé.

La commande update met à jour les caractéristiques des fichiers (date, taille, hash md5). Là encore si un fichier est manquant un message est retourné.

Une fois que l'on est satisfait de sa base des fichiers à sauvegarder, on peut lancer l'archivage. Plusieurs commandes existent : tar, tarbz, targz et zip qui permettent de créer respectivement des archives en format .tar, .tar.bz2, .tar.gz et .zip. Il faut spécifier le nom du fichier de sortie. Par exemple :
dvbackup.py tarbz backup.tar.bz2


dvbackup offre des fonctionnalités supplémentaires comme le chiffrement/déchiffrement de fichiers en AES.
On utilisera la commande encrypt avec deux arguments : le nom du fichier à chiffrer suivi du nom de fichier qui sera généré. La commande decrypt fonctionne de la même façon. Exemple :
dvbackup.py encrypt backup.tar.bz2 backuptbz.enc

Un mot de passe vous sera demandé pour le chiffrement. Il sera hashé en SHA236 et le résultat utilisé pour le chiffrement AES du fichier.

La commande ip permet de vous donner votre adresse IP externe, telle que vous êtes vu depuis Internet.

La commande clear vide votre base de données des fichiers (les fichiers eux ne sont pas touchés). C'est une commande SQL DROP qui est soumise.

Pour terminer la commande help vous affiche l'ensemble des commandes disponibles que l'on a vu précédemment.

dvbackup utilise des codes de retour spécifique : 0 en cas de succès, 1 en cas de problème détecté (fichier manquant ou modifié) et 2 en cas d'erreur de l'utilisateur (comprendre mauvaise utilisation du logiciel et ses commandes). C'est pratique pour appeler le logiciel depuis un script.
L'affichage généré est très succinct et peut donc être réutilisé facilement par d'autres scripts (redirection pipe).

On peut imaginer une tache cron qui fait un check des fichiers, enregistre le résultat dans un journal, effectue un update, ajoute/supprime quelques fichiers de la base, créé une archive avec targz, la chiffre avec AES (encrypt) puis envoie le tout sur un serveur avec un autre logiciel.

Le script dvbackup.py (sous licence GNU GPL) est téléchargeable ici.

Librairie Python ascii85

, , ,

J'ai écrit une librairie Python permettant d'encoder et décoder des données au format ascii85.
Pour ceux qui ne savent pas ce que c'est, c'est un algo d'encodage en données binaires vers un format texte uniquement. L'avantage sur l'algo base64 c'est qu'il utilise un alphabet plus large et permet donc d'obtenir un résultat qui prend moins de place.

Il existe déjà une implémentation Python mais elle se base sur une extension C et une autre version qui ne s'occupe qe du décodage.
Ici j'ai implémenté à la fois l'encodage et le décodage et c'est du Python à 100%.

Télécharger ascii85.py
J'ai aussi mis le code sur un pastebin.