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

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

Changed mirror redirect to n4d's nfsmanager mechanism

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