aboutsummaryrefslogtreecommitdiff
path: root/AptUrl/AptUrl.py
diff options
context:
space:
mode:
Diffstat (limited to 'AptUrl/AptUrl.py')
-rw-r--r--AptUrl/AptUrl.py193
1 files changed, 193 insertions, 0 deletions
diff --git a/AptUrl/AptUrl.py b/AptUrl/AptUrl.py
new file mode 100644
index 0000000..e712e5b
--- /dev/null
+++ b/AptUrl/AptUrl.py
@@ -0,0 +1,193 @@
+# Copyright (c) 2007-2008 Canonical
+#
+# AUTHOR:
+# Michael Vogt <mvo@ubuntu.com>
+# With contributions by Siegfried-A. Gevatter <rainct@ubuntu.com>
+#
+# This file is part of AptUrl
+#
+# AptUrl 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.
+#
+# AptUrl 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 AptUrl; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import apt
+import apt_pkg
+
+from . import Parser
+from . import Helpers
+from .Helpers import _
+
+from optparse import OptionParser
+
+import os
+import os.path
+
+# adding new repositories is currently disabled because some people have
+# security concerns about this feature
+allow_new_repositories = False
+
+# return codes
+(RESULT_OK,
+ RESULT_CANCELT,
+ RESULT_ERROR,
+ RESULT_BADARGS) = list(range(4))
+
+class AptUrlController(object):
+
+ def __init__(self, ui):
+ self.ui = ui
+
+ def openCache(self):
+ try:
+ self.cache = apt.Cache()
+ except SystemError as strerr:
+ if not '/etc/apt/sources.list' in str(strerr):
+ raise
+ self.ui.error(_("Invalid /etc/apt/sources.list file"), strerr)
+ return False
+ if self.cache._depcache.broken_count > 0:
+ err_header = _("Software index is broken")
+ err_body = _("This is a major failure of your software "
+ "management system. Please check for broken packages "
+ "with synaptic, check the file permissions and "
+ "correctness of the file '/etc/apt/sources.list' and "
+ "reload the software information with: "
+ "'sudo apt-get update' and 'sudo apt-get install -f'."
+ )
+ self.ui.error(err_header, err_body)
+ return False
+ return True
+
+ def parseArgs(self):
+ parser = OptionParser()
+ parser.add_option("-p", "--http-proxy", dest="http_proxy",
+ default=None, help="use http proxy")
+ (options, args) = parser.parse_args()
+
+ # eval and add proxy
+ if options.http_proxy is not None:
+ proxy = options.http_proxy
+ if not ":" in proxy:
+ proxy += ":3128"
+ os.environ["http_proxy"] = "http://%s" % proxy
+
+ # parse
+ try:
+ apturl_list = Parser.parse(args[0])
+ except IndexError as e:
+ self.ui.error(_("Need a url to continue, exiting"))
+ return []
+ except Parser.InvalidUrlException as e:
+ self.ui.error(_("Invalid url: '%s' given, exiting") % e.url,
+ str(e))
+ return []
+ return (apturl_list)
+
+ def verifyInstall(self, apturl):
+ " verify that the install package actually is installed "
+ # check if the package got actually installed
+ self.openCache()
+ pkg = self.cache[apturl.package]
+ if (not pkg.is_installed or
+ pkg._pkg.current_state != apt_pkg.CURSTATE_INSTALLED or
+ self.cache._depcache.broken_count > 0):
+ return False
+ return True
+
+ def main(self):
+ # global return code
+ ret = RESULT_OK
+ ui = self.ui
+
+ # parse arguments
+ apturl_list = self.parseArgs()
+ if not apturl_list:
+ return RESULT_BADARGS
+
+ # open cache
+ if not self.openCache():
+ return RESULT_ERROR
+
+ # now go over the url list
+ for apturl in apturl_list:
+ # FIXME: move this code block into a func like
+ # evalAptUrl()
+
+ if not apturl.schema in ("apt", "apt+http"):
+ self.ui.error(_("Can not deal with protocol '%s' ")
+ % apturl.schema)
+ continue
+
+ if apturl.refresh is not None:
+ ui.doUpdate()
+ if not self.openCache():
+ return RESULT_ERROR
+
+ # now check the package
+ if apturl.package not in self.cache:
+ try:
+ package_in_cache = bool(self.cache._cache[apturl.package])
+ except KeyError:
+ package_in_cache = False
+ if package_in_cache:
+ ui.error(_("Package '%s' is virtual.") % apturl.package)
+ continue
+ else:
+ ui.error(_("Could not find package '%s'.")
+ % apturl.package)
+ continue
+
+ if (self.cache[apturl.package].is_installed and
+ apturl.minver is None):
+ ui.message(_("Package '%s' is already installed")
+ % apturl.package)
+ continue
+
+ # ask the user
+ pkg = self.cache[apturl.package]
+ (sum, desc, homepage) = Helpers.parse_pkg(pkg)
+ if not ui.askInstallPackage(apturl.package, sum, desc, homepage):
+ ret = RESULT_CANCELT
+ continue
+
+ # try to install it
+ try:
+ self.cache[apturl.package].mark_install()
+ except SystemError as e:
+ ui.error(_("Can not install '%s' (%s) ") % (apturl.package, e))
+ continue
+ if apturl.minver is not None:
+ verStr = self.cache[apturl.package].candidate.version
+ if apt_pkg.version_compare(verStr, apturl.minver) < 1:
+ ui.error(_(
+ "Package '%s' requests minimal version '%s', but "
+ "only '%s' is available") % (apturl.package,
+ apturl.minver,
+ verStr))
+ continue
+
+ changes = self.cache.get_changes()
+ additional_pkgs = []
+
+ for pkg in changes:
+ if pkg.marked_install:
+ additional_pkgs.append(pkg.name)
+
+ # install it
+ ui.doInstall(apturl, extra_pkg_names=additional_pkgs)
+
+ if not self.verifyInstall(apturl):
+ ret = RESULT_ERROR
+
+ # return values
+ return ret