source: lliurex-shutdowner/trunk/fuentes/lliurex-shutdowner.install/usr/share/lliurex-shutdowner/LliurexShutdowner.py @ 5419

Last change on this file since 5419 was 5419, checked in by hectorgh, 21 months ago

wip

File size: 8.1 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*
3
4import gi
5gi.require_version('Gtk', '3.0')
6from gi.repository import Gtk,GObject, GLib
7
8import signal
9import gettext
10import sys
11import threading
12import copy
13
14import N4dManager
15
16signal.signal(signal.SIGINT, signal.SIG_DFL)
17gettext.textdomain('lliurex-shutdowner')
18_ = gettext.gettext
19
20
21
22
23class LliurexShutdowner:
24       
25        def __init__(self,args_dic):
26               
27                self.shutdown_bin="/usr/sbin/shutdown-lliurex"
28                self.cron_content="%s %s * * %s root %s >> /var/log/syslog\n"
29               
30                self.n4d_man=N4dManager.N4dManager()
31                self.n4d_man.set_server(args_dic["server"])
32               
33                if args_dic["gui"]:
34                       
35                        self.start_gui()
36                        GObject.threads_init()
37                        Gtk.main()
38               
39        #def __init__(self):
40       
41       
42        def start_gui(self):
43
44                builder=Gtk.Builder()
45                builder.set_translation_domain('lliurex-shutdowner')
46                builder.add_from_file("/usr/share/lliurex-shutdowner/rsrc/lliurex-shutdowner.ui")
47                self.main_window=builder.get_object("main_window")
48               
49                self.main_box=builder.get_object("main_box")
50                self.login_box=builder.get_object("login_box")
51                self.cron_box=builder.get_object("cron_box")
52                self.cron_frame=builder.get_object("cron_frame")
53               
54                self.stack=Gtk.Stack()
55                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
56                self.stack.set_transition_duration(200)
57                self.stack.add_titled(self.login_box,"login","Login")
58                self.stack.add_titled(self.cron_box,"cron","Cron options")
59                self.stack.show_all()
60               
61                self.main_box.pack_start(self.stack,True,True,0)
62               
63                self.close_button=builder.get_object("close_button")
64                self.login_button=builder.get_object("login_button")
65                self.shutdown_button=builder.get_object("shutdown_button")
66               
67                self.user_entry=builder.get_object("user_entry")
68                self.password_entry=builder.get_object("password_entry")
69                self.server_ip_entry=builder.get_object("server_ip_entry")
70               
71                self.login_msg_label=builder.get_object("login_msg_label")
72                self.detected_clients_label=builder.get_object("detected_clients_label")
73                self.cron_switch=builder.get_object("cron_switch")
74                self.hour_spinbutton=builder.get_object("hour_spinbutton")
75                self.minute_spinbutton=builder.get_object("minute_spinbutton")
76                self.monday_cb=builder.get_object("monday_checkbutton")
77                self.tuesday_cb=builder.get_object("tuesday_checkbutton")
78                self.wednesday_cb=builder.get_object("wednesday_checkbutton")
79                self.thursday_cb=builder.get_object("thursday_checkbutton")
80                self.friday_cb=builder.get_object("friday_checkbutton")
81                self.server_shutdown_cb=builder.get_object("server_shutdown_checkbutton")
82               
83                self.weekdays=[]
84                self.weekdays.append(self.monday_cb)
85                self.weekdays.append(self.tuesday_cb)
86                self.weekdays.append(self.wednesday_cb)
87                self.weekdays.append(self.thursday_cb)
88                self.weekdays.append(self.friday_cb)
89               
90                self.login_button.grab_focus()
91               
92                self.connect_signals()
93                self.main_window.show()
94                Gtk.main()
95               
96               
97        #def start_gui
98       
99        def connect_signals(self):
100               
101                self.main_window.connect("destroy",Gtk.main_quit)
102                self.main_window.connect("delete_event",self.check_changes)
103                self.login_button.connect("clicked",self.login_clicked)
104               
105                self.cron_switch.connect("notify::active",self.cron_switch_changed)
106                self.close_button.connect("clicked",self.check_changes)
107                self.shutdown_button.connect("clicked",self.shutdown_button_clicked)
108               
109        #def connect_signals
110       
111        # SIGNALS ####
112       
113        def cron_switch_changed(self,widget,data):
114               
115                self.cron_frame.set_sensitive(widget.get_active())
116               
117        #def cron_switch_changed
118       
119        def check_changes(self,widget=True,event=True):
120               
121               
122                if self.stack.get_visible_child_name()=="cron":
123               
124                        new_var=self.gather_values()
125                        if new_var!=self.n4d_man.shutdowner_var:
126                                self.n4d_man.shutdowner_var=new_var
127                                print("[LliurexShutdowner] Updating value on close signal...")
128                                self.n4d_man.set_shutdowner_values()
129                       
130                        day_configured=False
131                        for cb in self.weekdays:
132                                if cb.get_active():
133                                        day_configured=True
134                                        break
135                       
136                        if self.cron_switch.get_active() and not day_configured:
137                               
138                                return True
139                               
140                sys.exit(0)
141               
142        #def check_changes
143       
144        def shutdown_button_clicked(self,widget):
145               
146                self.n4d_man.shutdown_clients()
147               
148        #def shutdown_button
149       
150        def login_clicked(self,widget):
151               
152                user=self.user_entry.get_text()
153                password=self.password_entry.get_text()
154                server=self.server_ip_entry.get_text()
155               
156                # HACK
157               
158                if server!="":
159                        self.n4d_man.set_server(server)
160               
161               
162                self.login_msg_label.set_text(_("Validating user..."))
163               
164                widget.set_sensitive(False)
165                self.validate_user(user,password)
166               
167               
168        #def login_clicked
169       
170        # ##################### #
171       
172        def validate_user(self,user,password):
173               
174               
175                t=threading.Thread(target=self.n4d_man.validate_user,args=(user,password,))
176                t.daemon=True
177                t.start()
178                GLib.timeout_add(500,self.validate_user_listener,t)
179               
180               
181        #def validate_user
182       
183        def validate_user_listener(self,thread):
184                       
185                if thread.is_alive():
186                        return True
187                               
188                self.login_button.set_sensitive(True)
189                if not self.n4d_man.user_validated:
190                        self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user")+"</span>")
191                else:
192                        group_found=False
193                        for g in ["adm","admins","teachers"]:
194                                if g in self.n4d_man.user_groups:
195                                        group_found=True
196                                        break
197                                       
198                        if group_found:
199                                self.login_msg_label.set_text("")
200                               
201                                self.cron_frame.set_sensitive(self.n4d_man.is_cron_enabled())
202                                self.cron_switch.set_active(self.n4d_man.is_cron_enabled())
203                               
204                                self.detected_clients_label.set_text(_("Currently detected clients: %s")%self.n4d_man.detected_clients)
205                                GLib.timeout_add(2000,self.client_list_listener)
206                                GLib.timeout_add(5000,self.save_values_thread)
207
208                                values=self.n4d_man.get_cron_values()
209                                if values!=None:
210                                        self.monday_cb.set_active(values["weekdays"][0])
211                                        self.tuesday_cb.set_active(values["weekdays"][1])
212                                        self.wednesday_cb.set_active(values["weekdays"][2])
213                                        self.thursday_cb.set_active(values["weekdays"][3])
214                                        self.friday_cb.set_active(values["weekdays"][4])
215                                        self.hour_spinbutton.set_value(values["hour"])
216                                        self.minute_spinbutton.set_value(values["minute"])
217                                        self.server_shutdown_cb.set_active(values["server_shutdown"])
218                               
219                                self.stack.set_visible_child_name("cron")
220                        else:
221                                self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user")+"</span>")
222                               
223                return False
224                       
225        #def validate_user_listener
226       
227        def client_list_listener(self):
228               
229                self.detected_clients_label.set_text(_("Currently detected clients: %s")%self.n4d_man.detected_clients)
230               
231                return True
232               
233        #def
234       
235        def save_values_thread(self):
236               
237                new_var=self.gather_values()
238
239                if new_var!=self.n4d_man.shutdowner_var:
240                        self.n4d_man.shutdowner_var=new_var
241                        print("[LliurexShutdowner] Updating shutdowner variable...")
242                        t=threading.Thread(target=self.n4d_man.set_shutdowner_values)
243                        t.daemon=True
244                        t.start()
245                       
246                return True
247               
248        #def save_values_thread
249       
250
251        def gather_values(self):
252               
253                new_var=copy.deepcopy(self.n4d_man.shutdowner_var)
254                new_var["cron_enabled"]=self.cron_switch.get_active()
255                if self.cron_switch.get_active():
256                       
257                        day_configured=False
258                       
259                        for cb in self.weekdays:
260                                if cb.get_active():
261                                        day_configured=True
262                                        break
263
264                        if day_configured:
265                               
266                                minute=self.minute_spinbutton.get_value_as_int()
267                                hour=self.hour_spinbutton.get_value_as_int()
268                               
269                                new_var["cron_values"]["weekdays"][0]=self.monday_cb.get_active()
270                                new_var["cron_values"]["weekdays"][1]=self.tuesday_cb.get_active()
271                                new_var["cron_values"]["weekdays"][2]=self.wednesday_cb.get_active()
272                                new_var["cron_values"]["weekdays"][3]=self.thursday_cb.get_active()
273                                new_var["cron_values"]["weekdays"][4]=self.friday_cb.get_active()
274                                new_var["cron_values"]["server_shutdown"]=self.server_shutdown_cb.get_active()
275                                new_var["cron_values"]["hour"]=hour
276                                new_var["cron_values"]["minute"]=minute
277                       
278                                days=""
279                               
280                                count=1
281                                for day in new_var["cron_values"]["weekdays"]:
282                                        if day:
283                                                days+="%s,"%count
284                                        count+=1
285                       
286                                days=days.rstrip(",")
287                                new_var["cron_content"]=self.cron_content%(minute,hour,days,self.shutdown_bin)
288                               
289                        else:
290                                new_var["cron_enabled"]=False
291                               
292                return new_var
293               
294        #def gather_values
295       
296#class LliurexShutdowner
297
298
299
300if __name__=="__main__":
301       
302        args={}
303        args["gui"]=True
304        args["server"]="server"
305       
306        llx_s=LliurexShutdowner(args)
307       
Note: See TracBrowser for help on using the repository browser.