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

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

ZmdManager? bugfix

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