Les documents proposés sur ce site ont été testés et validés par différentes installations mais ne sauraient engager la responsabilité de la société en cas de problèmes ou de pertes de données si les modifications n'ont pas été réalisées par la société elle même.

Créer un addon pour ftpupinfo

FTPupinfo permet d'ajouter des addons qui permettront de créer des pages complémentaires aux rapports générés par le programme.

Ces addons sont écrits en python, mais le programme newaddon.py vous permet de générer un squelette qu'il suffira de compléter.

Exemple d'un nouvel addon

Créer l'addon

Nous allons créer un addon qui va créer une archive d'un répertoire, le déplacer dans un autre et afficher la liste des documents compressés de ce dernier.

Allez dans le dossier de FTPupinfo, puis lancez le programme d'ajout d'addon en lui donnant un nom (dans l'exemple, il s'appellera sauvegarde)

cd /usr/share/ftpupinfo
python newaddon.py sauvegarde

Vous obtenez quelque chose comme ceci:

MoonLight
skins/MoonLight/screen_sauvegarde.css
Création du fichier skins/MoonLight/screen_sauvegarde.css
stef
skins/stef/screen_sauvegarde.css
Création du fichier skins/stef/screen_sauvegarde.css

Le programme a généré un nouvel addon (dans /usr/share/ftpupinfo/addons/sauvegarde/py), un nouveau fichier de configuration (/etc/ftpupinfo/addons/sauvegarde.conf) et un fichier css de mise en forme de la page générée dans chacun des dossiers de thème (/usr/share/ftpupinfo/skins/stef/screen_sauvegarde.css)

Activer l'addon

L'addon généré ne fait rien pour l'instant. La première chose consiste à l'activer, afin qu'il puisse être lancé. Modifiez le fichier de configuration de l'addon (/etc/ftpupinfo/addons/sauvegarde.conf) pour qu'il soit lancé par FTPupinfo

[general]
critical="true"
activated = true

Les deux valeurs doivent être à “True” (avec ou sans guillemets).

Modifier le code de l'addon

Le code produit dans /usr/share/ftpupinfo/addons/sauvegarde/py n'effectue aucune action. Nous voulons qu'il en fasse 2:

  • Compresser un dossier (et le déplacer, et toutes les actions que vous souhaitez)
  • Générer une page html

Voici le code actuel:

# -*- coding: utf-8 -*-
# Auteur : Manuel BERROCAL <manu.berrocal@absolacom.com>
# Date : 
# Description :
"""
Description de l'addon # FIXME
"""

import sys, os
directory = "/usr/share/ftpupinfo/modules"
sys.path.append(directory)

from blochtml import BlocHtml
from blochtml import Rubrique
import infossystem
import dict4ini
from blochtml import Rubrique
from colors import MyColors as col
import ftpupinfo_fonc


class Sauvegarde:
    def __init__(self, skin = "stef"):
        self.skin = skin
        self.name = "sauvegarde"
        self.nead_php = False
        self.outputfile = "%s.html" % self.name
        self.comment = "sauvegarde"
        self.image = "skins/%s/images/%s.png" % (self.skin, self.name)

    def link(self):
        """ return link to file """
        self.link = '<div id="button_%s" class="menu_item">\n' % self.name
        self.link += '<a href="%s" title="%s">\n' % (self.outputfile, self.comment)
        self.link += '<img id="%s" alt="%s" src="%s" class="img_menu" />\n' % (self.name, self.name, self.image)
        self.link += '</a>\n</div>\n'
        return self.link


   def bloc(self, path):
        """ return bloc to write """

        print "++ Addon: [bloc_sauvegarde] DESCRIPTION"
        bloc_ = BlocHtml()
        bloc_.classebloc = "bloc"
        bloc_.title = "TITLE"
        bloc_.comment = "COMMENT"
        bloc_.content = ''

        # ajouter le code ici



        bloc_.ident = "sauvegardebloc"

        return bloc_.show()

    def writebloc(self, addons_header = "", footer = None, path = None):
        """
        Write content to file
        """
        lastwr = open(os.path.join(path, self.outputfile) , 'w')
        lastwr.write(addons_header)
        bloc_ = self.bloc(path)
        lastwr.write(bloc_)
        lastwr.write(footer)
        lastwr.close()


def need_action():
    """
    indicate that need (1) or not (0) to do preliminary action
    """
    return 0

def do_action(path):
    """
    do preliminary action
    """
    return

if __name__ == '__main__':
    do_action()

FTPupinfo va demander à l'addon s'il doit effectuer une action préliminaire à son fonctionnement. C'est dans la partie suivante qu'il effectue cette action:

def need_action():
    """
    indicate that need (1) or not (0) to do preliminary action
    """
    return 0

Si le retour est 0, aucune action n'est nécessaire, FTPupinfo appellera la création de la page en temps voulu. Si le retour est 1, FTPupinfo lancera alors l'action voulue. Comme nous désirons effectuer une action (l'archive), il faut mettre 1 dans ce code:

def need_action():
    """
    indicate that need (1) or not (0) to do preliminary action
    """
    return 1

Maintenant que FTPupinfo sait qu'il doit effectuer une action, il va lancer la fonction do_action. C'est donc dans celle ci que nous allons mettre le code de l'action à effectuer avant de générer la page HTML. Dans notre cas, nous voulons archiver le dossier /var/log/apache2 et copier l'archive prévue dans le dossier de FTPupinfo.

FTPupinfo va copier ses fichiers dans différents répertoires selon son paramétrage:

  1. si l'option report est à last: tous les fichiers produits par FTPupinfo se trouveront dans /var/spool/ftpupinfo/
  2. si l'option report est à one: tous les fichiers produits par FTPupinfo se trouveront dans /var/spool/ftpupinfo/date_du_jour
  3. si l'option report est à all: tous les fichiers produits par FTPupinfo se trouveront dans /var/spool/ftpupinfo/date_du_jour/heure_minute/

Le nom du dossier dans lequel copier les fichiers est transmis dans les addons par la variable path qu'il suffit d'utiliser.

La partie de code concernant l'action à effectuer est celle ci:

def do_action(path):
    """
    do preliminary action
    """
    return

Si le résultat de la fonction need_action est 0, cette partie est ignorée par le programme (sauf si elle possède une erreur de syntaxe)

Nous la modifions ainsi:

def do_action(path):
    """
    do preliminary action
    """
    # zip du dossier/var/log/apache2
    cmd = "tar zcvf archive.tar.gz /var/log/apache2" # commande à effectuer en bash
    os.system(cmd) # lancement par le système (bash) de la commande

    # Création du dossier de destination
    dir_dest = "%s/archives/" % (path)
    cmd2 = "mkdir -p " % (dir_dest)
    os.system(cmd2)

    # déplacement du dossier dans le répertoire
    cmd2 = "mv archive.tar.gz %s" % (dir_dest)
    os.system(cmd2)


    return

Les actions à effectuer sont ici volontairement simplistes. Python sait effectuer, grâce à ses modules, beaucoup d'actions sans passer par la commande os.system mais cela permet de créer des actions simples sans connaitre python.

“%s” est une variable string qui sera remplacée par la variable qui suit le “%” après les guillemets. Exemple:

var = “super”

print “python est %s” % (var)

produira la sortie “python est super”

Pour mettre plusieurs variables:

var = “super”

var2 = “facile à utiliser”

print “python est %s et %s” % (var, var2)

Générer la page HTML

FTPupinfo va ensuite générer la page HTML de l'addon lorsque toutes les actions auront été effectuées.

La page sera générée par la fonction bloc. La mise en forme de base est déjà en place, il ne vous reste plus qu'à remplir le contenu de la page, qui doit être dans la variable bloc_.content.

Dans notre exemple, nous effectuons un listage du dossier et nous ajoutons le contenu à la variable:

   def bloc(self, path):
        """ return bloc to write """

        print "++ Addon: [bloc_sauvegarde] DESCRIPTION"
        bloc_ = BlocHtml()
        bloc_.classebloc = "bloc"
        bloc_.title = "TITLE"
        bloc_.comment = "COMMENT"
        bloc_.content = ''

        cmd = "ls -lai %s/sauvegarde/" % path
        retour = os.popen(cmd).readlines()
        for ligne in retour:
            bloc_.content += ligne + "<br />"



        bloc_.ident = "sauvegardebloc"

        return bloc_.show()

Il ne reste plus qu'à lancer FTPupinfo pour tester le module

python est un langage simple et rapide à apprendre. La difficulté n'est pas de trouver la syntaxe d'écriture, mais de savoir décomposer les opérations de programmation. En quelques heures, il est possible d'écrire des programmes évolués, voire même avec interface graphique. Il est toujours intéressant de s'y pencher.

Vous aurez noté qu'avec cet exemple, il n'y aura toujours qu'une seule archive dans le dossier. C'est un exemple. Consultez les addons existants pour vous inspirer du code (commenté) présent dans ceux ci.

Erreurs d'importation

Lors du lancement de FTPupinfo, si votre module a un problème quelconque, FTPupinfo ne le lancera pas et vous signalera un laconique et rouge “error importing addon: sauvegarde”. Il peut l'afficher de une à 3 fois, selon l'endroit où se situent les erreurs.

Vous pouvez utiliser le programme /usr/share/ftpupinfo/debug_addon.py pour vous aider à trouver le problème.

Éditez le programme /usr/share/ftpupinfo/debug_addon.py pour modifier le nom du module à débugger (ligne 33) et lancez le en ligne de commande. Les pages générées le sont dans le dossier /tmp/ftpupinfo et les messages de la console devraient vous aider à débugguer votre addon.

L'erreur d'importation peut provenir de 2 choses:

  1. Vous avez une erreur de syntaxe dans votre code,
  2. Vous demandez une chose impossible et/ou cela provoque une erreur (listage d'un dossier non existant, copie d'un fichier sur un emplacement ou il existe déjà, …)

Corrigez l'erreur, et votre module devrait pouvoir s'importer.


Outils personnels