structure scan modules as dicts not arrays

This commit is contained in:
Chris Meyers
2017-07-11 13:38:12 -04:00
parent b79600d2e5
commit e1a24d9849
2 changed files with 61 additions and 52 deletions

View File

@@ -18,32 +18,45 @@ EXAMPLES = '''
# Example fact output: # Example fact output:
# host | success >> { # host | success >> {
# "ansible_facts": { # "ansible_facts": {
# "services": [ # "packages": {
# { # "libbz2-1.0": [
# "source": "apt", # {
# "version": "1.0.6-5", # "version": "1.0.6-5",
# "arch": "amd64", # "source": "apt",
# "name": "libbz2-1.0" # "arch": "amd64",
# }, # "name": "libbz2-1.0"
# { # }
# "source": "apt", # ],
# "version": "2.7.1-4ubuntu1", # "patch": [
# "arch": "amd64", # {
# "name": "patch" # "version": "2.7.1-4ubuntu1",
# }, # "source": "apt",
# { # "arch": "amd64",
# "source": "apt", # "name": "patch"
# "version": "4.8.2-19ubuntu1", # }
# "arch": "amd64", # ],
# "name": "gcc-4.8-base" # "gcc-4.8-base": [
# }, ... ] } } # {
# "version": "4.8.2-19ubuntu1",
# "source": "apt",
# "arch": "amd64",
# "name": "gcc-4.8-base"
# },
# {
# "version": "4.9.2-19ubuntu1",
# "source": "apt",
# "arch": "amd64",
# "name": "gcc-4.8-base"
# }
# ]
# }
''' '''
def rpm_package_list(): def rpm_package_list():
import rpm import rpm
trans_set = rpm.TransactionSet() trans_set = rpm.TransactionSet()
installed_packages = [] installed_packages = {}
for package in trans_set.dbMatch(): for package in trans_set.dbMatch():
package_details = dict(name=package[rpm.RPMTAG_NAME], package_details = dict(name=package[rpm.RPMTAG_NAME],
version=package[rpm.RPMTAG_VERSION], version=package[rpm.RPMTAG_VERSION],
@@ -51,7 +64,10 @@ def rpm_package_list():
epoch=package[rpm.RPMTAG_EPOCH], epoch=package[rpm.RPMTAG_EPOCH],
arch=package[rpm.RPMTAG_ARCH], arch=package[rpm.RPMTAG_ARCH],
source='rpm') source='rpm')
installed_packages.append(package_details) if package_details['name'] not in installed_packages:
installed_packages[package_details['name']] = [package_details]
else:
installed_packages[package_details['name']].append(package_details)
return installed_packages return installed_packages
@@ -66,7 +82,10 @@ def deb_package_list():
version=ac_pkg.version, version=ac_pkg.version,
arch=ac_pkg.architecture, arch=ac_pkg.architecture,
source='apt') source='apt')
installed_packages.append(package_details) if package_details['name'] not in installed_packages:
installed_packages[package_details['name']] = [package_details]
else:
installed_packages[package_details['name']].append(package_details)
return installed_packages return installed_packages

View File

@@ -20,27 +20,19 @@ EXAMPLES = '''
# Example fact output: # Example fact output:
# host | success >> { # host | success >> {
# "ansible_facts": { # "ansible_facts": {
# "services": [ # "services": {
# { # "network": {
# "name": "acpid", # "source": "sysv",
# "source": "sysv", # "state": "running",
# "state": "running" # "name": "network"
# }, # },
# { # "arp-ethers.service": {
# "name": "apparmor", # "source": "systemd",
# "source": "sysv", # "state": "stopped",
# "state": "stopped" # "name": "arp-ethers.service"
# }, # }
# { # }
# "name": "atd", # }
# "source": "sysv",
# "state": "running"
# },
# {
# "name": "cron",
# "source": "sysv",
# "state": "running"
# }, .... ] } }
''' '''
@@ -54,7 +46,7 @@ class BaseService(object):
class ServiceScanService(BaseService): class ServiceScanService(BaseService):
def gather_services(self): def gather_services(self):
services = [] services = {}
service_path = self.module.get_bin_path("service") service_path = self.module.get_bin_path("service")
if service_path is None: if service_path is None:
return None return None
@@ -73,7 +65,7 @@ class ServiceScanService(BaseService):
service_state = "running" service_state = "running"
else: else:
service_state = "stopped" service_state = "stopped"
services.append({"name": service_name, "state": service_state, "source": "sysv"}) services[service_name] = {"name": service_name, "state": service_state, "source": "sysv"}
# Upstart # Upstart
if initctl_path is not None and chkconfig_path is None: if initctl_path is not None and chkconfig_path is None:
@@ -92,7 +84,7 @@ class ServiceScanService(BaseService):
else: else:
pid = None # NOQA pid = None # NOQA
payload = {"name": service_name, "state": service_state, "goal": service_goal, "source": "upstart"} payload = {"name": service_name, "state": service_state, "goal": service_goal, "source": "upstart"}
services.append(payload) services[service_name] = payload
# RH sysvinit # RH sysvinit
elif chkconfig_path is not None: elif chkconfig_path is not None:
@@ -134,7 +126,7 @@ class ServiceScanService(BaseService):
else: else:
service_state = 'stopped' service_state = 'stopped'
service_data = {"name": service_name, "state": service_state, "source": "sysv"} service_data = {"name": service_name, "state": service_state, "source": "sysv"}
services.append(service_data) services[service_name] = service_data
return services return services
@@ -153,7 +145,7 @@ class SystemctlScanService(BaseService):
return False return False
def gather_services(self): def gather_services(self):
services = [] services = {}
if not self.systemd_enabled(): if not self.systemd_enabled():
return None return None
systemctl_path = self.module.get_bin_path("systemctl", opt_dirs=["/usr/bin", "/usr/local/bin"]) systemctl_path = self.module.get_bin_path("systemctl", opt_dirs=["/usr/bin", "/usr/local/bin"])
@@ -168,22 +160,20 @@ class SystemctlScanService(BaseService):
state_val = "running" state_val = "running"
else: else:
state_val = "stopped" state_val = "stopped"
services.append({"name": line_data[0], services[line_data[0]] = {"name": line_data[0], "state": state_val, "source": "systemd"}
"state": state_val,
"source": "systemd"})
return services return services
def main(): def main():
module = AnsibleModule(argument_spec = dict()) module = AnsibleModule(argument_spec = dict())
service_modules = (ServiceScanService, SystemctlScanService) service_modules = (ServiceScanService, SystemctlScanService)
all_services = [] all_services = {}
incomplete_warning = False incomplete_warning = False
for svc_module in service_modules: for svc_module in service_modules:
svcmod = svc_module(module) svcmod = svc_module(module)
svc = svcmod.gather_services() svc = svcmod.gather_services()
if svc is not None: if svc is not None:
all_services += svc all_services.update(svc)
if svcmod.incomplete_warning: if svcmod.incomplete_warning:
incomplete_warning = True incomplete_warning = True
if len(all_services) == 0: if len(all_services) == 0: