source: n4d-shutdowner-server/trunk/fuentes/install-files/usr/share/n4d/python-plugins/ShutdownerManager.py @ 6931

Last change on this file since 6931 was 6931, checked in by hectorgh, 18 months ago

lliurex-shutdowner-thinclients cron file should only exist if automatic shutdown is enabled

File size: 4.8 KB
Line 
1
2import sys
3import os
4import xmlrpclib
5import copy
6import time
7
8class ShutdownerManager:
9       
10
11        def __init__(self):
12               
13                self.cron_file="/etc/cron.d/lliurex-shutdowner"
14                self.thinclient_cron_file="/etc/cron.d/lliurex-shutdowner-thinclients"
15               
16               
17        #def init
18
19       
20        def startup(self,options):
21               
22                self.internal_variable=copy.deepcopy(objects["VariablesManager"].get_variable("SHUTDOWNER"))
23               
24                if self.internal_variable==None:
25                        try:
26
27                                self.initialize_variable()
28                                objects["VariablesManager"].add_variable("SHUTDOWNER",copy.deepcopy(self.internal_variable),"","Shutdowner internal variable","lliurex-shutdowner")
29                               
30                        except Exception as e:
31                                print e
32       
33                self.check_server_shutodown()
34
35        #def startup
36
37       
38        def initialize_variable(self):
39               
40                self.internal_variable={}
41                self.internal_variable["cron_enabled"]=False
42                self.internal_variable["cron_content"]=""
43                self.internal_variable["shutdown_signal"]=0.0
44                self.internal_variable["cron_values"]={}
45                self.internal_variable["cron_values"]["hour"]=0
46                self.internal_variable["cron_values"]["minute"]=0
47                self.internal_variable["cron_values"]["weekdays"]=[True,True,True,True,True]
48                self.internal_variable["cron_values"]["server_shutdown"]=False
49               
50        #def initialize_variable
51
52
53        def check_variable(self,variable):
54
55                try:
56                        if not type(variable)==dict:
57                                return False
58                        if not type(variable["cron_enabled"])==bool:
59                                return False
60                        if not type(variable["cron_content"])==str:
61                                return False
62                        if not type(variable["shutdown_signal"])==float:
63                                return False
64                        if not type(variable["cron_values"])==dict:
65                                return False
66                        if not type(variable["cron_values"]["hour"])==int:
67                                return False
68                        if not type(variable["cron_values"]["minute"])==int:
69                                return False
70                        if not type(variable["cron_values"]["server_shutdown"])==bool:
71                                return False
72                        if not type(variable["cron_values"]["weekdays"])==list:
73                                if len(variable["cron_values"]["weekdays"])!=5:
74                                        return False
75                except:
76                        return False
77
78                return True
79
80        #def check_variable
81
82       
83        def manual_client_list_check(self):
84               
85                objects["VariablesManager"].manual_client_list_check()
86                return True
87               
88        #def manual_client_list_check
89
90       
91        def is_cron_enabled(self):
92               
93                ret={}
94                ret["status"]=self.internal_variable["cron_enabled"]
95                ret["msg"]=self.internal_variable["cron_content"]
96               
97                if ret["status"]:
98                        ret["cli_support"]="enabled"
99                else:
100                        ret["cli_support"]="disabled"
101               
102                return ret
103               
104        #def is_cron_enabled
105       
106       
107        def is_server_shutdown_enabled(self):
108               
109                ret={}
110                ret["status"]=self.internal_variable["cron_enabled"]
111                ret["msg"]=self.internal_variable["cron_content"] and self.internal_variable["server_shutdown"]
112                if ret["msg"]:
113                        ret["cli_support"]="enabled"
114                else:
115                        ret["cli_support"]="disabled"
116                       
117                return ret
118               
119        #def is_server_shutdown_enabled
120       
121
122        def update_shutdown_signal(self):
123               
124                self.internal_variable["shutdown_signal"]=time.time()
125                return self.save_variable()
126               
127        #def update_shutdown_signal
128
129       
130        def save_variable(self,variable=None):
131
132                if variable==None:
133                        variable=copy.deepcopy(self.internal_variable)
134                else:
135                        if not self.check_variable(variable):
136                                return {"status":False,"msg":"Variable does not have the expected structure"}
137                        self.internal_variable=copy.deepcopy(variable)
138               
139                objects["VariablesManager"].set_variable("SHUTDOWNER",variable)
140               
141                self.check_server_shutodown()
142       
143                return {"status":True,"msg":""}
144               
145        #def save_variable
146
147       
148        def check_server_shutodown(self):
149                       
150                if self.internal_variable["cron_enabled"] and self.internal_variable["cron_values"]["server_shutdown"]:
151                        f=open(self.cron_file,"w")
152                        f.write(self.internal_variable["cron_content"])
153                        f.close()
154                else:
155                        if os.path.exists(self.cron_file):
156                                os.remove(self.cron_file)
157                       
158                self.build_thinclient_cron()
159               
160                return True
161               
162        #def check_server_shutdown
163       
164       
165        def build_thinclient_cron(self):
166               
167                if self.internal_variable["cron_enabled"] and self.internal_variable["cron_values"]["server_shutdown"]:
168                        # server will handle dialog calls its shutdown
169                        if os.path.exists(self.thinclient_cron_file):
170                                os.remove(self.thinclient_cron_file)
171                        return True
172       
173               
174                if self.internal_variable["cron_enabled"]:
175                       
176                        # server will only handle thin clients dialogs
177                        shutdown_cmd="/usr/sbin/shutdown-lliurex"
178                        cron_content="%s %s * * %s root %s >> /var/log/syslog\n"
179                        minute=self.internal_variable["cron_values"]["minute"]
180                        hour=self.internal_variable["cron_values"]["hour"]
181                        days=""
182                        count=1
183                       
184                        for day in self.internal_variable["cron_values"]["weekdays"]:
185                                if day:
186                                        days+="%s,"%count
187                                count+=1
188                        days=days.rstrip(",")
189                       
190                        thinclient_cron=cron_content%(minute,hour,days,shutdown_cmd)
191                       
192                        f=open(self.thinclient_cron_file,"w")
193                        f.write(thinclient_cron)
194                        f.close()
195                       
196                        return True
197                       
198                else:
199                        # nothing to do
200                        if os.path.exists(self.thinclient_cron_file):
201                                os.remove(self.thinclient_cron_file)
202                               
203                        return True
204               
205               
206        #def build_thinclient_cron
Note: See TracBrowser for help on using the repository browser.