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

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

wip

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