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

# Copyright (C) 2008 Konstantin Baev <kipruss@altlinux.org>

import traceback
import sys, os, shutil, stat

base = '/etc/X11/xsession.user.d/'

options = ['-l', '--link', '-c', '--copy', '-d', '--delete']

help_text = """Usage %(progname)s <option> <user> [<command>]

<option> must be in next list:
-l, --link	create symlink of object (i.e. program, which must be executable)
-c, --copy	copy object (i.e. script)
-d, --delete	delete user file
-h, --help	show this text and exit

Examples:
%(progname)s -l natalie /usr/bin/oocalc
%(progname)s -c fred ./run
%(progname)s -d mike
"""

def print_help():
    print help_text %{'progname' : sys.argv[0]}

def delete(filename):
    if os.path.islink(filename):
        os.remove(filename)
        return 1
    elif os.path.isfile(filename):
        if os.access(filename, os.W_OK):
            os.remove(filename)
            return 1
        else:
            print 'Ошибка: нет прав на удаление файла пользователя'
            return 2
    elif os.path.isdir(filename):
        print 'Ошибка: вместо файла пользователя - директория'
        return 2
    else:
        return 0

if not os.path.isdir(base):
    print 'Ошибка: каталог ', base, ' не существует'
    sys.exit()

if not os.access(base, os.W_OK):
    print 'Ошибка: каталог ', base, ' недоступен для записи'
    sys.exit()

try:
    Qargs = len(sys.argv)
    if (Qargs not in (3, 4) or sys.argv[1] in ['-h', '--help', '-?']
                            or sys.argv[1] not in options):
        print_help()
    else:
        option = sys.argv[1]
        username = sys.argv[2]
        dest = os.path.join(base, username)
        if (Qargs == 4):
            command = sys.argv[3]

        if (Qargs == 4) and (option in ['-l','--link']):
            if delete(dest) < 2:
                if not os.path.isfile(command):
                    print ('Ошибка: указанный файл не существует'
                           ' или не является файлом')
                elif not os.access(command, os.X_OK):
                    print 'Ошибка: указанный файл не исполняемый'
                else:
                    os.symlink(os.path.abspath(command), dest)
            else:
                print ('Ошибка: файл пользователя cуществует.'
                       ' Не удалось создать симлинк')

        elif (Qargs == 4) and (option in ['-c','--copy']):
            if delete(dest) < 2:
                if not os.path.isfile(command):
                    print ('Ошибка: указанный файл не существует'
                           ' или не является файлом')
                else:
                    shutil.copy(command, dest)
                    os.chmod(dest, os.stat(dest).st_mode |
                             stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
                    # os.chmod(dest, os.stat(dest).st_mode | 0111)
            else:
                print ('Ошибка: файл пользователя cуществует.'
                       ' Не удалось скопировать файл')

        elif (Qargs == 3) and (option in ['-d','--delete']):
            if not delete(dest):
                print 'Предупреждение: файл пользователя отсутствует'

        else:
            print_help()

except Exception:
    print 'Ошибка!'
    traceback.print_exc()

