source: zero-lliurex-mirror-redirect/trunk/fuentes/zero-lliurex-mirror-redirect.install/usr/sbin/mirror-redirect.py @ 6406

Last change on this file since 6406 was 6406, checked in by Juanma, 3 years ago

gui revised

  • Property svn:executable set to *
File size: 8.1 KB
Line 
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3import gi
4gi.require_version('Gtk', '3.0')
5from gi.repository import Gtk, GObject, Gdk
6import shutil
7import os
8import subprocess
9import time
10import threading
11import sys
12import xmlrpclib as n4d
13import lliurex.interfacesparser
14from edupals.ui.n4dgtklogin import *
15import gettext
16gettext.textdomain('zero-lliurex-mirror-redirect')
17_ = gettext.gettext
18
19class redirectMirror(threading.Thread):
20        def __init__(self,callback):
21                threading.Thread.__init__(self)
22                self.dbg=9
23                self.sw_slave=False
24                self.master_ip=''
25                self.callback=callback
26                self.hostFile="/var/lib/dnsmasq/hosts/mirror"
27                self.cnameFile="/var/lib/dnsmasq/config/cname-mirror"
28                self.mirror_dir="/net/mirror/llx16"
29                self.slave_ip=''
30                self.master_ip='10.3.0.254'
31                self.n4d=self._n4d_connect("localhost")
32                self._set_server_data()
33                self.n4dMaster=self._n4d_connect(self.master_ip)
34                self.credentials=[]
35
36        #def __init__
37
38        def _debug(self,msg):
39                if self.dbg==1:
40                        print("DBG: "+str(msg))
41        #def _debug
42
43        def _n4d_connect(self,server):
44                n4dclient=n4d.ServerProxy("https://"+server+":9779")
45                return(n4dclient)
46
47        def set_credentials(self,credentials):
48                self.credentials=credentials
49
50        def _set_server_data(self):
51                self.master_ip=self.n4d.get_variable("","VariablesManager","MASTER_SERVER_IP")
52                if (self.master_ip):
53                        self.sw_slave=True
54                else:
55                        self.master_ip=self.n4d.get_variable("","VariablesManager","SRV_IP")
56        #def _set_server_data
57
58        def is_enabled(self):
59                sw_enabled=False
60                self.slave_ip=self._get_replication_ip()
61                try:
62                        sw_enabled=self.n4dMaster.is_mirror_shared("","NfsManager","/net/mirror/llx16",self.slave_ip)['status']
63                except:
64                        sw_enabled=False
65                return(sw_enabled)
66        #def is_enabled
67
68        def enable_redirect(self):
69                sw_add=False
70                if not os.path.isdir(self.mirror_dir):
71                        try:
72                                os.makedirs(self.mirror_dir)
73                        except:
74                                self._debug("Can't create dir %s"%self.mirror_dir)
75               
76                try:
77                        sw_add=self.n4dMaster.add_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
78                        if not self.n4d.is_mount_configured(self.credentials,"NfsManager",self.mirror_dir)['status']:
79                                self.n4d.configure_mount_on_boot(self.credentials,"NfsManager",self.master_ip+":"+self.mirror_dir,self.mirror_dir)
80                                self._debug("Mounting on boot")
81                except Exception as e:
82                        print(e)
83                        sw_add=False
84                GObject.idle_add(self.callback,sw_add)
85                return sw_add
86        #def enable_redirect
87
88        def disable_redirect(self):
89                try:
90                        self.n4d.remove_mount_on_boot(self.credentials,"NfsManager",self.mirror_dir)
91                        sw_rm=self.n4dMaster.remove_ip_from_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
92                except:
93                        sw_rm=False
94                GObject.idle_add(self.callback,1)
95                return sw_rm
96        #def disable_redirect
97
98        def _get_replication_ip(self):
99                ifaces=lliurex.interfacesparser.InterfacesParser()
100                ifaces.load('/etc/network/interfaces')
101                for aux_iface in ifaces.get_interfaces_in_range("10.3.0.0/24"):
102                        iface=aux_iface
103                        break
104                ip=ifaces.get_info_interface(iface)[1].split('\n')[1].split(' ')[-1]
105                return ip
106        #def _get_replication_ip
107
108class mainWindow(Gtk.Window):
109        def __init__(self):
110                self.redirectMirror=redirectMirror(self._callback)
111                if not self.redirectMirror.sw_slave:
112                        print("[!] You need to be on a slave server to run this program [!]")
113                        label = Gtk.Label(_("You need to be on a slave server to run mirror-redirect"))
114                        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
115                        dialog.vbox.pack_start(label,True,True,10)
116                        label.show()
117                        dialog.set_border_width(6)
118                        response = dialog.run()
119                        dialog.destroy()
120                        sys.exit(0)
121
122                self.dbg=1
123                Gtk.Window.__init__(self,title=_("Mirror Redirect"))
124                self.stack=Gtk.Stack()
125                self.stack.set_transition_duration(1000)
126                self.stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE)
127                form_grid=Gtk.Grid()
128                form_grid.set_valign(Gtk.Align.START)
129                form_grid.set_halign(Gtk.Align.CENTER)
130                form_grid.set_column_homogeneous(False)
131                form_grid.set_row_homogeneous(False)
132                form_grid.set_margin_right(12)
133                login=N4dGtkLogin()
134                desc=_('Desde aquí puedes redireccionar el mirror en un servidor esclavo para usar el del servidor maestro')
135#               login.set_info_text("<span foreground='black'>Mirror Redirect</span>",_("Redireccionar el mirror"),"<span foreground='black'>"+desc+"</span>")
136                login.set_info_background(image='/usr/share/icons/hicolor/scalable/apps/mirror-redirect.svg')
137                login.set_allowed_groups(['adm'])
138                login.after_validation_goto(self._signin)
139                login.set_mw_proportion_ratio(1,1)
140                img_banner=Gtk.Image()
141                img_banner.set_from_file('/usr/share/icons/hicolor/scalable/apps/mirror-redirect.svg')
142                form_grid.attach(img_banner,0,0,1,3)
143                lbl_header=Gtk.Label()
144                lbl_header.set_valign(Gtk.Align.START)
145                lbl_header.set_halign(Gtk.Align.START)
146                lbl_header.set_margin_top(12)
147                lbl_header.set_markup('<big><b>Lliurex mirror redirect</b></big>\nDesde aquí puedes redireccionar el mirror en un servidor esclavo para usar el del servidor maestro')
148                lbl_header.set_max_width_chars(30)
149                lbl_header.set_line_wrap(True)
150                lbl_header.set_lines(-1)
151                form_grid.attach(lbl_header,1,0,2,3)
152                lbl_switch=Gtk.Label(_("Enable mirror redirection"))
153                lbl_switch.set_halign(Gtk.Align.START)
154                form_grid.attach(lbl_switch,1,1,1,1)
155                self.sw_enable=Gtk.Switch()
156                self.sw_enable.set_halign(Gtk.Align.START)
157                form_grid.attach(self.sw_enable,2,1,1,1)
158                self.lbl_state=Gtk.Label('')
159                self.lbl_state.set_width_chars(30)
160                self.lbl_state.set_halign(Gtk.Align.START)
161                self.lbl_state.set_valign(Gtk.Align.START)
162                self.lbl_state.set_xalign(0)
163                self.lbl_state.modify_fg(Gtk.StateType.NORMAL,Gdk.color_parse('#888'))
164                form_grid.attach(self.lbl_state,1,2,2,1)
165                self.spinner = Gtk.Spinner()
166                self.spinner.set_halign(Gtk.Align.END)
167                form_grid.attach(self.spinner,2,1,1,1)
168                self.sw_enable.set_active(self.redirectMirror.is_enabled())
169                if self.sw_enable.get_state():
170                        service_label=_("Using master server mirror")
171                else:
172                        service_label=_("Using local mirror")
173                self.lbl_state.set_text(_(service_label))
174                self.sw_enable.connect("state-set",self._on_sw_state)
175               
176                self.stack.add_titled(login, "login", "Login")
177                self.stack.add_titled(form_grid, "gui", "Gui")
178                self.stack.set_visible_child_name("login")
179                self.add(self.stack)
180                self.set_position(Gtk.WindowPosition.CENTER)
181                self.connect("delete-event", Gtk.main_quit)
182
183                self.show_all()
184        #def __init__
185                               
186        def _signin(self,lm,user,pwd):
187                self.credentials=[user,pwd]
188                self.redirectMirror.set_credentials(self.credentials)
189                self.stack.set_visible_child_name("gui")
190
191        def _debug(self,msg):
192                if self.dbg==1:
193                        print("DBG: "+str(msg))
194        #def _debug
195
196        def _on_sw_state(self,widget,data):
197                self._debug("State changed")
198                widget.set_sensitive(False)
199                self.spinner.start()
200                sw_state=widget.get_state()
201                if not sw_state:
202                        self._debug("Redirecting mirror...")
203                        self.lbl_state.set_text(_("Redirecting mirror..."))
204                        th=threading.Thread(target=self.redirectMirror.enable_redirect)
205                        th.start()
206                else:
207                        self.lbl_state.set_text(_("Redirecting mirror..."))
208                        th=threading.Thread(target=self.redirectMirror.disable_redirect)
209                        th.start()
210                self._debug("Done")
211        #def _on_sw_state
212
213        def _callback(self,action=None):
214                self.spinner.stop()
215                if action:
216                        self.lbl_state.set_text(_("Using master server mirror"))
217                else:
218                        self.lbl_state.set_text(_("Using local mirror"))
219                        self.sw_enable.handler_block_by_func(self._on_sw_state)
220                        self.sw_enable.set_state(False)
221                        self.sw_enable.handler_unblock_by_func(self._on_sw_state)
222                self.sw_enable.set_sensitive(True)
223        #def _callback
224
225def read_key():
226        try:
227                f=open("/etc/n4d/key")
228                f.close()
229                #hack
230                return True
231        except:
232                return False
233
234status=read_key()
235status=True
236
237if not status:
238        print("[!] You need root privileges to run this program [!]")
239        label = Gtk.Label(_("You need root privileges to run mirror-redirect"))
240        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
241        dialog.vbox.pack_start(label,True,True,10)
242        label.show()
243        dialog.set_border_width(6)
244        response = dialog.run()
245        dialog.destroy()
246#       sys.exit(0)
247
248GObject.threads_init()
249Gdk.threads_init()
250win = mainWindow()
251Gtk.main()
Note: See TracBrowser for help on using the repository browser.