source: lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/zmdManager.py @ 4741

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

recovered... lost code?

File size: 5.7 KB
Line 
1import sys
2import os
3import subprocess
4import stat
5import locale
6import tempfile
7try:
8        import xmlrpc.client as n4d
9except ImportError:
10        raise ImportError('xmlrpc not available. Disabling ZmdManager')
11import ssl
12import time
13
14class zmdmanager:
15        def __init__(self):
16                self.locale=locale.getlocale()[0]
17                self.dbg=1
18                self.zmdPath='/usr/share/zero-center/zmds'
19                self.disabled=False
20                if hasattr(sys,'last_value') or not (os.path.exists(self.zmdPath)):
21                        #If there's an error at this point it only could be an importError caused by xmlrpc
22                        self.disabled=True
23                self.pluginInfo={'install':'zmd','pkginfo':'zmd','remove':'zmd'}
24                self.progress=0
25                self.n4dclient=''
26                self.result={}
27                self.result['data']=[]
28                self.result['status']={}
29                self.result['status']={'status':-1,'msg':''}
30        #def __init__
31
32        def set_debug(self,dbg='1'):
33                self.dbg=int(dbg)
34                self._debug ("Debug enabled")
35        #def set__debug
36
37        def _debug(self,msg=''):
38                if self.dbg==1:
39                        print ('DEBUG Zmd: '+str(msg))
40        #def _debug
41
42        def register(self):
43                return(self.pluginInfo)
44        #def register
45
46        def execute_action(self,action,applist):
47                self.result['status']={'status':-1,'msg':''}
48                self.result['data']=list(applist)
49                if self.disabled:
50                        self._set_status(9)
51                else:
52                        count=len(applist)
53                        try:
54                                self.n4dclient=self._n4d_connect()
55                                for appInfo in applist:
56                                        if (action):
57                                                if action=='install':
58                                                        self.result['data'].append(self._install_Zmd(appInfo))
59                                                if action=='remove':
60                                                        self.result['data'].append(self._remove_Zmd(appInfo))
61                                                if action=='pkginfo':
62                                                        self.result['data'].append(self._get_Zmd_Info(appInfo))
63                        except:
64                                self.disabled=True
65                                self._set_status(10)
66                self.progress=100
67                return(self.result)
68        #def execute_action
69       
70        def _set_status(self,status,msg=''):
71                self.result['status']={'status':status,'msg':msg}
72       
73        def _callback(self,zmdLauncher):
74                inc=1
75                limit=99
76                n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
77                if zmdLauncher in n4dvars.keys():
78                        if n4dvars[zmdLauncher]['pulsating']:
79                                margin=limit-self.progress
80                                inc=round(margin/limit,3)
81                                self.progress=self.progress+inc
82        #def _callback
83
84        def _install_Zmd(self,appInfo):
85                zmd=self.zmdPath+'/'+appInfo['package']+'.zmd'
86                self._debug("Installing "+str(zmd))
87                if os.path.exists(zmd):
88                        err=0
89                        try:
90                                zmdsudo=['gksudo',zmd]
91                                self._debug("executing "+str(zmdsudo))
92                                zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
93                                zmdLauncher=os.path.basename(zmd)
94                                zmdLauncher=os.path.splitext(zmdLauncher)[0]
95                                while zmdCmd.poll() is None:
96                                        self._callback(zmdLauncher)
97                                        time.sleep(0.4)
98                                zmdResult=zmdCmd.stdout.read()
99                                zmdError=zmdCmd.stderr.read()
100                                self._debug("Error: "+str(zmdError))
101                                self._debug("Result: "+str(zmdResult))
102                                appInfo=self._get_Zmd_Info(appInfo)
103                                if appInfo['status']!='Installed':
104                                        err=5
105                        except Exception as e:
106                                appInfo=self._get_Zmd_Info(appInfo)
107                                self._debug(str(e))
108                                if appInfo['status']!='Installed':
109                                        err=5
110                else:
111                        err=8
112                self._set_status(err)
113                return err
114        #def _install_Zmd
115
116        def _remove_Zmd(self,appInfo):
117                zmd=appInfo['package']+'.zmd'
118                self._debug("Removing "+str(zmd))
119                os.chdir(self.zmdPath)
120                sw_continue=False
121                err=0
122                try:
123                        removePackages=[]
124                        f=open(zmd,'r')
125                        for line in f:
126                                if 'PACKAGE_LIST=' in line:
127                                        sw_continue=True
128                                        packagelist=line.split('=')[-1]
129                                        packagelist=packagelist.replace('"','')
130                                        packagelist=packagelist[:-1]
131                                        #We've the file with the packagelist, now it's time to read the list
132                                        self._debug("Obtaining packages in : "+packagelist)
133                                        f2=open  (packagelist,'r')
134                                        for line2 in f2:
135                                                pkg=line2.split(' ')[0]
136                                                pkg=pkg.split("\t")[0]
137                                                pkg=pkg.replace('"','')
138                                                self._debug("Append to remove list: "+pkg)
139                                                removePackages.append(pkg)
140                                        f2.close()
141                        f.close()
142                except Exception as e:
143                        err=7
144                        print(str(e))
145                if sw_continue:
146                        zeroScript='/tmp/zeroScript'
147                        f3=open(zeroScript,'w')
148                        f3.write('#!/bin/bash'+"\n")
149                        for pkg in removePackages:
150                                f3.write('/usr/bin/zero-installer remove '+pkg+"\n")
151                        f3.write ("zero-center set-non-configured "+appInfo['package']+"\n")
152                        f3.close()
153                        os.chmod(zeroScript,stat.S_IEXEC|stat.S_IREAD|stat.S_IWRITE|stat.S_IROTH|stat.S_IWOTH|stat.S_IXOTH|stat.S_IRGRP|stat.S_IWGRP|stat.S_IXGRP)
154                        zmdsudo=['gksudo',zeroScript]
155                        try:
156                                self._debug("Executing "+str(zmdsudo))
157                                zmdLauncher=os.path.basename(zmd)
158                                zmdLauncher=os.path.splitext(zmdLauncher)[0]
159                                zmdCmd=subprocess.Popen(zmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
160                                self._debug("Launched")
161                                while zmdCmd.poll() is None:
162                                        self._callback(zmdLauncher)
163                                        time.sleep(0.2)
164                                zmdResult=zmdCmd.stdout.read()
165                                zmdError=zmdCmd.stderr.read()
166                        except Exception as e:
167                                err=6
168                                self._debug(str(e))
169                        self._debug("Error: "+str(zmdError))
170                        self._debug("Result: "+str(zmdResult))
171                        appInfo=self._get_Zmd_Info(appInfo)
172                        if appInfo['status']=='Installed':
173                                err=6
174                        self._set_status(err)
175                        os.remove(zeroScript)
176                        return err
177        #def _remove_Zmd
178
179        def _get_Zmd_Info(self,appInfo):
180                zmd=appInfo['package']
181                appInfo['status']='Available'
182                try:
183                        n4dvars=self.n4dclient.get_variable("","VariablesManager","ZEROCENTER")
184                        if n4dvars:
185                                self._set_status(0)
186                                for key in n4dvars:
187                                        if zmd.lower() in key.lower():
188                                                if n4dvars[key]['state']==1:
189                                                        appInfo['status']='Installed'
190                        else:
191                                self._set_status(0)
192                except:
193                        self._set_status(10)
194#               self.result['data'].append(appInfo)
195#               self.result.append(appInfo)
196                return(appInfo)
197        #def _get_Zmd_Info
198       
199        def _n4d_connect(self):
200                #Setup SSL
201                context=ssl._create_unverified_context()
202                n4dclient = n4d.ServerProxy("https://localhost:9779",context=context)
203                return(n4dclient)
204        #def _n4d_connect
Note: See TracBrowser for help on using the repository browser.