auto-check for updates of installed plugins
This commit is contained in:
parent
3b646fac4a
commit
70fcdcdab2
|
@ -1,7 +1,8 @@
|
||||||
[info]
|
[info]
|
||||||
name: Plugin Installer
|
name: Plugin Installer
|
||||||
short_name: plugin_installer
|
short_name: plugin_installer
|
||||||
version: 0.3
|
version: 0.4
|
||||||
description: Install and upgrade plugins from ftp
|
description: Install and upgrade plugins from ftp
|
||||||
authors: Denis Fomin <fominde@gmail.com>
|
authors: Denis Fomin <fominde@gmail.com>
|
||||||
|
Yann Leboulanger <asterix@lagaule.org>
|
||||||
homepage: http://www.gajim.org/
|
homepage: http://www.gajim.org/
|
||||||
|
|
|
@ -33,10 +33,17 @@ import sys
|
||||||
from common import gajim
|
from common import gajim
|
||||||
from plugins import GajimPlugin
|
from plugins import GajimPlugin
|
||||||
from plugins.helpers import log_calls, log
|
from plugins.helpers import log_calls, log
|
||||||
from dialogs import WarningDialog, HigDialog
|
from dialogs import WarningDialog, HigDialog, YesNoDialog
|
||||||
from plugins.gui import GajimPluginConfigDialog
|
from plugins.gui import GajimPluginConfigDialog
|
||||||
|
|
||||||
|
|
||||||
|
def convert_version_to_list(version_str):
|
||||||
|
version_list = version_str.split('.')
|
||||||
|
l = []
|
||||||
|
while len(version_list):
|
||||||
|
l.append(int(version_list.pop(0)))
|
||||||
|
return l
|
||||||
|
|
||||||
class PluginInstaller(GajimPlugin):
|
class PluginInstaller(GajimPlugin):
|
||||||
|
|
||||||
@log_calls('PluginInstallerPlugin')
|
@log_calls('PluginInstallerPlugin')
|
||||||
|
@ -44,6 +51,10 @@ class PluginInstaller(GajimPlugin):
|
||||||
self.description = _('Install and upgrade plugins from ftp')
|
self.description = _('Install and upgrade plugins from ftp')
|
||||||
self.config_dialog = PluginInstallerPluginConfigDialog(self)
|
self.config_dialog = PluginInstallerPluginConfigDialog(self)
|
||||||
self.config_default_values = {'ftp_server': ('ftp.gajim.org', '')}
|
self.config_default_values = {'ftp_server': ('ftp.gajim.org', '')}
|
||||||
|
self.window = None
|
||||||
|
self.progressbar = None
|
||||||
|
self.available_plugins_model = None
|
||||||
|
self.upgrading = False # True when opened from upgrade popup dialog
|
||||||
|
|
||||||
@log_calls('PluginInstallerPlugin')
|
@log_calls('PluginInstallerPlugin')
|
||||||
def activate(self):
|
def activate(self):
|
||||||
|
@ -52,6 +63,50 @@ class PluginInstaller(GajimPlugin):
|
||||||
self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate)
|
self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate)
|
||||||
if 'plugins' in gajim.interface.instances:
|
if 'plugins' in gajim.interface.instances:
|
||||||
self.on_activate(None)
|
self.on_activate(None)
|
||||||
|
gobject.timeout_add_seconds(30, self.check_update)
|
||||||
|
|
||||||
|
@log_calls('PluginInstallerPlugin')
|
||||||
|
def warn_update(self, plugins):
|
||||||
|
def open_update(dummy):
|
||||||
|
self.upgrading = True
|
||||||
|
self.pl_menuitem.activate()
|
||||||
|
nb = gajim.interface.instances['plugins'].plugins_notebook
|
||||||
|
gobject.idle_add(nb.set_current_page, 1)
|
||||||
|
if plugins:
|
||||||
|
plugins_str = '\n'.join(plugins)
|
||||||
|
YesNoDialog(_('Plugins updates'), _('Some updates are available for'
|
||||||
|
' your installer plugins. Do you want to update those plugins:'
|
||||||
|
'\n%s') % plugins_str, on_response_yes=open_update)
|
||||||
|
|
||||||
|
@log_calls('PluginInstallerPlugin')
|
||||||
|
def check_update(self):
|
||||||
|
def _run():
|
||||||
|
to_update = []
|
||||||
|
con = ftplib.FTP(ftp.server)
|
||||||
|
con.login()
|
||||||
|
con.cwd('plugins')
|
||||||
|
plugins_dirs = con.nlst()
|
||||||
|
for dir_ in plugins_dirs:
|
||||||
|
try:
|
||||||
|
con.retrbinary('RETR %s/manifest.ini' % dir_,
|
||||||
|
ftp.handleDownload)
|
||||||
|
except Exception, error:
|
||||||
|
if str(error).startswith('550'):
|
||||||
|
continue
|
||||||
|
ftp.config.readfp(io.BytesIO(ftp.buffer_.getvalue()))
|
||||||
|
local_version = ftp.get_plugin_version(ftp.config.get('info',
|
||||||
|
'name'))
|
||||||
|
if local_version:
|
||||||
|
local = convert_version_to_list(local_version)
|
||||||
|
remote = convert_version_to_list(ftp.config.get('info',
|
||||||
|
'version'))
|
||||||
|
if remote > local:
|
||||||
|
to_update.append(ftp.config.get('info', 'name'))
|
||||||
|
con.quit()
|
||||||
|
gobject.idle_add(self.warn_update, to_update)
|
||||||
|
ftp = Ftp(self)
|
||||||
|
ftp.run = _run
|
||||||
|
ftp.start()
|
||||||
|
|
||||||
@log_calls('PluginInstallerPlugin')
|
@log_calls('PluginInstallerPlugin')
|
||||||
def deactivate(self):
|
def deactivate(self):
|
||||||
|
@ -152,12 +207,13 @@ class PluginInstaller(GajimPlugin):
|
||||||
else:
|
else:
|
||||||
self.inslall_upgrade_button.set_property('sensitive', True)
|
self.inslall_upgrade_button.set_property('sensitive', True)
|
||||||
|
|
||||||
def on_notebook_switch_page(self, widget, page, page_num,):
|
def on_notebook_switch_page(self, widget, page, page_num):
|
||||||
if not hasattr(self, 'ftp') and self.page_num == page_num:
|
if not hasattr(self, 'ftp') and self.page_num == page_num:
|
||||||
self.available_plugins_model.clear()
|
self.available_plugins_model.clear()
|
||||||
self.progressbar.show()
|
self.progressbar.show()
|
||||||
self.ftp = Ftp(self)
|
self.ftp = Ftp(self)
|
||||||
self.ftp.remote_dirs = None
|
self.ftp.remote_dirs = None
|
||||||
|
self.ftp.upgrading = True
|
||||||
self.ftp.start()
|
self.ftp.start()
|
||||||
|
|
||||||
def on_inslall_upgrade_clicked(self, widget):
|
def on_inslall_upgrade_clicked(self, widget):
|
||||||
|
@ -309,6 +365,7 @@ class PluginInstaller(GajimPlugin):
|
||||||
class Ftp(threading.Thread):
|
class Ftp(threading.Thread):
|
||||||
def __init__(self, plugin):
|
def __init__(self, plugin):
|
||||||
super(Ftp, self).__init__()
|
super(Ftp, self).__init__()
|
||||||
|
self.plugin = plugin
|
||||||
self.window = plugin.window
|
self.window = plugin.window
|
||||||
self.server = plugin.config['ftp_server']
|
self.server = plugin.config['ftp_server']
|
||||||
self.progressbar = plugin.progressbar
|
self.progressbar = plugin.progressbar
|
||||||
|
@ -317,6 +374,7 @@ class Ftp(threading.Thread):
|
||||||
self.buffer_ = io.BytesIO()
|
self.buffer_ = io.BytesIO()
|
||||||
self.remote_dirs = None
|
self.remote_dirs = None
|
||||||
self.append_to_model = True
|
self.append_to_model = True
|
||||||
|
self.upgrading = False
|
||||||
|
|
||||||
def model_append(self, row):
|
def model_append(self, row):
|
||||||
self.model.append(row)
|
self.model.append(row)
|
||||||
|
@ -357,9 +415,19 @@ class Ftp(threading.Thread):
|
||||||
self.config.readfp(io.BytesIO(self.buffer_.getvalue()))
|
self.config.readfp(io.BytesIO(self.buffer_.getvalue()))
|
||||||
local_version = self.get_plugin_version(
|
local_version = self.get_plugin_version(
|
||||||
self.config.get('info', 'name'))
|
self.config.get('info', 'name'))
|
||||||
|
upgrade = False
|
||||||
|
if self.upgrading and local_version:
|
||||||
|
local = convert_version_to_list(local_version)
|
||||||
|
remote = convert_version_to_list(self.config.get('info',
|
||||||
|
'version'))
|
||||||
|
if remote > local:
|
||||||
|
upgrade = True
|
||||||
|
gobject.idle_add(
|
||||||
|
self.plugin.inslall_upgrade_button.set_property,
|
||||||
|
'sensitive', True)
|
||||||
gobject.idle_add(self.model_append, [dir_,
|
gobject.idle_add(self.model_append, [dir_,
|
||||||
self.config.get('info', 'name'), local_version,
|
self.config.get('info', 'name'), local_version,
|
||||||
self.config.get('info', 'version'), False,
|
self.config.get('info', 'version'), upgrade,
|
||||||
self.config.get('info', 'description'),
|
self.config.get('info', 'description'),
|
||||||
self.config.get('info', 'authors'),
|
self.config.get('info', 'authors'),
|
||||||
self.config.get('info', 'homepage'), ])
|
self.config.get('info', 'homepage'), ])
|
||||||
|
|
Loading…
Reference in New Issue