saltstack/salt

View on GitHub
scripts/suse/zypper/plugins/commit/zyppnotify

Summary

Maintainability
Test Coverage
#!/usr/bin/python
#
# Copyright (c) 2016 SUSE Linux LLC
# All Rights Reserved.
#
# Author: Bo Maryniuk <bo@suse.de>

import sys
import os
import hashlib

from zypp_plugin import Plugin


class DriftDetector(Plugin):
    """
    Return diff of the installed packages outside the Salt.
    """
    def __init__(self):
        Plugin.__init__(self)
        self.ck_path = "/var/cache/salt/minion/rpmdb.cookie"
        self.rpm_path = "/var/lib/rpm/Packages"

    def _get_mtime(self):
        '''
        Get the modified time of the RPM Database.
        Returns:
            Unix ticks
        '''
        return os.path.exists(self.rpm_path) and int(os.path.getmtime(self.rpm_path)) or 0

    def _get_checksum(self):
        '''
        Get the checksum of the RPM Database.
        Returns:
            hexdigest
        '''
        digest = hashlib.sha256()
        with open(self.rpm_path, "rb") as rpm_db_fh:
            while True:
                buff = rpm_db_fh.read(0x1000)
                if not buff:
                    break
                digest.update(buff)

        return digest.hexdigest()

    def PLUGINEND(self, headers, body):
        """
        Hook when plugin closes Zypper's transaction.        
        """
        if 'SALT_RUNNING' not in os.environ:
            with open(self.ck_path, 'w') as ck_fh:
                ck_fh.write('{chksum} {mtime}\n'.format(chksum=self._get_checksum(), mtime=self._get_mtime()))

        self.ack()


DriftDetector().main()