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

Last change on this file since 5199 was 5199, checked in by Juanma, 21 months ago

appimage fully functional

File size: 3.8 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
7import sys
8import threading
9from bs4 import BeautifulSoup
10import random
11import time
12class appimagemanager:
13        def __init__(self):
14                self.dbg=1
15                self.progress=0
16                #This dict defines wich package_type relies on what action
17                #action=example
18                #package='*' (in this case all packages)
19                self.pluginInfo={'install':'appimage','remove':'appimage','pkginfo':'appimage'}
20                self.result={}
21                self.result['data']={}
22                self.result['status']={}
23                self.appImageFolder='/opt/bundles/appimg'
24                self.repoPage='https://dl.bintray.com/probono/AppImages'
25                #To get the description of an app we must go to a specific url.
26                #$(appname) we'll be replaced with the appname so the url matches the right one.
27                #If other site has other url naming convention it'll be mandatory to define it with the appropiate replacements
28                self.infoPage='https://bintray.com/probono/AppImages/$(appname)'
29                self.count=0
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 appImg: '+msg)
40        #def debug
41
42        def register(self):
43                return(self.pluginInfo)
44
45        def execute_action(self,action,applist=None):
46                self._chk_installDir()
47                self.progress=0
48                self.result['status']={'status':-1,'msg':''}
49                self.result['data']=''
50                dataList=[]
51                for appInfo in applist:
52                        if action=='install':
53                                dataList.append(self._install_appImg(appInfo))
54                        if action=='remove':
55                                dataList.append(self._remove_appImg(appInfo))
56                        if action=='pkginfo':
57                                dataList.append(self._get_info(appInfo))
58                self.result['data']=list(dataList)
59                self.progress=100
60                return(self.result)
61
62        def _set_status(self,status,msg=''):
63                self.result['status']={'status':status,'msg':msg}
64        #def _set_status
65
66        def _callback(self,partialSize=0,totalSize=0):
67                limit=99
68                if partialSize!=0 and totalSize!=0:
69                        inc=round(partialSize/totalSize,2)*100
70                        self.progress=inc
71                else:
72                        inc=1
73                        margin=limit-self.progress
74                        inc=round(margin/limit,3)
75                        self.progress=(self.progress+inc)
76                if (self.progress>limit):
77                        self.progress=limit
78
79        def _chk_installDir(self):
80                msg_status=True
81                if not os.path.isdir(self.appImageFolder):
82                        try:
83                                os.makedirs(self.appImageFolder)
84                        except:
85                                msg_status=False
86                return msg_status                               
87
88        def _install_appImg(self,appInfo):
89                appInfo=self._get_info(appInfo)
90                if appInfo['state']=='installed':
91                        self._set_status(4)
92                else:
93                        appImgUrl=self.repoPage+'/'+appInfo['appImage']
94                        self._debug("Downloading "+appImgUrl)
95                        dest_path=self.appImageFolder+'/'+appInfo['appImage']
96                        if appImgUrl:
97                                try:
98                                        with urllib.request.urlopen(appImgUrl) as response, open(dest_path, 'wb') as out_file:
99                                                bf=16*1024
100                                                acumbf=0
101                                                appSize=int(response.info()['Content-Length'])
102                                                while True:
103                                                        if acumbf>=appSize:
104                                                            break
105                                                        shutil.copyfileobj(response, out_file,bf)
106                                                        acumbf=acumbf+bf
107                                                        self._callback(acumbf,appSize)
108                                        st = os.stat(dest_path)
109                                        os.chmod(dest_path, st.st_mode | 0o111)
110                                        self._set_status(0)
111                                except:
112                                        self._set_status(5)
113                        else:
114                                self._set_status(12)
115                return appInfo
116        #def _install_appImg
117
118        def _remove_appImg(self,appInfo):
119                self._debug("Removing "+appInfo['appImage'])
120                if os.path.isfile(self.appImageFolder+'/'+appInfo['appImage']):
121                        try:
122                                call([self.appImageFolder+"/"+appInfo['appImage'], "--remove-appimage-desktop-integration"])
123                                os.remove(self.appImageFolder+"/"+appInfo['appImage'])
124                                self._set_status(0)
125                        except:
126                                self._set_status(6)
127                return(appInfo)
128        #def _remove_appImg
129
130        def _get_info(self,appInfo):
131                appInfo['state']='available'
132                if os.path.isfile(self.appImageFolder+'/'+appInfo['appImage']):
133                        appInfo['state']='installed'
134                self._set_status(0)
135                return(appInfo)
136        #def _get_info
137
Note: See TracBrowser for help on using the repository browser.