{ "info": { "author": "flashashen", "author_email": "flashashen@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 2.7", "Topic :: System :: Networking", "Topic :: System :: Networking :: Firewalls" ], "description": "no, *YOU* talk to the hand!\n===========================\n\n|CircleCI| |Python versions| |MIT License|\n\n--------------\n\nAccess all your corporate stuff and web stuff at the same time without\nfuss\n\n**You want this if you\u2019re being worn out by:**\n\n- Seeing the \u2018talk to the hand\u2019 page from the corporate web\n proxy/filter\n- Tunnel/proxy setup in too many places and in too many ways\n- Tunnels dropping silently\n- Forgetting to manually bring up tunnels after logging onto vpn\n- Re-entering ssh credentials over and over (key based auth isn\u2019t\n allowed everywhere)\n\nno-YOU-talk-to-the-hand solves all these issues by providing a\nstraight-forward combination of\n`sshuttle `__ for the heavy\nnetwork lifting, supervisord to keep everything up and manageable, and\nyaml to keep it simple and organized\n\nWorks with Linux and MacOS but **not MS Windows** due to sshuttle though\nthere is a workaround for windows described\n`here `__\n\nWhat it does\n------------\n\n- *Sets up your tunnels automatically* when your VPN connects\n- *Takes down your tunnels automatically* when your VPN disconnects\n- *Keeps your tunnels up* when they should be up\n- *Organizes your tunnels* with a single, simple, YAML configuration\n- *Enters passwords for you* as needed\n (`sshpass `__ required for\n now)\n- Supports *multiple VPNs (roots)*. Have different vpns that require\n separate tunnels? Define them in one place and only tunnels dependent\n on the vpn that is up are established\n- Supports any number of *simultaneous tunnels* (thanks to\n `sshuttle `__ )\n- Supportes *nested dependencies*. For example: (qa_db, prod_db) \u2013\n depends \u2013> (corp_private) \u2013 depends \u2013> (corp_vpn)\n\nConfig.yml replaces all your tunnel scripts/aliases, ssh setup inside db tools, application specific web proxy setup, etc:\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n.. code:: yaml\n\n\n HOST_PERSONAL_PROXY: &HOST_PERSONAL_PROXY 192.168.1.X\n PROXY_USER: &PROXY_USER proxy.username\n\n CORP_USER: &CORP_USER company.username\n CORP_PASS: &CORP_PASS pA$$wuuuurd\n\n # Define the corporate subnets. SUBNETS_CORP_ALL encompasses addresses that will already be sent\n # through your default network interace to the compnay network. This var is defined for exclusion \n # from other tunnels which will override your system defaults. SUBNETS_CORP_RESTRICTED is used\n # to forward a subset of corporate traffic through a jump server in order to reach hosts that are \n # not reachable directly on the VPN. \n SUBNETS_CORP_ALL: &SUBNETS_CORP_ALL\n - \"10.0.0.0/8\"\n SUBNETS_CORP_RESTRICTED: &SUBNETS_CORP_RESTRICTED \n - \"10.0.1.0/24\"\n - \"10.0.2.0/24\"\n\n # Define several special destinations on the corporate network. HOST_CORP_JUMP defines the host \n # through which all protected subnets must be accessed. HOST_CORP_PRIVILEGED_APP and HOST_CORP_SEURE_DB\n # define an application server and database where the database can only be reached from the\n # application server. Reaching the database will require a nested tunnel\n HOST_CORP_JUMP: &HOST_CORP_JUMP 10.0.0.1\n HOST_CORP_PRIVILEGED_APP: &HOST_CORP_PRIVILEGED_APP 10.0.1.1\n HOST_CORP_SECURE_DB: &HOST_CORP_SECURE_DB 10.0.2.1\n\n\n # Global config options \n log_level: DEBUG # Python log level. Default is DEBUG\n monitor_poll_seconds: 5 # Monitor thread wakeup (may be exceeded by a long tunnel check). Default is 20 \n\n\n tunnels:\n\n # Watch for connection to corporate VPN. This is the 'root', external tunnel\n # In this configuraiton, if the corporate jump server is available, then the vpn is up\n vpn:\n check:\n host: *HOST_CORP_JUMP\n port: 22\n\n\n # Bypass corporate network policies for web browsing, skype, streaming music, etc. \n # You must have a proxy server available that is outside the corporate network. If \n # you don't have one, this project is still useful for accessing restricted \n # resources within the corporate network.\n personal:\n depends: vpn\n proxy:\n host: *HOST_PERSONAL_PROXY\n user: *PROXY_USER\n pass:\n check:\n # instead of an ip and port, a check target can be a url for an http check\n url: https://twitter.com/\n\n forwards:\n # includes and excludes. items can be ips, subnets, or lists of ip/subnets.\n include:\n # By default, forward everything through the personal proxy\n - 0/0\n exclude:\n # exclude home network and anything corporate \n - 192.168.0.0/16\n - *SUBNETS_CORP_ALL\n\n # Forward traffic destined for restricted subnets through a corporate jump server.\n corp_sec:\n depends: vpn\n proxy:\n host: *HOST_CORP_JUMP\n user: *CORP_USER\n pass: *CORP_PASS\n # verify by checking ssh access to the privileged app server\n check:\n # If the application server is reachable, this tunnel is up\n host: *HOST_CORP_PRIVILEGED_APP\n port: 22\n forwards:\n # Include anything destined for a secured corporate subnet\n include:\n - *SUBNETS_CORP_RESTRICTED\n\n # Tunnel to access a secure db server from a privileged app server. This tunnel depends \n # on corp_restricted being established. For traffic destined for the DB, this rule will \n # fire first and the traffic will be forwarded through the APP server, however traffic \n # destined for the APP server is forwarded through the JUMP server. \n prod_db:\n depends: corp_sec\n proxy:\n host: *HOST_CORP_PRIVILEGED_APP\n user: *CORP_USER\n pass: *CORP_PASS\n check:\n driver: mysql+pymysql\n db: testdb\n user: testuser\n pass: testpass\n host: 10.0.2.1\n port: '3306'\n forwards:\n # includes and excludes. items can be ips, subnets, or lists of ip/subnets.\n include:\n - *HOST_CORP_SECURE_DB\n\n\n\nInstallation\n------------\n\n::\n\n $ pip install no_you_talk_to_the_hand\n\nIf pip install results in a error like \u2018TLSV1_ALERT_PROTOCOL_VERSION\u2019\nyou may first need to upgrade pip:\n\n::\n\n $ curl https://bootstrap.pypa.io/get-pip.py | python\n\nIf you configure a password for any remote server then\n`sshpass `__ is required.\n\n--------------\n\nsshuttle requires root/admin privilege to change forward rules. If your\nuser is prompted for sudo password, then you may encounter and error\nlike **sudo no tty present and no askpass program specified**. A quick\nsolution is to set the no password flag in the sudoers file. The\nfollowing works currently on Macs:\n\n::\n\n $ sudo visudo\n\n.. then add \u2018NOPASSWD\u2019 to the admin group like this:\n\n::\n\n $ %admin ALL=(ALL) NOPASSWD: ALL\n\n--------------\n\nIf you check a tunnel via a sqlalchemy connection (see prod_db tunnel in\nsample config above) then sqlalchemy and the appropriate driver must be\ninstalled separately\n\nRunning\n-------\n\nstart\n~~~~~\n\nStart daemon to begin managing the configured tunnels (in\n~/.nyttth/config.yml)\n\n::\n\n $ nyttth start\n\nstop\n~~~~\n\nStop daemon along with any tunnels that are running\n\n::\n\n $ nyttth stop\n\nstatus\n~~~~~~\n\nHelp:\n\n::\n\n $ nyttth status --help\n\n Usage: nyttth status [OPTIONS]\n\n View status of all configured tunnels\n\n Options:\n -t, --tunnel [qadb|riskdb|itun|dbtun|etun|vpn|rfindb]\n specify a specific tunnel\n -s, --skip skip tunnel health checks\n --help Show this message and exit.\n\nExample with VPN down:\n\n::\n\n $ nyttth status\n\n Process Depends Proc State Conn Check\n ----------------------------------------------------------\n vpn N/A down \n itun vpn STOPPED Not started skipped \n dbtun itun STOPPED Not started skipped \n etun vpn STOPPED Not started skipped \n qadb vpn STOPPED Not started skipped \n\nExample with VPN up:\n\n::\n\n $ nyttth status\n\n Process Depends Proc State Conn Check\n --------------------------------------------------------------------\n vpn N/A up \n itun vpn RUNNING pid 1595, uptime 0:09:28 up \n dbtun itun RUNNING pid 1603, uptime 0:09:23 up \n etun vpn RUNNING pid 1565, uptime 0:09:33 up \n qadb vpn RUNNING pid 2692, uptime 0:00:04 up \n\n\ntail\n~~~~\n\nHelp:\n\n::\n\n $ nyttth tail --help\n\n Usage: nyttth tail [OPTIONS]\n\n\n Use system tail command to display logs. If a specific tunnel is not specified \n then all logs will be tailed including the supervisord main log and the vpnmon \n tunnel monitor process.\n\n\n Options:\n -t, --tunnel [qadb|itun|dbtun|etun|vpn]\n specify a specific tunnel to tail. If not\n specified all tunnels and the tunnel monitor\n (monitor) will be tailed\n -f, --wait wait for additional data\n -n, --lines INTEGER number of lines to display\n --help Show this message and exit.\n\nTail output for a single (example) tunnel:\n\n::\n\n $ nyttth tail -f -t itun\n server: warning: closed channel 158 got cmd=TCP_STOP_SENDING len=0\n server: warning: closed channel 159 got cmd=TCP_STOP_SENDING len=0\n server: warning: closed channel 160 got cmd=TCP_STOP_SENDING len=0\n server: warning: closed channel 148 got cmd=TCP_STOP_SENDING len=0\n server: warning: closed channel 162 got cmd=TCP_STOP_SENDING len=0\n server: warning: closed channel 164 got cmd=TCP_STOP_SENDING len=0\n\nWhen VPN Connects:\n\n::\n\n $ nyttth tail -f | grep nyttth\n 2017-05-17 11:52:53,357 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:53,497 INFO nyttth: qadb is down. starting\n 2017-05-17 11:52:53,498 INFO nyttth: dbtun is down. starting\n 2017-05-17 11:52:53,907 INFO nyttth: etun is down. starting\n 2017-05-17 11:52:55,493 INFO nyttth: itun is down. starting\n 2017-05-17 11:53:06,527 DEBUG nyttth: checking tunnels\n 2017-05-17 11:53:06,814 INFO nyttth: rfindb is down. starting\n 2017-05-17 11:53:17,826 DEBUG nyttth: checking tunnels\n 2017-05-17 11:53:28,129 DEBUG nyttth: checking tunnels\n\nWhen VPN Disconnects:\n\n::\n\n $ nyttth tail -f | grep nyttth\n 2017-05-17 11:51:44,701 DEBUG nyttth: checking tunnels\n 2017-05-17 11:51:55,000 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:05,265 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:07,269 DEBUG nyttth: vpn is down\n 2017-05-17 11:52:07,274 INFO nyttth: qadb depends on vpn which is down. stopping\n 2017-05-17 11:52:07,281 INFO nyttth: itun depends on vpn which is down. stopping\n 2017-05-17 11:52:07,286 INFO nyttth: rfindb depends on itun which is down. stopping\n 2017-05-17 11:52:07,292 INFO nyttth: dbtun depends on vpn which is down. stopping\n 2017-05-17 11:52:07,299 INFO nyttth: etun depends on vpn which is down. stopping\n 2017-05-17 11:52:17,306 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:19,310 DEBUG nyttth: vpn is down\n 2017-05-17 11:52:29,324 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:31,329 DEBUG nyttth: vpn is down\n 2017-05-17 11:52:41,340 DEBUG nyttth: checking tunnels\n 2017-05-17 11:52:43,345 DEBUG nyttth: vpn is down\n\nctl\n~~~\n\nRun supervisorctl console\n\n::\n\n $ nyttth ctl\n\nNotes\n-----\n\nThis project uses sshuttle version 0.78.1. Subsequent versions define PF\n(Packet Filter) exclusions in a way that breaks when there are\nexclusions in multiple instances of sshuttle.\n\nPython 3 is not supported because supervisord does not\n\nThis docs ignores whatever technical differences there are between\ntunnels and forwards and just uses the word \u2018tunnels\u2019.\n\nRemote ssh servers through which trafffic is forwarded, are referred to\nas proxies.\n\nThe term \u2018VPN\u2019 refers to a \u2018root\u2019 tunnel in the configuration that\nspecifies no proxy setup or forwards. It exsits to check an external\ncondition (reachable network endpoint)and does not really have to be a\ntrue VPN\n\n.. |CircleCI| image:: https://circleci.com/gh/flashashen/no-YOU-talk-to-the-hand.svg?style=svg\n.. |Python versions| image:: https://img.shields.io/pypi/pyversions/no-YOU-talk-to-the-hand.svg\n.. |MIT License| image:: https://img.shields.io/github/license/flashashen/no-YOU-talk-to-the-hand.svg\n\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/flashashen/no-YOU-talk-to-the-hand", "keywords": "ssh vpn tunnel forward daemon", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "no-you-talk-to-the-hand", "package_url": "https://pypi.org/project/no-you-talk-to-the-hand/", "platform": "osx", "project_url": "https://pypi.org/project/no-you-talk-to-the-hand/", "project_urls": { "Homepage": "https://github.com/flashashen/no-YOU-talk-to-the-hand" }, "release_url": "https://pypi.org/project/no-you-talk-to-the-hand/1.0.5/", "requires_dist": [ "Click", "supervisor", "pyyaml (>=4.2b1)", "jinja2", "six", "requests (>=2.20.0)", "futures", "sshuttle (==0.78.1)" ], "requires_python": "", "summary": "nyttth: Boss your corporate network effortlessly. Automatic and organized tunneling with sshuttle + supervisord + yaml", "version": "1.0.5" }, "last_serial": 4681565, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "fed2f6d996aaa82eb8bd497d0ae0c81f", "sha256": "1a6e201987c1f41bd2dbf835cee08e06229150bf33b71ee8096f0fdc957d56fc" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fed2f6d996aaa82eb8bd497d0ae0c81f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 6323, "upload_time": "2017-08-02T18:25:49", "url": "https://files.pythonhosted.org/packages/5d/47/1b6cce9bf286894ac6e337d08d9ffe588ed8100b3bf8724e2e8fe0076ce4/no_you_talk_to_the_hand-0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "93a17bc695a117da5de635a54a7fafc1", "sha256": "30eb41101bf4e663a4be66393858c3fea16b6e94fcca4a656d1f906d35b901aa" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-0.3.tar.gz", "has_sig": false, "md5_digest": "93a17bc695a117da5de635a54a7fafc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5376, "upload_time": "2017-08-02T18:25:52", "url": "https://files.pythonhosted.org/packages/2a/d1/7ee1275f58ccb8a70ef7637a16e4f386a496bf64d6b708db2f11f47dcead/no_you_talk_to_the_hand-0.3.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "6db70159adc719e7f4c8237114954f62", "sha256": "a696f01e5e01b6920cc60776111fe49ad56870a6c4c0a2fa245500803942024a" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "6db70159adc719e7f4c8237114954f62", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 13966, "upload_time": "2017-08-02T18:25:50", "url": "https://files.pythonhosted.org/packages/5f/71/13205ca54f9f6ec8ed0a2fb5f3e3a1c0969796e7cf5ea2ccf9c6f0f2b868/no_you_talk_to_the_hand-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "01e9c03baf8d77dedab21fd54c61fcd6", "sha256": "20611d470e1bb5d28a2b1ae744f8150d7fa06aa492182b0227e4e7124eb3efff" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "01e9c03baf8d77dedab21fd54c61fcd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12043, "upload_time": "2017-08-02T18:25:51", "url": "https://files.pythonhosted.org/packages/3f/41/ca44cc8cb4259da79869487ef9173da96c670a7059a84f05d8570da8ab1c/no_you_talk_to_the_hand-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a4ce5cbc8b494aa0fd69544a2cfc802", "sha256": "285d4873a6810987c8ca894d45c40239e439a0d2c86c9c6d36ae8d198e9d35a7" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.0.tar.gz", "has_sig": false, "md5_digest": "9a4ce5cbc8b494aa0fd69544a2cfc802", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8072, "upload_time": "2017-08-02T18:25:54", "url": "https://files.pythonhosted.org/packages/61/aa/3f1398f9fab0e4fe948aac51d8fd717c090be24beacffd7c9ea187b29f36/no_you_talk_to_the_hand-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "d1a3b00585131128f6eb3a09362cceb4", "sha256": "4c3dd5be526e4334b059623cf6ddd9b25fdb9e05833dc6fb65a576dee8496e15" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "d1a3b00585131128f6eb3a09362cceb4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14000, "upload_time": "2017-08-02T22:52:25", "url": "https://files.pythonhosted.org/packages/0e/1a/f0d4fd9de621c69345fd6cb4313b05159d59f234d60b80221889b3306b74/no_you_talk_to_the_hand-1.0.1-py2-none-any.whl" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "0c3d79af53d0eabd67081e46d94ad7a7", "sha256": "dc26bcca6bd77d5e06f0e49b851a7eece029bcfb1f7c53d80fa67bfd3c482836" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "0c3d79af53d0eabd67081e46d94ad7a7", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15799, "upload_time": "2017-11-21T16:52:00", "url": "https://files.pythonhosted.org/packages/fb/94/8bc16996196c8094b4a31822dafb6dbe54b313a2c6482bf81c0c6b69131e/no_you_talk_to_the_hand-1.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6a3a8971d506b43e8b6a8ce00cb869e", "sha256": "56481ba001eb2d4c6875a884aaff88bc2d5343a5e16de63f2ea0292e679883c7" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.2.tar.gz", "has_sig": false, "md5_digest": "e6a3a8971d506b43e8b6a8ce00cb869e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14200, "upload_time": "2017-11-21T16:52:03", "url": "https://files.pythonhosted.org/packages/fb/00/37a48857822e5526011bbe3f49a70ed6ddc48aa088003558367b01652192/no_you_talk_to_the_hand-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "c3639538d6d077e3c9300d667d30c941", "sha256": "6c365657c45394ec33b57f8fb2f982907c263b7aa99076c76a2c9445ea5f53e7" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "c3639538d6d077e3c9300d667d30c941", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 16183, "upload_time": "2017-11-22T14:09:30", "url": "https://files.pythonhosted.org/packages/fe/ac/84dd95645759e2a117603f209fab87411b34af676479c22db3f0862b2b4e/no_you_talk_to_the_hand-1.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8609163de58c68797dd26e48d625dc4b", "sha256": "07b2d0415a2e67b4917c8bae992c2fd51fb8714c244f2950d24a0c400cf08772" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.3.tar.gz", "has_sig": false, "md5_digest": "8609163de58c68797dd26e48d625dc4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14775, "upload_time": "2017-11-22T14:09:32", "url": "https://files.pythonhosted.org/packages/f7/dc/d7b15738142cbf108c588b3d85c9e709dcad24098b214ede64f3a351e3ff/no_you_talk_to_the_hand-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "8fe988d6ac6936df3f433b42c4f133bf", "sha256": "b8462d3e07d7aae7bfb014e4bfbaa5fabd2f0fca8107cc0eec863a468adae5d6" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "8fe988d6ac6936df3f433b42c4f133bf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12518, "upload_time": "2018-09-06T16:45:05", "url": "https://files.pythonhosted.org/packages/ec/20/5e0dfa6fc15f1f7abc8e8e624e38dd066bf30f34a4de71d6531100f374f3/no_you_talk_to_the_hand-1.0.4-py2-none-any.whl" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "bc380735565845ed8e3f0e923d1ab0e6", "sha256": "ee1441be073c448b8c1c644f086831459950072d2a5532f83c64e0b3843ecc74" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "bc380735565845ed8e3f0e923d1ab0e6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14795, "upload_time": "2019-01-10T15:16:16", "url": "https://files.pythonhosted.org/packages/cf/e7/94b917a297234d3d986e9644d2e4d17fe8749cbe0d4708c64c6d0b297cd4/no_you_talk_to_the_hand-1.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4155019317b9d53e3e5378a402161447", "sha256": "4d8c5362785f023c68b75cc5f3e2626797f32ac7dfde7779f04069a7299cc844" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.5.tar.gz", "has_sig": false, "md5_digest": "4155019317b9d53e3e5378a402161447", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21254, "upload_time": "2019-01-10T15:16:17", "url": "https://files.pythonhosted.org/packages/6e/41/ebb81cfb7117bd0501c618bb42b47831b13fe96e2975c1e3cedee7c315bc/no_you_talk_to_the_hand-1.0.5.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bc380735565845ed8e3f0e923d1ab0e6", "sha256": "ee1441be073c448b8c1c644f086831459950072d2a5532f83c64e0b3843ecc74" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.5-py2-none-any.whl", "has_sig": false, "md5_digest": "bc380735565845ed8e3f0e923d1ab0e6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 14795, "upload_time": "2019-01-10T15:16:16", "url": "https://files.pythonhosted.org/packages/cf/e7/94b917a297234d3d986e9644d2e4d17fe8749cbe0d4708c64c6d0b297cd4/no_you_talk_to_the_hand-1.0.5-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4155019317b9d53e3e5378a402161447", "sha256": "4d8c5362785f023c68b75cc5f3e2626797f32ac7dfde7779f04069a7299cc844" }, "downloads": -1, "filename": "no_you_talk_to_the_hand-1.0.5.tar.gz", "has_sig": false, "md5_digest": "4155019317b9d53e3e5378a402161447", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21254, "upload_time": "2019-01-10T15:16:17", "url": "https://files.pythonhosted.org/packages/6e/41/ebb81cfb7117bd0501c618bb42b47831b13fe96e2975c1e3cedee7c315bc/no_you_talk_to_the_hand-1.0.5.tar.gz" } ] }