source: lliurex-mirror/trunk/fuentes/lliurex-mirror-cli/usr/sbin/lliurex-mirror @ 3337

Last change on this file since 3337 was 3337, checked in by kbut, 3 years ago

add to lliurex-mirror interactive update

  • Property svn:executable set to *
File size: 10.8 KB
Line 
1#!/usr/bin/env python
2import xmlrpclib as x
3import sys
4import getpass
5import tempfile
6from clint import arguments
7from clint.textui import puts, indent, colored
8import os
9import time
10
11class LliurexMirror(object):
12        """docstring for LliurexMirror"""
13        def __init__(self,credentials,host):
14                super(LliurexMirror, self).__init__()
15                self.ip = host if host != None else "localhost"
16                if credentials != None:
17                        self.credentials = credentials
18                else:
19                        try:
20                                self.credentials = self.get_local_credentials()
21                        except:
22                                print("Error: bad credentials")
23                                sys.exit(1)
24                self.client = x.ServerProxy("https://"+self.ip+":9779",allow_none=True)
25                self.localclient = x.ServerProxy("https://localhost:9779",allow_none=True)
26                self.localcredentials = self.get_local_credentials()
27
28        def get_local_credentials(self):
29                try:
30                        f = open('/etc/n4d/key','r')
31                        key = f.readline().strip()
32                        return key
33                except:
34                        return None
35
36        def setCname(self):
37                result = self.client.set_cname(self.credentials,"MirrorManager")
38                print result['msg']
39                return  0 if result['status'] else 1 
40
41        def noninteractiveUpdate(self,mirror,pathtoupdate):
42                self.runDebmirror(mirror,pathtoupdate)
43                while True:
44                        result = self.client.get_percentage(self.credentials,"MirrorManager",mirror)
45                        print str(result['msg'])
46                        result = self.client.is_alive(self.credentials,"MirrorManager")
47                        if not result['status']:
48                                break
49                        time.sleep(5)
50                       
51
52        def runDebmirror(self,mirror,pathtoupdate):
53
54                if len(pathtoupdate) != 0:
55                        if pathtoupdate.lower().startswith("http"):
56                                self.setMirrorOrig(mirror,pathtoupdate,3)
57                                self.setOptionUpdate(mirror,3)
58                        elif os.path.exists(pathtoupdate):
59                                result = self.client.get_client_ip('','MirrorManager','')
60                                tempserver = result['msg']
61                                result = self.localclient.enable_webserver_into_folder(self.localcredentials,'MirrorManager',pathtoupdate)
62                                tempserver = tempserver + ":" + str(result['msg'])
63                                self.setMirrorOrig(mirror,tempserver,2)
64                                self.setOptionUpdate(mirror,2)
65                        else:
66                                print("Error on orig")
67                                return 2
68                result = self.client.update(self.credentials,"MirrorManager",'',mirror,None)
69                print result['msg']
70                return  0 if result['status'] else 1
71
72        def exportMirror(self,mirror,dest):
73                #
74                # This code is equal on lliurex_mirror_connect.py file. Don't forget modify on both files.
75                #
76                result = self.client.get_all_configs(self.credentials,'MirrorManager')
77                config = result['msg'][mirror]
78                result = self.client.get_client_ip('','MirrorManager','')
79                ip = result['msg']
80                # Open webserver for mirror and get ip
81                result = self.client.enable_webserver_into_folder(self.credentials,'MirrorManager',config['MIRROR_PATH'])
82                port = str(result['msg'])
83                self.remoteport = port
84                # Modify Config and write
85               
86                config['MIRROR_PATH'] = dest
87                config['CURRENT_UPDATE_OPTION'] = '3'
88                config['ORIGS']['3'] = self.ip + ":" + str(port)
89                result = self.client.render_debmirror_config(self.credentials,'MirrorManager',config)
90                temp_file = tempfile.mktemp()
91                f = open(temp_file,'w')
92                f.write(result['msg'])
93                f.close()
94                callback_args = {}
95                callback_args['ip'] = ip
96                callback_args['port'] = port
97                # Execute mirror
98                print self.localclient.get_mirror(self.localcredentials,'MirrorManager',temp_file,callback_args)
99
100        def get_percentage_export(self):
101                try:
102                        result = self.localclient.is_alive_get_mirror(self.localcredentials,'MirrorManager')
103                        print result['msg'][0]
104                        return 0
105                except Exception as e:
106                        print e
107                        return 1
108                       
109        #def get_percentage_export
110
111        def is_alive_export(self):
112                try:
113                        result = self.localclient.is_alive_get_mirror(self.localcredentials,'MirrorManager')
114                        return result
115                except Exception as e:
116                        print e
117                        return None
118
119
120        def setOptionUpdate(self,mirror,option):
121                result = self.client.set_option_update(self.credentials,"MirrorManager",mirror,option)
122                print str(result['msg'])
123                return  0 if result['status'] else 1 
124
125        def isAlive(self):
126                result = self.client.is_alive(self.credentials,"MirrorManager")
127                print "True" if result['status'] else "False"
128                return  0 if result['status'] else 1 
129
130        def getMirrorArchitecture(self,distro):
131                result = self.client.get_mirror_architecture(self.credentials,"MirrorManager",distro)
132                print str(result['msg'])
133                return  0 if result['status'] else 1 
134
135        def setMirrorArchitecture(self,distro,archs):
136                result = self.client.set_mirror_architecture(self.credentials,"MirrorManager",distro,archs)
137                print str(result['msg'])
138                return  0 if result['status'] else 1 
139
140        def getMirrorOrig(self,distro):
141                result = self.client.get_mirror_orig(self.credentials,"MirrorManager",distro)
142                print str(result['msg'])
143                return  0 if result['status'] else 1 
144
145        def setMirrorOrig(self,distro,url,option):
146                result = self.client.set_mirror_orig(self.credentials,"MirrorManager",distro,url,option)
147                print str(result['msg'])
148                return  0 if result['status'] else 1 
149
150        def getChecksumValidation(self,distro):
151                result = self.client.get_checksum_validation(self.credentials,"MirrorManager",distro)
152                print str(result['msg'])
153                return  0 if result['status'] else 1 
154
155        def setChecksumValidation(self,distro,value):
156                check = 0 if not value else 1
157                result = self.client.set_checksum_validation(self.credentials,"MirrorManager",distro,check)
158                print str(result['msg'])
159                return  0 if result['status'] else 1 
160
161        def getPercentage(self,distro):
162                result = self.client.get_percentage(self.credentials,"MirrorManager",distro)
163                print str(result['msg'])
164                return  0 if result['status'] else 1 
165
166        def enableWebserverForPath(self,path):
167                result = self.client.enable_webserver_into_folder(self.credentials,"MirrorManager",path)
168                print str(result['msg'])
169                return  0 if result['status'] else 1 
170
171        def stopWebserver(self,port):
172                result = self.client.stop_webserver(self.credentials,"MirrorManager",port)
173                print str(result['msg'])
174                return  0 if result['status'] else 1 
175
176        def stopUpdate(self):
177                result = self.client.stopupdate(self.credentials,"MirrorManager")
178                print str(result['msg'])
179                return  0 if result['status'] else 1 
180
181        def getAvailableDistros(self):
182                result = self.client.get_available_mirrors(self.credentials,"MirrorManager")
183                print str(result['msg'])
184                return  0 if result['status'] else 1 
185
186        def isMirrorUpdate(self,distro):
187                result = self.client.is_update_available(self.credentials,"MirrorManager",distro)
188                print str(result['msg'])
189                return  0 if result['status'] else 1
190
191def usage():
192        puts("Usage")
193        with indent(4):
194                puts("lliurex-mirror [FLAGS...] ACTION")
195                puts("Actions")
196                with indent(4):
197                        puts("setcname")
198                        puts("update DISTRO [URL|FILEPATH]")
199                        puts("unattendedupdate DISTRO [URL|FILEPATH]")
200                        puts("rundebmirror DISTRO [URL|FILEPATH]")
201                        puts("exportmirror DISTRO DESTMIRROR")
202                        puts("isalive")
203                        puts("isaliveexport")
204                        puts("getmirrorarchitecture")
205                        puts("setmirrorarchitecture [ARCH ARCH ...]")
206                        puts("getmirrororig")
207                        puts("setmirrororig MIRROR URL OPTION")
208                        puts("getchecksumvalidation")
209                        puts("setchecksumvalidation [0|1]")
210                        puts("getpercentage")
211                        puts("getpercentageexport")
212                        puts("enablewebserverforpath PATH")
213                        puts("stopwebserver PORT")
214                        puts("stopupdate")
215                        puts("getavailabledistros")
216                        puts("ismirrorupdate")
217                puts("Flags")
218                with indent(4):
219                        puts("-h --help : Show help")
220                        puts("-H --host : Remove ip to launch mirror actions")
221                        puts("-k --key : Magic key to run lliurex-mirror")
222                        puts("-u --user : User to validation")
223                        puts("-p --password : Password to validation")
224
225                       
226        sys.exit(1)
227
228if __name__ == '__main__':
229        args = arguments.Args().copy
230        host = "localhost"
231        credentials = ""
232        user = None
233        password = None
234        if args.contains(["-h","--help"]) or len(args.all) == 0 :
235                usage()
236       
237        if args.contains(["-H","--host"]):
238                #host = args.value_after()
239                host = args.value_after("-H") if args.value_after("-H") != None else args.value_after("--host")
240                if host == None:
241                        usage()
242
243
244        if not args.contains(["-k","--key","-u","--user","-p","--password","-P","--intpassword"]):
245                if os.access('/etc/n4d/key',os.R_OK):
246                        f = open("/etc/n4d/key","r")
247                        credentials = f.readlines()[0].strip()
248
249        if args.contains(["-u","--user"]):
250                user = args.value_after("-u") if args.value_after("-u") != None else args.value_after("--user")
251                if user == None:
252                        usage()
253                index = args.first(["-u","--user"])
254                args.pop(index)
255                args.pop(index)
256
257        if args.contains(["-p","--password"]):
258                password = args.value_after("-p") if args.value_after("-p") != None else args.value_after("--password")
259                if password == None:
260                        usage()
261
262                index = args.first(["-p","--password"])
263                args.pop(index)
264                args.pop(index)
265
266        if args.contains(["-P","--intpassword"]):
267                if args.contains(["-u","--user"]):
268                        password = getpass.getpass("Password: ")
269                        index = args.first(["-P","--intpassword"])
270                        args.pop(index)
271                else:
272                        usage()
273
274        if user != None and password != None:
275                credentials = (user,password)
276
277        if args.contains(["-k","--key"]):
278                credentials = args.value_after("-k") if args.value_after("-k") != None else args.value_after("--key")
279                if credentials == None:
280                        usage()
281                index = args.first(["-k","--key"])
282                args.pop(index)
283                args.pop(index)
284
285        action = args.pop(0)
286        lliurexmirror = LliurexMirror(credentials,host)
287        if action == "setcname":
288                sys.exit(lliurexmirror.setCname())
289        elif action == "rundebmirror" or action =="update":
290                mirror = args.get(0)
291                pathtoupdate = " ".join(args[1:])
292                lliurexmirror.noninteractiveUpdate(mirror,pathtoupdate))
293        elif action =="unattendedupdate":
294                mirror = args.get(0)
295                pathtoupdate = " ".join(args[1:])
296                sys.exit(lliurexmirror.runDebmirror(mirror,pathtoupdate))
297        elif action == "isalive":
298                sys.exit(lliurexmirror.isAlive())
299        elif action == "isaliveexport":
300                sys.exit(lliurexmirror.is_alive_export())
301        elif action == "getmirrorarchitecture":
302                sys.exit(lliurexmirror.getMirrorArchitecture(args.get(0)))
303        elif action == "setmirrorarchitecture":
304                sys.exit(lliurexmirror.setMirrorArchitecture(args.pop(0),args.all))
305        elif action == "getmirrororig":
306                sys.exit(lliurexmirror.getMirrorOrig(args.get(0)))
307        elif action == "setmirrororig":
308                sys.exit(lliurexmirror.setMirrorOrig(args.get(0),args.get(1)))
309        elif action == "getchecksumvalidation":
310                sys.exit(lliurexmirror.getChecksumValidation(args.get(0)))
311        elif action == "setchecksumvalidation":
312                checkvalue = 1 if args.get(1) == "True" else 0
313                sys.exit(lliurexmirror.setChecksumValidation(args.get(0),checkvalue))
314        elif action == "getpercentage":
315                sys.exit(lliurexmirror.getPercentage(args.get(0)))
316        elif action == "getpercentageexport":
317                sys.exit(lliurexmirror.get_percentage_export())
318        elif action == "enablewebserverforpath":
319                sys.exit(lliurexmirror.enableWebserverForPath(args.get(0)))
320        elif action == "stopwebserver":
321                sys.exit(lliurexmirror.stopWebserver(args.get(0)))
322        elif action == "getavailabledistros":
323                sys.exit(lliurexmirror.getAvailableDistros())
324        elif action == "stopupdate":
325                sys.exit(lliurexmirror.stopUpdate())
326        elif action == "ismirrorupdate":
327                sys.exit(lliurexmirror.isMirrorUpdate(args.get(0)))
328        elif action == "exportmirror":
329                mirror = args.get(0)
330                destmirror = " ".join(args[1:])
331                sys.exit(lliurexmirror.exportMirror(mirror,destmirror))
332               
Note: See TracBrowser for help on using the repository browser.