def testGroup4(self): """ Test with a group name line in the group file that starts with a "+". (See bug #4470 for more details). """ if not os.path.exists("/etc/group"): return grpfile = file(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( """root::0: gk::0: bin::2:root,daemon +plusgrp adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm +""" ) grpfile.close() self.assert_("root" == portable.get_name_by_gid(0, self.test_root, True)) self.assert_(0 == portable.get_group_by_name("root", self.test_root, True)) self.assert_(0 == portable.get_group_by_name("gk", self.test_root, True)) self.assert_(7 == portable.get_group_by_name("tty", self.test_root, True)) self.assertRaises(KeyError, portable.get_group_by_name, "plusgrp", self.test_root, True)
def testGroup3(self): """ Test with corrupt/oddball group file """ if not os.path.exists("/etc/group"): return grpfile = file(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( """root::0: blorg bin::2:root,daemon corrupt:x adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm gk::0: +""" ) grpfile.close() self.assert_("root" == portable.get_name_by_gid(0, self.test_root, True)) self.assert_(0 == portable.get_group_by_name("root", self.test_root, True)) self.assert_(0 == portable.get_group_by_name("gk", self.test_root, True)) self.assert_(7 == portable.get_group_by_name("tty", self.test_root, True)) self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) self.assertRaises(KeyError, portable.get_group_by_name, "corrupt", self.test_root, True) self.assertRaises(KeyError, portable.get_group_by_name, 570, self.test_root, True)
def testGroup4(self): """ Test with a group name line in the group file that starts with a "+". (See bug #4470 for more details). """ if not os.path.exists("/etc/group"): return grpfile = open(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( \ """root::0: gk::0: bin::2:root,daemon +plusgrp adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm +""") grpfile.close() self.assertTrue("root" == \ portable.get_name_by_gid(0, self.test_root, True)) self.assertTrue(0 == \ portable.get_group_by_name("root", self.test_root, True)) self.assertTrue(0 == \ portable.get_group_by_name("gk", self.test_root, True)) self.assertTrue(7 == \ portable.get_group_by_name("tty", self.test_root, True)) self.assertRaises(KeyError, portable.get_group_by_name, "plusgrp", self.test_root, True)
def testGroup1(self): if not os.path.exists("/etc/group"): return grpfile = open(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( \ """root::0: gk::0: other::1:root bin::2:root,daemon sys::3:root,bin,adm adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm""") grpfile.close() self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) self.assertTrue(0 == \ portable.get_group_by_name("root", self.test_root, True)) self.assertTrue(0 == \ portable.get_group_by_name("gk", self.test_root, True)) self.assertRaises(KeyError, portable.get_name_by_gid, 12345, self.test_root, True)
def __do_alter_only_verify(self, pfmri, verbose=False, quiet=False, exit=0, parsable=False, debug=""): # Alter the owner, group, mode of all files (and # directories) to something different than the package declares. m = manifest.Manifest() m.set_content(self.get_img_manifest(pfmri)) for a in m.gen_actions(): if a.name not in ("file", "dir"): # Only want file or dir actions. continue ubin = portable.get_user_by_name("bin", None, False) groot = portable.get_group_by_name("root", None, False) fname = a.attrs["path"] fpath = os.path.join(self.get_img_path(), fname) os.chown(fpath, ubin, groot) os.chmod(fpath, misc.PKG_RO_FILE_MODE) verify_cmd = "verify" if verbose: verify_cmd += " -v" if quiet: verify_cmd += " -q" if parsable: verify_cmd += " --parsable=0" self.pkg("{0}{1} {2}".format(debug, verify_cmd, pfmri), exit=exit) if exit == 0: self.assertTrue("OK" in self.output and "ERROR" not in self.output) return exit
def damage_all_files(self): ubin = portable.get_user_by_name("bin", None, False) groot = portable.get_group_by_name("root", None, False) for path in self.misc_files: file_path = os.path.join(self.get_img_path(), path) with open(file_path, "a+") as f: f.write("\nbogus\n") os.chown(file_path, ubin, groot) os.chmod(file_path, misc.PKG_RO_FILE_MODE)
def damage_files(self, paths): ubin = portable.get_user_by_name("bin", None, False) groot = portable.get_group_by_name("root", None, False) for path in paths: file_path = os.path.join(self.get_img_path(), path) with open(file_path, "a+") as f: f.write("\nbogus\n") os.chown(file_path, ubin, groot) os.chmod(file_path, misc.PKG_RO_FILE_MODE)
def create_some_files(self, paths): ubin = portable.get_user_by_name("bin", None, False) groot = portable.get_group_by_name("root", None, False) for p in paths: file_path = os.path.join(self.get_img_path(), p) dirpath = os.path.dirname(file_path) if not os.path.exists(dirpath): os.mkdir(dirpath) with open(file_path, "a+") as f: f.write("\ncontents\n") os.chown(file_path, ubin, groot) os.chmod(file_path, misc.PKG_RO_FILE_MODE)
def testGroup2(self): """ Test with a missing group file """ if not os.path.exists("/etc/group"): return self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) # This should work on unix systems, since we'll "bootstrap" # out to the OS's version. And AFAIK all unix systems have # a group with gid 0. grpname = portable.get_name_by_gid(0, self.test_root, True) self.assert_(0 == portable.get_group_by_name(grpname, self.test_root, True))
def _chown_cache_dir(dir): """Sets ownership for cache directory as pkg5srv:bin""" uid = portable.get_user_by_name(SYSREPO_USER, None, False) gid = portable.get_group_by_name("bin", None, False) try: os.chown(dir, uid, gid) except OSError as err: if not os.environ.get("PKG5_TEST_ENV", None): raise SysrepoException( _("Unable to chown to {user}:{group}: " "{err}").format(user=SYSREPO_USER, group="bin", err=err))
def _chown_dir(dir): """Sets ownership for the given directory to pkg5srv:pkg5srv""" uid = portable.get_user_by_name(DEPOT_USER, None, False) gid = portable.get_group_by_name(DEPOT_GROUP, None, False) try: os.chown(dir, uid, gid) except OSError as err: if not os.environ.get("PKG5_TEST_ENV", None): raise DepotException(_("Unable to chown {dir} to " "{user}:{group}: {err}").format( dir=dir, user=DEPOT_USER, group=DEPOT_GROUP, err=err))
def _chown_dir(dir): """Sets ownership for the given directory to pkg5srv:pkg5srv""" uid = portable.get_user_by_name(DEPOT_USER, None, False) gid = portable.get_group_by_name(DEPOT_GROUP, None, False) try: os.chown(dir, uid, gid) except OSError, err: if not os.environ.get("PKG5_TEST_ENV", None): raise DepotException(_("Unable to chown %(dir)s to " "%(user)s:%(group)s: %(err)s") % {"dir": dir, "user": DEPOT_USER, "group": DEPOT_GROUP, "err": err})
def testGroup2(self): """ Test with a missing group file """ if not os.path.exists("/etc/group"): return self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) # This should work on unix systems, since we'll "bootstrap" # out to the OS's version. And AFAIK all unix systems have # a group with gid 0. grpname = portable.get_name_by_gid(0, self.test_root, True) self.assertTrue(0 == \ portable.get_group_by_name(grpname, self.test_root, True))
def _chown_cache_dir(dir): """Sets ownership for cache directory as pkg5srv:bin""" uid = portable.get_user_by_name(SYSREPO_USER, None, False) gid = portable.get_group_by_name("bin", None, False) try: os.chown(dir, uid, gid) except OSError, err: if not os.environ.get("PKG5_TEST_ENV", None): raise SysrepoException( _("Unable to chown to %(user)s:%(group)s: " "%(err)s") % {"user": SYSREPO_USER, "group": "bin", "err": err})
def testGroup3(self): """ Test with corrupt/oddball group file """ if not os.path.exists("/etc/group"): return grpfile = open(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( \ """root::0: blorg bin::2:root,daemon corrupt:x adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm gk::0: +""") grpfile.close() self.assertTrue("root" == \ portable.get_name_by_gid(0, self.test_root, True)) self.assertTrue(0 == \ portable.get_group_by_name("root", self.test_root, True)) self.assertTrue(0 == \ portable.get_group_by_name("gk", self.test_root, True)) self.assertTrue(7 == \ portable.get_group_by_name("tty", self.test_root, True)) self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) self.assertRaises(KeyError, portable.get_group_by_name, "corrupt", self.test_root, True) self.assertRaises(KeyError, portable.get_group_by_name, 570, self.test_root, True)
def testGroup1(self): if not os.path.exists("/etc/group"): return grpfile = file(os.path.join(self.test_root, "etc", "group"), "w") grpfile.write( """root::0: gk::0: other::1:root bin::2:root,daemon sys::3:root,bin,adm adm::4:root,daemon uucp::5:root mail::6:root tty::7:root,adm""" ) grpfile.close() self.assertRaises(KeyError, portable.get_group_by_name, "ThisShouldNotExist", self.test_root, True) self.assert_(0 == portable.get_group_by_name("root", self.test_root, True)) self.assert_(0 == portable.get_group_by_name("gk", self.test_root, True)) self.assertRaises(KeyError, portable.get_name_by_gid, 12345, self.test_root, True)
def _chown_runtime_dir(runtime_dir): """Change the ownership of all files under runtime_dir to our sysrepo user/group""" uid = portable.get_user_by_name(SYSREPO_USER, None, False) gid = portable.get_group_by_name(SYSREPO_GROUP, None, False) try: misc.recursive_chown_dir(runtime_dir, uid, gid) except OSError as err: if not os.environ.get("PKG5_TEST_ENV", None): raise SysrepoException( _("Unable to chown to {user}:{group}: " "{err}").format(user=SYSREPO_USER, group=SYSREPO_GROUP, err=err))
def _chown_runtime_dir(runtime_dir): """Change the ownership of all files under runtime_dir to our sysrepo user/group""" uid = portable.get_user_by_name(SYSREPO_USER, None, False) gid = portable.get_group_by_name(SYSREPO_GROUP, None, False) try: misc.recursive_chown_dir(runtime_dir, uid, gid) except OSError, err: if not os.environ.get("PKG5_TEST_ENV", None): raise SysrepoException( _("Unable to chown to %(user)s:%(group)s: " "%(err)s") % {"user": SYSREPO_USER, "group": SYSREPO_GROUP, "err": err})
def __do_alter_verify(self, pfmri, verbose=False, quiet=False, exit=0, parsable=False): # Alter the owner, group, mode, and timestamp of all files (and # directories) to something different than the package declares. m = manifest.Manifest() m.set_content(self.get_img_manifest(pfmri)) ctime = time.time() - 1000 for a in m.gen_actions(): if a.name not in ("file", "dir"): # Only want file or dir actions. continue ubin = portable.get_user_by_name("bin", None, False) groot = portable.get_group_by_name("root", None, False) fname = a.attrs["path"] fpath = os.path.join(self.get_img_path(), fname) os.chown(fpath, ubin, groot) os.chmod(fpath, misc.PKG_RO_FILE_MODE) os.utime(fpath, (ctime, ctime)) # Call pkg fix to fix them. fix_cmd = "fix" if verbose: fix_cmd += " -v" if quiet: fix_cmd += " -q" if parsable: fix_cmd += " --parsable=0" self.pkg("{0} {1}".format(fix_cmd, pfmri), exit=exit) if exit != 0: return exit editables = [] # Now verify that fix actually fixed them. for a in m.gen_actions(): if a.name not in ("file", "dir"): # Only want file or dir actions. continue # Validate standard attributes. self.validate_fsobj_attrs(a) # Now validate attributes that require special handling. fname = a.attrs["path"] fpath = os.path.join(self.get_img_path(), fname) lstat = os.lstat(fpath) # Verify that preserved files don't get renamed, and # the new ones are not installed if the file wasn't # missing already. preserve = a.attrs.get("preserve") if preserve == "renamenew": self.assert_(not os.path.exists(fpath + ".new")) elif preserve == "renameold": self.assert_(not os.path.exists(fpath + ".old")) if preserve: editables.append("{0}".format(a.attrs["path"])) # Verify timestamp (if applicable). ts = a.attrs.get("timestamp") if ts: expected = misc.timestamp_to_time(ts) actual = lstat.st_mtime if preserve: self.assertNotEqual( expected, actual, "timestamp expected {expected} == " "actual {actual} for " "{fname}".format(expected=expected, actual=actual, fname=fname)) else: self.assertEqual( expected, actual, "timestamp expected {expected} != " "actual {actual} for " "{fname}".format(expected=expected, actual=actual, fname=fname)) # Verify the parsable output (if applicable). if parsable: if editables: self.assertEqualParsable( self.output, affect_packages=["{0}".format(pfmri)], change_editables=[["updated", editables]]) else: self.assertEqualParsable(self.output, affect_packages=["{0}".format(pfmri)])