#!/usr/bin/env python from common import * import hashlib import shutil import socket import stat re_checksum = re.compile(r'^([0-9a-fA-F]+)\s+.*') PassedFlags = namedtuple("PassedFlags", "exists, type, size, mode, checksum, dev, ltarget, uid, gid, mtime") class TestSoftwareInstalledPackage(SoftwareBaseTestCase): CLASS_NAME = "LMI_SoftwareFileCheck" KEYS = ( "CheckID", "Name", "SoftwareElementID", "SoftwareElementState" , "TargetOperatingSystem", "Version") hash_num2algo = { 1 : hashlib.md5, 2 : hashlib.sha1, 8 : hashlib.sha256, 9 : hashlib.sha384, 10 : hashlib.sha512, 11 : hashlib.sha224 } hash_num2cmd = { 1 : "md5sum", 2 : "sha1sum", 8 : "sha256sum", 9 : "sha384sum", 10 : "sha512sum", 11 : "sha224sum" } hash_num2length = { 1 : 32, 2 : 40, 8 : 64, 9 : 96, 10 : 128, 11 : 56 } def make_op(self, nevra, filename): op = self.op.copy() m = re_nevra.match(nevra) name, version = [ m.group(k) for k in ("name", "ver") ] op["Name"] = filename op["Version"] = version op["CheckID"] = "%s#%s" % (name, filename) op["SoftwareElementState"] = pywbem.Uint16(2) op["TargetOperatingSystem"] = pywbem.Uint16(36) op["SoftwareElementID"] = nevra return op def make_checksum_str(self, csumnum, filename): return re_checksum.match(subprocess.check_output([ self.hash_num2cmd[csumnum], filename])).group(1).lower() def do_test_symlink(self, op, nevra, f, inst): target = os.readlink(f) stats = os.lstat(f) self.assertEqual(inst["FileType"], pywbem.Uint16(3)) self.assertEqual(inst["FileUserID"], stats.st_uid) self.assertEqual(inst["FileGroupID"], stats.st_gid) self.assertEqual(inst["FileMode"], stats.st_mode) self.assertEqual(inst["FileSize"], stats.st_size) self.assertEqual(inst["LinkTarget"], target) self.assertEqual(inst["Checksum"], "0"*self.hash_num2length[inst["ChecksumType"]]) self.assertEqual(inst["LastModificationTime"], int(stats.st_mtime)) # modify owner prev_user = inst["FileUserID"] prev_mtime = inst["LastModificationTime"] prev_pflags = PassedFlags(*inst["PassedFlags"]) os.lchown(f, stats.st_uid + 1, -1) inst = self.conn.GetInstance(InstanceName=inst.path) self.assertEqual(inst["FileUserID"], inst["ExpectedFileUserID"] + 1) self.assertEqual(inst["FileUserID"], prev_user + 1) self.assertEqual(inst["FileGroupID"], stats.st_gid) cur_pflags = PassedFlags(*inst["PassedFlags"]) #self.assertGreater(inst["LastModificationTime"], prev_mtime) self.assertTrue(cur_pflags.exists) self.assertTrue(cur_pflags.type) self.assertTrue(cur_pflags.size) self.assertTrue(cur_pflags.mode) self.assertTrue(cur_pflags.checksum) self.assertTrue(cur_pflags.dev) self.assertTrue(cur_pflags.ltarget) self.assertFalse(cur_pflags.uid) self.assertTrue(cur_pflags.gid) self.assertTrue(cur_pflags.mtime) # modify link_target os.remove(f) os.symlink("wrong" + "*"*len(inst["ExpectedLinkTarget"]), f) os.lchown(f, inst["ExpectedFileUserID"], inst["ExpectedFileGroupID"]) inst = self.conn.GetInstance(InstanceName=inst.path) cur_pflags = PassedFlags(*inst["PassedFlags"]) self.assertGreater(len(inst["LinkTarget"]), len(inst["ExpectedLinkTarget"])) self.assertTrue(cur_pflags.exists) self.assertTrue(cur_pflags.type) self.assertFalse(cur_pflags.size) self.assertTrue(cur_pflags.mode) self.assertTrue(cur_pflags.checksum) self.assertTrue(cur_pflags.dev) self.assertFalse(cur_pflags.ltarget) self.assertTrue(cur_pflags.uid) self.assertTrue(cur_pflags.gid) self.assertTrue(cur_pflags.mtime) def do_test_directory(self, op, nevra, f, inst): stats = os.lstat(f) self.assertEqual(inst["FileType"], pywbem.Uint16(2)) self.assertEqual(inst["FileUserID"], stats.st_uid) self.assertEqual(inst["FileGroupID"], stats.st_gid) self.assertEqual(inst["FileMode"], stats.st_mode) self.assertEqual(inst["FileSize"], stats.st_size) self.assertIs(inst["LinkTarget"], None) self.assertEqual(inst["Checksum"], "0"*self.hash_num2length[inst["ChecksumType"]]) self.assertEqual(inst["LastModificationTime"], int(stats.st_mtime)) def do_test_file(self, op, nevra, f, inst): stats = os.lstat(f) self.assertEqual(inst["FileType"], pywbem.Uint16(1)) self.assertEqual(inst["FileUserID"], stats.st_uid) self.assertEqual(inst["FileGroupID"], stats.st_gid) self.assertEqual(inst["FileMode"], stats.st_mode) self.assertEqual(inst["FileSize"], stats.st_size) self.assertIs(inst["LinkTarget"], None) csum = self.make_checksum_str(inst['ChecksumType'], f) self.assertEqual(inst["Checksum"].lower(), csum) self.assertEqual(inst["ExpectedLastModificationTime"], inst["LastModificationTime"]) self.assertEqual(inst["LastModificationTime"], int(stats.st_mtime)) # make it longer with open(f, "a+") as fobj: fobj.write("data\n") inst = self.conn.GetInstance(InstanceName=inst.path) cur_pflags = PassedFlags(*inst["PassedFlags"]) self.assertGreater(inst["FileSize"], inst["ExpectedFileSize"]) self.assertGreater(inst["LastModificationTime"], inst["ExpectedLastModificationTime"]) self.assertTrue(cur_pflags.exists) self.assertTrue(cur_pflags.type) self.assertFalse(cur_pflags.size) self.assertTrue(cur_pflags.mode) self.assertFalse(cur_pflags.checksum) self.assertTrue(cur_pflags.dev) self.assertTrue(cur_pflags.ltarget) self.assertTrue(cur_pflags.uid) self.assertTrue(cur_pflags.gid) self.assertFalse(cur_pflags.mtime) # change file type os.remove(f) os.symlink(f, f) os.lchown(f, inst["ExpectedFileUserID"], inst["ExpectedFileGroupID"]) inst = self.conn.GetInstance(InstanceName=inst.path) cur_pflags = PassedFlags(*inst["PassedFlags"]) self.assertNotEqual(inst["LinkTarget"], inst["ExpectedLinkTarget"]) self.assertNotEqual(inst["FileSize"], inst["ExpectedFileSize"]) self.assertGreater(inst["LastModificationTime"], inst["ExpectedLastModificationTime"]) self.assertNotEqual(inst["FileType"], inst["ExpectedFileType"]) self.assertEqual(inst["FileType"], pywbem.Uint16(3)) self.assertTrue(cur_pflags.exists) self.assertFalse(cur_pflags.type) self.assertFalse(cur_pflags.size) self.assertFalse(cur_pflags.mode) self.assertFalse(cur_pflags.checksum) self.assertTrue(cur_pflags.dev) self.assertFalse(cur_pflags.ltarget) self.assertTrue(cur_pflags.uid) self.assertTrue(cur_pflags.gid) self.assertFalse(cur_pflags.mtime) # remove it os.remove(f) inst = self.conn.GetInstance(InstanceName=inst.path) cur_pflags = PassedFlags(*inst["PassedFlags"]) self.assertEqual(inst["LinkTarget"], inst["ExpectedLinkTarget"]) self.assertNotEqual(inst["FileSize"], inst["ExpectedFileSize"]) self.assertIsNone(inst["LastModificationTime"]) self.assertIsNone(inst["FileType"]) self.assertIsNone(inst["Checksum"]) self.assertIsNone(inst["FileMode"]) self.assertIsNone(inst["FileUserID"]) self.assertIsNone(inst["FileGroupID"]) self.assertFalse(cur_pflags.exists) self.assertFalse(cur_pflags.type) self.assertFalse(cur_pflags.size) self.assertFalse(cur_pflags.mode) self.assertFalse(cur_pflags.checksum) self.assertFalse(cur_pflags.dev) self.assertFalse(cur_pflags.ltarget) self.assertFalse(cur_pflags.uid) self.assertFalse(cur_pflags.gid) self.assertFalse(cur_pflags.mtime) def test_get_instance(self): for nevra, files in pkg_files: m = re_nevra.match(nevra) name, version = [ m.group(k) for k in ("name", "ver") ] if is_installed(nevra=nevra) and not verify_pkg(name): remove_pkg(name) if not is_installed(name): install_pkg(nevra=nevra) self.assertTrue(is_installed(nevra=nevra)) for f in files: op = self.make_op(nevra, f) inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False) self.assertIsInstance(inst, pywbem.CIMInstance) self.assertEqual(inst.path, op) for key in self.KEYS: self.assertEqual(inst[key], op[key]) self.assertTrue(inst["FileExists"]) self.assertEqual(len(inst["PassedFlags"]), 10) self.assertTrue(all(f is True for f in inst["PassedFlags"])) for prop in ( "FileType", "FileUserID", "FileGroupID" , "FileMode", "FileSize", "LinkTarget" , "Checksum", "FileModeFlags"): self.assertEqual(inst["Expected"+prop], inst[prop]) if os.path.islink(f): self.do_test_symlink(op, nevra, f, inst) elif os.path.isdir(f): self.do_test_directory(op, nevra, f, inst) elif os.path.isfile(f): self.do_test_file(op, nevra, f, inst) def test_invoke_method(self): for nevra, files in pkg_files: m = re_nevra.match(nevra) name, version = [ m.group(k) for k in ("name", "ver") ] if is_installed(nevra=nevra) and not verify_pkg(name): remove_pkg(name) if not is_installed(name): install_pkg(nevra=nevra) self.assertTrue(is_installed(nevra=nevra)) for f in files: op = self.make_op(nevra, f) (rval, oparms) = self.conn.InvokeMethod( MethodName="Invoke", ObjectName=op) self.assertEqual(rval, pywbem.Uint32(0)) # modify file if os.path.isfile(f): os.remove(f) else: os.lchown(f, os.stat(f).st_uid + 1, -1) (rval, oparms) = self.conn.InvokeMethod( MethodName="Invoke", ObjectName=op) self.assertEqual(rval, pywbem.Uint32(2)) @classmethod def tearDownClass(cls): for pkg_nevra, files in pkg_files: name = re_nevra.match(pkg_nevra).group('name') if is_installed(name) and not verify_pkg(name): remove_pkg(name) if not is_installed(name): install_pkg(nevra=pkg_nevra) if __name__ == "__main__": unittest.main()