diff options
Diffstat (limited to 'plugins/plugin_installer')
-rw-r--r-- | plugins/plugin_installer/__init__.py | 1 | ||||
-rw-r--r-- | plugins/plugin_installer/config_dialog.ui | 294 | ||||
-rw-r--r-- | plugins/plugin_installer/manifest.ini | 8 | ||||
-rw-r--r-- | plugins/plugin_installer/plugin_installer.py | 532 |
4 files changed, 0 insertions, 835 deletions
diff --git a/plugins/plugin_installer/__init__.py b/plugins/plugin_installer/__init__.py deleted file mode 100644 index a272f29ca..000000000 --- a/plugins/plugin_installer/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from plugin_installer import PluginInstaller diff --git a/plugins/plugin_installer/config_dialog.ui b/plugins/plugin_installer/config_dialog.ui deleted file mode 100644 index e6376335c..000000000 --- a/plugins/plugin_installer/config_dialog.ui +++ /dev/null @@ -1,294 +0,0 @@ -<?xml version="1.0"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> - <object class="GtkTextBuffer" id="textbuffer1"> - <property name="text">Plug-in decription should be displayed here. This text will be erased during PluginsWindow initialization.</property> - </object> - <object class="GtkWindow" id="window1"> - <child> - <object class="GtkHPaned" id="hpaned2"> - <property name="width_request">600</property> - <property name="height_request">350</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="position">340</property> - <property name="position_set">True</property> - <child> - <object class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">6</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <object class="GtkTreeView" id="available_treeview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="search_column">1</property> - </object> - </child> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkProgressBar" id="progressbar"> - <property name="ellipsize">end</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="resize">False</property> - <property name="shrink">False</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox4"> - <property name="visible">True</property> - <property name="border_width">5</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="plugin_name_label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label"><empty></property> - <property name="selectable">True</property> - <property name="ellipsize">end</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox8"> - <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="label8"> - <property name="visible">True</property> - <property name="label" translatable="yes">Authors:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="plugin_authors_label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label"><empty></property> - <property name="selectable">True</property> - <property name="ellipsize">end</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox9"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label9"> - <property name="visible">True</property> - <property name="label" translatable="yes">Homepage:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLinkButton" id="plugin_homepage_linkbutton1"> - <property name="label">button</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="relief">none</property> - <property name="focus_on_click">False</property> - <property name="xalign">0</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox5"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkHBox" id="hbox10"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label10"> - <property name="visible">True</property> - <property name="label" translatable="yes">Description:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkAlignment" id="alignment4"> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkTextView" id="plugin_description_textview1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="pixels_above_lines">6</property> - <property name="wrap_mode">word</property> - <property name="left_margin">6</property> - <property name="right_margin">6</property> - <property name="indent">1</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="position">3</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox15"> - <property name="visible">True</property> - <child> - <placeholder/> - </child> - <child> - <object class="GtkHButtonBox" id="hbuttonbox3"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="inslall_upgrade_button"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">False</property> - <property name="receives_default">True</property> - <signal name="clicked" handler="on_inslall_upgrade_clicked"/> - <child> - <object class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <child> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="stock">gtk-refresh</property> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Install/Upgrade</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="pack_type">end</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">4</property> - </packing> - </child> - </object> - <packing> - <property name="resize">True</property> - <property name="shrink">True</property> - </packing> - </child> - </object> - </child> - </object> - <object class="GtkWindow" id="window2"> - <child> - <object class="GtkHBox" id="hbox111"> - <property name="visible">True</property> - <child> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Ftp server:</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="ftp_server"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> -</interface> diff --git a/plugins/plugin_installer/manifest.ini b/plugins/plugin_installer/manifest.ini deleted file mode 100644 index 7a1508150..000000000 --- a/plugins/plugin_installer/manifest.ini +++ /dev/null @@ -1,8 +0,0 @@ -[info] -name: Plugin Installer -short_name: plugin_installer -version: 0.5 -description: Install and upgrade plugins from ftp -authors: Denis Fomin <fominde@gmail.com> - Yann Leboulanger <asterix@lagaule.org> -homepage: http://www.gajim.org/ diff --git a/plugins/plugin_installer/plugin_installer.py b/plugins/plugin_installer/plugin_installer.py deleted file mode 100644 index 1fe131477..000000000 --- a/plugins/plugin_installer/plugin_installer.py +++ /dev/null @@ -1,532 +0,0 @@ -# -*- coding: utf-8 -*- -# -## plugins/plugin_installer/plugin_installer.py -## -## Copyright (C) 2010-2011 Denis Fomin <fominde AT gmail.com> -## Copyright (C) 2011 Yann Leboulanger <asterix AT lagaule.org> -## -## This file is part of Gajim. -## -## Gajim is free software; you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published -## by the Free Software Foundation; version 3 only. -## -## Gajim is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with Gajim. If not, see <http://www.gnu.org/licenses/>. -## -import gtk -import pango -import gobject -import ftplib -import io -import threading -import ConfigParser -import os -import fnmatch -import sys - -from common import gajim -from plugins import GajimPlugin -from plugins.helpers import log_calls, log -from dialogs import WarningDialog, HigDialog, YesNoDialog -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): - - @log_calls('PluginInstallerPlugin') - def init(self): - self.description = _('Install and upgrade plugins from ftp') - self.config_dialog = PluginInstallerPluginConfigDialog(self) - 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') - def activate(self): - self.pl_menuitem = gajim.interface.roster.xml.get_object( - 'plugins_menuitem') - self.id_ = self.pl_menuitem.connect_after('activate', self.on_activate) - if 'plugins' in gajim.interface.instances: - 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(): - try: - to_update = [] - con = ftplib.FTP_TLS(ftp.server) - con.login() - con.prot_p() - 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) - except Exception, e: - log.debug('Ftp error when check updates: %s' % str(e)) - ftp = Ftp(self) - ftp.run = _run - ftp.start() - - @log_calls('PluginInstallerPlugin') - def deactivate(self): - self.pl_menuitem.disconnect(self.id_) - if hasattr(self, 'page_num'): - self.notebook.remove_page(self.page_num) - self.notebook.set_current_page(0) - if hasattr(self, 'ftp'): - del self.ftp - - def on_activate(self, widget): - if 'plugins' not in gajim.interface.instances: - return - self.installed_plugins_model = gajim.interface.instances[ - 'plugins'].installed_plugins_model - self.notebook = gajim.interface.instances['plugins'].plugins_notebook - self.id_n = self.notebook.connect('switch-page', - self.on_notebook_switch_page) - self.window = gajim.interface.instances['plugins'].window - self.window.connect('destroy', self.on_win_destroy) - self.GTK_BUILDER_FILE_PATH = self.local_file_path('config_dialog.ui') - self.xml = gtk.Builder() - self.xml.set_translation_domain('gajim_plugins') - self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['hpaned2']) - hpaned = self.xml.get_object('hpaned2') - self.page_num = self.notebook.append_page(hpaned, - gtk.Label(_('Available'))) - - widgets_to_extract = ('plugin_name_label1', - 'available_treeview', 'progressbar', 'inslall_upgrade_button', - 'plugin_authors_label1', 'plugin_authors_label1', - 'plugin_homepage_linkbutton1', 'plugin_description_textview1') - - for widget_name in widgets_to_extract: - setattr(self, widget_name, self.xml.get_object(widget_name)) - - attr_list = pango.AttrList() - attr_list.insert(pango.AttrWeight(pango.WEIGHT_BOLD, 0, -1)) - self.plugin_name_label1.set_attributes(attr_list) - - self.available_plugins_model = gtk.ListStore(gobject.TYPE_PYOBJECT, - gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, - gobject.TYPE_BOOLEAN, gobject.TYPE_PYOBJECT, gobject.TYPE_PYOBJECT, - gobject.TYPE_PYOBJECT) - self.available_treeview.set_model(self.available_plugins_model) - - self.progressbar.set_property('no-show-all', True) - renderer = gtk.CellRendererText() - col = gtk.TreeViewColumn(_('Plugin'), renderer, text=1) - col.set_resizable(True) - col.set_property('expand', True) - col.set_sizing(gtk.TREE_VIEW_COLUMN_GROW_ONLY) - self.available_treeview.append_column(col) - col = gtk.TreeViewColumn(_('Installed\nversion'), renderer, text=2) - self.available_treeview.append_column(col) - col = gtk.TreeViewColumn(_('Available\nversion'), renderer, text=3) - col.set_property('expand', False) - self.available_treeview.append_column(col) - - renderer = gtk.CellRendererToggle() - renderer.set_property('activatable', True) - renderer.connect('toggled', self.available_plugins_toggled_cb) - col = gtk.TreeViewColumn(_('Install /\nUpgrade'), renderer, active=4) - self.available_treeview.append_column(col) - - if gobject.signal_lookup('error_signal', self.window) is 0: - gobject.signal_new('error_signal', self.window, - gobject.SIGNAL_RUN_LAST, gobject.TYPE_STRING, - (gobject.TYPE_STRING,)) - gobject.signal_new('plugin_downloaded', self.window, - gobject.SIGNAL_RUN_LAST, gobject.TYPE_STRING, - (gobject.TYPE_PYOBJECT,)) - self.window.connect('error_signal', self.on_some_ftp_error) - self.window.connect('plugin_downloaded', self.on_plugin_downloaded) - - selection = self.available_treeview.get_selection() - selection.connect('changed', - self.available_plugins_treeview_selection_changed) - selection.set_mode(gtk.SELECTION_SINGLE) - - self._clear_available_plugin_info() - self.xml.connect_signals(self) - self.window.show_all() - - def on_win_destroy(self, widget): - if hasattr(self, 'ftp'): - del self.ftp - - def available_plugins_toggled_cb(self, cell, path): - is_active = self.available_plugins_model[path][4] - self.available_plugins_model[path][4] = not is_active - dir_list = [] - for i in xrange(len(self.available_plugins_model)): - if self.available_plugins_model[i][4]: - dir_list.append(self.available_plugins_model[i][0]) - if not dir_list: - self.inslall_upgrade_button.set_property('sensitive', False) - else: - self.inslall_upgrade_button.set_property('sensitive', True) - - def on_notebook_switch_page(self, widget, page, page_num): - if not hasattr(self, 'ftp') and self.page_num == page_num: - self.available_plugins_model.clear() - self.progressbar.show() - self.ftp = Ftp(self) - self.ftp.remote_dirs = None - self.ftp.upgrading = True - self.ftp.start() - - def on_inslall_upgrade_clicked(self, widget): - self.inslall_upgrade_button.set_property('sensitive', False) - dir_list = [] - for i in xrange(len(self.available_plugins_model)): - if self.available_plugins_model[i][4]: - dir_list.append(self.available_plugins_model[i][0]) - - ftp = Ftp(self) - ftp.remote_dirs = dir_list - ftp.start() - - def on_some_ftp_error(self, widget, error_text): - for i in xrange(len(self.available_plugins_model)): - self.available_plugins_model[i][4] = False - self.progressbar.hide() - WarningDialog(_('Ftp error'), error_text, self.window) - - def on_plugin_downloaded(self, widget, plugin_dirs): - for _dir in plugin_dirs: - is_active = False - plugins = None - plugin_dir = os.path.join(gajim.PLUGINS_DIRS[1], _dir) - plugin = gajim.plugin_manager.get_plugin_by_path(plugin_dir) - if plugin: - if plugin.active and plugin.name != self.name: - is_active = True - gobject.idle_add(gajim.plugin_manager.deactivate_plugin, - plugin) - gajim.plugin_manager.plugins.remove(plugin) - - model = self.installed_plugins_model - for row in xrange(len(model)): - if plugin == model[row][0]: - model.remove(model.get_iter((row, 0))) - break - - plugins = self.scan_dir_for_plugin(plugin_dir) - if not plugins: - continue - gajim.plugin_manager.add_plugin(plugins[0]) - plugin = gajim.plugin_manager.plugins[-1] - for row in xrange(len(self.available_plugins_model)): - if plugin.name == self.available_plugins_model[row][1]: - self.available_plugins_model[row][2] = plugin.version - self.available_plugins_model[row][4] = False - continue - if is_active and plugin.name != self.name: - gobject.idle_add(gajim.plugin_manager.activate_plugin, plugin) - if plugin.name != 'Plugin Installer': - self.installed_plugins_model.append([plugin, plugin.name, - is_active]) - dialog = HigDialog(None, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, - '', _('All selected plugins downloaded')) - dialog.set_modal(False) - dialog.set_transient_for(self.window) - dialog.popup() - - def available_plugins_treeview_selection_changed(self, treeview_selection): - model, iter = treeview_selection.get_selected() - if iter: - self.plugin_name_label1.set_text(model.get_value(iter, 1)) - self.plugin_authors_label1.set_text(model.get_value(iter, 6)) - self.plugin_homepage_linkbutton1.set_uri(model.get_value(iter, 7)) - self.plugin_homepage_linkbutton1.set_label(model.get_value(iter, 7)) - label = self.plugin_homepage_linkbutton1.get_children()[0] - label.set_ellipsize(pango.ELLIPSIZE_END) - self.plugin_homepage_linkbutton1.set_property('sensitive', True) - desc_textbuffer = self.plugin_description_textview1.get_buffer() - desc_textbuffer.set_text(_(model.get_value(iter, 5))) - self.plugin_description_textview1.set_property('sensitive', True) - else: - self._clear_available_plugin_info() - - def _clear_available_plugin_info(self): - self.plugin_name_label1.set_text('') - self.plugin_authors_label1.set_text('') - self.plugin_homepage_linkbutton1.set_uri('') - self.plugin_homepage_linkbutton1.set_label('') - self.plugin_homepage_linkbutton1.set_property('sensitive', False) - - desc_textbuffer = self.plugin_description_textview1.get_buffer() - desc_textbuffer.set_text('') - self.plugin_description_textview1.set_property('sensitive', False) - - def scan_dir_for_plugin(self, path): - plugins_found = [] - conf = ConfigParser.ConfigParser() - fields = ('name', 'short_name', 'version', 'description', 'authors', - 'homepage') - if not os.path.isdir(path): - return plugins_found - - dir_list = os.listdir(path) - dir_, mod = os.path.split(path) - sys.path.insert(0, dir_) - - manifest_path = os.path.join(path, 'manifest.ini') - if not os.path.isfile(manifest_path): - return plugins_found - - for elem_name in dir_list: - file_path = os.path.join(path, elem_name) - module = None - - if os.path.isfile(file_path) and fnmatch.fnmatch(file_path, '*.py'): - module_name = os.path.splitext(elem_name)[0] - if module_name == '__init__': - continue - try: - module = __import__('%s.%s' % (mod, module_name)) - except ValueError, value_error: - pass - except ImportError, import_error: - pass - except AttributeError, attribute_error: - pass - if module is None: - continue - - for module_attr_name in [attr_name for attr_name in dir(module) - if not (attr_name.startswith('__') or attr_name.endswith('__'))]: - module_attr = getattr(module, module_attr_name) - try: - if not issubclass(module_attr, GajimPlugin) or \ - module_attr is GajimPlugin: - continue - module_attr.__path__ = os.path.abspath(os.path.dirname( - file_path)) - - # read metadata from manifest.ini - conf.readfp(open(manifest_path, 'r')) - for option in fields: - if conf.get('info', option) is '': - raise ConfigParser.NoOptionError, 'field empty' - setattr(module_attr, option, conf.get('info', option)) - conf.remove_section('info') - plugins_found.append(module_attr) - - except TypeError, type_error: - pass - except ConfigParser.NoOptionError, type_error: - # all fields are required - pass - return plugins_found - - -class Ftp(threading.Thread): - def __init__(self, plugin): - super(Ftp, self).__init__() - self.plugin = plugin - self.window = plugin.window - self.server = plugin.config['ftp_server'] - self.progressbar = plugin.progressbar - self.model = plugin.available_plugins_model - self.config = ConfigParser.ConfigParser() - self.buffer_ = io.BytesIO() - self.remote_dirs = None - self.append_to_model = True - self.upgrading = False - - def model_append(self, row): - self.model.append(row) - return False - - def progressbar_pulse(self): - self.progressbar.pulse() - return True - - def get_plugin_version(self, plugin_name): - for plugin in gajim.plugin_manager.plugins: - if plugin.name == plugin_name: - return plugin.version - - def run(self): - try: - gobject.idle_add(self.progressbar.set_text, - _('Connecting to server')) - self.ftp = ftplib.FTP_TLS(self.server) - self.ftp.login() - self.ftp.prot_p() - self.ftp.cwd('plugins') - if not self.remote_dirs: - self.plugins_dirs = self.ftp.nlst() - progress_step = 1.0 / len(self.plugins_dirs) - gobject.idle_add(self.progressbar.set_text, - _('Scan files on the server')) - for dir_ in self.plugins_dirs: - fract = self.progressbar.get_fraction() + progress_step - gobject.idle_add(self.progressbar.set_fraction, fract) - gobject.idle_add(self.progressbar.set_text, - _('Read "%s"') % dir_) - try: - self.ftp.retrbinary('RETR %s/manifest.ini' % dir_, - self.handleDownload) - except Exception, error: - if str(error).startswith('550'): - continue - self.config.readfp(io.BytesIO(self.buffer_.getvalue())) - local_version = self.get_plugin_version( - 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_, - self.config.get('info', 'name'), local_version, - self.config.get('info', 'version'), upgrade, - self.config.get('info', 'description'), - self.config.get('info', 'authors'), - self.config.get('info', 'homepage'), ]) - self.plugins_dirs = None - self.ftp.quit() - gobject.idle_add(self.progressbar.set_fraction, 0) - if self.remote_dirs: - self.download_plugin() - gobject.idle_add(self.progressbar.hide) - except Exception, e: - self.window.emit('error_signal', str(e)) - - def handleDownload(self, block): - self.buffer_.write(block) - - def download_plugin(self): - gobject.idle_add(self.progressbar.show) - self.pulse = gobject.timeout_add(150, self.progressbar_pulse) - gobject.idle_add(self.progressbar.set_text, _('Create a list of files')) - for remote_dir in self.remote_dirs: - - def nlstr(dir_, subdir=None): - if subdir: - dir_ = dir_ + '/' + subdir - list_ = self.ftp.nlst(dir_) - for i in list_: - name = i.split('/')[-1] - if '.' not in name: - try: - if i == self.ftp.nlst(i)[0]: - files.append(i[1:]) - del dirs[i[1:]] - except Exception, e: - # empty dir or file - continue - dirs.append(i[1:]) - subdirs = name - nlstr(dir_, subdirs) - else: - files.append(i[1:]) - dirs, files = [], [] - nlstr('/plugins/' + remote_dir) - - if not os.path.isdir(gajim.PLUGINS_DIRS[1]): - os.mkdir(gajim.PLUGINS_DIRS[1]) - local_dir = ld = os.path.join(gajim.PLUGINS_DIRS[1], remote_dir) - if not os.path.isdir(local_dir): - os.mkdir(local_dir) - local_dir = os.path.split(gajim.PLUGINS_DIRS[1])[0] - - # creating dirs - for dir_ in dirs: - try: - os.mkdir(os.path.join(local_dir, dir_)) - except OSError, e: - if str(e).startswith('[Errno 17]'): - continue - raise - - # downloading files - for filename in files: - gobject.idle_add(self.progressbar.set_text, - _('Downloading "%s"') % filename) - full_filename = os.path.join(local_dir, filename) - try: - self.ftp.retrbinary('RETR /%s' % filename, - open(full_filename, 'wb').write) - #full_filename.close() - except ftplib.error_perm: - print 'ERROR: cannot read file "%s"' % filename - os.unlink(filename) - self.ftp.quit() - gobject.idle_add(self.window.emit, 'plugin_downloaded', - self.remote_dirs) - gobject.source_remove(self.pulse) - - -class PluginInstallerPluginConfigDialog(GajimPluginConfigDialog): - def init(self): - self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path( - 'config_dialog.ui') - self.xml = gtk.Builder() - self.xml.set_translation_domain('gajim_plugins') - self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH, ['hbox111']) - hbox = self.xml.get_object('hbox111') - self.child.pack_start(hbox) - - self.xml.connect_signals(self) - self.connect('hide', self.on_hide) - - def on_run(self): - widget = self.xml.get_object('ftp_server') - widget.set_text(str(self.plugin.config['ftp_server'])) - - def on_hide(self, widget): - widget = self.xml.get_object('ftp_server') - self.plugin.config['ftp_server'] = widget.get_text() |