Tym-Project

From: SUPINFO
To: Tous
Subject: IT

Planifier Librement L'allumage Et L'éteignage D'un Nas Readynas Ultra 2

Oh, un post !

Mon NAS est formidable, il sait faire plein de choses géniales, mais la meilleure reste la possibilité de s’allumer et s’éteindre automatiquement via un planning (basique) déterminé à l’avance.

Couplée à une prise maitre-esclave, mon NAS devient alors le big boss de toute ma zone multimedia et me permet facilement d’éteindre tout ce petit monde pendant la nuit et de rallumer le tout le matin au réveil.

Bon, ça c’était la théorie. En pratique je me suis rapidement trouvé très très limité par la simplicité du planning natif du NAS. Impossible par exemple de prévoir un allumage de 7h à 8h30, puis de 18h à 23h : uniquement de de 7h à 23H… ce qui n’est pas très utile dans mon cas car je n’ai pas de chat qui utilise le net en mon absence.

Mais comment faire alors pour améliorer cette fonctionnalité ? Spoiler, c’est possible et expliqué ci-après !

Mais où se cachent les scripts ?

Je l’ai indiqué par le passé, mais le ReadyNAS c’est simplement une Debian avec une interface Web un peu sexy. Qui dit Debian dit Linux… et donc le planning de mise en route/éteignage vu plus haut a forcément un fichier de configuration quelque part !

nas:~# find / -name power* | grep -v devices
/frontview/ui/resource/images/Device/power.gif
/sbin/poweroff
/sys/bus/acpi/drivers/power
/sys/class/power_supply
/sys/power
/etc/cron.d/poweroff
/etc/frontview/poweron_timer
/etc/init.d/powerdown
/etc/acpi/events/powerbtn
/etc/acpi/powerbtn
/proc/acpi/button/power
/proc/sys/kernel/poweroff_cmd

On commence par le plus évident, /etc/cron.d/poweroff :

nas:~# cat /etc/cron.d/poweroff
 0  0 * *  0 root  /frontview/bin/autopoweroff &> /dev/null
 0  9 * *  1 root  /frontview/bin/autopoweroff &> /dev/null
 0  9 * *  2 root  /frontview/bin/autopoweroff &> /dev/null
 0  9 * *  3 root  /frontview/bin/autopoweroff &> /dev/null
 0  9 * *  4 root  /frontview/bin/autopoweroff &> /dev/null
 0  9 * *  5 root  /frontview/bin/autopoweroff &> /dev/null
 0  0 * *  6 root  /frontview/bin/autopoweroff &> /dev/null

Pas de grosse difficulté ici, si je veux modifier le planning d’éteignage (“poweroff”), il me suffit d’ajouter des lignes dans ce fichier. Pour la syntaxe exacte, Wikipedia est ton ami.

Bon et le “poweron” alors ?? On creuse un peu, on regarde les fichier de la liste plus haut… et…

nas:~# cat /etc/frontview/poweron_timer
sun 08:00
mon 06:30
tue 06:30
wed 06:30
thu 06:30
fri 06:30
sat 08:00

Bingo dans /etc/frontview/poweron_timer ! La syntaxe est on ne peut plus simple, et après quelques tests tout fonctionne comme prévu. Je peux ajouter autant de lignes dans les fichiers de config et mon NAS fait la lambada de l’auto-allumage !

“Mais c’est chiiiiiant à configurer !”

Bon au début c’est bien, puis je me suis rendu compte que cette config n’a rien de vraiment ergonomique. Je m’étais créé un petit Google Spredsheet pour suivre le planning de ma config… et soudain j’ai eu une révalation ! Si je bidouillait un script qui irait chercher l’information directement dans le Google Doc pour ensuite l’appliquer comme un grand sur la config du NAS !

C’est donc que ce que j’ai fait.

Oh, je peux vous expliquer en effet !

Pour commencer, voici à quoi ressemble mon planning :

Je vous passe les détails sur la mise en forme automatique ou les listes de choix, mais le principe général est que je travaille sur des plages de 30 minutes du Lundi au Dimanche.

Pour consulter ce document dans un script j’ai décidé d’utiliser Python, surtout pour la présence d’une librairie bien pratique : gspread. Bien pratique surtout pour sa simplicité… car l’API Google est une vrai catastrophe en terme d’ergonomie.

#!/usr/bin/python2.6

import gspread

# Correspondance des jours pour le crontab et pour la config poweroff
day_to_off={'Lundi':1,'Mardi':2,'Mercredi':3,'Jeudi':4,'Vendredi':5,'Samedi':6,'Dimanche':0}
day_to_on={'Lundi':'mon','Mardi':'tue','Mercredi':'wed','Jeudi':'thu','Vendredi':'fri','Samedi':'sat','Dimanche':'sun'}

gc= gspread.login('monmail@gmail.com','monmotdepasse')
wks=gc.open_by_key('clé de la spreadsheet Google Doc').get_worksheet(0)

#On stocke le contenu dans une variable pour accélérer les traitements à venir
full=wks.get_all_values()
full_=[]


for col in range (1,8):
    for line in range(1,49):
            full_.append([full[0][col],full[line][0],full[line][col]])

full=full_
detail=[]


day=full[0][0]
time=full[0][1]
state=full[0][2]
prev=[day,time,state]

for row in range(1,len(full)-1):
    day=full[row][0]
    time=full[row][1]
    state=full[row][2]
    current=[day,time,state]
    if current[2]==prev[2]:
        prev=current
    else:
        detail.append(current)
        prev=current

cron=open('/etc/cron.d/poweroff','w')
poweron=open('/etc/frontview/poweron_timer','w')        

for row in detail:
    if row[2]=="On":
        #print(day_to_on[row[0]]+' '+row[1])
        poweron.write(day_to_on[row[0]]+' '+row[1]+'\n')
    if row[2]=="Off":
        #print(' '+str(int(row[1][3:5]))+' '+str(int(row[1][0:2]))+' * * '+str(day_to_off[row[0]])+' root  /frontview/bin/autopoweroff &> /dev/null')
        cron.write(' '+str(int(row[1][3:5]))+' '+str(int(row[1][0:2]))+' * * '+str(day_to_off[row[0]])+' root  /frontview/bin/autopoweroff &> /dev/null\n')

Ce petit bijou de programmation (si si, j’assume !) va donc interroger le Google Doc, organiser le tout pour déterminer les plages On et Off pour ensuite mettre à jours les fichiers de configuration correspondants.

Il suffit ensuite de programmer un cron pour exécuter le script à intervalles réguliers, et le tour est joué !

nas:~# crontab -l
# m h    dom    mon dow command
*/5 *   *   *   *   /root/auto_on_off_calendar.py &

Mon NAS, c’est pas un ReadyNAS, ton truc ça sert à rien !

Oh oh oh, on se calme les enfants… J’ai indiqué plus haut que mon NAS c’est du Linux dans le dedans, alors Google est ton ami, et peut-être qu’une solution existe. Bonne expérimentation !

Comments