Package screenlets :: Module install
[hide private]
[frames] | no frames]

Source Code for Module screenlets.install

  1  # This application is released under the GNU General Public License  
  2  # v3 (or, at your option, any later version). You can find the full  
  3  # text of the license under http://www.gnu.org/licenses/gpl.txt.  
  4  # By using, editing and/or distributing this software you agree to  
  5  # the terms and conditions of this license.  
  6  # Thank you for using free software! 
  7  # 
  8  #  screenlets.install (c) RYX (Rico Pfaus 2007) <ryx@ryxperience.com>, 
  9  #  Whise (Helder Fraga) 2008 <helder.fraga@hotmail.com> 
 10  # 
 11   
 12  import screenlets 
 13  from screenlets import utils 
 14  import os 
 15  import gettext 
 16   
 17  gettext.textdomain('screenlets') 
 18  gettext.bindtextdomain('screenlets', screenlets.INSTALL_PREFIX +  '/share/locale') 
 19   
 20   
 21  # stub for gettext 
22 -def _(s):
23 #return s 24 return gettext.gettext(s)
25 26 27 if os.geteuid()==0: 28 # we run as root, install system-wide 29 USER = 0 30 DIR_USER = screenlets.DIR_USER_ROOT 31 DIR_AUTOSTART = '/etc/xdg/autostart' # TODO: use pyxdg here 32 else: 33 # we run as normal user, install into $HOME 34 USER = 1 35 DIR_USER = screenlets.DIR_USER 36 DIR_AUTOSTART = utils.get_autostart_dir() 37
38 -class ScreenletInstaller(object):
39 """A simple utility to install screenlets into the current user's directory 40 (so either into $HOME/.screenlets/ for normal users or, if run as root, 41 into screenlets.INSTALL_PREFIX/share/screenlets/).""" 42
43 - def __init__ (self):
44 self._message = ''
45 46
47 - def get_info_from_package_name (self, filename):
48 """Return all info we can get from the package-name or return None 49 if something went wrong. If nothing failed, the returned value is 50 a 4-tuple of the form: (name, version, basename, extension).""" 51 base = os.path.basename(filename) 52 ext = str(filename)[len(str(filename)) -3:] 53 # prepend "tar." if we have a bz2 or gz archive 54 tar_opts = 'xfz' 55 if ext == 'bz2': 56 tar_opts = 'xfj' 57 if ext == 'skz': 58 screenlets.show_error(None,_('This type of karamba theme is not supported yet\n Only older versions can be used')) 59 return False 60 # extract archive to temporary dir 61 62 if not os.path.isdir('/tmp/screenlets/'): 63 os.system('mkdir ' + '/tmp/screenlets/') 64 try: os.system('rm -rf /tmp/screenlets/install-temp') 65 except: pass 66 tmpdir = '/tmp/screenlets' + '/install-temp/' 67 os.system('mkdir %s' % tmpdir) 68 69 70 71 os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), tmpdir)) 72 for dd in os.listdir(tmpdir): 73 if str(dd).endswith('.theme'): 74 os.system('mv ' + tmpdir + ' ' + '/tmp/screenlets/' + dd[:-6]) 75 os.system('mkdir %s' % tmpdir) 76 os.system('mv ' + '/tmp/screenlets/' + dd[:-6] + ' '+ tmpdir) 77 name = dd[:-6] 78 return (name, ext) 79 80 for d in tmpdir : #for each item in folders 81 if os.path.exists(d) and os.path.isdir(d): #is it a valid folder? 82 for f in os.listdir(tmpdir): 83 84 name = f 85 try: 86 print name 87 return (name, ext) 88 except: 89 90 return False
91
92 - def get_result_message (self):
93 """Return a human-readable result message about the last operation.""" 94 return self._message
95
96 - def is_installed (self, name):
97 """Checks if the given screenlet with the name defined by 'name' 98 (without trailing 'Screenlet') is already installed in the current 99 install target location.""" 100 return os.path.isdir(DIR_USER + '/' + name)
101
102 - def install (self, filename):
103 """Install a screenlet from a given archive-file. Extracts the 104 contents of the archive to the user's screenlet dir.""" 105 print 'Installing %s' % filename 106 result = False 107 # get name of screenlet 108 #basename = os.path.basename(filename) 109 #extension = os.path.splitext(filename) 110 #name = basename[:basename.find('.')] 111 #print name 112 info = self.get_info_from_package_name(filename) 113 if info == False: 114 self._message= _("Archive is damaged or unsupported, use only tar, bz2 or gz.") 115 return False 116 name = info[0] 117 ext = info[1] 118 119 tar_opts = 'xfz' 120 if ext == 'bz2': 121 tar_opts = 'xfj' 122 123 124 125 # check if screenlet is already installed 126 #found_path = screenlets.utils.find_first_screenlet_path(name) 127 if self.is_installed(name):#found_path != None: 128 if screenlets.show_question(None,(_("The %(slet)sScreenlet is already installed in '%(dir)s'.\nDo you wish to continue?") % {"slet":name, "dir":DIR_USER}),(_('Install %s') % (name))): 129 pass 130 else: 131 self._message= _('%sScreenlet is already installed') % (name) 132 return False 133 # check extension and create appropriate args for tar 134 tmpdir = screenlets.DIR_TMP + '/install-temp' 135 # verify contents 136 if not os.path.isdir('%s/%s' % (tmpdir, name)): 137 # dir missing 138 self._message = _("Invalid archive. Archive must contain a directory with the screenlet's name.") 139 elif not os.path.isfile('%s/%s/%sScreenlet.py' % (tmpdir, name, name)): 140 # Not a screenlet , lets check for karamba theme 141 themename = '' 142 for findtheme in os.listdir('%s/%s/' % (tmpdir, name)): 143 if str(findtheme).lower().endswith('.theme'): 144 print findtheme 145 if themename == '': 146 print tmpdir + '/'+ name + '/' + themename[:-6] + '.py' 147 if not os.path.isfile(tmpdir + '/'+ name + '/' + findtheme[:-6] + '.py'): 148 themename = findtheme[:-6] 149 else: 150 self._message = _("Compatibility for this karamba theme is not yet implemented") 151 return False 152 if themename != '': 153 name1 = name.replace(' ','') 154 name1 = name1.replace('-','') 155 name1 = name1.replace('.','') 156 name1 = name1.replace('_','') 157 print name1 158 #os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 159 #os.system('mkdir %s/%s' % (DIR_USER,name1)) 160 if self.is_installed(name1):os.system('rm -rf %s/%s' % (DIR_USER, name1)) 161 162 os.system('mv %s/%s %s/%s ' % (chr(34) + tmpdir, name + chr(34),DIR_USER,name1))#tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 163 os.system('mkdir %s/%s/themes' % (DIR_USER,name1)) 164 os.system('mkdir %s/%s/themes/default' % (DIR_USER,name1)) 165 os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/karamba.png ' + DIR_USER + '/' + name1 + '/themes/default/') 166 if os.path.isfile(DIR_USER + '/' + name1 + '/icon.png') == False or os.path.isfile(DIR_USER + '/' + name1 + '/icon.svg') == False: 167 os.system('cp ' + screenlets.INSTALL_PREFIX + '/share/screenlets-manager/karamba.png ' + DIR_USER + '/' + name1 + '/icon.png') 168 widgetengine = open(screenlets.INSTALL_PREFIX + '/share/screenlets-manager/KarambaScreenlet.py', 'r') 169 enginecopy = widgetengine.read() 170 widgetengine.close() 171 widgetengine = None 172 enginecopy = enginecopy.replace('KarambaScreenlet',name1 + 'Screenlet') 173 174 enginesave = open(DIR_USER + '/' + name1 + '/' + name1 + 'Screenlet.py','w') 175 enginesave.write(enginecopy) 176 enginesave.close() 177 self._message = _("Karamba theme was successfully installed") 178 result = True 179 else:self._message = _("Invalid archive. Archive does not contain a screenlet or a valid karamba theme.") 180 181 182 183 184 185 186 187 188 189 190 else: 191 # check for package-info 192 193 if not os.path.isfile('%s/%s/Screenlet.package' % (tmpdir, name)): 194 if screenlets.show_question(None,(_("%s was not packaged with the screenlet packager. Do you wish to continue and try to install it?") % (name)),(_('Install %s') % (name))): 195 pass 196 else: 197 self._message = _("This package was not packaged with the screenlet packager.") 198 return False 199 200 # copy archive to user dir (and create if not exists) 201 utils.create_user_dir() 202 os.system('tar %s %s -C %s' % (tar_opts, chr(34)+filename+chr(34), DIR_USER)) 203 # delete package info from target dir 204 os.system('rm %s/%s/Screenlet.package' % (DIR_USER, name)) 205 # set msg/result 206 self._message = _("The %sScreenlet has been succesfully installed.") % name 207 result = True 208 # remove temp contents 209 os.system('rm -rf %s/install-temp' % screenlets.DIR_TMP) 210 # ready 211 return result
212