#! /usr/bin/env python
# -*- coding: iso8859-15 -*-

""" Script de lancement de mumudvb

Auteur : Frédéric Pauget
Licence : GPLv2
"""
import sys, getopt, os
from sat_base import NotRunning, CarteOqp

if os.getuid() == 0 :
    os.system("su tv -c %s" % " ".join(sys.argv))
    sys.exit(0)
elif os.getuid() != 101 :
    print "Ce programme doit être lancé par l'utilisateur tv (uid=101)"
    print "Astuce : sudo -u tv %s" % sys.argv[0]
    sys.exit(1)

def usage(erreur=None) :
    if erreur :
        print erreur
    print """Usage : 
  %(p)s start [<numero carte> [<transpondeur>]]: 
      démarrage le transpondeur donné sur la carte donnée, 
      si le transpondeur est omis démarre celui défini dans la conf
      si seul démarre des flux définis dans la conf
  %(p)s stop [numero carte] : 
      arrête tous les flux des cartes spécifiées, 
      si aucune carte est fournie arrète tous les flux
  %(p)s restart [numero carte] : 
      démarre tous les flux des cartes spécifiées
      si aucune carte est fournie redémarre tous les flux
      
Les options possibles sont :
    -d ou --debug : affiche tous les messages 
                    et ne daemonize pas mumudvb
    -v ou --verbose : affiche les messages de debuggage
    -q ou --quiet : affiche rien
    --timeout_accord=<nb> : nb de secondes données pour l'accord""" \
    % { 'p' : sys.argv[0].split('/')[-1] + ' [options]'}
    if not erreur : sys.exit(0)
    else : sys.exit(-1)

# Arguments
try :
    options, args = getopt.getopt(sys.argv[1:], 'hdvq', [ 'help', 'debug' , 'quiet' , 'verbose', 'timeout_accord='] )
except getopt.error, msg :
    sys.stderr.write('%s\n' % msg)
    sys.exit(255)

verbose = 1
timeout_accord = 20
for opt, val in options :
    if opt in [ '-v' , '--verbose' ] :
        verbose = 2
    elif opt in [ '-d' , '--debug' ] :
        verbose = 3
    elif opt == [ '-q' , '--quiet' ] :
        verbose = 0
    elif opt == '--timeout_accord' :
        try:
            timeout_accord = int(val)
        except:
            usage("Valeur de timeout_accord (%s) incorrecte" % val)
    elif opt in [ '-h', '--help' ] :
        usage()

if not args :
    usage('Argument requis')

elif args[0] not in [ 'start', 'stop' , 'restart' ] :
    usage("Commande %s incorrecte" % args[0])


# Carte fournie ?
try :
    cartes = [ int(args[1]) ]
except ValueError :
    usage("Argument %s incorrect (doit être le numéro de carte)." % args[1])
except :
    # Toutes les cartes
    cartes = range(6)
    if verbose > 2 :
        print "Mode debug non permis avec le lancement automatique"
        verbose = 3

if args[0] in  ( 'start', 'restart' ) :
    if cartes == range(6) :
        from sat_conf import conf
        cartes = conf
    else :
        transpondeur = args[2]
        from sat_base import *
        try :
            carte = eval(transpondeur)
            cartes = [ carte(cartes[0]) ] 
        except NameError:
            usage('Transpondeur %s inconnu.' % transpondeur)
    
    
elif args[0] == 'stop' :
    from sat_base import carte
    cartes = map(carte,cartes)
    
# On effectue l'opération demandée
for carte in cartes :
    carte.verbose = verbose
    carte.timeout_accord = timeout_accord
    try :
        eval('carte.%s()' % args[0])
    except CarteOqp :
        print "Carte %i occupée, abandon" % carte.card
    except NotRunning :
        # Pas réussi à lancer, TODO
        pass
        
