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

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

Added N4d login component

  • Property svn:executable set to *
File size: 8.0 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 n4dgtklogin import *
15import gettext
16gettext.textdomain('zero-lliurex-mirror-redirect')
17_ = gettext.gettext
18
19class redirectMirror():
20        def __init__(self,callback):
21#               threading.Thread.__init__(self)
22                self.dbg=1
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
35        #def __init__
36
37        def _debug(self,msg):
38                if self.dbg==1:
39                        print("DBG: "+str(msg))
40        #def _debug
41
42        def _n4d_connect(self,server):
43                n4dclient=n4d.ServerProxy("https://"+server+":9779")
44                return(n4dclient)
45
46        def _set_server_data(self):
47                self.master_ip=self.n4d.get_variable("","VariablesManager","MASTER_SERVER_IP")
48                if (self.master_ip):
49                        self.sw_slave=True
50                else:
51                        self.master_ip=self.n4d.get_variable("","VariablesManager","SRV_IP")
52        #def _set_server_data
53
54        def is_enabled(self):
55                sw_enabled=False
56                self.slave_ip=self._get_replication_ip()
57                sw_enabled=self.n4dMaster.is_mirror_shared("","NfsManager","/net/mirror/llx16",self.slave_ip)['status']
58                return(sw_enabled)
59        #def is_enabled
60
61        def enable_redirect(self):
62                try:
63                        sw_add=self.n4dMaster.add_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
64                        print(sw_add)
65                        if not self.n4d.is_mount_configured(self.credentials,"NfsManager",self.mirror_dir)['status']:
66                                self.n4d.configure_mount_on_boot(self.credentials,"NfsManager",self.master_ip+":"+self.mirror_dir,self.mirror_dir)
67                                print("Mounting on boot")
68                except Exception as e:
69                        print(e)
70                        sw_add=False
71                GObject.idle_add(self.callback,1)
72                return sw_add
73        #def enable_redirect
74
75        def disable_redirect(self):
76                try:
77                        self.n4d.remove_mount_on_boot(self.credentials,"NfsManager",self.mirror_dir)
78                        sw_rm=self.n4dMaster.remove_ip_from_mirror(self.credentials,"NfsManager",self.mirror_dir,self.slave_ip)['status']
79                except:
80                        sw_rm=False
81                GObject.idle_add(self.callback,1)
82                return sw_rm
83        #def disable_redirect
84        '''
85        def enable_redirect2(self):
86                hostname=subprocess.check_output("hostname -A",universal_newlines=True,shell=True).rstrip()
87                self._debug("Setting cname as %s" % self.master_ip)
88                domain=hostname.split('.')[-1]
89                cnameContent="cname=mirror."+domain+","+self.master_ip+"."+domain+"\ncname=lliurex-mirror."+domain+","+self.master_ip+"."+domain+"\n"
90                f=open(self.cnameFile,'w')
91                f.write(cnameContent)
92                f.close()
93                #Create host file
94                f=open(self.hostFile,'w')
95                f.write(self.master_ip+" mirror")
96                f.close()
97                subprocess.check_output("service dnsmasq restart",shell=True)
98                GObject.idle_add(self.callback,1)
99        #def enable_redirect
100
101        #def disable_redirect(self):
102                hostname=subprocess.check_output("hostname -A",universal_newlines=True,shell=True).rstrip()
103                self._debug("Setting cname as %s" % hostname)
104                domain=hostname.split('.')[-1]
105                cnameContent="cname=mirror."+domain+","+hostname+"\ncname=lliurex-mirror."+domain+","+hostname+"\n"
106                f=open(self.cnameFile,'w')
107                f.writelines(cnameContent)
108                f.close()
109                #Delete host file
110                if os.path.isfile(self.hostFile):
111                        os.remove(self.hostFile)
112                subprocess.check_output("service dnsmasq restart",shell=True)
113               
114                GObject.idle_add(self.callback,1)
115        #def disable_redirect
116        '''
117        def _get_replication_ip(self):
118                ifaces=lliurex.interfacesparser.InterfacesParser()
119                ifaces.load('/etc/network/interfaces')
120                for aux_iface in ifaces.get_interfaces_in_range("10.3.0.0/24"):
121                        iface=aux_iface
122                        break
123                ip=ifaces.get_info_interface(iface)[1].split('\n')[1].split(' ')[-1]
124                return ip
125        #def _get_replication_ip
126
127class mainWindow(Gtk.Window):
128        def __init__(self):
129                self.redirectMirror=redirectMirror(self._callback)
130                if not self.redirectMirror.sw_slave:
131                        print("[!] You need to be on a slave server to run this program [!]")
132                        label = Gtk.Label(_("You need to be on a slave server to run mirror-redirect"))
133                        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
134                        dialog.vbox.pack_start(label,True,True,10)
135                        label.show()
136                        dialog.set_border_width(6)
137                        response = dialog.run()
138                        dialog.destroy()
139                        sys.exit(0)
140
141                self.dbg=1
142                Gtk.Window.__init__(self,title=_("Mirror Redirect"))
143                self.stack=Gtk.Stack()
144                self.stack.set_transition_duration(1000)
145                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
146                self.set_position(Gtk.WindowPosition.CENTER)
147                self.connect("delete-event", Gtk.main_quit)
148                vbox=Gtk.VBox()
149                img_area=Gtk.Box(spacing=6)
150                img=Gtk.Image(stock=Gtk.STOCK_REVERT_TO_SAVED)
151                img_area.add(img)
152                img_area.add(Gtk.Label(_("Mirror redirect")))
153                img_area.set_border_width(5)
154                img_area.show_all()
155                frame=Gtk.Frame()
156                frame.set_border_width(5)
157                box = Gtk.Grid()
158                box.set_border_width(5)
159                box.set_column_spacing(20)
160                box.set_row_spacing(30)
161                login=N4dGtkLogin()
162                login.set_info_text("<span foreground='black'>Mirror Redirect</span>","Redireccionar el mirror","<span foreground='black'>Desde aquí puedes redireccionar el mirror en un servidor esclavo para usar el del servidor maestro.</span>")
163                login.set_info_background(image='/usr/share/backgrounds/lliurex/lliurex-blueprint.png',cover=True)
164                login.after_validation_goto(self._signin)
165                loginBox=login.render_form()
166                self.stack.add_titled(loginBox, "login", "Login")
167                self.stack.add_titled(vbox, "gui", "Gui")
168                self.add(self.stack)
169                vbox.add(img_area)
170                vbox.add(frame)
171                frame.add(box)
172                box.attach(Gtk.Label(_("Enable Mirror Redirect")),0,1,1,1)
173                self.sw_Enable=Gtk.Switch()
174                box.attach(self.sw_Enable,1,1,1,1)
175                self.lbl_State=Gtk.Label('')
176                box.attach(self.lbl_State,0,2, 3,2)
177                self.spinner = Gtk.Spinner()
178                box.attach(self.spinner, 0, 3, 2, 2)
179                self.sw_Enable.set_active(self.redirectMirror.is_enabled())
180                if self.sw_Enable.get_state():
181                        service_label="Using master server mirror"
182                else:
183                        service_label="Using local mirror"
184                self.lbl_State.set_text(_(service_label))
185                self.sw_Enable.connect("state-set",self._on_sw_state)
186                self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT)
187                self.stack.set_visible_child_name("login")
188
189                self.show_all()
190        #def __init__
191                               
192        def _signin(self,lm,user,pwd):
193                self.credentials=[user,pwd]
194                self.stack.set_visible_child_name("gui")
195        def _debug(self,msg):
196                if self.dbg==1:
197                        print("DBG: "+str(msg))
198        #def _debug
199
200        def _on_sw_state(self,widget,data):
201                self._debug("State changed")
202                widget.set_sensitive(False)
203                self.spinner.start()
204                sw_state=widget.get_state()
205                if not sw_state:
206                        self._debug("Redirecting mirror...")
207                        self.lbl_State.set_text(_("Redirecting mirror..."))
208                        th=threading.Thread(target=self.redirectMirror.enable_redirect)
209                        th.start()
210                else:
211                        self.lbl_State.set_text(_("Redirecting mirror..."))
212                        th=threading.Thread(target=self.redirectMirror.disable_redirect)
213                        th.start()
214                self._debug("Done")
215        #def _on_sw_state
216
217        def _callback(self,action=None):
218                self.spinner.stop()
219                if action:
220                        self.lbl_State.set_text(_("Using master server mirror"))
221                else:
222                        self.lbl_State.set_text(_("Using local mirror"))
223                self.sw_Enable.set_sensitive(True)
224        #def _callback
225
226def read_key():
227        try:
228                f=open("/etc/n4d/key")
229                f.close()
230                #hack
231                return True
232        except:
233                return False
234
235status=read_key()
236status=True
237
238if not status:
239        print("[!] You need root privileges to run this program [!]")
240        label = Gtk.Label(_("You need root privileges to run mirror-redirect"))
241        dialog = Gtk.Dialog("Warning", None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
242        dialog.vbox.pack_start(label,True,True,10)
243        label.show()
244        dialog.set_border_width(6)
245        response = dialog.run()
246        dialog.destroy()
247#       sys.exit(0)
248
249GObject.threads_init()
250Gdk.threads_init()
251win = mainWindow()
252Gtk.main()
Note: See TracBrowser for help on using the repository browser.