{
"info": {
"author": "Jason Antman",
"author_email": "jason@jasonantman.com",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 4 - Beta",
"Environment :: Console",
"Intended Audience :: Information Technology",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)",
"Natural Language :: English",
"Operating System :: POSIX",
"Programming Language :: Python",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Topic :: Internet :: Name Service (DNS)"
],
"description": "pydnstest\n=========\n\n.. image:: https://img.shields.io/pypi/v/pydnstest.svg\n :target: https://pypi.python.org/pypi/pydnstest\n\n.. image:: http://jantman-personal-public.s3-website-us-east-1.amazonaws.com/pypi-stats/pydnstest/per-month.svg\n :target: http://jantman-personal-public.s3-website-us-east-1.amazonaws.com/pypi-stats/pydnstest/index.html\n :alt: PyPi downloads\n\n.. image:: https://secure.travis-ci.org/jantman/pydnstest.png?branch=master\n :target: http://travis-ci.org/jantman/pydnstest\n :alt: travis-ci for master branch\n\n.. image:: https://codecov.io/github/jantman/pydnstest/coverage.svg?branch=master\n :target: https://codecov.io/github/jantman/pydnstest?branch=master\n :alt: coverage report for master branch\n\n.. image:: http://www.repostatus.org/badges/latest/inactive.svg\n :alt: Project Status: Inactive \u2013 The project has reached a stable, usable state but is no longer being actively developed; support/maintenance will be provided as time allows.\n :target: http://www.repostatus.org/#inactive\n\nPython tool for testing DNS changes (add, remove, rename, change records)\nagainst a staging DNS server, verifying the same changes against production,\nor confirming that a record returns the same result in both environments.\n\npydnstest is licensed under the GNU Affero General Public License version 3.\n\nRequirements\n------------\n\n* Python 2.7 or 3.4+ (currently tested with 2.7, 3.4, 3.5, 3.6)\n* Python `VirtualEnv `_ and ``pip`` (recommended installation method; your OS/distribution should have packages for these)\n* *or* the following packages:\n\n * `pydns `_ (python2) or `py3dns `_ (python3)\n * `pyparsing `_\n\nInstallation\n------------\n\nIt's recommended that you install into a virtual environment (virtualenv /\nvenv). See the `virtualenv usage documentation `_\nfor information on how to create a venv. If you really want to install\nsystem-wide, you can (using sudo).\n\n.. code-block:: bash\n\n pip install pydnstest\n\nConfiguration\n-------------\n\nEither run ``pydnstest --promptconfig`` to interactively build and write out a configuration file\n(to ``~/.dnstest.ini``) or run ``pydnstest --example-config > ~/.dnstest.ini`` and edit the\nresulting file as desired.\n\nYou can view your current configuration with the ``--configprint`` option.\n\nUsage\n-----\n\npydnstest takes one or more specifications for DNS changes to be made, in a natural-language-like grammar, and tests a staging DNS server (and optionally verifies against a production/live server once the changes are live). For each specification, it prints out a simple one-line OK/NG summary, and optionally some helpful secondary messages and/or warnings. At the moment, it takes input either on STDIN or read from a file.\n\nThe following usage examples all assume that you've installed pydnstest in a\nvirtualenv located at ``~/venv_dir``. If you installed system-wide, simply\nomit the first two lines (``cd ~/venv_dir`` and ``source bin/activate``).\n\nGrammar\n^^^^^^^\n\n.. code-block:: bash\n\n add [record|name|entry] [with ][value|address|target] \n remove [record|name|entry] \n rename [record|name|entry] [with] [value|address|target] to \n change [record|name|entry] to \n confirm (checks that TEST and PROD return identical results)\n\nSample input file\n^^^^^^^^^^^^^^^^^\n\n.. code-block:: bash\n\n add foo.example.com with address 1.2.3.4\n remove bar.example.com\n rename baz.example.com with value 1.2.3.5 to blam.example.com\n change quux.example.com to 1.2.3.6\n confirm blam.example.com\n\nUsage with input file\n^^^^^^^^^^^^^^^^^^^^^\n\nWrite a test file with the following content, at ~/inputfile.txt:\n\n.. code-block:: bash\n\n add record newhost.example.com with address 10.188.8.90\n add record newhost-console.example.com with address 10.188.15.90\n\nAnd then run the tests on it:\n\n.. code-block:: bash\n\n jantman@phoenix$ cd ~/venv_dir\n jantman@phoenix$ source bin/activate\n (venv_dir)jantman@phoenix$ pydnstest -f ~/inputfile.txt\n OK: newhost.example.com => 10.188.8.90 (TEST)\n PROD server returns NXDOMAIN for newhost.example.com (PROD)\n REVERSE OK: 10.188.8.90 => newhost.example.com (TEST)\n OK: newhost-console.example.com => 10.188.15.90 (TEST)\n PROD server returns NXDOMAIN for newhost-console.example.com (PROD)\n REVERSE OK: 10.188.15.90 => newhost-console.example.com (TEST)\n ++++ All 2 tests passed. (pydnstest 0.1.0)\n\n\nVerify once in prod\n^^^^^^^^^^^^^^^^^^^\n\nAfter making the above changes live, verify them in production:\n\n.. code-block:: bash\n\n jantman@phoenix$ cd ~/venv_dir\n jantman@phoenix$ source bin/activate\n (venv_dir)jantman@phoenix$ pydnstest -f ~/inputfile.txt -V\n OK: newhost.example.com => 10.188.8.90 (PROD)\n REVERSE OK: 10.188.8.90 => newhost.example.com (PROD)\n OK: newhost-console.example.com => 10.188.15.90 (PROD)\n REVERSE OK: 10.188.15.90 => newhost-console.example.com (PROD)\n ++++ All 2 tests passed. (pydnstest 0.1.0)\n\nRun one quick test\n^^^^^^^^^^^^^^^^^^\n\nDo a quick one-off test passed in on stdin, to confirm that prod and test\nreturn the same result for a given name:\n\n.. code-block:: bash\n\n jantman@phoenix$ cd ~/venv_dir\n jantman@phoenix$ source bin/activate\n (venv_dir)jantman@phoenix$ echo \"confirm foo.example.com\" | pydnstest\n OK: prod and test servers return same response for 'foo.example.com'\n response: {'name': 'foo.example.com', 'data': '10.10.8.2', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4}\n ++++ All 1 tests passed. (pydnstest 0.1.0)\n\nRun interactively from STDIN\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nYou can also provide test data on STDIN. This is mainly useful when pulling test data\nfrom another file, such as:\n\n.. code-block:: bash\n\n jantman@phoenix:pts/12:~/tmp$ cat sample_zone.txt\n $ORIGIN example.com.\n\n ;PYDNSTEST add record foo.example.com with address 10.10.8.2\n foo IN A 10.10.8.2\n ;PYDNSTEST add record bar.example.com with address 10.10.8.3\n bar IN A 10.10.8.3\n ;PYDNSTEST add record baz.example.com with address 10.10.8.4\n baz IN A 10.10.8.4\n jantman@phoenix$ cd ~/venv_dir\n jantman@phoenix$ source bin/activate\n (venv_dir)jantman@phoenix$ grep \"^;PYDNSTEST\" ~/tmp/sample_zone.txt | sed 's/^;PYDNSTEST //' | pydnstest\n OK: prod and test servers return same response for 'foo.example.com'\n response: {'name': 'foo.example.com', 'data': '10.10.8.2', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4}\n OK: prod and test servers return same response for 'bar.example.com'\n response: {'name': 'bar.example.com', 'data': '10.10.8.3', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4}\n OK: prod and test servers return same response for 'baz.example.com'\n response: {'name': 'baz.example.com', 'data': '10.10.8.4', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4}\n ++++ All 3 tests passed. (pydnstest 0.2.2)\n\nBugs and Feature Requests\n-------------------------\n\nBug reports and feature requests are happily accepted via the `GitHub Issue Tracker `_. Pull requests are\nwelcome. Issues that don't have an accompanying pull request will be worked on\nas my time and priority allows.\n\nLicense\n-------\n\npydnstest is licensed under the `GNU Affero General Public\nLicense `_ version 3, with the\nadditional term that the Copyright and Authors attributions may not be removed\nor otherwise altered, except to add the Author attribution of a contributor to\nthe work. (Additional Terms pursuant to Section 7b of the AGPL v3).\n\nI chose AGPL mostly because I want this software to continue to evolve and\nbenefit from community involvement and improvement.\n\nDevelopment\n===========\n\nTo install for development:\n\n1. Fork the `pydnstest `_ repository on GitHub\n2. Create a new branch off of master in your fork.\n\n.. code-block:: bash\n\n $ virtualenv pydnstest\n $ cd pydnstest && source bin/activate\n $ pip install -e git+git@github.com:YOURNAME/pydnstest.git@BRANCHNAME#egg=pydnstest\n $ cd src/pydnstest\n\nThe git clone you're now in will probably be checked out to a specific commit,\nso you may want to ``git checkout BRANCHNAME``.\n\nGuidelines\n----------\n\n* pep8 compliant with some exceptions (see pytest.ini)\n* 100% test coverage with pytest (with valid tests) (note that until\n https://github.com/lemurheavy/coveralls-public/issues/31 is fixed, you\n need to check the ``cov`` output for branch coverage, coveralls can't\n be relied on).\n\nTesting\n-------\n\nTesting is done via `pytest `_, driven by `tox `_\nand currently encompasses testing for both the input language parsing, and the\nDNS testing logic (via stubbing the DNS lookup methods and returning known\nresults).\n\nBe aware that the tests also run a few live DNS queries (dnstest_dns_test.py /\nTestDNS class) against domains that I control, mostly as a sanity check for\nchanges in the underlying pydns library. These may occasionally timeout or\nfail, as is the case with any live network tests.\n\n* testing is as simple as:\n\n * ``pip install tox``\n * ``tox``\n\n* If you want to see code coverage: ``tox -e cov``\n\n * this produces two coverage reports - a summary on STDOUT and a full report in the ``htmlcov/`` directory\n\n* If you want to pass additional arguments to pytest, add them to the tox command line after \"--\". i.e., for verbose pytext output on py27 tests: ``tox -e py27 -- -v``\n\nRelease Checklist\n-----------------\n\n1. Open an issue for the release; cut a branch off master for that issue.\n2. Confirm that there are CHANGES.rst entries for all major changes.\n3. Ensure that Travis tests passing in all environments.\n4. Ensure that test coverage is no less than the last release (ideally, 100%).\n5. Increment the version number in pydnstest/version.py and add version and release date to CHANGES.rst, then push to GitHub.\n6. Confirm that README.rst renders correctly on GitHub.\n7. Upload package to testpypi, confirm that README.rst renders correctly.\n\n * Make sure your ~/.pypirc file is correct\n * ``python setup.py register -r https://testpypi.python.org/pypi``\n * ``python setup.py sdist upload -r https://testpypi.python.org/pypi``\n * Check that the README renders at https://testpypi.python.org/pypi/pydnstest\n\n8. Create a pull request for the release to be merge into master. Upon successful Travis build, merge it.\n9. Tag the release in Git, push tag to GitHub:\n\n * tag the release. for now the message is quite simple: ``git tag -a vX.Y.Z -m 'X.Y.Z released YYYY-MM-DD'``\n * push the tag to GitHub: ``git push origin vX.Y.Z``\n\n11. Upload package to live pypi:\n\n * ``python setup.py sdist upload``\n\n10. make sure any GH issues fixed in the release were closed.\n\nChangelog\n=========\n\n0.4.0 (2017-12-24)\n------------------\n\n* Drop support for Python 2.6 and Python3 < 3.4\n* Add testing for Python 3.5 and 3.6\n* Stop testing Python 2.6, 3.3 and pypy\n\n0.3.1 (2015-01-12)\n------------------\n\n* (`issue #34 `_) Fix edge case where we have two A records, a valid PTR pointing to one of them, and we remove the other. ``pydnstest.checks.check_removed_name()`` was only checking for the *existence* of a PTR, it wasn't confirming that the PTR actually pointed back to the removed name. Added a warning for this specific case.\n\n0.3.0 (2014-06-17)\n------------------\n\n* (`issue #6 `_) add grammar to --help usage output\n* add develop branch build status image to README.rst\n* update release procedure documentation\n* (`issue #12 `_) add postional argument passthru support for tox to pytest\n* got rid of develop branch alltogether - everything on master\n* some PEP-8 fixes and test fixes\n* added python3 to package classifiers\n* added pypi version and download badges to README.rst\n* setup coveralls.io for coverage reports\n* added missing description of sleep parameter in README.rst\n* updated comments in example config to be more clear\n* updated README.rst example config to match the one in the package\n* added --example-config option to print and example config file and then exit\n* added --configprint option to print current config file and then exit\n* added mock as a test dependency\n* (`issue #7 `_) added --promptconfig option to interactively build configuration file\n* (`issue #20 `_) add warning when reading from stdin\n* (`issue #19 `_) make grammar in usage message come from parser class\n\n0.2.2 (2013-12-07)\n------------------\n\n* (`issue #2 `_) add 'sleep' cli and config file option to sleep X seconds\n between tests\n* (`issue #3 `_) add cli and config option to ignore TTL when comparing\n responses from DNS servers\n* (`issue #5 `_) document release procedure\n* (`issue #4 `_) support one-character hostnames\n* (`issue #8 `_) support leading underscore in hostnames\n* add coverage reports to tox and travis-ci\n* fix pep8 tests and remove superfluous double test run from tox\n* fix coverage report excluded lines\n* add test coverage for util module\n\n0.2.1 (2013-11-06)\n------------------\n\n* fix README.rst markup error\n* add doc parsing tests\n\n0.2.0 (2013-11-06)\n------------------\n\n* Documentation updates\n* Support py26-py33\n* some test fixes for py26-33 support\n\n0.1.0 (2013-11-01)\n------------------\n\n* Inital development release\n\n\n",
"description_content_type": null,
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "http://github.com/jantman/pydnstest/",
"keywords": "dns testing pydns",
"license": "AGPLv3+",
"maintainer": "",
"maintainer_email": "",
"name": "pydnstest",
"package_url": "https://pypi.org/project/pydnstest/",
"platform": "",
"project_url": "https://pypi.org/project/pydnstest/",
"project_urls": {
"Homepage": "http://github.com/jantman/pydnstest/"
},
"release_url": "https://pypi.org/project/pydnstest/0.4.0/",
"requires_dist": [
"py3dns (==3.0.4)",
"pyparsing (==2.0.1)"
],
"requires_python": "",
"summary": "Tool to test DNS changes on a staging server and verify in production",
"version": "0.4.0"
},
"last_serial": 3440516,
"releases": {
"0.2.1": [
{
"comment_text": "",
"digests": {
"md5": "62efa71563f87a77d14eaba82ba27e99",
"sha256": "ec3b020f59f315f08d7d0013df2083f97f84af990668fc249d449033378cd6b1"
},
"downloads": -1,
"filename": "pydnstest-0.2.1.tar.gz",
"has_sig": false,
"md5_digest": "62efa71563f87a77d14eaba82ba27e99",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 41846,
"upload_time": "2013-11-07T03:45:10",
"url": "https://files.pythonhosted.org/packages/ec/a7/6245a08bff93827adf78206d052a95be5d0da7bced4b090fda6daff329c9/pydnstest-0.2.1.tar.gz"
}
],
"0.2.2": [
{
"comment_text": "",
"digests": {
"md5": "ac891f9bd89c415e0e4af716370155da",
"sha256": "06f394b6948b258ce68ddea779b5a95edc1c98de1321ce1a06a762af0e173b35"
},
"downloads": -1,
"filename": "pydnstest-0.2.2.tar.gz",
"has_sig": false,
"md5_digest": "ac891f9bd89c415e0e4af716370155da",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 46203,
"upload_time": "2013-12-07T17:40:58",
"url": "https://files.pythonhosted.org/packages/d4/ce/6230e66ee6d528cd411661012b729712c204cc667e62212c52fcecc875cd/pydnstest-0.2.2.tar.gz"
}
],
"0.3.0": [
{
"comment_text": "",
"digests": {
"md5": "5542f2cefc21db9a327449ef27a0ce4d",
"sha256": "5a577f602720b591e264311bb47b8e6ba24167f3886ecd430a78a328d5ed7859"
},
"downloads": -1,
"filename": "pydnstest-0.3.0.tar.gz",
"has_sig": false,
"md5_digest": "5542f2cefc21db9a327449ef27a0ce4d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 52535,
"upload_time": "2014-06-18T03:09:50",
"url": "https://files.pythonhosted.org/packages/f1/b0/e0e279da9af1d3e270f5e709c8bf52569b2cdc2218721bab13e81c9ee277/pydnstest-0.3.0.tar.gz"
}
],
"0.3.1": [
{
"comment_text": "",
"digests": {
"md5": "1227cdfbaca80b0248a3cdfdfb56c02d",
"sha256": "decaae946b4f90878792c629ddabe7bd6220b5a7459e3a4e0c6a11f03ef0245a"
},
"downloads": -1,
"filename": "pydnstest-0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "1227cdfbaca80b0248a3cdfdfb56c02d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 53622,
"upload_time": "2015-01-12T18:20:43",
"url": "https://files.pythonhosted.org/packages/91/a7/e5e571291e8037273ed33ed11e161888f9704bd3febbf482ca36213deb41/pydnstest-0.3.1.tar.gz"
}
],
"0.4.0": [
{
"comment_text": "",
"digests": {
"md5": "df9ffadbf9ec86130106b0d2fb365955",
"sha256": "89757af0b2f6c2542fedb1934db02373a8e4ef86a41605a401640d4b73f35766"
},
"downloads": -1,
"filename": "pydnstest-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "df9ffadbf9ec86130106b0d2fb365955",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 68267,
"upload_time": "2017-12-24T14:00:21",
"url": "https://files.pythonhosted.org/packages/3d/7e/da7e628ff0ecb13fa5f66484cd759da41a443354fae083904d7eca982e41/pydnstest-0.4.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "ba785d7b9282c6d76c1ef5cc6ad16f67",
"sha256": "39b112b34b801395ca5cb4584662d999cb51f974e68b55b76a91fcce46b76b9a"
},
"downloads": -1,
"filename": "pydnstest-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "ba785d7b9282c6d76c1ef5cc6ad16f67",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 52857,
"upload_time": "2017-12-24T14:00:23",
"url": "https://files.pythonhosted.org/packages/db/2b/3ce5b21110dae10008d1e5d1077bbf75458a14492c253b46776e3a72967a/pydnstest-0.4.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "df9ffadbf9ec86130106b0d2fb365955",
"sha256": "89757af0b2f6c2542fedb1934db02373a8e4ef86a41605a401640d4b73f35766"
},
"downloads": -1,
"filename": "pydnstest-0.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "df9ffadbf9ec86130106b0d2fb365955",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 68267,
"upload_time": "2017-12-24T14:00:21",
"url": "https://files.pythonhosted.org/packages/3d/7e/da7e628ff0ecb13fa5f66484cd759da41a443354fae083904d7eca982e41/pydnstest-0.4.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "ba785d7b9282c6d76c1ef5cc6ad16f67",
"sha256": "39b112b34b801395ca5cb4584662d999cb51f974e68b55b76a91fcce46b76b9a"
},
"downloads": -1,
"filename": "pydnstest-0.4.0.tar.gz",
"has_sig": false,
"md5_digest": "ba785d7b9282c6d76c1ef5cc6ad16f67",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 52857,
"upload_time": "2017-12-24T14:00:23",
"url": "https://files.pythonhosted.org/packages/db/2b/3ce5b21110dae10008d1e5d1077bbf75458a14492c253b46776e3a72967a/pydnstest-0.4.0.tar.gz"
}
]
}