def test_conffileproxy_invalid_arg(self): bad_conf = """ [dangling stanza attr = 1 bad file = very true""" twd = TestWorkDir() badfile = twd.write_file("bad_conf.conf", bad_conf) with ksconf_cli: # A command that uses ConfFileType() with mode="load" base_cmd = ["rest-export"] ko = ksconf_cli(*base_cmd + [twd.get_path("a_non_existent_file.conf")]) self.assertIn(ko.returncode, (EXIT_CODE_USER_QUIT, EXIT_CODE_NO_SUCH_FILE)) self.assertRegex( ko.stderr, r".*\b(can't open '[^']+\.conf'|invalid ConfFileType).*") ko = ksconf_cli(*base_cmd + [badfile]) self.assertIn(ko.returncode, (EXIT_CODE_USER_QUIT, EXIT_CODE_NO_SUCH_FILE)) self.assertRegex(ko.stderr, ".*(failed to parse|invalid ConfFileType).*") with FakeStdin(bad_conf): ko = ksconf_cli(*base_cmd + ["-"]) self.assertIn(ko.returncode, (EXIT_CODE_USER_QUIT, EXIT_CODE_NO_SUCH_FILE)) self.assertRegex(ko.stderr, ".*(failed to parse|invalid ConfFileType).*")
def test_promote_batch_simple_keep(self): twd = self.sample_data01() with ksconf_cli: ksconf_cli("promote", "--batch", "--keep-empty", self.conf_local, self.conf_default) self.assertEqual(os.stat(self.conf_local).st_size, 0) # "Local file should be blanked") self.assert_data01(twd) del twd
def test_promote_batch_simple(self): twd = self.sample_data01() with ksconf_cli: ksconf_cli("promote", "--batch", self.conf_local, self.conf_default) self.assertFalse(os.path.isfile( self.conf_local)) # "Local file should be blanked") self.assert_data01(twd) del twd
def test_promote_to_dir(self): twd = self.sample_data01() with ksconf_cli: ksconf_cli("promote", "--batch", self.conf_local, twd.get_path("default")) self.assertTrue(os.path.isfile(self.conf_default), "Default file should be created.") self.assertFalse(os.path.isfile(self.conf_local), "Default file should be created.") self.assert_data01(twd)
def test_sort_inplace_returncodes(self): """ Inplace sorting long and short args """ with ksconf_cli: ko = ksconf_cli("sort", "-i", self.conf_bogus) self.assertEqual(ko.returncode, EXIT_CODE_SORT_APPLIED) self.assertRegex(ko.stderr, "^Replaced file") # Sort the second time, no there should be NO updates with ksconf_cli: ko = ksconf_cli("sort", "--inplace", self.conf_bogus) self.assertEqual(ko.returncode, EXIT_CODE_SUCCESS) self.assertRegex(ko.stderr, "^Nothing to update")
def test_sort_mixed_quiet(self): # Not yet implemented. Currently relying on the shell to do this. with ksconf_cli: ko = ksconf_cli("sort", "-i", "--quiet", *self.all_confs) self.assertEqual(ko.returncode, EXIT_CODE_BAD_CONF_FILE) self.assertRegex(ko.stderr, r"Error [^\r\n]+?[/\\]badfile\.conf") self.assertNotRegex(ko.stderr, r"Skipping [^\r\n]+?[/\\]transforms\.conf") self.assertRegex(ko.stderr, r"[\r\n]Replaced file [^\r\n]+?\.conf") # No there should be NO output with ksconf_cli: ko = ksconf_cli("sort", "-i", "--quiet", self.conf_bogus, self.no_sort) self.assertEqual(ko.returncode, EXIT_CODE_SUCCESS) self.assertNotRegex(ko.stderr, r"Error [^\r\n]+?\.conf") self.assertNotRegex(ko.stderr, r"[\r\n]Skipping [^\r\n]+?[/\\]transforms.conf") self.assertNotRegex(ko.stderr, r"[\r\n]Replaced file [^\r\n]+?\.conf")
def _modsec01_upgrade(self, twd, app_tgz): """ Upgade app install with auto commit. """ tgz = static_data(app_tgz) with ksconf_cli: kco = ksconf_cli("unarchive", tgz, "--dest", twd.get_path("apps"), "--git-mode=commit", "--no-edit") self.assertIn("About to upgrade", kco.stdout)
def test_promote_same_file_abrt(self): twd = TestWorkDir() dummy = twd.write_conf("dummy.conf", dummy_config) with ksconf_cli: # Expect this to fail ko = ksconf_cli("promote", "--batch", dummy, dummy) self.assertEqual(ko.returncode, EXIT_CODE_FAILED_SAFETY_CHECK) self.assertRegex(ko.stderr, "same file")
def test_promote_glob_stanzas(self): twd = self.sample_data02() with ksconf_cli: ksconf_cli("promote", "--batch", "--match=wildcard", "--stanza", "Stanza*", self.conf_local, self.conf_default) self.assertFalse(os.path.isfile(self.conf_local)) d = twd.read_conf("default/test.conf") stanza1 = d["Stanza1"] self.assertEqual(stanza1["a"], "3") self.assertEqual(stanza1["b"], "6") self.assertEqual(stanza1["c"], "8") stanza2 = d["Stanza2"] self.assertEqual(stanza2["x"], "1") self.assertEqual(stanza2["y"], "2") stanza3 = d["Stanza3"] self.assertEqual(stanza3["z"], "0") del twd
def test_sort_mixed(self): # Not yet implemented. Currently relying on the shell to do this. with ksconf_cli: ko = ksconf_cli("sort", "-i", *self.all_confs) self.assertEqual(ko.returncode, EXIT_CODE_BAD_CONF_FILE) self.assertRegex(ko.stderr, r"Error [^\r\n]+? file [^\r\n]+?[/\\]badfile\.conf[^\r\n]+ \[BAD_STANZA") self.assertRegex(ko.stderr, r"Skipping no-sort file [^ ]+[/\\]transforms\.conf")
def test_promote_list_invert_stanzas(self): twd = self.sample_data02() with ksconf_cli: ksconf_cli("promote", "--batch", "--invert-match", "--stanza", "Stanza2", self.conf_local, self.conf_default) d = twd.read_conf("default/test.conf") stanza1 = d["Stanza1"] self.assertEqual(stanza1["a"], "3") self.assertEqual(stanza1["b"], "6") self.assertEqual(stanza1["c"], "8") self.assertNotIn("Stanza2", d) stanza3 = d["Stanza3"] self.assertEqual(stanza3["z"], "0") l = d = twd.read_conf("local/test.conf") stanza2 = l["Stanza2"] self.assertEqual(stanza2["x"], "1") self.assertEqual(stanza2["y"], "2") del twd
def test_sort_stdout(self): # Not yet implemented. Currently relying on the shell to do this. with ksconf_cli: ko = ksconf_cli("sort", self.conf_bogus, self.no_sort) self.assertEqual(ko.returncode, EXIT_CODE_SUCCESS) self.assertRegex(ko.stdout, r"-----+ [^\r\n]+[/\\]bogus\.conf") self.assertRegex(ko.stdout, r"[\r\n]-----+ [^\r\n]+[/\\]transforms\.conf") self.assertRegex(ko.stdout, r"[\r\n]DEST_KEY = [^\r\n]+[\r\n]FORMAT =", "transforms.conf should be sorted even with KSCONF-NO-SORT directive for non-inplace mode")
def test_promote_summary(self): twd = self.sample_data01() with ksconf_cli: ko = ksconf_cli("promote", "--summary", self.conf_local, self.conf_default) self.assertEqual(ko.returncode, EXIT_CODE_SUCCESS) self.assertRegex( ko.stderr, r"\s*[License usage trend by sourcetype]\s+3 keys") del twd
def test_zip_file(self): # Note: Very minimal .zip testing since using the ZIP format is rare but does happen. # Sometimes a user will grab a zip file from a GitHub download, so we cope if we can. twd = TestWorkDir( ) # No git, keeping it as simple as possible (also, test that code path) zfile = static_data("apps/technology-add-on-for-rsa-securid_01.zip") with ksconf_cli: kco = ksconf_cli("unarchive", zfile, "--dest", twd.makedir("apps")) self.assertIn("About to install", kco.stdout) self.assertIn("RSA Securid Splunk Addon", kco.stdout) self.assertRegex(kco.stdout, "without version control support")
def test_promote_new_file(self): twd = TestWorkDir() dummy_local = twd.write_conf("local/dummy.conf", dummy_config) dummy_default = twd.get_path("default/dummy.conf") twd.makedir("default") with ksconf_cli: # Expect this to fail ko = ksconf_cli("promote", "--batch", dummy_local, dummy_default) self.assertEqual(ko.returncode, EXIT_CODE_SUCCESS) self.assertRegex(ko.stdout, "Moving source file [^\r\n]+ to the target")
def test_promote_list_add_new_stanza_ignore_case(self): twd = self.sample_data02() with ksconf_cli: ksconf_cli("promote", "--batch", "--ignore-case", "--stanza", "sTaNzA2", self.conf_local, self.conf_default) d = twd.read_conf("default/test.conf") stanza1 = d["Stanza1"] self.assertEqual(stanza1["a"], "2") self.assertNotIn("b", stanza1) self.assertEqual(stanza1["c"], "8") stanza2 = d["Stanza2"] self.assertEqual(stanza2["x"], "1") self.assertEqual(stanza2["y"], "2") stanza3 = d["Stanza3"] self.assertEqual(stanza3["z"], "0") l = twd.read_conf("local/test.conf") stanza1_local = l["Stanza1"] self.assertEqual(stanza1_local["a"], "3") self.assertEqual(stanza1_local["b"], "6") self.assertNotIn("Stanza2", l) del twd
def _modsec01_install_11(self, twd): """ Fresh app install a manual commit. """ apps = twd.makedir("apps") tgz = static_data("apps/modsecurity-add-on-for-splunk_11.tgz") with ksconf_cli: kco = ksconf_cli("unarchive", tgz, "--dest", apps, "--git-mode=stage") self.assertIn("About to install", kco.stdout) self.assertIn("ModSecurity Add-on", kco.stdout, "Should display app name during install") twd.write_file(".gitignore", "*.bak") twd.git("add", "apps/Splunk_TA_modsecurity", ".gitignore") twd.git("commit", "-m", "Add custom file.") twd.write_file("Junk.bak", "# An ignored file.")
def _modsec01_untracked_files(self, twd): twd.write_file("apps/Splunk_TA_modsecurity/untracked_file", "content") twd.write_file("apps/Splunk_TA_modsecurity/ignored.bak", "Ignored file") with ksconf_cli: kco = ksconf_cli( "unarchive", static_data("apps/modsecurity-add-on-for-splunk_12.tgz"), "--dest", twd.get_path("apps"), "--git-sanity-check=ignored", "--git-mode=commit", "--no-edit") self.assertEqual(kco.returncode, EXIT_CODE_FAILED_SAFETY_CHECK) git_ls_files(twd._path, "cached") # Bump code coverage # Rollback upgrade and try again twd.git("reset", "--hard", "HEAD") # Remove offending files twd.remove_file("apps/Splunk_TA_modsecurity/untracked_file") twd.remove_file("apps/Splunk_TA_modsecurity/ignored.bak") kco = ksconf_cli( "unarchive", static_data("apps/modsecurity-add-on-for-splunk_12.tgz"), "--dest", twd.get_path("apps"), "--git-sanity-check", "ignored", "--git-mode=commit", "--no-edit") self.assertEqual(kco.returncode, EXIT_CODE_SUCCESS)
def test_promote_empty_stanza(self): twd = TestWorkDir() conf_default = twd.write_file( "default/test.conf", r""" [Stanza1] a = 2 c = 8 [Stanza3] z = 0 """) conf_local = twd.write_file( "local/test.conf", r""" [Stanza1] [Stanza3] z = 2 """) with ksconf_cli: ksconf_cli("promote", "--batch", conf_local, conf_default) d = twd.read_conf("default/test.conf") self.assertFalse(os.path.isfile(conf_local)) self.assertEqual(d["Stanza1"]["a"], "2") self.assertEqual(d["Stanza1"]["c"], "8") self.assertEqual(d["Stanza3"]["z"], "2")
def test_modsec_install_defaultd(self): twd = TestWorkDir(git_repo=True) app_archives = [ "apps/modsecurity-add-on-for-splunk_11.tgz", "apps/modsecurity-add-on-for-splunk_12.tgz", "apps/modsecurity-add-on-for-splunk_14.tgz", ] apps = twd.makedir("apps") for app in app_archives: tgz = static_data(app) with ksconf_cli: kco = ksconf_cli("unarchive", tgz, "--dest", apps, "--git-mode=commit", "--no-edit", "--default-dir", "default.d/10-official", "--exclude", "README/inputs.conf.spec") self.assertEqual(kco.returncode, EXIT_CODE_SUCCESS) self.assertRegex(kco.stdout, "with git support")
def test_bad_file(self): with ksconf_cli: ko = ksconf_cli("sort", self.conf_bad) self.assertEqual(ko.returncode, EXIT_CODE_BAD_CONF_FILE)
def test_help(self): out = ksconf_cli("--help") with ksconf_cli: self.assertIn("Kintyre Splunk CONFig tool", out.stdout) self.assertIn("usage: ", out.stdout) self.assertEqual(out.returncode, EXIT_CODE_SUCCESS)