Example #1
0
 def install(self, entry):
     rv = True
     if entry.get("current_exists", "true") == "false":
         initial = entry.find("Initial")
         if initial is not None:
             self.logger.debug("Augeas: Setting initial data for %s" %
                               entry.get("name"))
             file_entry = Bcfg2.Client.XML.Element("Path",
                                                   **dict(entry.attrib))
             file_entry.text = initial.text
             self.filetool.install(file_entry)
             # re-parse the file
             self.get_augeas(entry).load()
     for cmd in self.get_commands(entry):
         try:
             cmd.install()
         except:  # pylint: disable=W0702
             self.logger.error(
                 "Failure running Augeas command on %s: %s: %s" %
                 (entry.get("name"), cmd, sys.exc_info()[1]))
             rv = False
     try:
         self.get_augeas(entry).save()
     except:  # pylint: disable=W0702
         self.logger.error("Failure saving Augeas changes to %s: %s" %
                           (entry.get("name"), sys.exc_info()[1]))
         rv = False
     return POSIXTool.install(self, entry) and rv
Example #2
0
    def install(self, entry):
        """Install device entries."""
        fmode = self._exists(entry)

        if fmode and not stat.S_ISDIR(fmode[stat.ST_MODE]):
            self.logger.info("POSIX: Found a non-directory entry at %s, "
                             "removing" % entry.get('name'))
            try:
                os.unlink(entry.get('name'))
                fmode = False
            except OSError:
                err = sys.exc_info()[1]
                self.logger.error("POSIX: Failed to unlink %s: %s" %
                                  (entry.get('name'), err))
                return False
        elif fmode:
            self.logger.debug("POSIX: Found a pre-existing directory at %s" %
                              entry.get('name'))

        rv = True
        if not fmode:
            rv &= self._makedirs(entry)

        if entry.get('prune', 'false') == 'true':
            for pent in entry.findall('Prune'):
                pname = pent.get('path')
                try:
                    self.logger.debug("POSIX: Removing %s" % pname)
                    self._remove(pent)
                except OSError:
                    err = sys.exc_info()[1]
                    self.logger.error("POSIX: Failed to unlink %s: %s" %
                                      (pname, err))
                    rv = False
        return POSIXTool.install(self, entry) and rv
Example #3
0
    def verify(self, entry, modlist):
        ondisk = self._exists(entry)
        if not ondisk:
            return False

        if not stat.S_ISDIR(ondisk[stat.ST_MODE]):
            self.logger.info("POSIX: %s is not a directory" %
                             entry.get('name'))
            return False

        prune = True
        if entry.get('prune', 'false').lower() == 'true':
            # check for any extra entries when prune='true' attribute is set
            try:
                extras = [os.path.join(entry.get('name'), ent)
                          for ent in os.listdir(entry.get('name'))
                          if os.path.join(entry.get('name'),
                                          ent) not in modlist]
                if extras:
                    prune = False
                    msg = "Directory %s contains extra entries: %s" % \
                        (entry.get('name'), "; ".join(extras))
                    self.logger.info("POSIX: " + msg)
                    entry.set('qtext', entry.get('qtext', '') + '\n' + msg)
                    for extra in extras:
                        Bcfg2.Client.XML.SubElement(entry, 'Prune', path=extra)
            except OSError:
                prune = True

        return POSIXTool.verify(self, entry, modlist) and prune
Example #4
0
 def install(self, entry):
     rv = True
     if entry.get("current_exists", "true") == "false":
         initial = entry.find("Initial")
         if initial is not None:
             self.logger.debug("Augeas: Setting initial data for %s" %
                               entry.get("name"))
             file_entry = Bcfg2.Client.XML.Element("Path",
                                                   **dict(entry.attrib))
             file_entry.text = initial.text
             self.filetool.install(file_entry)
             # re-parse the file
             self.get_augeas(entry).load()
     for cmd in self.get_commands(entry):
         try:
             cmd.install()
         except:  # pylint: disable=W0702
             self.logger.error(
                 "Failure running Augeas command on %s: %s: %s" %
                 (entry.get("name"), cmd, sys.exc_info()[1]))
             rv = False
     try:
         self.get_augeas(entry).save()
     except:  # pylint: disable=W0702
         self.logger.error("Failure saving Augeas changes to %s: %s" %
                           (entry.get("name"), sys.exc_info()[1]))
         rv = False
     return POSIXTool.install(self, entry) and rv
Example #5
0
    def verify(self, entry, modlist):
        """Verify device entry."""
        ondisk = self._exists(entry)
        if not ondisk:
            return False

        # attempt to verify device properties as specified in config
        rv = True
        dev_type = entry.get('dev_type')
        if dev_type in ['block', 'char']:
            major = int(entry.get('major'))
            minor = int(entry.get('minor'))
            if major != os.major(ondisk.st_rdev):
                msg = ("Major number for device %s is incorrect. "
                       "Current major is %s but should be %s" %
                       (entry.get("name"), os.major(ondisk.st_rdev), major))
                self.logger.debug('POSIX: ' + msg)
                entry.set('qtext', entry.get('qtext', '') + "\n" + msg)
                rv = False

            if minor != os.minor(ondisk.st_rdev):
                msg = ("Minor number for device %s is incorrect. "
                       "Current minor is %s but should be %s" %
                       (entry.get("name"), os.minor(ondisk.st_rdev), minor))
                self.logger.debug('POSIX: ' + msg)
                entry.set('qtext', entry.get('qtext', '') + "\n" + msg)
                rv = False
        return POSIXTool.verify(self, entry, modlist) and rv
Example #6
0
    def verify(self, entry, modlist):
        ondisk = self._exists(entry)
        if not ondisk:
            return False

        if not stat.S_ISDIR(ondisk[stat.ST_MODE]):
            self.logger.info("POSIX: %s is not a directory" %
                             entry.get('name'))
            return False

        prune = True
        if entry.get('prune', 'false').lower() == 'true':
            # check for any extra entries when prune='true' attribute is set
            try:
                extras = [
                    os.path.join(entry.get('name'), ent)
                    for ent in os.listdir(entry.get('name'))
                    if os.path.join(entry.get('name'), ent) not in modlist
                ]
                if extras:
                    prune = False
                    msg = "Directory %s contains extra entries: %s" % \
                        (entry.get('name'), "; ".join(extras))
                    self.logger.info("POSIX: " + msg)
                    entry.set('qtext', entry.get('qtext', '') + '\n' + msg)
                    for extra in extras:
                        Bcfg2.Client.XML.SubElement(entry, 'Prune', name=extra)
            except OSError:
                prune = True

        return POSIXTool.verify(self, entry, modlist) and prune
Example #7
0
    def install(self, entry):
        """Install directory entries."""
        fmode = self._exists(entry)

        if fmode and not stat.S_ISDIR(fmode[stat.ST_MODE]):
            self.logger.info("POSIX: Found a non-directory entry at %s, "
                             "removing" % entry.get('name'))
            try:
                os.unlink(entry.get('name'))
                fmode = False
            except OSError:
                err = sys.exc_info()[1]
                self.logger.error("POSIX: Failed to unlink %s: %s" %
                                  (entry.get('name'), err))
                return False
        elif fmode:
            self.logger.debug("POSIX: Found a pre-existing directory at %s" %
                              entry.get('name'))

        rv = True
        if not fmode:
            rv &= self._makedirs(entry)

        if entry.get('prune', 'false') == 'true':
            for pent in entry.findall('Prune'):
                pname = pent.get('name')
                try:
                    self.logger.debug("POSIX: Removing %s" % pname)
                    self._remove(pent)
                except OSError:
                    err = sys.exc_info()[1]
                    self.logger.error("POSIX: Failed to unlink %s: %s" %
                                      (pname, err))
                    rv = False
        return POSIXTool.install(self, entry) and rv
Example #8
0
File: File.py Project: jonten/bcfg2
    def install(self, entry):
        """Install device entries."""
        if not os.path.exists(os.path.dirname(entry.get("name"))):
            if not self._makedirs(entry, path=os.path.dirname(entry.get("name"))):
                return False
        newfile = self._write_tmpfile(entry)
        if not newfile:
            return False
        rv = self._set_perms(entry, path=newfile)
        if not self._rename_tmpfile(newfile, entry):
            return False

        return POSIXTool.install(self, entry) and rv
Example #9
0
    def install(self, entry):
        """Install device entries."""
        if not os.path.exists(os.path.dirname(entry.get('name'))):
            if not self._makedirs(entry,
                                  path=os.path.dirname(entry.get('name'))):
                return False
        newfile = self._write_tmpfile(entry)
        if not newfile:
            return False
        rv = self._set_perms(entry, path=newfile)
        if not self._rename_tmpfile(newfile, entry):
            return False

        return POSIXTool.install(self, entry) and rv
Example #10
0
    def install(self, entry):
        """Install device entries."""
        fmode = self._exists(entry)

        if fmode and not stat.S_ISDIR(fmode[stat.ST_MODE]):
            self.logger.info("POSIX: Found a non-directory entry at %s, "
                             "removing" % entry.get('name'))
            try:
                os.unlink(entry.get('name'))
                fmode = False
            except OSError:
                err = sys.exc_info()[1]
                self.logger.error("POSIX: Failed to unlink %s: %s" %
                                  (entry.get('name'), err))
                return False
        elif fmode:
            self.logger.debug("POSIX: Found a pre-existing directory at %s" %
                              entry.get('name'))

        rv = True
        if not fmode:
            rv &= self._makedirs(entry)

        if entry.get('prune', 'false') == 'true':
            ulfailed = False
            for pent in entry.findall('Prune'):
                pname = pent.get('path')
                ulfailed = False
                if os.path.isdir(pname):
                    remove = shutil.rmtree
                else:
                    remove = os.unlink
                try:
                    self.logger.debug("POSIX: Removing %s" % pname)
                    remove(pname)
                except OSError:
                    err = sys.exc_info()[1]
                    self.logger.error("POSIX: Failed to unlink %s: %s" %
                                      (pname, err))
                    ulfailed = True
            if ulfailed:
                # even if prune failed, we still want to install the
                # entry to make sure that we get permissions and
                # whatnot set
                rv = False
        return POSIXTool.install(self, entry) and rv
Example #11
0
    def install(self, entry):
        """Install device entries."""
        fmode = self._exists(entry)

        if fmode and not stat.S_ISDIR(fmode[stat.ST_MODE]):
            self.logger.info("POSIX: Found a non-directory entry at %s, "
                             "removing" % entry.get('name'))
            try:
                os.unlink(entry.get('name'))
                fmode = False
            except OSError:
                err = sys.exc_info()[1]
                self.logger.error("POSIX: Failed to unlink %s: %s" %
                                  (entry.get('name'), err))
                return False
        elif fmode:
            self.logger.debug("POSIX: Found a pre-existing directory at %s" %
                              entry.get('name'))

        rv = True
        if not fmode:
            rv &= self._makedirs(entry)

        if entry.get('prune', 'false') == 'true':
            ulfailed = False
            for pent in entry.findall('Prune'):
                pname = pent.get('path')
                ulfailed = False
                if os.path.isdir(pname):
                    remove = shutil.rmtree
                else:
                    remove = os.unlink
                try:
                    self.logger.debug("POSIX: Removing %s" % pname)
                    remove(pname)
                except OSError:
                    err = sys.exc_info()[1]
                    self.logger.error("POSIX: Failed to unlink %s: %s" %
                                      (pname, err))
                    ulfailed = True
            if ulfailed:
                # even if prune failed, we still want to install the
                # entry to make sure that we get permissions and
                # whatnot set
                rv = False
        return POSIXTool.install(self, entry) and rv
Example #12
0
    def verify(self, entry, modlist):
        ondisk = self._exists(entry)
        tempdata, is_binary = self._get_data(entry)
        if isinstance(tempdata, str) and str != unicode:
            tempdatasize = len(tempdata)
        else:
            tempdatasize = len(tempdata.encode(Bcfg2.Options.setup.encoding))

        different = False
        content = None
        if not ondisk:
            # first, see if the target file exists at all; if not,
            # they're clearly different
            different = True
            content = ""
        elif tempdatasize != ondisk[stat.ST_SIZE]:
            # next, see if the size of the target file is different
            # from the size of the desired content
            different = True
        else:
            # finally, read in the target file and compare them
            # directly. comparison could be done with a checksum,
            # which might be faster for big binary files, but slower
            # for everything else
            try:
                content = open(entry.get('name')).read()
            except UnicodeDecodeError:
                content = open(entry.get('name'),
                               encoding=Bcfg2.Options.setup.encoding).read()
            except IOError:
                self.logger.error("POSIX: Failed to read %s: %s" %
                                  (entry.get("name"), sys.exc_info()[1]))
                return False
            different = content != tempdata

        if different:
            self.logger.debug("POSIX: %s has incorrect contents" %
                              entry.get("name"))
            self._get_diffs(entry,
                            interactive=Bcfg2.Options.setup.interactive,
                            sensitive=entry.get('sensitive',
                                                'false').lower() == 'true',
                            is_binary=is_binary,
                            content=content)
        return POSIXTool.verify(self, entry, modlist) and not different
Example #13
0
 def install(self, entry):
     if not self._exists(entry, remove=True):
         try:
             dev_type = entry.get('dev_type')
             mode = device_map[dev_type] | int(entry.get('mode'), 8)
             if dev_type in ['block', 'char']:
                 major = int(entry.get('major'))
                 minor = int(entry.get('minor'))
                 device = os.makedev(major, minor)
                 os.mknod(entry.get('name'), mode, device)
             else:
                 os.mknod(entry.get('name'), mode)
         except (KeyError, OSError, ValueError):
             err = sys.exc_info()[1]
             self.logger.error('POSIX: Failed to install %s: %s' %
                               (entry.get('name'), err))
             return False
     return POSIXTool.install(self, entry)
Example #14
0
 def install(self, entry):
     rv = True
     for cmd in self.get_commands(entry, unverified=True):
         try:
             cmd.install()
         except:  # pylint: disable=W0702
             self.logger.error(
                 "Failure running Augeas command on %s: %s: %s" %
                 (entry.get("name"), cmd, sys.exc_info()[1]))
             rv = False
     try:
         self.get_augeas(entry).save()
     except:  # pylint: disable=W0702
         self.logger.error(
             "Failure saving Augeas changes to %s: %s" %
             (entry.get("name"), sys.exc_info()[1]))
         rv = False
     return POSIXTool.install(self, entry) and rv
Example #15
0
    def verify(self, entry, modlist):
        ondisk = self._exists(entry)
        tempdata, is_binary = self._get_data(entry)
        if isinstance(tempdata, str) and str != unicode:
            tempdatasize = len(tempdata)
        else:
            tempdatasize = len(tempdata.encode(Bcfg2.Options.setup.encoding))

        different = False
        content = None
        if not ondisk:
            # first, see if the target file exists at all; if not,
            # they're clearly different
            different = True
            content = ""
        elif tempdatasize != ondisk[stat.ST_SIZE]:
            # next, see if the size of the target file is different
            # from the size of the desired content
            different = True
        else:
            # finally, read in the target file and compare them
            # directly. comparison could be done with a checksum,
            # which might be faster for big binary files, but slower
            # for everything else
            try:
                content = open(entry.get('name')).read()
            except UnicodeDecodeError:
                content = open(entry.get('name'),
                               encoding=Bcfg2.Options.setup.encoding).read()
            except IOError:
                self.logger.error("POSIX: Failed to read %s: %s" %
                                  (entry.get("name"), sys.exc_info()[1]))
                return False
            different = content != tempdata

        if different:
            self.logger.debug("POSIX: %s has incorrect contents" %
                              entry.get("name"))
            self._get_diffs(
                entry, interactive=Bcfg2.Options.setup.interactive,
                sensitive=entry.get('sensitive', 'false').lower() == 'true',
                is_binary=is_binary, content=content)
        return POSIXTool.verify(self, entry, modlist) and not different
Example #16
0
 def verify(self, entry, modlist):
     rv = True
     for cmd in self.get_commands(entry):
         try:
             if not cmd.verify():
                 err = "Augeas: Command has not been applied to %s: %s" % \
                       (entry.get("name"), cmd)
                 self.logger.debug(err)
                 entry.set('qtext', "\n".join([entry.get('qtext', ''),
                                               err]))
                 rv = False
                 cmd.command.set("verified", "false")
             else:
                 cmd.command.set("verified", "true")
         except:  # pylint: disable=W0702
             err = "Augeas: Unexpected error verifying %s: %s: %s" % \
                   (entry.get("name"), cmd, sys.exc_info()[1])
             self.logger.error(err)
             entry.set('qtext', "\n".join([entry.get('qtext', ''), err]))
             rv = False
             cmd.command.set("verified", "false")
     return POSIXTool.verify(self, entry, modlist) and rv
Example #17
0
 def verify(self, entry, modlist):
     rv = True
     for cmd in self.get_commands(entry):
         try:
             if not cmd.verify():
                 err = "Augeas: Command has not been applied to %s: %s" % \
                       (entry.get("name"), cmd)
                 self.logger.debug(err)
                 entry.set('qtext', "\n".join([entry.get('qtext', ''),
                                               err]))
                 rv = False
                 cmd.command.set("verified", "false")
             else:
                 cmd.command.set("verified", "true")
         except:  # pylint: disable=W0702
             err = "Augeas: Unexpected error verifying %s: %s: %s" % \
                   (entry.get("name"), cmd, sys.exc_info()[1])
             self.logger.error(err)
             entry.set('qtext', "\n".join([entry.get('qtext', ''), err]))
             rv = False
             cmd.command.set("verified", "false")
     return POSIXTool.verify(self, entry, modlist) and rv
Example #18
0
File: File.py Project: jonten/bcfg2
    def verify(self, entry, modlist):
        ondisk = self._exists(entry)
        tempdata, is_binary = self._get_data(entry)

        different = False
        content = None
        if not ondisk:
            # first, see if the target file exists at all; if not,
            # they're clearly different
            different = True
            content = ""
        elif len(tempdata) != ondisk[stat.ST_SIZE]:
            # next, see if the size of the target file is different
            # from the size of the desired content
            different = True
        else:
            # finally, read in the target file and compare them
            # directly. comparison could be done with a checksum,
            # which might be faster for big binary files, but slower
            # for everything else
            try:
                content = open(entry.get("name")).read()
            except IOError:
                self.logger.error("POSIX: Failed to read %s: %s" % (entry.get("name"), sys.exc_info()[1]))
                return False
            different = content != tempdata

        if different:
            self.logger.debug("POSIX: %s has incorrect contents" % entry.get("name"))
            self._get_diffs(
                entry,
                interactive=self.setup["interactive"],
                sensitive=entry.get("sensitive", "false").lower() == "true",
                is_binary=is_binary,
                content=content,
            )
        return POSIXTool.verify(self, entry, modlist) and not different
Example #19
0
 def __init__(self, config):
     POSIXTool.__init__(self, config)
     self._augeas = dict()
     # file tool for setting initial values of files that don't
     # exist
     self.filetool = POSIXFile(config)
Example #20
0
 def __init__(self, config):
     POSIXTool.__init__(self, config)
     self._augeas = dict()
     # file tool for setting initial values of files that don't
     # exist
     self.filetool = POSIXFile(config)
Example #21
0
 def __init__(self, config):
     POSIXTool.__init__(self, config)
     self._augeas = dict()