149 lines
4.6 KiB
Python
149 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
###########################################################################
|
|
#
|
|
# Eole NG - 2010
|
|
# Copyright Pole de Competence Eole (Ministere Education - Academie Dijon)
|
|
# Licence CeCill http://www.cecill.info/licences/Licence_CeCILL_V2-fr.html
|
|
# eole@ac-dijon.fr
|
|
#
|
|
###########################################################################
|
|
"""
|
|
Librairie pour la gestion des mises à jour
|
|
"""
|
|
from os import system
|
|
from dateutil import parser
|
|
from pyeole.schedule import ManageSchedule, list_once, add_schedule, \
|
|
del_schedule, apply_schedules, DAY_TO_STRING
|
|
from pyeole.process import system_out
|
|
from .client import CreoleClient
|
|
|
|
from .i18n import _
|
|
|
|
# fichier d'information pour la mise à jour unique
|
|
DIFF_FILENAME = '/var/lib/eole/reports/maj-diff.txt'
|
|
|
|
#########################################
|
|
## Mise à jour hebdomadaire (maj_auto) ##
|
|
#########################################
|
|
|
|
client = CreoleClient()
|
|
|
|
def maj_enabled():
|
|
"""
|
|
vérifie si la mise à jour est activée ou non
|
|
"""
|
|
return client.get('/schedule/majauto/day') == 'weekly'
|
|
|
|
def get_maj_day():
|
|
"""
|
|
renvoie le jour et l'heure des mises à jour
|
|
par exemple :
|
|
{'hour': 5, 'minute': 4, 'weekday': 'vendredi'}
|
|
"""
|
|
shed = client.get('/schedule/schedule')
|
|
shed.pop('monthday')
|
|
shed['weekday'] = DAY_TO_STRING[shed['weekday']]
|
|
return shed
|
|
|
|
def enable_maj_auto():
|
|
"""
|
|
active la mise à jour hebdomadaire
|
|
"""
|
|
if not maj_enabled():
|
|
manage_schedule = ManageSchedule()
|
|
manage_schedule.add('majauto', 'weekly', 'post')
|
|
manage_schedule.save()
|
|
apply_schedules()
|
|
|
|
def disable_maj_auto():
|
|
"""
|
|
désactive la mise à jour hebdomadaire
|
|
"""
|
|
if maj_enabled():
|
|
manage_schedule = ManageSchedule()
|
|
manage_schedule.delete('majauto')
|
|
manage_schedule.save()
|
|
apply_schedules()
|
|
|
|
|
|
#########################################
|
|
## Mise à jour unique (schedule once) ##
|
|
#########################################
|
|
|
|
def maj_once_enabled():
|
|
"""
|
|
vérifie si la mise à jour est activée ou non
|
|
"""
|
|
return 'majauto' in list_once('post')
|
|
|
|
def enable_maj_once():
|
|
"""
|
|
active la mise à jour 'once'
|
|
"""
|
|
if not maj_once_enabled():
|
|
cancel_maj_differee()
|
|
add_schedule('once', 'post', 'majauto')
|
|
write_diff(True, 'ce soir')
|
|
return True
|
|
|
|
def disable_maj_once():
|
|
"""
|
|
désactive la mise à jour 'once'
|
|
"""
|
|
if maj_once_enabled():
|
|
del_schedule('once', 'post', 'majauto')
|
|
|
|
|
|
#########################################
|
|
## Mise à jour unique (maj_differee) ##
|
|
#########################################
|
|
|
|
def write_diff(enable, heure=None):
|
|
""" ecrit les informations du gestionnaire de mise a jour
|
|
dans le fichier de config de l'ead """
|
|
fic = file(DIFF_FILENAME, 'w')
|
|
if enable:
|
|
fic.write(_(u'An update is scheduled at {0}').format(heure))
|
|
else:
|
|
fic.write("")
|
|
fic.close()
|
|
|
|
def cancel_maj_differee():
|
|
"""
|
|
déprogramme les mises à jour differées
|
|
"""
|
|
disable_maj_once()
|
|
cmd = """for i in `grep -l "Maj-Auto" /var/spool/cron/atjobs/* 2>/dev/null`; do rm -f $i ; done;"""
|
|
system(cmd)
|
|
write_diff(False)
|
|
return True
|
|
|
|
def prog_maj_differee(heure, options='-R'):
|
|
"""
|
|
Programmation une mise à jour différée de quelques heures
|
|
Elle est lancée via la commande at pour l'utilisateur root
|
|
options : options à passer à Maj-Auto
|
|
"""
|
|
if heure == 'once':
|
|
return enable_maj_once()
|
|
# suppression des éventuelles autres maj différées
|
|
cancel_maj_differee()
|
|
stdin = "rm -f %s\nMaj-Auto %s\n" % (DIFF_FILENAME, options)
|
|
env_path = {'PATH': '/usr/share/eole:/usr/share/eole/sbin:/usr/local/sbin:'
|
|
'/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
|
|
'LC_ALL': 'fr_FR.UTF-8'}
|
|
ret = system_out(['/usr/bin/at', 'now', '+', str(heure), 'hours'], stdin=stdin, env=env_path)
|
|
if ret[0] != 0:
|
|
return False
|
|
scheduled_maj = " ".join(ret[2].splitlines()[1].split()[3:7])
|
|
scheduled_maj = parser.parse(scheduled_maj)
|
|
scheduled_day = "{0:0=2d}".format(scheduled_maj.day)
|
|
scheduled_month = "{0:0=2d}".format(scheduled_maj.month)
|
|
scheduled_year = "{0:0=2d}".format(scheduled_maj.year)
|
|
scheduled_hour = "{0:0=2d}".format(scheduled_maj.hour)
|
|
scheduled_minute = "{0:0=2d}".format(scheduled_maj.minute)
|
|
scheduled_maj = _(u'{0} the {1}').format(":".join((scheduled_hour, scheduled_minute)), \
|
|
"/".join((scheduled_day, scheduled_month, scheduled_year)))
|
|
write_diff(True , scheduled_maj)
|
|
return True
|