123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #
- # Copyright (C) 2005-2009 TUBITAK/UEKAE
- #
- # This program 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; either version 2 of the License, or (at your option)
- # any later version.
- #
- # Please read the COPYING file.
- #
- # Disable cyclic garbage collector of Python to avoid comar segmentation
- # faults under high load (#11110)
- import gc
- gc.disable()
- import os
- import locale
- import string
- # FIXME: later this will be Comar's job
- systemlocale = open("/etc/mudur/locale", "r").readline().strip()
- # for pisi
- os.environ["LC_ALL"] = systemlocale
- # for system error messages
- locale.setlocale(locale.LC_ALL, systemlocale)
- try:
- import pisi.api
- import pisi.db
- import pisi.ui
- import pisi.util as util
- import pisi.configfile
- from pisi.version import Version
- except KeyboardInterrupt:
- notify("System.Manager", "cancelled", "")
- class UI(pisi.ui.UI):
- def error(self, msg):
- notify("System.Manager", "error", str(msg))
- def warning(self, msg):
- notify("System.Manager", "warning", str(msg))
- def notify(self, event, **keywords):
- if event == pisi.ui.installing:
- pkgname = keywords["package"].name
- notify("System.Manager", "status", ("installing", pkgname, "", ""))
- elif event == pisi.ui.configuring:
- pkgname = keywords["package"].name
- notify("System.Manager", "status", ("configuring", pkgname, "", ""))
- elif event == pisi.ui.extracting:
- pkgname = keywords["package"].name
- notify("System.Manager", "status", ("extracting", pkgname, "", ""))
- elif event == pisi.ui.updatingrepo:
- reponame = keywords["name"]
- notify("System.Manager", "status", ("updatingrepo", reponame, "", ""))
- elif event == pisi.ui.removing:
- pkgname = keywords["package"].name
- notify("System.Manager", "status", ("removing", pkgname, "", ""))
- elif event == pisi.ui.cached:
- total = str(keywords["total"])
- cached = str(keywords["cached"])
- notify("System.Manager", "status", ("cached", total, cached, ""))
- elif event == pisi.ui.installed:
- notify("System.Manager", "status", ("installed", "", "", ""))
- elif event == pisi.ui.removed:
- notify("System.Manager", "status", ("removed", "", "", ""))
- elif event == pisi.ui.upgraded:
- notify("System.Manager", "status", ("upgraded", "", "", ""))
- elif event == pisi.ui.packagestogo:
- notify("System.Manager", "status", ("order", "", "", ""))
- elif event == pisi.ui.desktopfile:
- filepath = keywords["desktopfile"]
- notify("System.Manager", "status", ("desktopfile", filepath, "", ""))
- else:
- return
- def ack(self, msg):
- return True
- def confirm(self, msg):
- return True
- def display_progress(self, operation, percent, info="", **kw):
- if operation == "fetching":
- file_name = kw["filename"]
- if not file_name.startswith("pisi-index.xml"):
- file_name = pisi.util.parse_package_name(file_name)[0]
- out = (operation, file_name, str(percent), int(kw["rate"]), kw["symbol"], int(kw["downloaded_size"]), int(kw["total_size"]))
- else:
- out = (operation, str(percent), info, 0, 0, 0, 0)
- notify("System.Manager", "progress", out)
- def _init_pisi():
- ui = UI()
- try:
- pisi.api.set_userinterface(ui)
- except KeyboardInterrupt:
- cancelled()
- def cancelled():
- notify("System.Manager", "cancelled", None)
- def started(operation=""):
- notify("System.Manager", "started", operation)
- def finished(operation=""):
- if operation in ["System.Manager.setCache", "System.Manager.installPackage", "System.Manager.removePackage", "System.Manager.updatePackage"]:
- __checkCacheLimits()
- notify("System.Manager", "finished", operation)
- def privileged(func):
- """
- Decorator for synchronizing privileged functions
- """
- def wrapper(*__args,**__kw):
- operation = "System.Manager.%s" % func.func_name
- started(operation)
- _init_pisi()
- try:
- func(*__args,**__kw)
- except KeyboardInterrupt:
- cancelled()
- return
- except Exception, e:
- notify("System.Manager", "error", str(e))
- return
- finished(operation)
- return wrapper
- @privileged
- def installPackage(package=None):
- if package:
- package = package.split(",")
- reinstall = package[0].endswith(".pisi")
- pisi.api.install(package, ignore_file_conflicts=True, reinstall=reinstall)
- @privileged
- def reinstallPackage(package=None):
- if package:
- package = package.split(",")
- pisi.api.install(package, ignore_file_conflicts=True, reinstall=True)
- @privileged
- def updatePackage(package=None):
- if package is None:
- package = []
- else:
- package = package.split(",")
- pisi.api.upgrade(package)
- @privileged
- def removePackage(package=None):
- if package:
- package = package.split(",")
- pisi.api.remove(package)
- @privileged
- def updateRepository(repository=None):
- if repository:
- pisi.api.update_repo(repository)
- @privileged
- def updateAllRepositories():
- repos = pisi.db.repodb.RepoDB().list_repos()
- for repo in repos:
- try:
- pisi.api.update_repo(repo)
- except pisi.db.repodb.RepoError, e:
- notify("System.Manager", "error", str(e))
- @privileged
- def addRepository(name=None,uri=None):
- if name and uri:
- pisi.api.add_repo(name,uri)
- @privileged
- def removeRepository(repo=None):
- if repo:
- pisi.api.remove_repo(repo)
- @privileged
- def setRepoActivities(repos=None):
- if repos:
- for repo, active in repos.items():
- pisi.api.set_repo_activity(repo, active)
- @privileged
- def setRepositories(repos):
- oldRepos = pisi.db.repodb.RepoDB().list_repos(only_active=False)
- for repo in oldRepos:
- pisi.api.remove_repo(repo)
- for repo in repos:
- pisi.api.add_repo(repo[0], repo[1])
- @privileged
- # ex: setConfig("general", "bandwidth_limit", "30")
- def setConfig(category, name, value):
- config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
- config.set(category, name, value)
- config.write_config()
- @privileged
- def setCache(enabled, limit):
- config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
- config.set("general", "package_cache", str(enabled))
- config.set("general", "package_cache_limit", str(limit))
- config.write_config()
- @privileged
- def takeSnapshot():
- pisi.api.snapshot()
- @privileged
- def takeBack(operation):
- pisi.api.takeback(operation)
- @privileged
- def clearCache(cacheDir, limit):
- pisi.api.clearCache(int(limit) == 0)
- def __checkCacheLimits():
- cached_pkgs_dir = "/var/cache/pisi/packages"
- config = pisi.configfile.ConfigurationFile("/etc/pisi/pisi.conf")
- cache = config.get("general", "package_cache")
- if cache == "True":
- limit = config.get("general", "package_cache_limit")
- # If PackageCache is used and limit is 0. It means limitless.
- if limit and int(limit) != 0:
- clearCache(cached_pkgs_dir, int(limit) * 1024 * 1024)
- elif cache == "False":
- clearCache(cached_pkgs_dir, 0)
|