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

Last change on this file since 5133 was 5133, checked in by Juanma, 2 years ago

added appImage plugin

File size: 3.9 KB
Line 
1#The name of the main class must match the file name in lowercase
2import urllib
3import shutil
4import json
5import os
6from subprocess import call
7class appimagemanager:
8        def __init__(self):
9                self.example='This is an example plugin'
10                self.dbg=0
11                self.progress=0
12                #This dict defines wich package_type relies on what action
13                #action=example
14                #package='*' (in this case all packages)
15                self.pluginInfo={'install':'appimage','remove':'appimage','pkginfo':'appimage'}
16                self.result={}
17                self.result['data']={}
18                self.result['status']={}
19                self.appImageFolder='/tmp'
20                self.pkginfo=self.appImageFolder+'/.bundles.json'
21                self.count=0
22        #def __init__
23
24        def set_debug(self,dbg='1'):
25                self.dbg=int(dbg)
26                self._debug ("Debug enabled")
27        #def set_debug
28
29        def _debug(self,msg=''):
30                if self.dbg==1:
31                        print ('DEBUG appImg: '+msg)
32        #def debug
33
34        def register(self):
35                return(self.pluginInfo)
36
37        def execute_action(self,action,applist):
38                self.progress=0
39                self.result['status']={'status':-1,'msg':''}
40                self.result['data']=''
41                dataList=[]
42                for appInfo in applist:
43                        if action=='install':
44                                dataList.append(self._install_appImg(appInfo))
45                        if action=='remove':
46                                dataList.append(self._remove_appImg(appInfo))
47                        if action=='pkginfo':
48                                dataList.append(self._get_info(appInfo))
49                self.result['data']=list(dataList)
50                self.progress=100
51                return(self.result)
52
53        def _set_status(self,status,msg=''):
54                self.result['status']={'status':status,'msg':msg}
55        #def _set_status
56
57        def _callback(self,partialSize=0,totalSize=0):
58                limit=99
59                if partialSize!=0 and totalSize!=0:
60                        inc=round(partialSize/totalSize,2)*100
61                        self.progress=inc
62                else:
63                        inc=1
64                        margin=limit-self.progress
65                        inc=round(margin/limit,3)
66                        self.progress=(self.progress+inc)
67                if (self.progress>limit):
68                        self.progress=limit
69
70        def _install_appImg(self,appInfo):
71                appInfo=self._get_info(appInfo)
72                if appInfo['state']=='installed':
73                        self._set_status(4)
74                else:
75                        appImgUrl='https://dl.bintray.com/probono/AppImages/'+appInfo['appImage']
76                        self._debug("Downloading "+appImgUrl)
77                        dest_path='/tmp/'+appInfo['appImage']
78                        if appImgUrl:
79                                try:
80                                        with urllib.request.urlopen(appImgUrl) as response, open(dest_path, 'wb') as out_file:
81                                                bf=16*1024
82                                                acumbf=0
83                                                appSize=int(response.info()['Content-Length'])
84                                                while True:
85                                                        if acumbf>=appSize:
86                                                            break
87                                                        shutil.copyfileobj(response, out_file,bf)
88                                                        acumbf=acumbf+bf
89                                                        self._callback(acumbf,appSize)
90                                        st = os.stat(dest_path)
91                                        os.chmod(dest_path, st.st_mode | 0o111)
92                                        self._set_status(0)
93                                        self._write_info(appInfo,'install')
94                                except:
95                                        self._set_status(5)
96                        else:
97                                self._set_status(12)
98                return appInfo
99        #def _install_appImg
100
101        def _remove_appImg(self,appInfo):
102                appInfo=self._get_info(appInfo)
103                if appInfo['state']=='available':
104                        self._set_status(3)
105                else:
106                        try:
107                                call([self.appImageFolder+"/"+appInfo['appImage'], "--remove-appimage-desktop-integration"])
108                                os.remove(self.appImageFolder+"/"+appInfo['appImage'])
109                                self._write_info(appInfo,'remove')
110                                self._set_status(0)
111                        except:
112                                self._set_status(6)
113                return(appInfo)
114        #def _remove_appImg
115       
116        def _write_info(self,appInfo,action):
117                infoBundle={}
118                if os.path.isfile(self.pkginfo):
119                        try:
120                                infoFile=open(self.pkginfo).read()
121                                infoBundle=json.loads(infoFile)
122                        except:
123                                pass
124                if action=='remove':
125                        infoBundle.pop(appInfo['appImage'],None)
126                if action=='install':
127                        infoBundle.update({appInfo['appImage']:'installed'})
128                try:
129                        with open(self.pkginfo, 'w') as infoFile:
130                            infoBundle=json.dump(infoBundle,infoFile)
131                except:
132                        pass
133        #def _write_info
134
135        def _get_info(self,appInfo):
136                appInfo['state']='available'
137                if os.path.isfile(self.pkginfo):
138                        try:
139                                infoFile=open(self.pkginfo).read()
140                                infoBundle=json.loads(infoFile)
141                                if appInfo['appImage'] in infoBundle:
142                                        appInfo['state']=infoBundle[appInfo['appImage']]
143                        except:
144                                pass
145                self._set_status(0)
146                return(appInfo)
147        #def _get_info
Note: See TracBrowser for help on using the repository browser.