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

Last change on this file since 5451 was 5451, checked in by hectorgh, 2 years ago

wip

File size: 8.4 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                self.user_entry.connect("activate",self.entries_press_event)
102                self.password_entry.connect("activate",self.entries_press_event)
103                self.server_ip_entry.connect("activate",self.entries_press_event)
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       
112        # SIGNALS ########################################################
113       
114        def entries_press_event(self,widget):
115               
116                self.login_clicked(None)
117               
118        #def entries_press_event
119       
120       
121        def cron_switch_changed(self,widget,data):
122               
123                self.cron_frame.set_sensitive(widget.get_active())
124               
125        #def cron_switch_changed
126       
127       
128        def check_changes(self,widget=True,event=True):
129               
130               
131                if self.stack.get_visible_child_name()=="cron":
132               
133                        new_var=self.gather_values()
134                        if new_var!=self.n4d_man.shutdowner_var:
135                                self.n4d_man.shutdowner_var=new_var
136                                print("[LliurexShutdowner] Updating value on close signal...")
137                                self.n4d_man.set_shutdowner_values()
138                       
139                        day_configured=False
140                        for cb in self.weekdays:
141                                if cb.get_active():
142                                        day_configured=True
143                                        break
144                       
145                        if self.cron_switch.get_active() and not day_configured:
146                               
147                                return True
148                               
149                sys.exit(0)
150               
151        #def check_changes
152       
153       
154        def shutdown_button_clicked(self,widget):
155               
156                self.n4d_man.shutdown_clients()
157               
158        #def shutdown_button
159       
160       
161        def login_clicked(self,widget):
162               
163                user=self.user_entry.get_text()
164                password=self.password_entry.get_text()
165                server=self.server_ip_entry.get_text()
166               
167                # HACK
168               
169                if server!="":
170                        self.n4d_man.set_server(server)
171               
172               
173                self.login_msg_label.set_text(_("Validating user..."))
174               
175                self.login_button.set_sensitive(False)
176                self.validate_user(user,password)
177               
178               
179        #def login_clicked
180       
181        # ##################### ##########################################
182       
183        def validate_user(self,user,password):
184               
185               
186                t=threading.Thread(target=self.n4d_man.validate_user,args=(user,password,))
187                t.daemon=True
188                t.start()
189                GLib.timeout_add(500,self.validate_user_listener,t)
190               
191        #def validate_user
192       
193       
194        def validate_user_listener(self,thread):
195                       
196                if thread.is_alive():
197                        return True
198                               
199                self.login_button.set_sensitive(True)
200                if not self.n4d_man.user_validated:
201                        self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user")+"</span>")
202                else:
203                        group_found=False
204                        for g in ["adm","admins","teachers"]:
205                                if g in self.n4d_man.user_groups:
206                                        group_found=True
207                                        break
208                                       
209                        if group_found:
210                                self.login_msg_label.set_text("")
211                               
212                                self.cron_frame.set_sensitive(self.n4d_man.is_cron_enabled())
213                                self.cron_switch.set_active(self.n4d_man.is_cron_enabled())
214                               
215                                self.detected_clients_label.set_text(_("Currently detected clients: %s")%self.n4d_man.detected_clients)
216                                GLib.timeout_add(2000,self.client_list_listener)
217                                GLib.timeout_add(5000,self.save_values_thread)
218
219                                values=self.n4d_man.get_cron_values()
220                                if values!=None:
221                                        self.monday_cb.set_active(values["weekdays"][0])
222                                        self.tuesday_cb.set_active(values["weekdays"][1])
223                                        self.wednesday_cb.set_active(values["weekdays"][2])
224                                        self.thursday_cb.set_active(values["weekdays"][3])
225                                        self.friday_cb.set_active(values["weekdays"][4])
226                                        self.hour_spinbutton.set_value(values["hour"])
227                                        self.minute_spinbutton.set_value(values["minute"])
228                                        self.server_shutdown_cb.set_active(values["server_shutdown"])
229                               
230                                self.stack.set_visible_child_name("cron")
231                        else:
232                                self.login_msg_label.set_markup("<span foreground='red'>"+_("Invalid user")+"</span>")
233                               
234                return False
235                       
236        #def validate_user_listener
237       
238       
239        def client_list_listener(self):
240               
241                self.detected_clients_label.set_text(_("Currently detected clients: %s")%self.n4d_man.detected_clients)
242                return True
243               
244        #def  client_list_listener
245       
246       
247        def save_values_thread(self):
248               
249                new_var=self.gather_values()
250
251                if new_var!=self.n4d_man.shutdowner_var:
252                        self.n4d_man.shutdowner_var=new_var
253                        print("[LliurexShutdowner] Updating shutdowner variable...")
254                        t=threading.Thread(target=self.n4d_man.set_shutdowner_values)
255                        t.daemon=True
256                        t.start()
257                       
258                return True
259               
260        #def save_values_thread
261       
262
263        def gather_values(self):
264               
265                new_var=copy.deepcopy(self.n4d_man.shutdowner_var)
266                new_var["cron_enabled"]=self.cron_switch.get_active()
267                if self.cron_switch.get_active():
268                       
269                        day_configured=False
270                       
271                        for cb in self.weekdays:
272                                if cb.get_active():
273                                        day_configured=True
274                                        break
275
276                        if day_configured:
277                               
278                                minute=self.minute_spinbutton.get_value_as_int()
279                                hour=self.hour_spinbutton.get_value_as_int()
280                               
281                                new_var["cron_values"]["weekdays"][0]=self.monday_cb.get_active()
282                                new_var["cron_values"]["weekdays"][1]=self.tuesday_cb.get_active()
283                                new_var["cron_values"]["weekdays"][2]=self.wednesday_cb.get_active()
284                                new_var["cron_values"]["weekdays"][3]=self.thursday_cb.get_active()
285                                new_var["cron_values"]["weekdays"][4]=self.friday_cb.get_active()
286                                new_var["cron_values"]["server_shutdown"]=self.server_shutdown_cb.get_active()
287                                new_var["cron_values"]["hour"]=hour
288                                new_var["cron_values"]["minute"]=minute
289                       
290                                days=""
291                               
292                                count=1
293                                for day in new_var["cron_values"]["weekdays"]:
294                                        if day:
295                                                days+="%s,"%count
296                                        count+=1
297                       
298                                days=days.rstrip(",")
299                                new_var["cron_content"]=self.cron_content%(minute,hour,days,self.shutdown_bin)
300                               
301                        else:
302                                new_var["cron_enabled"]=False
303                               
304                return new_var
305               
306        #def gather_values
307       
308#class LliurexShutdowner
309
310
311if __name__=="__main__":
312       
313        pass
314       
Note: See TracBrowser for help on using the repository browser.