ajoute_chambre.py 5.33 KB
Newer Older
1
#! /usr/bin/env python
2
# -*- mode: python; coding: utf-8 -*-
3
#
dimino's avatar
dimino committed
4
# $Id: ajoute_chambre.py,v 1.2 2007-02-24 01:08:45 dimino Exp $
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#
# ajoute_chambre.py
# -----------------
#
# Copyright (C) February 23, 2007 Jeremie Dimino
# Email: <dimino@crans.org>
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
#
#
# Description:
28
#   Ajoute une chambre sur une prise libre (fait pour le batiment g à la base)
29 30 31 32 33 34
#

import sys, os

sys.path.append('/usr/scripts/gestion')

35 36
raise EnvironmentError("Ce script est *vieux*")

37 38 39
from annuaires import chbre_prises, reverse, bat_switchs
from affich_tools import cprint

40
# C'est juste pour le déboggage
41 42 43 44
__fichier_annuaire = "/usr/scripts/gestion/annuaires.py"


def assigne_chambre(prise, chbre):
45
    """ Assigne une chambre à une prise.
46

47
prise doit être de la forme bnnn[g/d], ou nnn[g/d], dans ce dernier cas le bâtiment est le g.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
"""

    if len(chbre) != 3 or not chbre.isdigit():
        return 'argument_invalide'

    bat = prise[0]

    if bat.isdigit():
        bat = 'g'
    else:
        bat = bat.lower()

        if bat not in bat_switchs:
            return 'batiment_inconnu'

        prise = prise[1:]

65
    if chbre_prises(bat).get(chbre):
66 67 68 69 70 71 72 73 74 75 76 77 78 79
        return 'chambre_deja_cablee'

#     dico = reverse(bat)
#     chambre = dico.get(prise)
#     if not chambre:
#         prise += '-'
#         chambre = dico.get(prise)

#     if not chambre:
#         return 'prise_inconnue'

#     if chambre != 'XXX':
#         return 'prise_utilisee'

80
    # Ajout effectif de la chambre sur la prise donnée
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

    annuaire = open(__fichier_annuaire, 'r')
    tampon = annuaire.read()
    annuaire.close()

    # Du parsing chiant...
    index = tampon.find('\nchbre_prises')
    if index == -1 or tampon[index + 13] not in [ ' ', '=' ]:
        return 'fichier_annuaire_invalide'

    index = tampon.find("'%s'" % (bat), index + 13)
    if index == -1:
        return 'fichier_annuaire_invalide'

    index = tampon.find("'XXX':'%s'" % (prise), index + 3)
    if index == -1:
dimino's avatar
dimino committed
97 98 99 100 101 102
        prise += '-'
        index = tampon.find("'XXX':'%s'" % (prise), index + 3)
        if index == -1:
            return 'prise_introuvable'

    annuaire = open(__fichier_annuaire, 'w')
103 104 105

    annuaire.write(tampon[:index])
    annuaire.write("'%s':'%s'" % (chbre, prise))
dimino's avatar
dimino committed
106
    annuaire.write(tampon[(index+8+len(prise)):])
107 108 109 110 111 112 113

    annuaire.close()

    user = os.getenv('SUDO_USER')
    if not user:
        user = os.getenv('USER') or "inconnu"

114 115
    # Vu que ça va être mis dans la ligne de commande éxécuter après,
    # autant être parano.
116 117 118 119 120
    for c in user:
        if not (c.isalnum or c in [ '-', '_' ]):
            user = "(uid=%d)" % (os.getuid())
            break

dimino's avatar
dimino committed
121
    os.system('cd /usr/scripts/gestion && /usr/bin/cvs commit %s \
122
-m "ajoute_chambre.py: chambre %s%s ajouté sur la prise %s%s par %s"' %
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
              (__fichier_annuaire, bat, chbre, bat, prise, user))


def __usage(err=''):
    """ Message d'erreur """

    if err : cprint(err, 'rouge')
    cprint(u"Tapez %s -h pour plus d'informations" % sys.argv[0].split('/')[-1].split('.')[0])
    sys.exit(2)


def __aide():
    """ Aide """

    cprint(u"""Usage: %s [OPTIONS] <prise> <chambre>
138
Ajoute une chambre sur une prise qui n'était pas encore utilisé.
139 140 141 142

Options:
  -h, --help                affiche cette aide

143 144 145
<prise> doit être de la forme bnnn ou nnn où:
- B est le batiment (g si non spécifié)
- nnn est le numéro de la prise
146

147
<chambre> doit être de la forme nnn
148

149
Rapporter toutes anomalies à <dimino@crans.org>.""" % sys.argv[0].split('/')[-1].split('.')[0])
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
    sys.exit(0)


if __name__ == '__main__':

    import getopt

    try:
        options, arg = getopt.getopt(sys.argv[1:], 'h', [ 'help' ])
    except getopt.error, msg:
        __usage(unicode(msg))

    for opt, val in options:
        if opt in [ '-h', '--help' ]:
            __aide()
        else:
            cprint(u'Option inconnue: %s' % opt, 'rouge')
            __usage()

    if len(arg) != 2:
        __usage()

    resultat = assigne_chambre(arg[0], arg[1])

    if resultat == 'argument_invalide':
        __usage(u"Format de la chambre invalide")

    elif resultat == 'chambre_deja_cablee':
178
        __usage(u"La chambre est déjà cablée")
179 180 181 182 183 184 185 186

    elif resultat == 'batiment_inconnu':
        __usage(u"Le batiment n'existe pas")

    elif resultat == 'prise_inconnue':
        __usage(u"La prise n'existe pas")

    elif resultat == 'prise_utilisee':
187
        __usage(u"La prise est déjà utilisée")
188 189

    elif resultat == 'prise_introuvable':
190 191
        cprint(u"""La prise n'a pas été trouvé dans l'annuaire.
Vérifiez que vous avez bien mis le numéro de prise et de chambre.""")
192 193

    elif resultat == 'fichier_annuaire_invalide':
194
        cprint(u"Le fichier d'annuaire n'est pas reconnu, envoyer un mail à dimino@crans.org")