Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use low-level package objects in the apt module to check installed state #4091

Merged
merged 1 commit into from
Sep 16, 2013
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
27 changes: 19 additions & 8 deletions library/packaging/apt
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,13 @@ APTITUDE_ZERO = "0 packages upgraded, 0 newly installed, 0 to remove and 0 not u
APT_LISTS_PATH = "/var/lib/apt/lists"
APT_UPDATE_SUCCESS_STAMP_PATH = "/var/lib/apt/periodic/update-success-stamp"

HAS_PYTHON_APT = True
try:
import apt
import apt_pkg
except:
HAS_PYTHON_APT = False

def package_split(pkgspec):
parts = pkgspec.split('=')
if len(parts) > 1:
Expand All @@ -145,7 +152,12 @@ def package_split(pkgspec):

def package_status(m, pkgname, version, cache, state):
try:
# get the package from the cache, as well as the
# the low-level apt_pkg.Package object which contains
# state fields not directly acccesible from the
# higher-level apt.package.Package object.
pkg = cache[pkgname]
ll_pkg = cache._cache[pkgname] # the low-level package object
except KeyError:
if state == 'install':
m.fail_json(msg="No package matching '%s' is available" % pkgname)
Expand All @@ -158,16 +170,18 @@ def package_status(m, pkgname, version, cache, state):

if version:
try :
return pkg.is_installed and fnmatch.fnmatch(pkg.installed.version, version), False, has_files
return ll_pkg.current_state == apt_pkg.CURSTATE_INSTALLED and \
fnmatch.fnmatch(pkg.installed.version, version), False, has_files
except AttributeError:
#assume older version of python-apt is installed
return pkg.isInstalled and fnmatch.fnmatch(pkg.installedVersion, version), False, has_files
return ll_pkg.current_state == apt_pkg.CURSTATE_INSTALLED and \
fnmatch.fnmatch(pkg.installedVersion, version), False, has_files
else:
try :
return pkg.is_installed, pkg.is_upgradable, has_files
return ll_pkg.current_state == apt_pkg.CURSTATE_INSTALLED, pkg.is_upgradable, has_files
except AttributeError:
#assume older version of python-apt is installed
return pkg.isInstalled, pkg.isUpgradable, has_files
return ll_pkg.current_state == apt_pkg.CURSTATE_INSTALLED, pkg.isUpgradable, has_files

def expand_pkgspec_from_fnmatches(m, pkgspec, cache):
new_pkgspec = []
Expand Down Expand Up @@ -308,10 +322,7 @@ def main():
supports_check_mode = True
)

try:
import apt
import apt_pkg
except:
if not HAS_PYTHON_APT:
module.fail_json(msg="Could not import python modules: apt, apt_pkg. Please install python-apt package.")

global APTITUDE_CMD
Expand Down