Univention Bugzilla – Attachment 5945 Details for
Bug 34989
App Center repository creation is too slow
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Using 25_ucs-appcenter.list instead
bug34989.patch (text/plain), 13.80 KB, created by
Dirk Wiesenthal
on 2014-06-10 14:30:35 CEST
(
hide
)
Description:
Using 25_ucs-appcenter.list instead
Filename:
MIME Type:
Creator:
Dirk Wiesenthal
Created:
2014-06-10 14:30:35 CEST
Size:
13.80 KB
patch
obsolete
>Index: scripts/univention-migrate-apps >=================================================================== >--- scripts/univention-migrate-apps (Revision 0) >+++ scripts/univention-migrate-apps (Revision 0) >@@ -0,0 +1,87 @@ >+#!/usr/bin/python2.6 >+# -*- coding: utf-8 -*- >+# >+# Univention App Center >+# univention-register-apps >+# >+# Copyright 2014 Univention GmbH >+# >+# http://www.univention.de/ >+# >+# All rights reserved. >+# >+# The source code of this program is made available >+# under the terms of the GNU Affero General Public License version 3 >+# (GNU AGPL V3) as published by the Free Software Foundation. >+# >+# Binary versions of this program provided by Univention to you as >+# well as other copyrighted, protected or trademarked materials like >+# Logos, graphics, fonts, specific documentations and configurations, >+# cryptographic keys etc. are subject to a license agreement between >+# you and Univention and not subject to the GNU AGPL V3. >+# >+# In the case you use this program under the terms of the GNU AGPL V3, >+# the program is provided 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 Affero General Public License for more details. >+# >+# You should have received a copy of the GNU Affero General Public >+# License with the Debian GNU/Linux or Univention distribution in file >+# /usr/share/common-licenses/AGPL-3; if not, see >+# <http://www.gnu.org/licenses/>. >+# >+ >+import sys >+from optparse import OptionParser >+ >+from univention.lib.package_manager import PackageManager >+from univention.updater import UniventionUpdater >+from univention.config_registry import ConfigRegistry >+from univention.management.console.modules.appcenter.util import ComponentManager, install_opener, set_save_commit_load >+from univention.management.console.modules.appcenter.app_center import Application >+ >+ucr = ConfigRegistry() >+ucr.load() >+ >+if __name__ == '__main__': >+ usage = '%prog' >+ description = '%prog migrates the components of all installed apps to a new format. You most probably want to set UCR variable repository/app_center/new_format BEFORE calling this script' >+ parser = OptionParser(usage=usage, description=description) >+ parser.add_option("-n", "--to-new", action="store_true", dest="new_format", default=True, >+ help="all components are migrated to the new format (much faster, but less features and less integration) in /etc/apt/sources.list.d/25_ucs-appcenter.list") >+ parser.add_option("-o", "--to-old", action="store_false", dest="new_format", default=True, >+ help="all components are migrated to the old format (slower, more features, more integration) in /etc/apt/sources.list.d/20_ucs-onlince.component.list") >+ parser.add_option("-f", "--force", action="store_true", dest="force", default=False, >+ help="if migrating, you better have set the UCR variable repository/app_center/new_format accordingly. Specifying --force disables a check that will exit the script if those do not match.") >+ options, args = parser.parse_args() >+ >+ if ucr.is_true('repository/app_center/new_format', True) != options.new_format: >+ if not options.force: >+ sys.stderr.write('New format is set to %s. Which does not correspond to UCR variable repository/app_center/new_format. Existing now. You may specify --force to override this check.\n' % options.new_format) >+ sys.exit(1) >+ uu = UniventionUpdater(False) >+ component_manager = ComponentManager(ucr, uu) >+ package_manager = PackageManager(lock=False) >+ >+ install_opener(ucr) >+ try: >+ with set_save_commit_load(component_manager.ucr) as super_ucr: >+ for app in Application.all_installed(package_manager, only_local=True): >+ if app.get('withoutrepository'): >+ continue >+ sys.stdout.write('Migrating %r.\n' % app) >+ if options.new_format: >+ component_manager.remove_app_old_format(app, super_ucr) >+ component_manager.put_app_new_format(app, super_ucr) >+ else: >+ component_manager.put_app_old_format(app, super_ucr) >+ component_manager.remove_app_new_format(app, super_ucr) >+ except Exception as exc: >+ sys.stderr.write('univention-migrate-apps did not succeed. Check the internet connection and try again.\n') >+ sys.exit(1) >+ else: >+ package_manager.update() >+ sys.stdout.write('All applications have been migrated.\n') >+ sys.exit(0) >+ >Index: conffiles/etc/apt/sources.list.d/25_ucs-appcenter.list >=================================================================== >--- conffiles/etc/apt/sources.list.d/25_ucs-appcenter.list (Revision 0) >+++ conffiles/etc/apt/sources.list.d/25_ucs-appcenter.list (Revision 0) >@@ -0,0 +1,25 @@ >+@%@UCRWARNING=#@%@ >+ >+@!@ >+from univention.config_registry import ConfigRegistry >+ >+from univention.management.console.modules.appcenter.app_center import Application >+ >+Application.all(only_local=True) >+ >+ucr = ConfigRegistry() >+ucr.load() >+ >+app_ucr_key = 'repository/app_center/apps/' >+for key in ucr.iterkeys(): >+ if key.startswith(app_ucr_key): >+ component = key[len(app_ucr_key):] >+ app = Application.find(component=component) >+ print >+ if app: >+ print '# %r' % app >+ print app.debian_repository(arch=False) >+ print app.debian_repository(arch=True) >+ else: >+ print '# %s not found' % component >+@!@ >Index: debian/univention-management-console-module-appcenter.install >=================================================================== >--- debian/univention-management-console-module-appcenter.install (Revision 50922) >+++ debian/univention-management-console-module-appcenter.install (Arbeitskopie) >@@ -3,3 +3,4 @@ > ldap/*.acl usr/share/univention-management-console-module-appcenter > scripts/univention-register-apps usr/sbin/ > scripts/univention-rename-app usr/sbin/ >+scripts/univention-migrate-apps usr/sbin/ >Index: debian/univention-management-console-module-apps.univention-config-registry >=================================================================== >--- debian/univention-management-console-module-apps.univention-config-registry (Revision 50922) >+++ debian/univention-management-console-module-apps.univention-config-registry (Arbeitskopie) >@@ -1,4 +1,10 @@ > Type: file >+File: etc/apt/sources.list.d/25_ucs-appcenter.list >+Variables: repository/app_center/apps/.* >+Variables: repository/app_center/server >+Variables: version/version >+ >+Type: file > File: usr/share/univention-management-console/i18n/de/apps.mo > > Type: file >Index: umc/python/appcenter/util.py >=================================================================== >--- umc/python/appcenter/util.py (Revision 50922) >+++ umc/python/appcenter/util.py (Arbeitskopie) >@@ -44,10 +44,12 @@ > from univention.admin.handlers.computers import domaincontroller_master > from univention.admin.handlers.computers import domaincontroller_backup > >- > # local application > from constants import COMPONENT_BASE, COMP_PARAMS, STATUS_ICONS, DEFAULT_ICON, PUT_SUCCESS, PUT_PROCESSING_ERROR > >+_ucr = univention.config_registry.ConfigRegistry() >+_ucr.load() >+ > def rename_app(old_id, new_id, component_manager, package_manager): > from univention.management.console.modules.appcenter.app_center import Application > app = Application.find(old_id) >@@ -133,7 +135,7 @@ > def component_registered(component_id, ucr): > ''' Checks if a component is registered (enabled or disabled). > Moved outside of ComponentManager to avoid dependencies for >- UniventionUpdater when just using Application.all() ''' >+ UniventionUpdater''' > return '%s/%s' % (COMPONENT_BASE, component_id) in ucr > > def component_current(component_id, ucr): >@@ -273,10 +275,26 @@ > def is_registered(self, component_id): > return component_registered(component_id, self.ucr) > >- def put_app(self, app, super_ucr=None): >+ def put_app_new_format(self, app, super_ucr=None): > if super_ucr is None: > with set_save_commit_load(self.ucr) as super_ucr: > return self.put_app(app, super_ucr) >+ ucr_var = app.repository_ucr_var() >+ if ucr_var: >+ super_ucr.set_registry_var(ucr_var, 'enabled') >+ >+ def remove_app_new_format(self, app, super_ucr=None): >+ if super_ucr is None: >+ with set_save_commit_load(self.ucr) as super_ucr: >+ return self.remove_app(app, super_ucr) >+ ucr_var = app.repository_ucr_var() >+ if ucr_var: >+ super_ucr.set_registry_var(ucr_var, '') >+ >+ def put_app_old_format(self, app, super_ucr=None): >+ if super_ucr is None: >+ with set_save_commit_load(self.ucr) as super_ucr: >+ return self.put_app(app, super_ucr) > app_data = { > 'server' : app.get_server(), > 'prefix' : '', >@@ -296,12 +314,19 @@ > app_data['version'] = 'current' > self.put(app_data, super_ucr) > >- def remove_app(self, app, super_ucr=None): >+ def remove_app_old_format(self, app, super_ucr): > if super_ucr is None: > with set_save_commit_load(self.ucr) as super_ucr: > return self.remove_app(app, super_ucr) > self._remove(app.component_id, super_ucr) > >+ if _ucr.is_true('repository/app_center/new_format', True): >+ put_app = put_app_new_format >+ remove_app = remove_app_new_format >+ else: >+ put_app = put_app_old_format >+ remove_app = remove_app_old_format >+ > def put(self, data, super_ucr): > """ Does the real work of writing one component definition back. > Will be called for each element in the request array of >@@ -360,6 +385,30 @@ > self.put({'name' : component_id, 'version' : ''}, super_ucr) > return super_ucr.changed() > >+ def enable_app(self, app, super_ucr=None): >+ if super_ucr is None: >+ with set_save_commit_load(self.ucr) as super_ucr: >+ return self.enable_app(app, super_ucr) >+ if self.ucr.is_true('repository/app_center/new_format', True): >+ ucr_var = app.repository_ucr_var() >+ if ucr_var: >+ super_ucr.set_registry_var(ucr_var, 'enabled') >+ else: >+ self.currentify(app.component_id, super_ucr) >+ return super_ucr.changed() >+ >+ def disable_app(self, app, super_ucr=None): >+ if super_ucr is None: >+ with set_save_commit_load(self.ucr) as super_ucr: >+ return self.disable_app(app, super_ucr) >+ if self.ucr.is_true('repository/app_center/new_format', True): >+ ucr_var = app.repository_ucr_var() >+ if ucr_var: >+ super_ucr.set_registry_var(ucr_var, 'disabled') >+ else: >+ self.uncurrentify(app.component_id, super_ucr) >+ return super_ucr.changed() >+ > def _remove(self, component_id, super_ucr): > named_component_base = '%s/%s' % (COMPONENT_BASE, component_id) > for var in COMP_PARAMS: >Index: umc/python/appcenter/app_center.py >=================================================================== >--- umc/python/appcenter/app_center.py (Revision 50922) >+++ umc/python/appcenter/app_center.py (Arbeitskopie) >@@ -515,10 +515,15 @@ > ) > > @classmethod >- def find(cls, application_id): >+ def find(cls, application_id=None, component=None): > for application in cls.all(): >- if application.id == application_id: >- return application >+ if component is None: >+ if application.id == application_id: >+ return application >+ else: >+ for version in application.versions: >+ if application.component_id == component: >+ return version > > @classmethod > def _get_category_translations(cls, fake=False): >@@ -654,7 +659,7 @@ > shutil.copymode(template_png, png_16) > > @classmethod >- def all_installed(cls, package_manager, force_reread=False, only_local=False, localize=True): >+ def all_installed(cls, package_manager, force_reread=False, only_local=False, localize=None): > ret = [] > for app in cls.all(force_reread=force_reread, only_local=only_local, localize=localize): > if app.allowed_on_local_server() and app.is_installed(package_manager, strict=False): >@@ -662,11 +667,13 @@ > return ret > > @classmethod >- def all(cls, force_reread=False, only_local=False, localize=True): >+ def all(cls, force_reread=False, only_local=False, localize=None): > # reload ucr variables > ucr.load() > > # load the first time the category translations >+ if localize is None: >+ localize = not only_local > cls._get_category_translations(fake=not localize) > > if force_reread: >@@ -743,24 +750,28 @@ > def is_registered(self, ucr): > if self.get('withoutrepository'): > return True >- return component_registered(self.component_id, ucr) >+ if ucr.is_true('repository/app_center/new_format', True): >+ return self.repository_ucr_var() in ucr >+ else: >+ return component_registered(self.component_id, ucr) > > def is_current(self, ucr): > if self.get('withoutrepository'): > return True >- return component_current(self.component_id, ucr) >+ if ucr.is_true('repository/app_center/new_format', True): >+ return ucr.get(self.repository_ucr_var()) == 'enabled' >+ else: >+ return component_current(self.component_id, ucr) > > def disable_component(self, component_manager): > if self.get('withoutrepository'): > return >- with set_save_commit_load(component_manager.ucr) as super_ucr: >- return component_manager.uncurrentify(self.component_id, super_ucr) >+ return component_manager.disable_app(self) > > def enable_component(self, component_manager): > if self.get('withoutrepository'): > return >- with set_save_commit_load(component_manager.ucr) as super_ucr: >- return component_manager.currentify(self.component_id, super_ucr) >+ return component_manager.enable_app(self) > > def allowed_on_local_server(self): > server_role = ucr.get('server/role') >@@ -795,6 +806,21 @@ > res['fully_loaded'] = True > return res > >+ def repository_ucr_var(self): >+ if self.get('withoutrepository'): >+ return None >+ return 'repository/app_center/apps/%s' % self.component_id >+ >+ def debian_repository(self, arch): >+ if arch is False: >+ arch = 'all' >+ if arch is True: >+ arch = '$(ARCH)' >+ server = self.get_server() >+ version = self.get_ucs_version() >+ repo_name = self.component_id >+ return 'deb http://%s/univention-repository/%s/maintained/component/ %s/%s/' % (server, version, repo_name, arch) >+ > def __repr__(self): > return '<Application id="%s" name="%s (%s)" component="%s">' % (self.id, self.name, self.version, self.component_id) >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 34989
: 5945