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

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