{ "info": { "author": "Nickolas Fox", "author_email": "tarvitz@blacklibrary.ru", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Other Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: POSIX", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Libraries" ], "description": "\nJenkins Utils\n=============\n\n.. image:: https://travis-ci.org/tarvitz/jenkins-utils.svg?branch=master\n :target: https://travis-ci.org/tarvitz/jenkins-cipher\n\n.. image:: https://coveralls.io/repos/github/tarvitz/jenkins-utils/badge.svg?branch=master\n :target: https://coveralls.io/github/tarvitz/jenkins-utils?branch=master\n\n.. image:: https://badge.fury.io/py/jenkins-utils.svg\n :target: https://badge.fury.io/py/jenkins-utils\n\n.. contents::\n :local:\n :depth: 2\n\nAbstract\n--------\nImplements some jenkins utils in python way.\n\nNotes\n~~~~~\njenkins-utils does not support plain-credentials, ssh-credentials plugins,\nso there's no option to encrypt/decrypt these data yet.\n\nRequirements\n------------\n\n- Python 3.4+\n- pycrypto (non windows systems)\n- pycryptodomex (windows)\n\n.. note::\n\n Does not work automatically on python-3.7 and Windows due to inavailability\n to build pycrypto module on host system, however any of installed\n pycrypto/pycryptodomex modules are supported on any os/platform.\n\nUsage\n-----\n\nCurrently there's encrypt/decrypt operations implemented and gathered in convenient and\npython developer friendly form.\n\nAs an example you an decrypt (or encrypt) message using Jenkins's master and hudson secret keys:\n\n.. code-block:: bash\n\n $ python invoke.py --master-key master.key --hudson-secret-key hudson.util.Secret \\\n --action decrypt \"{AQAAABAAAAAgd+820Q6QR4ABkf3JpXHacuO3zdj11o8JD/6VIJi8XjS9GJJyWquIYbNokyKKsIfN}\"\n\n this is simple text to encrypt\n\n $ python invoke.py --master-key master.key --hudson-secret-key hudson.util.Secret \\\n --aes-type cbc --action encrypt \"this is simple text to encrypt\"\n {AQAAABAAAAAgfb9K8Kaq716l8SwGDqEFMRzm/3ynYDK7IsfI4C7BlVyMIlP/5JGfYK1n1Nc10VoD}\n $\n\n.. note::\n\n - Master key is located at $JENKINS_HOME/secrets/master.key\n - Hudson key is located at $JENKINS_HOME/secrets/hudson.util.Secret\n\nAdvanced use\n------------\nreader.py\n\n.. code-block:: python\n\n #!/usr/bin/env python3\n import sys\n import base64\n import argparse\n from lxml import etree\n from jenkins.utils import Secret\n\n\n def decrypt(opts):\n master_key = open(opts.master_key, 'rb').read()\n hudson_secret_key = open(opts.hudson_key, 'rb').read()\n secret = Secret(\n master_key=master_key, hudson_secret_key=hudson_secret_key\n )\n credentials = etree.fromstring(\n open(opts.credentials, 'rb').read()\n )\n for node in credentials.xpath('//com.cloudbees.plugins.credentials.'\n 'impl.UsernamePasswordCredentialsImpl'):\n username, *_ = node.xpath('./username/text()')\n password_encoded, *_ = node.xpath('./password/text()')\n password = base64.decodebytes(password_encoded.encode('utf-8'))\n print(\n \"Encrypted (username:password): ({}:{})\".format(\n username, secret.decrypt(password)\n )\n )\n\n\n def main():\n parser = argparse.ArgumentParser()\n parser.add_argument('-c', '--credentials', dest='credentials',\n required=True, help='jenkins credentials.xml file')\n parser.add_argument('-m', '--master-key', dest='master_key',\n help='jenkins secrets master.key file', required=True)\n parser.add_argument('-H', '--hudson-secret-key', dest='hudson_key',\n help='jenkins secrets hudson.util.Secret file')\n options = parser.parse_args()\n sys.exit(decrypt(options))\n\n\n if __name__ == '__main__':\n main()\n\n.. code-block:: bash\n\n $ python reader.py -c credentials.xml -m master.key -H hudson.util.Secret\n\n Encrypted (username:password): (scm-bot:W9CA6qTajV)\n Encrypted (username:password): (artifactory-bot:vB9V9BtPN4)\n Encrypted (username:password): (git-bot:V32c5S8TnHCvmfr)\n ... and so on\n\n\nReferences\n----------\n- |jenkins_secret_github|_\n- |jenkins_python_decrypter|_\n\n\n.. references\n\n.. |jenkins_secret_github| replace:: Jenkins util/Secret.java sources\n.. _jenkins_secret_github: https://github.com/jenkinsci/jenkins/blob/jenkins-2.89.4/core/src/main/java/hudson/util/Secret.java\n\n.. |jenkins_python_decrypter| replace:: Jenkins python decrypter\n.. _jenkins_python_decrypter: https://github.com/tweksteen/jenkins-decrypt/blob/master/decrypt.py\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/tarvitz/jenkins-secret", "keywords": "jenkins cipher secret tools utils aes ecb cbc", "license": "", "maintainer": "", "maintainer_email": "", "name": "jenkins-utils", "package_url": "https://pypi.org/project/jenkins-utils/", "platform": "any", "project_url": "https://pypi.org/project/jenkins-utils/", "project_urls": { "Homepage": "https://github.com/tarvitz/jenkins-secret" }, "release_url": "https://pypi.org/project/jenkins-utils/0.1.2/", "requires_dist": [ "pycrypto (>=2.6.1) ; platform_system != \"Windows\"", "pycryptodomex (>=3.6.1) ; platform_system == \"Windows\"" ], "requires_python": ">=3", "summary": "Jenkins Utils", "version": "0.1.2" }, "last_serial": 5179098, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "562516a90dfce177737ea92fe5b3bedb", "sha256": "e34c6d4cbcbdd1ee7236ac22388bceace8a88b4377c00bb7920bb552f542419c" }, "downloads": -1, "filename": "jenkins_utils-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "562516a90dfce177737ea92fe5b3bedb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 14170, "upload_time": "2018-05-19T11:56:18", "url": "https://files.pythonhosted.org/packages/ea/33/9a6085ae0b44ff03a68e4f0a97b1b283f9719ae5a89cbe6297b84c771638/jenkins_utils-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e117a1d7a83d95aa4302a0a384b193a1", "sha256": "7a5fce8b0c6ce9fb3c5a27694dcaea40dad5f64443154d9d2f75e904a73e5bdc" }, "downloads": -1, "filename": "jenkins-utils-0.1.tar.gz", "has_sig": false, "md5_digest": "e117a1d7a83d95aa4302a0a384b193a1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 9564, "upload_time": "2018-05-19T11:56:19", "url": "https://files.pythonhosted.org/packages/07/6a/e32a4b5c7ffd81e5766d98bb8f9cb81441f0d9116840ae744e28aab6f8c3/jenkins-utils-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "5bf018894c29930348691429544e667d", "sha256": "af7c66564f1bac523c4f25380dd5c9b52da8f5e39f0b4d37bb4d4e5a4603c64b" }, "downloads": -1, "filename": "jenkins_utils-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5bf018894c29930348691429544e667d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 14136, "upload_time": "2018-05-19T12:14:24", "url": "https://files.pythonhosted.org/packages/8f/17/f11e887b36df08d9b0d9b4d50d6b8b8ee575144cc15f9a305b5ee2bef0e3/jenkins_utils-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7adafa2f1a1532c8421f511c69af355d", "sha256": "b0ee13b9a695509b8e1ac4349872485ee117dc305687a9f9a453053f1fd422a2" }, "downloads": -1, "filename": "jenkins-utils-0.1.1.tar.gz", "has_sig": false, "md5_digest": "7adafa2f1a1532c8421f511c69af355d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 9664, "upload_time": "2018-05-19T12:14:26", "url": "https://files.pythonhosted.org/packages/16/6d/1ab582bd74b270ef53f698bba6256445d2ed9d5d4add15357853be09eb59/jenkins-utils-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "5c2b549deea1ec0efd11f445efedef36", "sha256": "0130a0fa3269021edad94a06835e3be93b483ba7967724b8c8003fd1ceb09291" }, "downloads": -1, "filename": "jenkins_utils-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5c2b549deea1ec0efd11f445efedef36", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 9612, "upload_time": "2019-04-23T20:30:26", "url": "https://files.pythonhosted.org/packages/2b/07/5c3939ebf0e6b37bffd8fe284f0afeb5cacc7813380b1fdc4d21b363015c/jenkins_utils-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76cdc4e037ba6b7e039e52516252b386", "sha256": "92fef0fd802590102132065e7a8729d2de715b5de297b5fc111b5ce93bc59f3b" }, "downloads": -1, "filename": "jenkins-utils-0.1.2.tar.gz", "has_sig": false, "md5_digest": "76cdc4e037ba6b7e039e52516252b386", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 9447, "upload_time": "2019-04-23T20:30:27", "url": "https://files.pythonhosted.org/packages/6b/27/79c2447c6ce83a57a49c5cacc995ca781ce2fb5b9dc2801a4639f33061b7/jenkins-utils-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5c2b549deea1ec0efd11f445efedef36", "sha256": "0130a0fa3269021edad94a06835e3be93b483ba7967724b8c8003fd1ceb09291" }, "downloads": -1, "filename": "jenkins_utils-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "5c2b549deea1ec0efd11f445efedef36", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3", "size": 9612, "upload_time": "2019-04-23T20:30:26", "url": "https://files.pythonhosted.org/packages/2b/07/5c3939ebf0e6b37bffd8fe284f0afeb5cacc7813380b1fdc4d21b363015c/jenkins_utils-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76cdc4e037ba6b7e039e52516252b386", "sha256": "92fef0fd802590102132065e7a8729d2de715b5de297b5fc111b5ce93bc59f3b" }, "downloads": -1, "filename": "jenkins-utils-0.1.2.tar.gz", "has_sig": false, "md5_digest": "76cdc4e037ba6b7e039e52516252b386", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3", "size": 9447, "upload_time": "2019-04-23T20:30:27", "url": "https://files.pythonhosted.org/packages/6b/27/79c2447c6ce83a57a49c5cacc995ca781ce2fb5b9dc2801a4639f33061b7/jenkins-utils-0.1.2.tar.gz" } ] }