{ "info": { "author": "Adam Talsma", "author_email": "adam@talsma.ca", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Topic :: System :: Clustering", "Topic :: System :: Systems Administration" ], "description": "Bladerunner\n===========\n\n.. image:: https://badges.gitter.im/Join%20Chat.svg\n :alt: Join the chat at https://gitter.im/a-tal/bladerunner\n :target: https://gitter.im/a-tal/bladerunner?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge\n\n|Build Status| |Coverage Status| |Version| |Downloads this month|\n\n===========\n\nBladerunner is a program to send and receive information from any type\nof ssh enabled text based device. It can run through a jumpbox if there\nare networking restrictions. You can also provide an additional password\nto use for any program after logging in, such as MySQL or sudo.\nbladerunner will attempt to use the host password for everything unless\nyou specify otherwise, allowing it to default through sudo in simple use\ncases. MySQL, FTP, and telnet prompts are included as well as the\ndefault Ubuntu and CentOS bash shells and password prompts. You can\nprovide an additional prompt via command line arguments. bladerunner\nwill automatically accept SSH certificates and will throw ^C at any\ncommand that exceeds the timeout before returning. Commands can be\nloaded into a file and run from there line by line per host.\n\nInstall\n-------\n\nInstallation is done via the usual methods:\n\n.. code:: sh\n\n $ python setup.py build\n $ sudo python setup.py install\n\nAlternatively, you can install via pip:\n\n.. code:: sh\n\n $ pip install bladerunner\n\nRequires\n--------\n\nPython (v2.7+), pexpect and `futures\n2.1.3 `__.\n\nOptions\n-------\n\nFor a full list of options use:\n\n.. code:: sh\n\n bladerunner --help\n\nUsing a file with a list of commands in it is an easy way to execute\nmore complex tasks.\n\nUse of Bladerunner from within Python\n=====================================\n\nIt may be useful to run Bladerunner from inside another script. Here's\nhow:\n\n.. code:: python\n\n from bladerunner.base import Bladerunner\n from bladerunner.formatting import csv_results, pretty_results, stacked_results\n\n def bladerunner_test():\n \"\"\"A simple test of bladerunner's execution and output formats.\"\"\"\n\n # pass in lists of strings, commands and hosts will be executed in order\n servers = [\"testserver1.testdomain.com\", \"testserver2.testdomain.com\"]\n commands = [\"uptime\", \"mysql\", \"show databases;\", \"exit;\", \"date\"]\n\n # this is the full options dictionary\n options = {\n \"debug\": False,\n \"delay\": None,\n \"cmd_timeout\": 20,\n \"csv_char\": \",\",\n \"extra_prompts\": [\"core-router1>\"],\n \"jump_host\": \"core-router1\",\n \"jump_password\": \"cisco\",\n \"jump_port\": 22,\n \"jump_user\": \"admin\",\n \"output_file\": \"/home/joebob/Documents/output.txt\",\n \"passwd_prompts\": [], # usually best to let Bladerunner decide\n \"password\": \"hunter7\",\n \"password_safety\": True,\n \"port\": 22,\n \"progressbar\": True,\n \"second_password\": \"super-sekrets\",\n \"shell_prompts\": [], # this list is typically auto-generated\n \"ssh\": \"ssh\",\n \"ssh_key\": None,\n \"stacked\": False, # preference flag for stacked results\n \"style\": 0,\n \"threads\": 100,\n \"timeout\": 20,\n \"unix_line_endings\": False,\n \"username\": \"joebob\",\n \"width\": 80, # used in displaying results\n \"windows_line_endings\": False, # force the use of \\r\\n\n }\n\n # initialize Bladerunner with the options provided\n runner = Bladerunner(options)\n\n # execution of commands on hosts, may take a while to return\n results = runner.run(commands, servers)\n\n # Prints CSV results\n csv_results(results)\n\n # Prints pretty_results using the available styles\n for i in range(4):\n options[\"style\"] = i\n pretty_results(results, options)\n\n # Prints the results in a flat, vertically stacked way\n stacked_results(results)\n\nThreaded Bladerunner\n====================\n\nAs of Bladerunner 4.0.0 it is possible to use the run\\_threaded() method\nto call the run() method in new thread. This is especially useful inside\nof Tornado applications, which may need to be responsive in the main\nthread during a long running task.\n\nIt is recommended that you use gen.Task to do this inside of Tornado,\nbut Bladerunner itself simply returns a thread and calls a callback, so\nit's really up to the implementation as for how the threading is\nhandled. Here's a simple use case for building a non-blocking remote\nexecution function:\n\n.. code:: python\n\n from tornado import gen, web\n from bladerunner.base import Bladerunner\n\n @gen.engine\n def threaded_commands(options, commands, servers, callback=None):\n runner = Bladerunner(options)\n results = yield gen.Task(runner.run_threaded, commands, servers)\n if callback:\n callback(results)\n\n class MyHandler(web.RequestHandler):\n @gen.engine\n def get(self, *args, **kwargs):\n commands = self.qs_dict.get(\"commands\", [])\n servers = self.qs_dict.get(\"servers\", [])\n if commands and servers:\n # password can be a list to try multiple passwords per host\n options = {\"username\": \"root\", \"password\": [\"r00t\", \"d3f4ult\"]}\n results = yield gen.Task(threaded_commands, options, commands, servers)\n self.write(200, results)\n else:\n self.write(404, \"commands or servers not provided in qs_dict\")\n\nBladerunner Interactive\n=======================\n\nSometimes, you need to apply logic to conditionally decide commands to\nissue based off of the results of a previous command. As of Bladerunner\n4.1.0 there are now a couple different ways you can do this.\n\nSingle host interactive via python shell\n----------------------------------------\n\nHere is the simplest use case of a BladerunnerInteractive object:\n\n.. code:: python\n\n >>> from bladerunner import Bladerunner\n >>> runner = Bladerunner()\n >>> inter = runner.interactive(\"some_host\")\n >>> inter.run(\"uptime\")\n '17:46:22 up 23 days, 19:52, 6 users, load average: 0.17, 0.13, 0.09'\n\nMultiple hosts interactively via python shell\n---------------------------------------------\n\nRather than handling the BladerunnerInteractive objects yourself, you\ncan store them in the base Bladerunner object instead, letting the base\nobject run the interactive command on all hosts in parallel. An example:\n\n.. code:: python\n\n >>> from bladerunner import Bladerunner\n >>> runner = Bladerunner()\n >>> runner.run_interactive(\"hostname\", \"some_host\")\n some_host: some_host\n >>> runner.run_interactive(\"hostname\")\n some_host: some_host\n >>> runner.run_interactive(\"hostname\", \"some_other_host\")\n some_host: some_host\n some_other_host: some_other_host\n\nAs you can see, supplying more hosts (the second argument, can also be a\nlist), is optional. If you do supply more hosts, they will be added to\nthe internal list. To remove a host from the pool, use\nBladerunner.end\\_interactive() with the hostname or list of hostnames\nyou'd like to remove:\n\n.. code:: python\n\n >>> runner.end_interactive(\"some_host\")\n >>> runner.interactive_hosts\n {'some_other_host': }\n\nInteractive Threading\n---------------------\n\nBoth the run and the connect methods of the BladerunnerInteractive\nobjects can be threaded. When using the base object's run\\_interactive\nmethod, it will use multi-threading internally to perform the action on\nall devices in parallel, but the call itself is blocking. To work around\nthis, you need to use the BladerunnerInteractive objects themselves. An\nexample of threaded connecting and threaded interactive command running:\n\n.. code:: python\n\n from tornado import gen\n from bladerunner import Bladerunner\n\n options = {}\n runner = Bladerunner(options)\n inter = runner.interactive(\"somewhere\")\n connected = yield gen.Task(inter.connect_threaded)\n if connected:\n results = yield gen.Task(inter.run_threaded, \"whoami\")\n if \"root\" in results:\n print(\"god-mode is enabled\")\n else:\n print(\"{} is but a mere plebeian\".format(results))\n else:\n print(\"could not connect\")\n\nYou do not need to make a specific call to connect\\_threaded, as the run\ncall will detect that it hasn't connected yet and attempt to. However,\nit may be preferred to know the connection status earlier.\n\nPredefined Interactive Functions\n--------------------------------\n\nIn the instance where you know exactly what you're looking for, and\nexactly what to do based off of that outcome, it may be easiest to write\na BladerunnerInteractive function and let the base object do the\nthreading for you. In this way, we can run the same logic against many\nhosts. An example script where you need to check the running status of a\nservice and issue a restart on any hosts where the service is currently\ndown:\n\n.. code:: python\n\n from bladerunner import Bladerunner\n\n def my_function(session):\n \"\"\"You can call this anything, but the signature has to be exact.\n\n You must accept a single non-keyword argument, which will be the\n BladerunnerInteractive object.\n\n You can return anything you want, anything other than None will be\n returned grouped as a list with all the other function calls.\n \"\"\"\n\n results = session.run(\"/etc/init.d/httpd status\")\n if not \"is running...\" in results:\n session.run(\"/etc/init.d/httpd restart\")\n return session.server\n\n def main():\n runner = Bladerunner({\"username\": \"root\"})\n res = runner.run_interactive_function(my_function, [\"host1\", \"host2\"])\n print(\"restarted httpd service on: {}\".format(\", \".join(res)))\n\n if __name__ == \"__main__\":\n main()\n\nIn the case where you need different connection parameters for multiple\nsets of devices, make more Bladerunner base objects and spawn the\ninteractive sets off of them. Alternatively, you can call an update on\nthe base object's options, like so:\n\n.. code:: python\n\n from bladerunner import Bladerunner\n\n def my_function():\n results = session.run(\"/etc/init.d/httpd status\")\n if not \"is running...\" in results:\n session.run(\"/etc/init.d/httpd restart\")\n return session.server, True\n return session.server, False\n\n runner = Bladerunner({\"username\": \"user1\", \"password\": \"password1\"})\n\n # line separated lists of hostnames or IPs can be passed as string filepaths\n runner.run_interactive_function(my_function, \"/root/server_list_1\")\n\n # if you want to end these sessions, remove them from the base object:\n runner.end_interactive(\"/root/server_list_1\")\n\n # new BladerunnerInteractive objects inherit the base object's settings\n # but you can update them on the base rather than having to make new ones\n runner.options.update({\"username\": \"user2\", \"password\": \"password2\"})\n\n # the connections to these servers will be maintained in the base object\n # indefinately! there are also automatic re-connect methods that are used.\n # if you need finer grained control of the sessions, you can pool them\n # externally to enforce timeouts and/or keepalives.\n results = runner.run_interactive_function(my_function, \"/root/server_list_2\")\n\n # results at this point is whatever we've defined to return in our function,\n # inside a list with each function run per host (order not guaranteed).\n for server_name, httpd_restarted in results:\n print(\"httpd on server {} was {}restarted!\".format(\n server_name,\n \"not \" * int(httpd_restarted is False),\n ))\n\nNon-Standard SSH\n----------------\n\nAs of Bladerunner 4.1.8+ you can provide --ssh to give a non-standard\ncommand as ssh. This will clear any automatically added flags, so include\nthem in your command if any are required. Also keep in mind if you are\nalso using Bladerunner with a jumpbox, the ssh command needs to be\navailable there as well.\n\nAs a usage example for this, Bladerunner 4.1.8+ can be used with the gcloud CLI:\n\n.. code:: bash\n\n $ bladerunner -nN --ssh=\"gcloud compute ssh\" \"echo 'hello world'\" $(kubectl get nodes -o name | cut -d '/' -f2 | tr '\\n' ' ')\n\n\nBugs & TODO\n-----------\n\nIf you come across a bug, please create a new issue in the `issue\ntracking system `__ with\nenough relevant details and it will be dealt with promptly.\n\n\nAuthoritative Source\n====================\n\nNote that `this repository `__ is the\nsource repository for the Python Packaging Index and is the upstream repository\nfor all bug fixes and feature development.\n\nThis repository is distributed under the GPLv2 license, with the acknowledgement\nthat some (most, for now) of the library source code is under the BSD license\nand is still Copyright (c) 2015 Activision Publishing, Inc (see the LICENSE file\nfor full details).\n\nHaving said that, this project is transitioning away from the prior codebase.\nTo track how much of the code base is GPLv2 vs BSD, you can use:\n\n.. code:: bash\n\n $ git diff --stat 62d52e04bb86614efc3e6e280b2c9adccddde83f master\n\nIt's also being tracked and updated via Travis-CI right here:\n\n|Lines In|\n\n|Lines Out|\n\n|Total Change|\n\n.. |Build Status| image:: https://travis-ci.org/a-tal/bladerunner.png?branch=master\n :target: https://travis-ci.org/a-tal/bladerunner\n.. |Coverage Status| image:: https://coveralls.io/repos/a-tal/bladerunner/badge.png?branch=master\n :target: https://coveralls.io/r/a-tal/bladerunner?branch=master\n.. |Version| image:: https://img.shields.io/pypi/v/bladerunner.svg\n :target: https://pypi.python.org/pypi/bladerunner/\n.. |Downloads this month| image:: https://img.shields.io/pypi/dm/bladerunner.svg\n :target: https://pypi.python.org/pypi/bladerunner/\n.. |Lines In| image:: https://img.shields.io/badge/lines_in-691-green.svg\n.. |Lines out| image:: https://img.shields.io/badge/lines_out-1228-red.svg\n.. |Total Change| image:: https://img.shields.io/badge/total_change-25.44%-yellow.svg", "description_content_type": null, "docs_url": "https://pythonhosted.org/bladerunner/", "download_url": "https://github.com/a-tal/bladerunner", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/a-tal/bladerunner", "keywords": "", "license": "GPLv2", "maintainer": "", "maintainer_email": "", "name": "bladerunner", "package_url": "https://pypi.org/project/bladerunner/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/bladerunner/", "project_urls": { "Download": "https://github.com/a-tal/bladerunner", "Homepage": "https://github.com/a-tal/bladerunner" }, "release_url": "https://pypi.org/project/bladerunner/4.1.9/", "requires_dist": [ "pexpect (>=3.3)", "six (>=1.9.0)" ], "requires_python": "", "summary": "Execution of commands on hosts", "version": "4.1.9" }, "last_serial": 1836783, "releases": { "3.4": [ { "comment_text": "", "digests": { "md5": "4bb252c0d5ac916ec9a407d127cec369", "sha256": "cc4f3ca788c343df5c898cad640aca154c46bf41fa1acf356338bc8aba5ae218" }, "downloads": -1, "filename": "bladerunner-3.4.tar.gz", "has_sig": false, "md5_digest": "4bb252c0d5ac916ec9a407d127cec369", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14944, "upload_time": "2013-07-06T01:52:31", "url": "https://files.pythonhosted.org/packages/0a/76/f634c087a7bad335b581b70cf62f18cc741464e8fff7047821d1c7f760a1/bladerunner-3.4.tar.gz" } ], "3.5": [ { "comment_text": "", "digests": { "md5": "9b5bbbbb6c9921ed0e8bbe07c495145a", "sha256": "f39baceb88531ffbcc14214476b8f19fda6d60cd4508e895bc5d437f5b2b5a9d" }, "downloads": -1, "filename": "bladerunner-3.5.tar.gz", "has_sig": false, "md5_digest": "9b5bbbbb6c9921ed0e8bbe07c495145a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14982, "upload_time": "2013-07-30T02:03:07", "url": "https://files.pythonhosted.org/packages/a6/f1/4d0e843a39729e9f8d2094281e077b48a8963fb3b09f21517e2e56d01d8a/bladerunner-3.5.tar.gz" } ], "3.7": [ { "comment_text": "", "digests": { "md5": "4fb3d6c201adeedb4b935f814d61c327", "sha256": "f49e49e50038b73dece1b34935b39fc445430192ce5c48da7912f6eac5914a4c" }, "downloads": -1, "filename": "bladerunner-3.7.tar.gz", "has_sig": false, "md5_digest": "4fb3d6c201adeedb4b935f814d61c327", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17534, "upload_time": "2013-12-03T21:41:34", "url": "https://files.pythonhosted.org/packages/e0/20/f8ce8c1882d8257dea29beb97975fe6231150ed71f3a1fe4c146551629fe/bladerunner-3.7.tar.gz" } ], "3.7.1": [ { "comment_text": "", "digests": { "md5": "985eafd44dab3a1d68c31cb992b73101", "sha256": "5b152e0a6cba5ae9c054bbae10589c6109f6e440cc488fb213f108c9ab6423da" }, "downloads": -1, "filename": "bladerunner-3.7.1.tar.gz", "has_sig": false, "md5_digest": "985eafd44dab3a1d68c31cb992b73101", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17489, "upload_time": "2013-12-17T18:33:18", "url": "https://files.pythonhosted.org/packages/17/62/93bd47c487478f2e307905655877c994af83e84bacf46f15cd85d2766b38/bladerunner-3.7.1.tar.gz" } ], "3.7.2": [ { "comment_text": "", "digests": { "md5": "05f6defb4713e107b5a788b88cfce1f8", "sha256": "ca292071d2e84ce0c034caf7421f13acb9c937cb3d6fc17ee96dfec9d12f7f7e" }, "downloads": -1, "filename": "bladerunner-3.7.2.tar.gz", "has_sig": false, "md5_digest": "05f6defb4713e107b5a788b88cfce1f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17554, "upload_time": "2013-12-17T23:45:42", "url": "https://files.pythonhosted.org/packages/9e/d8/66ec05fdb98f2ba29340a3d81070a913dab3c73bd4bf731a4cc20c35125c/bladerunner-3.7.2.tar.gz" } ], "3.7.3": [ { "comment_text": "", "digests": { "md5": "1bb909c116a7b5ffc484f3929d670e79", "sha256": "8866b8908c66c15ccc64ea5d1ce146353dad060fdb0edde05eb0f95fa036ba76" }, "downloads": -1, "filename": "bladerunner-3.7.3.tar.gz", "has_sig": false, "md5_digest": "1bb909c116a7b5ffc484f3929d670e79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18210, "upload_time": "2014-03-04T02:54:41", "url": "https://files.pythonhosted.org/packages/26/8a/803394ca5ee73ca80a185bfed9f97131a366e4cf683cb3075d236da2c533/bladerunner-3.7.3.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "3193d03b0dde984ade64dc172b86b485", "sha256": "748a8419e7ba233ba0dc75d33bda33db9df689ef0e7f3680c798c42defe943c6" }, "downloads": -1, "filename": "bladerunner-4.0.0.tar.gz", "has_sig": false, "md5_digest": "3193d03b0dde984ade64dc172b86b485", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18185, "upload_time": "2014-04-01T19:23:30", "url": "https://files.pythonhosted.org/packages/1f/6c/d873ce041eb43e43139079b3c8e2b6199f0b58ecd6d475ad8d66bffbeac2/bladerunner-4.0.0.tar.gz" } ], "4.0.1": [ { "comment_text": "", "digests": { "md5": "185c6a49b5de60a6028b1dfa899ef9b2", "sha256": "9ff16e05703487bf2a52ebcd02ef39dab579f1aef3cf16b19d61cd8ce331fcfd" }, "downloads": -1, "filename": "bladerunner-4.0.1.tar.gz", "has_sig": false, "md5_digest": "185c6a49b5de60a6028b1dfa899ef9b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18827, "upload_time": "2014-04-03T20:18:46", "url": "https://files.pythonhosted.org/packages/7e/fc/03292d4ead1e85cf8c994a1e099ffe020ce95e92b979e83b8e9ac25883d0/bladerunner-4.0.1.tar.gz" } ], "4.0.2": [ { "comment_text": "", "digests": { "md5": "74228e77e164116ba525748652fb683f", "sha256": "ec38d600d4516b4832deeedcaa00faccc686bb743e5b4bfad12932afb870db02" }, "downloads": -1, "filename": "bladerunner-4.0.2.tar.gz", "has_sig": false, "md5_digest": "74228e77e164116ba525748652fb683f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19093, "upload_time": "2014-04-23T02:14:55", "url": "https://files.pythonhosted.org/packages/ba/b4/b3d7dae34991dfcd1fa834227f39f41b3f81bd2b821b0d27243f20d46dcc/bladerunner-4.0.2.tar.gz" } ], "4.0.3": [ { "comment_text": "", "digests": { "md5": "dc4d7c752b074dced89441cd6080e316", "sha256": "99e2737d5aef4a264ee7531fad797497d95bc0e448f0291e12dd82f82cf67446" }, "downloads": -1, "filename": "bladerunner-4.0.3.tar.gz", "has_sig": false, "md5_digest": "dc4d7c752b074dced89441cd6080e316", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19277, "upload_time": "2014-04-23T04:34:19", "url": "https://files.pythonhosted.org/packages/ce/84/d9993c35ec5850583f8bd4b98983d4acab565ad0731803a4dd0c8a58ffef/bladerunner-4.0.3.tar.gz" } ], "4.0.4": [ { "comment_text": "", "digests": { "md5": "c3ff03f0659f8809017093fc933343e5", "sha256": "639cf87b30fe53ed6be81946323f9c14be3ca3c2c4d8af7b0957893dd8c31034" }, "downloads": -1, "filename": "bladerunner-4.0.4.tar.gz", "has_sig": false, "md5_digest": "c3ff03f0659f8809017093fc933343e5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19219, "upload_time": "2014-04-23T18:33:55", "url": "https://files.pythonhosted.org/packages/a1/2b/910c279f86244042dd89d840ab510a71b082e491d49b1a81e6516f4742af/bladerunner-4.0.4.tar.gz" } ], "4.0.5": [ { "comment_text": "", "digests": { "md5": "b5654d3a0e6444c3dc75b26b66b91219", "sha256": "7c9da62784d383133ab0053c513828b2d43d2610619b2b0f204a1346716a7dec" }, "downloads": -1, "filename": "bladerunner-4.0.5.tar.gz", "has_sig": false, "md5_digest": "b5654d3a0e6444c3dc75b26b66b91219", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19209, "upload_time": "2014-04-23T19:07:41", "url": "https://files.pythonhosted.org/packages/6a/96/6b7ae6956da84709e3e0e30e67f997ebac55bd40d616e626cd27938cf11d/bladerunner-4.0.5.tar.gz" } ], "4.0.6": [ { "comment_text": "", "digests": { "md5": "c40568e307524b19440953c5512856b9", "sha256": "fa80086a1f0dfae464875bce6bd1e2c49b9989a004d3164bff62794670250dd6" }, "downloads": -1, "filename": "bladerunner-4.0.6.tar.gz", "has_sig": false, "md5_digest": "c40568e307524b19440953c5512856b9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19210, "upload_time": "2014-05-16T01:21:19", "url": "https://files.pythonhosted.org/packages/a5/67/027f671202370ad955c3ab1bbc2e8348020c3dbb9c40d0dbdc9ee8fd1b62/bladerunner-4.0.6.tar.gz" } ], "4.0.7": [ { "comment_text": "", "digests": { "md5": "4e3a97bea534543d69c86a856342413e", "sha256": "43de0f0c71e6f61a1b1325941e964cdd43efd9bb138131d85d05451cd6220161" }, "downloads": -1, "filename": "bladerunner-4.0.7.tar.gz", "has_sig": false, "md5_digest": "4e3a97bea534543d69c86a856342413e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19750, "upload_time": "2014-06-13T00:37:28", "url": "https://files.pythonhosted.org/packages/54/51/b8c9a7d924391601490b690320da2d59a5551c8377103e711c0e43253263/bladerunner-4.0.7.tar.gz" } ], "4.0.8": [ { "comment_text": "", "digests": { "md5": "7d32b074a5078417382c30a12b78ef4a", "sha256": "379a1459a63d8fc89825030ee4c85936ca48e2ebd3aa77e381c1a9d9da494219" }, "downloads": -1, "filename": "bladerunner-4.0.8.tar.gz", "has_sig": false, "md5_digest": "7d32b074a5078417382c30a12b78ef4a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19509, "upload_time": "2014-07-08T01:25:25", "url": "https://files.pythonhosted.org/packages/99/1f/131ced11cfc235abe7f0517e2072fa57a7349e3f6e4ac272304d3522db13/bladerunner-4.0.8.tar.gz" } ], "4.1.0": [ { "comment_text": "", "digests": { "md5": "38ecbef784461905509d074db9eb3166", "sha256": "7710c9ec17de966f9dd3ac62a72c397063588b1d8fd5325f52c24dd99952bd05" }, "downloads": -1, "filename": "bladerunner-4.1.0.tar.gz", "has_sig": false, "md5_digest": "38ecbef784461905509d074db9eb3166", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23511, "upload_time": "2014-10-27T21:33:06", "url": "https://files.pythonhosted.org/packages/ca/fb/be7b626b410000cf8945741030f9edd6915feb48b56b56f816dfa302ee69/bladerunner-4.1.0.tar.gz" } ], "4.1.1": [ { "comment_text": "", "digests": { "md5": "06728ead7bf93c135de5e99141eaf31d", "sha256": "6b6be3379649f2f6e119b166d228965aab49ccab447afa26a83fc1691b0fb580" }, "downloads": -1, "filename": "bladerunner-4.1.1.tar.gz", "has_sig": false, "md5_digest": "06728ead7bf93c135de5e99141eaf31d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23656, "upload_time": "2014-10-31T22:56:11", "url": "https://files.pythonhosted.org/packages/08/ad/851581921f7557de1cb22395f8909cc366a9e76566077eabcbf4f9cb4f2d/bladerunner-4.1.1.tar.gz" } ], "4.1.2": [ { "comment_text": "", "digests": { "md5": "448d13edaf3eb863f377df05624054ab", "sha256": "f9092cdc06953fb423dae2075ae3fd917ca5983f65bbde637acac36b0998351b" }, "downloads": -1, "filename": "bladerunner-4.1.2.tar.gz", "has_sig": false, "md5_digest": "448d13edaf3eb863f377df05624054ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23689, "upload_time": "2014-11-11T01:31:57", "url": "https://files.pythonhosted.org/packages/32/f6/78858173ec2affde806ddb9e096ace19aa7ed96c62d0ca7e370b3a2e77a5/bladerunner-4.1.2.tar.gz" } ], "4.1.3": [ { "comment_text": "", "digests": { "md5": "3c7963e9d6f2442bebc7600c5651d368", "sha256": "bcf9e5d729b94843bbef31739e67dd382fecda17d9371ee1041e4887e386005f" }, "downloads": -1, "filename": "bladerunner-4.1.3.tar.gz", "has_sig": false, "md5_digest": "3c7963e9d6f2442bebc7600c5651d368", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23842, "upload_time": "2015-02-02T08:59:39", "url": "https://files.pythonhosted.org/packages/f1/5a/fd17facaef08f89cbf98263d62512fb065a7a1fb2ab6d92e0ac656c919dc/bladerunner-4.1.3.tar.gz" } ], "4.1.4": [ { "comment_text": "", "digests": { "md5": "ad119e802d66a6ec150a41fb7261f9e8", "sha256": "c325b52b34da91ba2f9daa68030fb4ad6ddc517335e00a9ebaa2cee4edb7df6c" }, "downloads": -1, "filename": "bladerunner-4.1.4.tar.gz", "has_sig": false, "md5_digest": "ad119e802d66a6ec150a41fb7261f9e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23770, "upload_time": "2015-02-03T09:56:13", "url": "https://files.pythonhosted.org/packages/7d/ed/29728fff088a655f55e9a831b2274d08ee33511f333593c8f575709ada9c/bladerunner-4.1.4.tar.gz" } ], "4.1.5": [ { "comment_text": "", "digests": { "md5": "5ee0822375718d65a13fbbc2553f5330", "sha256": "f26140527ed4bddcdb97fdfa47efa32f5b96866fbb5874d75bbb68fdbe65c9fa" }, "downloads": -1, "filename": "bladerunner-4.1.5.tar.gz", "has_sig": false, "md5_digest": "5ee0822375718d65a13fbbc2553f5330", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24431, "upload_time": "2015-02-05T18:51:09", "url": "https://files.pythonhosted.org/packages/79/98/824014738d8673136bea08c740707d18e48f838eaf0b5da1e1e90e0dc143/bladerunner-4.1.5.tar.gz" } ], "4.1.6": [ { "comment_text": "", "digests": { "md5": "f88451610cc2e886fcecd29fe0554c28", "sha256": "c3d0332205f21f8855e376b936d90b35fb99f54f48e530813cfa4b46bfc0ba01" }, "downloads": -1, "filename": "bladerunner-4.1.6.tar.gz", "has_sig": false, "md5_digest": "f88451610cc2e886fcecd29fe0554c28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25001, "upload_time": "2015-03-09T19:44:42", "url": "https://files.pythonhosted.org/packages/10/be/b967c0587011c5be99898108293f2101b91f4bae0601900378653c2d2fae/bladerunner-4.1.6.tar.gz" } ], "4.1.7": [ { "comment_text": "", "digests": { "md5": "91b94d222c5f9cce43bf66e9860f01cd", "sha256": "1743bcfedf27935fd5b2d0e95a34f0e7a0e47ed55ec96e9b7c68916d303d118a" }, "downloads": -1, "filename": "bladerunner-4.1.7-py3-none-any.whl", "has_sig": false, "md5_digest": "91b94d222c5f9cce43bf66e9860f01cd", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 35830, "upload_time": "2015-06-11T06:11:15", "url": "https://files.pythonhosted.org/packages/19/c0/09eb96a15eed7d7c55166465e572b75dab0b4b927bfba16fa0eb6671b859/bladerunner-4.1.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "477a01a2b08f9a394cb28783977b2468", "sha256": "bfc4bf6f49ca46508faad08c4ed4991010236feb6bd61b7d6736ef55133274e8" }, "downloads": -1, "filename": "bladerunner-4.1.7.tar.gz", "has_sig": false, "md5_digest": "477a01a2b08f9a394cb28783977b2468", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29622, "upload_time": "2015-06-11T06:11:12", "url": "https://files.pythonhosted.org/packages/df/c1/7624c9e7818c87b5d19f470cc1d976db98bece8eb13aa996c47279be601e/bladerunner-4.1.7.tar.gz" } ], "4.1.8": [ { "comment_text": "", "digests": { "md5": "79b04219a072eb0ce3d41e947ad424f0", "sha256": "2dc1c22c3015e230b18fc13b7bca507dcb9b044e3c8915ff797b16268e4a71a0" }, "downloads": -1, "filename": "bladerunner-4.1.8-py3-none-any.whl", "has_sig": false, "md5_digest": "79b04219a072eb0ce3d41e947ad424f0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35941, "upload_time": "2015-11-25T23:28:54", "url": "https://files.pythonhosted.org/packages/97/b6/dd596a278445813ea6c1672f11cc179dbf952b64b7868ed03806c53d31ae/bladerunner-4.1.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ee38f5ee92e1893be6f5f50261a0bcb", "sha256": "ce3f062f63df99c65af3e62b409f413b8e4c74397d4908b41c858e5126e37f59" }, "downloads": -1, "filename": "bladerunner-4.1.8.tar.gz", "has_sig": false, "md5_digest": "2ee38f5ee92e1893be6f5f50261a0bcb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29649, "upload_time": "2015-11-25T23:28:58", "url": "https://files.pythonhosted.org/packages/d2/91/f9d76039baf517b347d5953b591b2a196884361490794176c2c6eb812c0a/bladerunner-4.1.8.tar.gz" } ], "4.1.9": [ { "comment_text": "", "digests": { "md5": "ea7ed9c4dbc876eac865d6fc29af65c8", "sha256": "340deb928574fe09467dbfb1b0ace22056122f4aa99aee2efd0335186b669164" }, "downloads": -1, "filename": "bladerunner-4.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "ea7ed9c4dbc876eac865d6fc29af65c8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35802, "upload_time": "2015-11-27T21:37:54", "url": "https://files.pythonhosted.org/packages/6a/9b/61ce8c26991cd5b803896252b17d9307fdd2edbd34cd0ea32c73f0460ffe/bladerunner-4.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cec93c792af2c2206243cadd647f1f3", "sha256": "3c7df3f66bc057d8a20a11690f72ed18e24cff544bf274e93c20d3d297b7e601" }, "downloads": -1, "filename": "bladerunner-4.1.9.tar.gz", "has_sig": false, "md5_digest": "6cec93c792af2c2206243cadd647f1f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29513, "upload_time": "2015-11-27T21:37:58", "url": "https://files.pythonhosted.org/packages/92/64/b5b043b26d7ba50ddbbd61efa716d548d73db77266b77139126ad59a1fe7/bladerunner-4.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ea7ed9c4dbc876eac865d6fc29af65c8", "sha256": "340deb928574fe09467dbfb1b0ace22056122f4aa99aee2efd0335186b669164" }, "downloads": -1, "filename": "bladerunner-4.1.9-py3-none-any.whl", "has_sig": false, "md5_digest": "ea7ed9c4dbc876eac865d6fc29af65c8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 35802, "upload_time": "2015-11-27T21:37:54", "url": "https://files.pythonhosted.org/packages/6a/9b/61ce8c26991cd5b803896252b17d9307fdd2edbd34cd0ea32c73f0460ffe/bladerunner-4.1.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cec93c792af2c2206243cadd647f1f3", "sha256": "3c7df3f66bc057d8a20a11690f72ed18e24cff544bf274e93c20d3d297b7e601" }, "downloads": -1, "filename": "bladerunner-4.1.9.tar.gz", "has_sig": false, "md5_digest": "6cec93c792af2c2206243cadd647f1f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29513, "upload_time": "2015-11-27T21:37:58", "url": "https://files.pythonhosted.org/packages/92/64/b5b043b26d7ba50ddbbd61efa716d548d73db77266b77139126ad59a1fe7/bladerunner-4.1.9.tar.gz" } ] }