{ "info": { "author": "Joe Block", "author_email": "jpb@numenta.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "Agamotto\n========\n\nAgamotto is a helper module to make it easier to test a running system\nwith Python.\n\nWhy not use serverspec? I work in a Python shop and want our devs to be\nable to easily write their own tests. Making the test suite use the same\nlanguage they use daily removes a potential friction point.\n\nInstallation\n============\n\n.. code:: bash\n\n pip install agamotto\n\nUsage\n=====\n\n.. code:: python\n\n\n import agamotto\n import unittest2 as unittest\n\n class TestKnownSecurityIssues(unittest.TestCase):\n\n def testBashHasCVE_2014_6271Fix(self):\n \"\"\"Confirm that fix has been installed for CVE-2014-6271 Bash Code\n Injection Vulnerability via Specially Crafted Environment Variables\n \"\"\"\n self.assertFalse(agamotto.process.stdoutContains(\"(env x='() { :;}; echo vulnerable' bash -c \\\"echo this is a test\\\") 2>&1\",\n 'vulnerable'), 'Bash is vulnerable to CVE-2014-6271')\n\n\n def testBashHasCVE_2014_7169Fix(self):\n \"\"\"Confirm that fix has been installed for CVE-2014-7169 Bash Code\n Injection Vulnerability via Specially Crafted Environment Variables\n \"\"\"\n self.assertFalse(agamotto.process.stdoutContains(\"env X='() { (a)=>\\' bash -c \\\"echo echo vuln\\\"; [[ \\\"$(cat echo)\\\" == \\\"vuln\\\" ]] && echo \\\"still vulnerable :(\\\" 2>&1\",\n 'still vulnerable'), 'Bash is vulnerable to CVE-2014-7169')\n\n\n def testNoAccountsHaveEmptyPasswords(self):\n \"\"\"/etc/shadow has : separated fields. Check the password field ($2) and\n make sure no accounts have a blank password.\n \"\"\"\n self.assertEquals(agamotto.process.execute(\n 'sudo awk -F: \\'($2 == \"\") {print}\\' /etc/shadow | wc -l').strip(), '0',\n \"found accounts with blank password\")\n\n\n def testRootIsTheOnlyUidZeroAccount(self):\n \"\"\"/etc/passwd stores the UID in field 3. Make sure only one account entry\n has uid 0.\n \"\"\"\n self.assertEquals(agamotto.process.execute(\n 'awk -F: \\'($3 == \"0\") {print}\\' /etc/passwd').strip(),\n 'root:x:0:0:root:/root:/bin/bash')\n\n\n\n if __name__ == '__main__':\n unittest.main()\n\nThen run py.test.\n\nCaveats\n=======\n\nWe're a CentOS shop. This hasn't even been tested on stock RHEL, let\nalone Debian or Ubuntu. Pull requests adding that functionality are\nwelcome, of course.", "description_content_type": null, "docs_url": null, "download_url": "https://github.com/GrokSolutions/agamotto/archive/0.5.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/groksolutions/agamotto", "keywords": "server testing", "license": "Apache", "maintainer": null, "maintainer_email": null, "name": "agamotto", "package_url": "https://pypi.org/project/agamotto/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/agamotto/", "project_urls": { "Download": "https://github.com/GrokSolutions/agamotto/archive/0.5.1.tar.gz", "Homepage": "http://github.com/groksolutions/agamotto" }, "release_url": "https://pypi.org/project/agamotto/0.5.1/", "requires_dist": null, "requires_python": null, "summary": "Agamotto is a module that provides helper functions for testing the configuration of a running server", "version": "0.5.1" }, "last_serial": 1272864, "releases": { "0.5.0": [ { "comment_text": "", "digests": { "md5": "e211b29a3860d20b0b051f82b34c7f87", "sha256": "3ff9ab0d64f6452325f60bfcbb30b81d88f34f1e80cbf45b6c95a9022151cb1f" }, "downloads": -1, "filename": "agamotto-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e211b29a3860d20b0b051f82b34c7f87", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14965, "upload_time": "2014-10-15T22:57:54", "url": "https://files.pythonhosted.org/packages/e2/a0/13b79b24a00df9468c913f8b87629c6fa47186f29abf398b12223959168a/agamotto-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bba9ebe46a8d2d3b6c77f27ad484d174", "sha256": "013f16f5fb9e4357f8f7f8cd0f8b777b3f5cf1a129df531bce5cb4e6c1f16ee5" }, "downloads": -1, "filename": "agamotto-0.5.0.tar.gz", "has_sig": false, "md5_digest": "bba9ebe46a8d2d3b6c77f27ad484d174", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8932, "upload_time": "2014-10-15T22:57:43", "url": "https://files.pythonhosted.org/packages/74/42/1251f1db0f82d3c15ec019d5550a7df43f549d2fbcba56d131e1d9198a65/agamotto-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "0def3214d8d8f8962d45b50d06c5101c", "sha256": "b4f2ea5f4cfdbf4a517851710067a9366d02f0424fd15ff6ec6294377bd9aff6" }, "downloads": -1, "filename": "agamotto-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0def3214d8d8f8962d45b50d06c5101c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14945, "upload_time": "2014-10-16T17:27:13", "url": "https://files.pythonhosted.org/packages/9f/b4/f41ee6d2a58f3e63c24dd42a8c23642f538d823bdc3688a8b655767616df/agamotto-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6b44fd3cb00a955d3362a50bc9b2b90", "sha256": "f0413a8b6dc3cf201a7433532f1ea99235238f989dfab684c6cfbf4fa9cb882b" }, "downloads": -1, "filename": "agamotto-0.5.1.tar.gz", "has_sig": false, "md5_digest": "b6b44fd3cb00a955d3362a50bc9b2b90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9178, "upload_time": "2014-10-16T17:27:10", "url": "https://files.pythonhosted.org/packages/d9/bc/319981b7ff71d78a7f27f250c1a39d23e6ca85f39c5958a9c39068edb3c2/agamotto-0.5.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0def3214d8d8f8962d45b50d06c5101c", "sha256": "b4f2ea5f4cfdbf4a517851710067a9366d02f0424fd15ff6ec6294377bd9aff6" }, "downloads": -1, "filename": "agamotto-0.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0def3214d8d8f8962d45b50d06c5101c", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 14945, "upload_time": "2014-10-16T17:27:13", "url": "https://files.pythonhosted.org/packages/9f/b4/f41ee6d2a58f3e63c24dd42a8c23642f538d823bdc3688a8b655767616df/agamotto-0.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b6b44fd3cb00a955d3362a50bc9b2b90", "sha256": "f0413a8b6dc3cf201a7433532f1ea99235238f989dfab684c6cfbf4fa9cb882b" }, "downloads": -1, "filename": "agamotto-0.5.1.tar.gz", "has_sig": false, "md5_digest": "b6b44fd3cb00a955d3362a50bc9b2b90", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9178, "upload_time": "2014-10-16T17:27:10", "url": "https://files.pythonhosted.org/packages/d9/bc/319981b7ff71d78a7f27f250c1a39d23e6ca85f39c5958a9c39068edb3c2/agamotto-0.5.1.tar.gz" } ] }