HLab

Julien Hautefeuille

Importer des utilisateurs en masse dans un NAS Synology avec Python

Dans le milieu professionnel, il est courant de devoir importer en masse des utilisateurs dans un système d’exploitation.

Les NAS Synology sont des systèmes particuliers dans le sens où l’administration courante du système se réalise grâce à des d’interfaces graphiques dans un navigateur internet.

Dans la partie “Gestion des utilisateurs”, il est possible d’importer en masse des utilisateurs à partir d’un fichier tabulaire CSV (bouton “Créer”).

On nous fournit donc un fichier CSV comportant des données utilisateurs.

L’objectif est de transformer le fichier source en un fichier de destination formaté selon les critères attendus par le NAS.

Le script suivant illustrera la méthode. Le script est facilement compréhensible et trivial.

L’intérêt ici est de montrer l’utilité de Python dans des tâches courantes d’administration système.

Le fichier CSV source :

Séverine,RIGHT,severine.right@freesurf.fr,"Equipe1, commun",,Interne

Le fichier CSV de destination que l’on souhaite obtenir :

severine.right  97UW9J37XX  Equipe1, commun severine.right@freesurf.fr

On pourra remarquer que certains champs ont été coupés (adresse email), d’autres ont été abandonnés (“Interne”) et d’autres créés (mot de passe). La balise de formatage a aussi été changée pour passer d’une virgule à une tabulation. Ce formatage est attendu par le NAS Synology.

Le script de modification :

#!/usr/bin/env python3.4
# -*- coding: utf-8 -*-

__title__ = 'convert'
__version__ = '0.1'
__author__ = 'julien@hautefeuille.eu'
__licence__ = 'BSD'

import csv

data = set()

def generate_temp_password(length):
    if not isinstance(length, int) or length < 8:
        raise ValueError("temp password must have positive length")

    chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
    from os import urandom
    return "".join([chars[c % len(chars)] for c in urandom(length)])

def read_csv(f):
    with open(f, 'r') as csvfile:
        inreader = csv.reader(csvfile, delimiter=',', quotechar='"')
        for row in inreader:            
            data.add((row[2].split("@")[0], generate_temp_password(10), row[3], row[2]))

def write_csv(f, d):
    with open(f, 'w') as csvfile:
        outwriter = csv.writer(csvfile, delimiter='\t', quotechar="'", quoting=csv.QUOTE_MINIMAL)
        for e in d:
            outwriter.writerow(e)

if __name__ == '__main__':
    read_csv('users.csv')

    for e in data:
        print(e)

    write_csv('synousers.csv', data)

Le script ne présente aucune difficulté de compréhension. Néanmoins, on peut souligner l’utilisation d’un set() qui permet de supprimer les éventuels doublons dans le fichier source et l’utilisation d’une fonction de génération basique de mots de passe. Dans une utilisation plus efficace, on pourrait se passer de l’utilisation du set() data et concaténer les opérations de lecture et d’écriture dans la même fonction. L’utilisation d’une variable intermédiaire et le découpage de fonction ont davantage un objectif pédagogique.