source: dpkg-unlocker/trunk/fuentes/dpkgunlocker-gui/python3-dpkgunlocker-gui/MainWindow.py @ 7966

Last change on this file since 7966 was 7966, checked in by jrpelegrina, 16 months ago

WIP. Changes to use polkit

File size: 13.0 KB
Line 
1#!/usr/bin/env python3
2
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, Pango, GdkPixbuf, Gdk, Gio, GObject,GLib
6
7
8import signal
9import os
10import subprocess
11import json
12import sys
13import syslog
14import time
15import threading
16import tempfile
17import pwd
18
19signal.signal(signal.SIGINT, signal.SIG_DFL)
20
21from . import settings
22import gettext
23gettext.textdomain(settings.TEXT_DOMAIN)
24_ = gettext.gettext
25
26class MainWindow:
27       
28        def __init__(self):
29
30                self.core=Core.Core.get_core()
31       
32        #def init
33       
34       
35        def load_gui(self):
36               
37                builder=Gtk.Builder()
38                builder.set_translation_domain(settings.TEXT_DOMAIN)
39                ui_path=self.core.ui_path
40                builder.add_from_file(ui_path)
41
42               
43                self.css_file=self.core.rsrc_dir+"dpkgunlocker-gui.css"
44
45                self.stack = Gtk.Stack()
46                self.stack.set_transition_duration(10)
47                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
48               
49                self.main_window=builder.get_object("main_window")
50                self.main_window.set_title("Dpkg-Unlocker")
51                self.main_box=builder.get_object("main_box")
52                self.main_window.resize(640,620)
53                self.image_box=builder.get_object("image_box")
54                self.help_button=builder.get_object("help_button")
55                self.unlock_button=builder.get_object("unlock_button")
56
57                self.process_box=self.core.processBox
58                self.stack.add_titled(self.process_box,"processBox","ProcessBox")
59                self.main_box.pack_start(self.stack,True,False,5)
60                self.main_window.show_all()
61                self.process_box.terminal_viewport.hide()
62               
63                self.final_column=0
64                self.final_row=0
65
66                self.set_css_info()
67                self.connect_signals()
68                self.is_working=False
69                self.load_info(True)
70                GLib.timeout_add_seconds(5, self.is_worker)
71               
72        #def load_gui
73
74
75        def set_css_info(self):
76               
77                self.style_provider=Gtk.CssProvider()
78                f=Gio.File.new_for_path(self.css_file)
79                self.style_provider.load_from_file(f)
80                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
81                self.main_window.set_name("WINDOW")
82                self.image_box.set_name("IMAGE_BOX")
83                self.process_box.terminal_label.set_name("MSG_LABEL")
84               
85
86        #def set_css_info       
87                               
88
89
90        def connect_signals(self):
91
92                self.main_window.connect("destroy",self.quit)
93                self.help_button.connect("clicked",self.help_clicked)
94                self.unlock_button.connect("clicked",self.unlock_process)
95
96        #def connect_signals   
97
98        def is_worker(self):
99
100                if not self.is_working:
101                        self.load_info(False)
102                                       
103                return True
104
105        #def is_worker         
106
107        def load_info(self,log):
108
109                info=self.core.unlockerManager.checkingLocks()
110                self.manage_unlock_button(info)
111                self.process_box.load_info(info,log)
112
113        #def load_info
114
115       
116        def manage_unlock_button(self,info):
117
118                cont=0
119                ok_status=[0,1,3]
120                running_status=[1,3]
121                liveProcess=0
122
123                for item in info:
124                        if info[item] in ok_status:
125                                cont+=1
126                        if info [item] in running_status:
127                                liveProcess+=1 
128
129                if cont==3:
130                        self.unlock_button.set_sensitive(False)
131                        self.process_box.terminal_label.set_text(self.get_msg_text(0))
132
133                else:
134                        if cont==0:
135                                self.unlock_button.set_sensitive(True)
136                        else:
137                                if liveProcess>0:
138                                        self.unlock_button.set_sensitive(False)
139                                        self.process_box.terminal_label.set_text(self.get_msg_text(11)) 
140                                else:
141                                        self.unlock_button.set_sensitive(True)
142                                        self.process_box.terminal_label.set_text(self.get_msg_text(12)) 
143
144        #def manage_unlock_button
145       
146        def init_unlocker_processes(self):
147
148                self.remove_llxup_lock_launched=False
149                self.remove_llxup_lock_done=False
150
151                self.remove_dpkg_lock_launched=False
152                self.remove_dpkg_lock_done=False
153
154                self.remove_apt_lock_launched=False
155                self.remove_apt_lock_done=False
156
157                self.fixing_system_launched=False
158                self.fixing_system_done=False
159
160        #def init_unlocker_processes   
161
162        def create_process_token(self,command,action):
163
164
165                if action=="Lliurex-Up":
166                        self.token_llxup_process=tempfile.mkstemp('_LlxUp')
167                        remove_tmp=' rm -f ' + self.token_llxup_process[1] + ';'+'\n'
168                       
169                elif action=="Dpkg":
170                        self.token_dpkg_process=tempfile.mkstemp('_Dpkg')
171                        remove_tmp=' rm -f ' + self.token_dpkg_process[1] + ';'+'\n'
172
173                elif action=="Apt":
174                        self.token_apt_process=tempfile.mkstemp('_Apt') 
175                        remove_tmp=' rm -f ' + self.token_apt_process[1] + ';'+'\n'
176                       
177                elif action=="Fixing":
178                        self.token_fixing_process=tempfile.mkstemp('_Fixing')   
179                        remove_tmp=' rm -f ' + self.token_fixing_process[1] + ';'+'\n'
180
181                cmd=command+remove_tmp
182                return cmd
183
184        #def create_process_token       
185
186        def create_result_token(self,command,action):
187
188
189                if action=="Lliurex-Up":
190                        self.token_llxup_result=tempfile.mkstemp('_LlxUp')
191                        result_tmp=' echo $? >' + self.token_llxup_result[1]+ ';'
192                       
193                elif action=="Dpkg":
194                        self.token_dpkg_result=tempfile.mkstemp('_Dpkg')
195                        result_tmp=' echo $? > ' + self.token_dpkg_result[1] + ';'
196
197                elif action=="Apt":
198                        self.token_apt_result=tempfile.mkstemp('_Apt') 
199                        result_tmp=' echo $? > ' + self.token_apt_result[1] + ';'
200                       
201                elif action=="Fixing":
202                        self.token_fixing_result=tempfile.mkstemp('_Fixing')   
203                        result_tmp=' echo $? > ' + self.token_fixing_result[1] + ';'
204
205                cmd=command+';'+result_tmp
206                return cmd     
207
208        #def create_result_token       
209
210
211        def unlock_process(self,wigdet):
212
213                self.is_working=True
214                dialog = Gtk.MessageDialog(None,0,Gtk.MessageType.WARNING, Gtk.ButtonsType.YES_NO, "Dpkg-Unlocker")
215                msg=self.get_msg_text(10)
216                dialog.format_secondary_text(msg)
217                response=dialog.run()
218                dialog.destroy()
219               
220                if response==Gtk.ResponseType.YES:
221                        self.core.processBox.manage_vterminal(True,False)
222                        self.unlock_button.set_sensitive(False)
223                        self.process_box.terminal_viewport.show()
224                        self.unlockInfo=self.core.unlockerManager.getUnlockerCommand()
225                        self.unlock_command,self.fixing_command,liveProcess=self.core.unlockerManager.getUnlockerCommand()
226                        #self.write_log("Dpkg-Unlocked-Gui")
227                        self.init_unlocker_processes()
228
229                        GLib.timeout_add(100,self.pulsate_unlock_process)
230
231                else:
232                        self.is_working=False   
233
234        #def unlock_process     
235
236
237        def pulsate_unlock_process(self):
238
239                error=False
240
241                if not self.remove_llxup_lock_launched:
242                        if "Lliurex-Up" in self.unlockInfo["unlockCmd"]:
243                                self.process_box.terminal_label.show()
244                                msg=self.get_msg_text(1)
245                                self.write_log(msg)
246                                self.process_box.terminal_label.set_text(msg)
247                                self.remove_llxup_lock_launched=True
248                                self.llxup_lock_check=True
249                                self.exec_command("Lliurex-Up","remove")
250
251                        else:
252                                self.remove_llxup_lock_done=True
253                                self.llxup_lock_check=False
254                                self.llxup_result=True
255
256                if self.remove_llxup_lock_done:
257                        if self.llxup_lock_check:
258                                self.llxup_result=self.check_process("Lliurex-Up")
259
260                        if self.llxup_result:
261                               
262                                if not self.remove_dpkg_lock_launched:
263                                        if "Dpkg" in self.unlockInfo["unlockCmd"]:
264                                                msg=self.get_msg_text(2)
265                                                self.write_log(msg)
266                                                self.process_box.terminal_label.set_text(msg)
267                                                self.remove_dpkg_lock_launched=True
268                                                self.dpkg_lock_check=True
269                                                self.exec_command("Dpkg","remove")
270                                        else:
271                                                self.remove_dpkg_lock_done=True
272                                                self.dpkg_lock_check=False
273                                                self.dpkg_result=True
274
275                                if self.remove_dpkg_lock_done:
276                                        if self.dpkg_lock_check:
277                                                self.dpkg_result=self.check_process("Dpkg")
278
279                                        if self.dpkg_result:
280                               
281                                                if not self.remove_apt_lock_launched:
282                                                        if "Apt" in self.unlockInfo["unlockCmd"]:
283                                                                msg=self.get_msg_text(3)
284                                                                self.write_log(msg)
285                                                                self.process_box.terminal_label.set_text(msg)
286                                                                self.remove_apt_lock_launched=True
287                                                                self.apt_lock_check=True
288                                                                self.exec_command("Apt","remove")
289                                                        else:
290                                                                self.remove_apt_lock_done=True
291                                                                self.apt_lock_check=False
292                                                                self.apt_result=True   
293
294                                                if self.remove_apt_lock_done:
295                                                        if self.apt_lock_check:
296                                                                self.apt_result=self.check_process("Apt")
297
298                                                        if self.apt_result:
299                               
300                                                                if not self.fixing_system_launched:
301                                                                        if self.unlockInfo["commonCmd"]!="":
302                                                                                self.process_box.terminal_label.set_text(self.get_msg_text(4))
303                                                                                self.fixing_system_launched=True
304                                                                                self.fixig_lock_check=True
305                                                                                self.exec_command("Fixing","fixing")
306                                                                        else:
307                                                                                self.fixing_system_done=True
308                                                                                self.fixig_lock_check=False
309                                                                                self.fixing_result=True
310
311                                                                if self.fixing_system_done:
312                                                                        if self.fixig_lock_check:
313                                                                                self.fixing_result=self.check_process("Fixing")
314
315                                                                        self.core.processBox.manage_vterminal(False,True)
316                                                                        if self.fixing_result:
317                                                                                msg=self.get_msg_text(5)
318                                                                                self.write_log_terminal()
319                                                                                self.write_log(msg)
320                                                                                self.load_info(False)
321                                                                                self.process_box.terminal_label.set_text(msg)
322                                                                                return False
323                                                                        else:
324                                                                                error=True
325                                                                                self.write_log_terminal()
326                                                                                code=6
327       
328               
329                                                        else:
330                                                                error=True
331                                                                code=7                 
332                                        else:
333                                                error=True     
334                                                code=8                                                         
335
336                        else:
337                                error=True
338                                code=9
339
340
341                        if error:
342                                self.core.processBox.manage_vterminal(False,True)
343                                msg_error=self.get_msg_text(code)
344                                self.process_box.terminal_label.set_name("MSG_ERROR_LABEL")
345                                self.process_box.terminal_label.set_text(msg_error)
346                                self.write_log(msg_error)
347                                return False
348
349
350                if self.remove_llxup_lock_launched:
351                        if not self.remove_llxup_lock_done:
352                                if os.path.exists(self.token_llxup_process[1]):
353                                        return True
354                                else:
355                                        self.remove_llxup_lock_done=True
356                                        return True     
357
358                if self.remove_dpkg_lock_launched:
359                        if not self.remove_dpkg_lock_done:
360                                if os.path.exists(self.token_dpkg_process[1]):
361                                        return True
362                                else:
363                                        self.remove_dpkg_lock_done=True
364                                        return True             
365
366                if self.remove_apt_lock_launched:
367                        if not self.remove_apt_lock_done:
368                                if os.path.exists(self.token_apt_process[1]):
369                                        return True
370                                else:
371                                        self.remove_apt_lock_done=True
372                                        return True     
373
374                if self.fixing_system_launched:
375                        if not self.fixing_system_done:
376                                if os.path.exists(self.token_fixing_process[1]):
377                                        return True
378                                else:
379                                        self.fixing_system_done=True
380                                        return True                                                                                     
381       
382        #def pulsate_unlock_process
383       
384        def exec_command(self,action,type_cmd):
385
386                if type_cmd=="remove":
387                        command=self.unlockInfo["unlockCmd"][action]
388                else:
389                        command=self.unlockInfo["commonCmd"]
390
391                length=len(command)
392               
393                if length>0:
394                        command=self.create_result_token(command,action)
395                        command=self.create_process_token(command,action)
396                        length=len(command)
397                        self.process_box.vterminal.feed_child(command,length)
398                else:
399                        if action=="Lliurex-Up":
400                                self.remove_llxup_lock_done=True
401                        elif action=="Dpkg":
402                                self.remove_dpkg_lock_done=True
403                        elif action=="Apt":
404                                self.remove_ap_lock_done=True
405                        elif action=="Fixing":
406                                self.fixing_system_done=True
407
408        #def exec_command                       
409
410       
411        def check_process(self,action):
412
413                result=True
414
415                if action=="Lliurex-Up":
416                        token=self.token_llxup_result[1]
417                elif action=="Dpkg":
418                        token=self.token_dpkg_result[1]
419                elif action=="Apt":
420                        token=self.token_apt_result[1]
421                elif action=="Fixing":
422                        token=self.token_fixing_result[1]
423                                       
424               
425                if os.path.exists(token):
426                        file=open(token)
427                        content=file.readline()
428                        if '0' not in content:
429                                result=False
430                        file.close()
431                        os.remove(token)
432
433                return result
434               
435        #def check_process
436
437        def get_msg_text(self,code):
438
439                if code==0:
440                        msg=_("All processes seem correct. Nothing to do")
441                elif code==1:
442                        msg=_("Removing Lliurex-Up lock file...")
443                elif code==2:
444                        msg=_("Removing Dpkg lock file...")
445                elif code==3:
446                        msg=_("Removing Apt lock file...")
447                elif code==4:
448                        msg=_("Fixing the system...")
449                elif code==5:
450                        msg=_("Unlocking process finished successfully")       
451                elif code==6:
452                        msg=_("Error fixing the system")
453                elif code==7:
454                        msg=_("Error removing Apt lock file")
455                elif code==8:
456                        msg=_("Error removing Dpg lock file")
457                elif code==9:
458                        msg=_("Error removing Lliurex-Up lock file")
459                elif code==10:
460                        msg=_("Do you want to execute the unlocking process?")
461                elif code==11:
462                        msg=_("Some process are running. Wait a moment")
463                elif code==12:
464                        msg=_("Detected some blocked process")
465                return msg     
466
467        #def get_msg_text                                                                       
468       
469       
470        def quit(self,widget):
471
472                msg_log='Quit'
473                self.core.unlockerManager.cleanLockToken()
474                self.write_log(msg_log)
475                Gtk.main_quit() 
476
477        #def quit       
478
479        def write_log_terminal(self):
480
481                init_row=self.final_row
482                init_column=self.final_column
483
484                self.final_column,self.final_row = self.process_box.vterminal.get_cursor_position()
485                log_text=self.process_box.vterminal.get_text_range(init_row,init_column,self.final_row,self.final_column)[0]
486
487                log_text=log_text.split("\n")
488
489                syslog.openlog("DpkgUnlocker")
490                syslog.syslog("Fixing the system")
491                               
492               
493                for item in log_text:
494                        if item!="":
495                                self.write_log(item)
496                                                                                                                                                               
497                return
498
499        #def write_log_terminal
500
501        def write_log(self,msg):
502       
503                syslog.openlog("DpkgUnlocker")
504                syslog.syslog(msg)     
505
506        #def write_log
507
508        def help_clicked(self,widget):
509
510                lang=os.environ["LANG"]
511                run_pkexec=False
512               
513                if "PKEXEC_UID" in os.environ:
514                        run_pkexec=True
515               
516                if 'ca_ES' in lang:
517                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Dpkg-Unlocker_va'
518                else:
519                        cmd='xdg-open http://wiki.lliurex.net/tiki-index.php?page=Dpkg-Unlocker'
520
521                if not run_pkexec:
522                        os.system("su -c '%s' $USER" %cmd)
523                else:
524                        user=pwd.getpwuid(int(os.environ["PKEXEC_UID"])).pw_name
525                        fcmd="su -c '" +cmd+ "' "+ user
526                        os.system(fcmd) 
527
528        #def help_clicked       
529                       
530
531        def start_gui(self):
532               
533                Gtk.main()
534               
535        #def start_gui
536
537       
538
539#class MainWindow
540from . import Core
Note: See TracBrowser for help on using the repository browser.