Source

container / libsmb.py

Full commit
#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
@namespace libsmb.py
@file libsmb.py

Sammlung von Funktionen, um bequem Benutzer für Samba anzulegen.
Die Benutzer haben keinen Zugang zum Linux-System.

@author Thorsten Weimann
@date 21.11.2007
@version 0.1
"""

import os
import shutil
from subprocess import Popen, PIPE
import sys
import tarfile

if os.getuid():
    print u'Das Programm muss als root ausgeführt werden.'
    sys.exit(1)

SMB_HOME_PATH = u'/home/samba/user'
SMB_PROFILE_PATH = u'/home/samba/profile'
SMB_DEL_BACKUP = u'/home/samba/user'
ENC = sys.getfilesystemencoding()


def check_username(uname):
    """Prüft ob der Benutzername schon vergeben ist.

    @param uname Benutzername
    """
    i = 0
    dirs = tuple(os.listdir(SMB_HOME_PATH))
    while True:
        if uname in dirs:
            i += 1
            uname = '%s_%s' % (uname, i)
        else:
            if i:
                return '%s_%s' % (uname, i)
            else:
                return uname

def smb_add_user(uname, passwd, group, prefix=''):
    """Legt einen Benutzer im Linux-System und am Samba-Server an.
    Der Benutzer kann sich nicht lokal anmelden.

    @param uname Benutzername
    @param passwd Passwort
    @param group Primäre Gruppe des neuen Benutzers
    @param prefix Optionales Prefix für den Benutzernamen

    @return Tatsächlich vergebener Benutzername
    """
    # Nur Benutzernamen in Kleinbuchstaben
    uname = uname.lower()
    # Wenn prefix definiert ist, dem Benutzernamen voranstellen
    if prefix:
        uname = u'%s_%s' % (prefix, uname)
    # Prüfen, ob es den Benutzer schon gibt
    user = check_username(uname)
    # Home Dir zusammenstellen
    userdir = os.path.join(SMB_HOME_PATH, user.lower())
    # Profilverzeichnis zusammenstellen
    profiledir = os.path.join(SMB_PROFILE_PATH, user.lower())
    # Befehl zum Anlegen des Benutzers am System
    add = u'useradd -g %s -s /bin/false -d %s %s' % (group, userdir, user)
    # Benutzer anlegen
    process = Popen(add.encode(ENC), stdout=PIPE)
    # Befehl zum Anlegen des Samba-Benutzers (Passwort: test)
    smb = u'printf "test\ntest\n" | smbpasswd -a -s %s' % user
    # Benutzer (Samba) anlegen
    process = Popen(smb.encode(ENC), stdout=PIPE)
    # Home Dir anlegen
    os.mkdir(userdir, 0700)
    # Profilverzeichnis anlegen
    os.mkdir(profiledir, 0700)
    # Besitzer von Home Dir festlegen
    udir = u'chown %s %s' % (user, userdir)
    process = Popen(udir.encode(ENC), stdout=PIPE)
    process.wait()
    # Besitzer des Profils festlegen
    pdir = u'chown %s %s' % (user, profiledir)
    process = Popen(pdir.encode(ENC), stdout=PIPE)
    # Tatsächlich angelegten Benutzernamen zurückgeben
    return user

def backup_user(uname, path_to_backup):
    """Sichert ein Verzeichnis (mit Unterverzeichnissen)."""
    tarname = u'%s/%s_bak.tar.bz2' % (SMB_DEL_BACKUP, uname.lower())
    tar = tarfile.TarFile(tarname.encode(ENC), 'w:bz2')
    tar.add(path_to_backup.encode(ENC))
    tar.close()

def smb_del_user(uname):
    """Löscht einen Benutzer aus der Samba-DB und vom System. Das Home Dir
    wird gepackt gesichert und dann gelöscht.
    """
    userdir = os.path.join(SMB_HOME_PATH, uname.lower())
    profiledir = os.path.join(SMB_PROFILE_PATH, uname.lower())
    if not os.path.isdir(userdir.encode(ENC)):
        return False
    smb = u'smbpasswd -x %s' % uname
    process = Popen(smb.encode(ENC), shell=True, stdout=PIPE)
    backup_user(uname, userdir)
    shutil.rmtree(userdir)
    shutil.rmtree(profiledir)
    system = u'userdel %s' % uname
    process = Popen(system.encode(ENC), shell=True, stdout=PIPE)
    process.wait()
    return True

if __name__ == '__main__':
    smb_add_user(u'Tweimann', 'GEhEIm', 'S-Admins')