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

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

remove duplicated debs when there's a zmd managing the deb installation

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