| 1 | '''Bcfg2 Support for Encap Packages''' |
|---|
| 2 | |
|---|
| 3 | __revision__ = '$Revision$' |
|---|
| 4 | |
|---|
| 5 | import glob |
|---|
| 6 | import re |
|---|
| 7 | import Bcfg2.Client.Tools |
|---|
| 8 | |
|---|
| 9 | class Encap(Bcfg2.Client.Tools.PkgTool): |
|---|
| 10 | '''Support for Encap packages''' |
|---|
| 11 | name = 'Encap' |
|---|
| 12 | __execs__ = ['/usr/local/bin/epkg'] |
|---|
| 13 | __handles__ = [('Package', 'encap')] |
|---|
| 14 | __req__ = {'Package': ['version', 'url']} |
|---|
| 15 | pkgtype = 'encap' |
|---|
| 16 | pkgtool = ("/usr/local/bin/epkg -l -f -q %s", ("%s", ["url"])) |
|---|
| 17 | splitter = re.compile('.*/(?P<name>[\w-]+)\-(?P<version>[\w\.+-]+)') |
|---|
| 18 | |
|---|
| 19 | # If you define self.pkgtool and self.pkgname it will [use] the Pkgtool.Install |
|---|
| 20 | # method will do the installation stuff for you |
|---|
| 21 | |
|---|
| 22 | def RefreshPackages(self): |
|---|
| 23 | '''Try to find encap packages''' |
|---|
| 24 | self.installed = {} |
|---|
| 25 | for pkg in glob.glob("/usr/local/encap/*"): |
|---|
| 26 | match = self.splitter.match(pkg) |
|---|
| 27 | if match: |
|---|
| 28 | self.installed[match.group('name')] = match.group('version') |
|---|
| 29 | else: |
|---|
| 30 | print("Failed to split name %s" % pkg) |
|---|
| 31 | self.logger.debug("Encap.py: RefreshPackages: self.installed.keys() are:") |
|---|
| 32 | self.logger.debug("%s" % list(self.installed.keys())) |
|---|
| 33 | |
|---|
| 34 | def VerifyPackage(self, entry, _): |
|---|
| 35 | '''Verify Package status for entry''' |
|---|
| 36 | if not entry.get('version'): |
|---|
| 37 | self.logger.info("Insufficient information of Package %s; cannot Verify" % entry.get('name')) |
|---|
| 38 | return False |
|---|
| 39 | cmdrc = self.cmd.run("/usr/local/bin/epkg -q -S -k %s-%s >/dev/null" % |
|---|
| 40 | (entry.get('name'), entry.get('version')))[0] |
|---|
| 41 | if cmdrc != 0: |
|---|
| 42 | self.logger.debug("Package %s version incorrect" % entry.get('name')) |
|---|
| 43 | else: |
|---|
| 44 | return True |
|---|
| 45 | return False |
|---|
| 46 | |
|---|
| 47 | # Can use the FindExtraPackages method from Bcfg2.Client.Tools.PkgTool |
|---|
| 48 | |
|---|
| 49 | def RemovePackages(self, packages): |
|---|
| 50 | '''Deal with extra configuration detected''' |
|---|
| 51 | names = " ".join([pkg.get('name') for pkg in packages]) |
|---|
| 52 | self.logger.info("Removing packages: %s" % (names)) |
|---|
| 53 | self.cmd.run("/usr/local/bin/epkg -l -q -r %s" % (names)) |
|---|
| 54 | self.RefreshPackages() |
|---|
| 55 | self.extra = self.FindExtraPackages() |
|---|