1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
# pyinfra
# File: pyinfra/facts/apt.py
# Desc: facts for the apt package manager & deb files
from __future__ import unicode_literals
import re
import six
from pyinfra.api import FactBase
from .util.packaging import parse_packages
def parse_apt_repo(name):
regex = r'^(deb(?:-src)?)\s+([^\s]+)\s+([a-z-]+)\s+([a-z-\s]*)$'
matches = re.match(regex, name)
if matches:
return {
'type': matches.group(1),
'url': matches.group(2),
'distribution': matches.group(3),
'components': set(matches.group(4).split())
}
class AptSources(FactBase):
'''
Returns a list of installed apt sources:
.. code:: python
{
'type': 'deb',
'url': 'http://archive.ubuntu.org',
'distribution': 'trusty',
'components', ['main', 'multiverse']
},
...
'''
default = {}
command = 'cat /etc/apt/sources.list /etc/apt/sources.list.d/*.list'
def process(self, output):
repos = []
for line in output:
repo = parse_apt_repo(line)
if repo:
repos.append(repo)
return repos
class DebPackages(FactBase):
'''
Returns a dict of installed dpkg packages:
.. code:: python
'package_name': 'version',
...
'''
default = {}
command = 'dpkg -l'
_regex = r'^[a-z]+\s+([a-zA-Z0-9\+\-\.]+):?[a-zA-Z0-9]*\s+([a-zA-Z0-9:~\.\-\+]+).+$'
def process(self, output):
return parse_packages(self._regex, output)
class DebPackage(FactBase):
'''
Returns information on a .deb file.
'''
_regexes = {
'name': r'^Package: ([a-zA-Z0-9\-]+)$',
'version': r'^Version: ([0-9\.\-]+)$',
}
def command(self, name):
return 'dpkg -I {0}'.format(name)
def process(self, output):
data = {}
for line in output:
for key, regex in six.iteritems(self._regexes):
matches = re.match(regex, line)
if matches:
value = matches.group(1)
data[key] = value
break
return data
|