{ "info": { "author": "Horacio G. de Oro", "author_email": "hgdeoro@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: No Input/Output (Daemon)", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: System :: Distributed Computing", "Topic :: System :: Networking", "Topic :: System :: Systems Administration", "Topic :: Utilities" ], "description": "==========\nTcpNetLock\n==========\n\n\n.. image:: https://img.shields.io/pypi/v/tcpnetlock.svg\n :target: https://pypi.python.org/pypi/tcpnetlock\n\n.. image:: https://img.shields.io/travis/hgdeoro/tcpnetlock.svg\n :target: https://travis-ci.org/hgdeoro/tcpnetlock\n\n.. image:: https://readthedocs.org/projects/tcpnetlock/badge/?version=latest\n :target: https://tcpnetlock.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\n\n.. image:: https://pyup.io/repos/github/hgdeoro/tcpnetlock/shield.svg\n :target: https://pyup.io/repos/github/hgdeoro/tcpnetlock/\n :alt: Updates\n\n\n\nNetwork lock based on TCP sockets\n---------------------------------\n\n\n* Free software: GNU General Public License v3\n* Documentation: https://tcpnetlock.readthedocs.io/\n* GitHub: https://github.com/hgdeoro/tcpnetlock/\n* Docker: https://hub.docker.com/r/hgdeoro/tcpnetlock/\n\n\nWhy?\n----\n\nWhile deploying applications to Kubernetes, I needed a way to make sure that\nsome potential concurrent, distributed actions, are not executed concurrently.\nFor example:\n\n* **database migrations**: just one Pod in the Kubernetes cluster should be able to apply the database migrations\n* for **batch jobs**, different workers could be working on the same resource, this can be avoided with this lock mechanism\n\nOf course, Zookeeper is a MUCH BETTER solution, but that's too much for my use cases...\n\nHow it works\n------------\n\nAssuming the server is running on localhost, let's get a lock using telnet::\n\n $ telnet localhost 7654\n Trying 127.0.0.1...\n Connected to localhost.\n Escape character is '^]'.\n\nTo try to acquire a lock, send::\n\n lock,name:django-migrations\n\nServer responds with::\n\n ok\n\nFrom that point, and while the TCP connection is open, you have the lock.\n\nIf you try the same in a different terminal, you will get::\n\n $ telnet localhost 7654\n Trying 127.0.0.1...\n Connected to localhost.\n Escape character is '^]'.\n lock,name:django-migrations <= you write\n not-granted <= server response\n Connection closed by foreign host. <= server closed the connection\n\nHere the server responded with **not-granted** and closed the TCP connection. The lock was not granted to you.\n\nBut, in real-life scenarios, you would use the provided utility **tcpnetlock_do**::\n\n $ tcpnetlock_do --lock-name django-migrations -- python manage.py migrate\n\nTo test it, you will need the server running. To get the server running with Docker, just run::\n\n $ docker pull hgdeoro/tcpnetlock\n $ docker run -ti --rm -p 7654:7654 hgdeoro/tcpnetlock\n\nAlternatively, you can install the package in a virtualenv and launch the server::\n\n $ virtualenv -p python3.6 venv\n $ source venv/bin/activate\n $ pip install tcpnetlock\n $ tcpnetlock_server --info\n INFO:root:Started server listening on localhost:7654\n\n\nFeatures\n--------\n\n* Runs on Python 3.6 / Python 3.5\n* Do not require external libraries\n* Ready to use Docker image (based on Alpine)\n* Includes server and python client\n* Includes utility to run Linux commands while holding the lock\n* Simple protocol: you can get a lock even with *netcat*\n\nAppendix: netcat\n----------------\n\nSince the protocol is just text over a TCP connection, you can get a lock just writing the\nright text overt the TCP connection and leaving that TCP connection open, and that's the default\nbehaviour of netcat::\n\n $ echo 'lock,name:LOCK_NAME' | nc localhost 7654\n\nThe first line uses netcat to open the TCP connection and tries to get the lock.\n\nThe biggest problem would be to READ the response to the server (will be one of 'ok' or 'not-granted') while\nsend `nc` to the background. We can use a `fifo` for that::\n\n $ echo 'lock,name:LOCK_NAME' | nc -v localhost 7654 | tee /tmp/.tcpnetlock &\n $ result=$(head -n 1 /tmp/.tcpnetlock)\n\nEven though this works, using one of the two existing python clients (`tnl_client` and `tnl_do`) would be much better.\n\n\nCredits\n-------\n\nThis package was created with Cookiecutter_ and the `audreyr/cookiecutter-pypackage`_ project template.\n\n.. _Cookiecutter: https://github.com/audreyr/cookiecutter\n.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage\n\n\n=======\nHistory\n=======\n\n0.1.8 (2018-07-20)\n------------------\n\n* Make period of cleanup configurable via environment variables\n* FIX response for stats action\n* Add tests for background thread\n* Add client method to call the stats action\n\n0.1.7 (2018-07-19)\n------------------\n\n* Log release of lock causde by client disconnecting\n* Add .stats action\n* Add background thread to cleanup old locks\n* Remove global server state hold on Context class\n\n0.1.6 (2018-07-06)\n------------------\n\n* FIX tag used in Docker image\n* log server version when starting\n\n0.1.5 (2018-06-26)\n------------------\n\n* FIX variable name used for building Docker image\n* Change theme for docs\n\n0.1.4 (2018-06-26)\n------------------\n\n* Implements retries for cli tnl_do\n\n0.1.3 (2018-06-22)\n------------------\n\n* Server logs granted lock\n* Add description to CLI\n* Client use environment variables for host/port\n* Add __str__ to Action to have better logs in server\n\n0.1.2 (2018-06-21)\n------------------\n\n* Update client & server to handle errors in a better way\n* Add tests\n* Update docs\n\n0.1.1 (2018-06-20)\n------------------\n\n* Add .bashrc (for developers)\n* Fix setup.py\n\n0.1.0 (2018-06-19)\n------------------\n\n* Docker start server with --info by default\n* Adds cloudbuild.yaml to facilitate building in GCP\n* Change in protocol to detect unintended uses\n* Detect invalid requests and always send response to client\n* BIG refactor of server and client classes\n* Add lot of tests (current coverage: 99%)\n\n\n0.0.8 (2018-06-18)\n------------------\n\n* Refactor messy code from server, client and cli\n\n\n0.0.7 (2018-06-17)\n------------------\n\n* Code cleanup and refactor\n* Add tests\n* Implements run_with_lock script to make really easy to use from shell scripts\n\n0.0.6 (2018-06-16)\n------------------\n\n* Create shell script to be sourced, to facilitate use of tcpnetlock from shell scripts\n\n0.0.5 (2018-06-15)\n------------------\n\n* Update CONTRIBUTING (documents commands for the full release process)\n* Disable upload to pypi from Travis-CI\n\n0.0.4 (2018-06-15)\n------------------\n\n* Encapsulate Lock, adds client id and timestamp\n* Implement sending of keepalive from client\n* Remove use of 'click'\n* Start server from cli with configurable parameters (listen address, port, etc)\n* Use client id to identify who has the lock\n\n0.0.3 (2018-06-15)\n------------------\n\n* Validate lock name in server\n* FIX client to handle RESPONSE_ERR response\n* Add unittests\n* Refactor locks into server class\n* Use threading for test server\n* Make code compatible with Python 3.5\n\n0.0.2 (2018-06-15)\n------------------\n\n* Implements RELEASE of locks\n* FIX release of lock when client closes the connection\n* Validates lock name\n* Code refactoring\n\n0.0.1 (2018-06-15)\n------------------\n\n* Add files from cookiecutter-pypackage\n* Migrate test cases to pytest\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/hgdeoro/tcpnetlock", "keywords": "tcpnetlock", "license": "GNU General Public License v3", "maintainer": "", "maintainer_email": "", "name": "tcpnetlock", "package_url": "https://pypi.org/project/tcpnetlock/", "platform": "", "project_url": "https://pypi.org/project/tcpnetlock/", "project_urls": { "Homepage": "https://github.com/hgdeoro/tcpnetlock" }, "release_url": "https://pypi.org/project/tcpnetlock/0.1.8/", "requires_dist": null, "requires_python": "", "summary": "Network lock based on TCP sockets", "version": "0.1.8" }, "last_serial": 4086951, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "d46080709565e66f7b10c6849673d959", "sha256": "f89c075ec34ff29fb93d0fa070b114b36f67420b576ae413838a3d5c9fdd0de3" }, "downloads": -1, "filename": "tcpnetlock-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d46080709565e66f7b10c6849673d959", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 5762, "upload_time": "2018-06-15T19:11:59", "url": "https://files.pythonhosted.org/packages/be/4e/98bf0b6458b9bf1a4c88d419f8407eb397e48cab1ec550cd953eed18f645/tcpnetlock-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2ad8abdf3bcc7184296bacb55d94dba6", "sha256": "d1469ae2e874cc81e7ea81535d0f1dd1e649849c8c59c31c72b1d5cbbd15d356" }, "downloads": -1, "filename": "tcpnetlock-0.0.1.tar.gz", "has_sig": false, "md5_digest": "2ad8abdf3bcc7184296bacb55d94dba6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16689, "upload_time": "2018-06-15T19:12:00", "url": "https://files.pythonhosted.org/packages/7c/43/568343d23e0f6e3e6329c0fecf5171b7d079f334af9aa74f7cc52ca8e669/tcpnetlock-0.0.1.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "e936f4e392cc63c4548ca81178b6a099", "sha256": "e2a5dc42a7ef999704f2e9b5e4796a08ab64db591fc26f0b02f0489349250ea3" }, "downloads": -1, "filename": "tcpnetlock-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e936f4e392cc63c4548ca81178b6a099", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 7740, "upload_time": "2018-06-16T03:58:25", "url": "https://files.pythonhosted.org/packages/1e/89/f8ace754e79c8165a1b8371d7188dbb6092a322522d009ed04a7d89e2b2e/tcpnetlock-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "70edfca0b49cc55b4b51d7449fea2bdf", "sha256": "ee3da75ae6591e11707d3f1e93ad9e6154c9ad5f81a588de13b2f3918ce7cd8c" }, "downloads": -1, "filename": "tcpnetlock-0.0.5.tar.gz", "has_sig": false, "md5_digest": "70edfca0b49cc55b4b51d7449fea2bdf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18850, "upload_time": "2018-06-16T03:58:26", "url": "https://files.pythonhosted.org/packages/a3/83/ac9f98edaffbb53d668e41aaa6d40a1839df18b5bd848ffbf6b626a2bd0e/tcpnetlock-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "617b30e3389c3af22e7d6077b0c5644c", "sha256": "05654d410ccc22da603942f8cc8b86ab34945e9fdda5a5f48399a257f1af3323" }, "downloads": -1, "filename": "tcpnetlock-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "617b30e3389c3af22e7d6077b0c5644c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 8476, "upload_time": "2018-06-16T07:05:58", "url": "https://files.pythonhosted.org/packages/f1/75/e6147074d5c7c64fb46b672db21cdc6310428be4283e87c739ad0567a6de/tcpnetlock-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5744be576023d419fa3c7628b43f7696", "sha256": "ede336971aef6c8ee15737ec11b9985c04cd7ddc50cafe9b0aad7cf628be82d5" }, "downloads": -1, "filename": "tcpnetlock-0.0.6.tar.gz", "has_sig": false, "md5_digest": "5744be576023d419fa3c7628b43f7696", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21092, "upload_time": "2018-06-16T07:05:59", "url": "https://files.pythonhosted.org/packages/9d/b1/0ce97c7dd01d1845d2dd8657d6c0049661f55622a36ba2628e7034594c02/tcpnetlock-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "311dadeceebbcb092ff5427da71a07d8", "sha256": "05e3afd70dcf11d987c3a58da3d973207c8ee3d17773414b81f902b26a370608" }, "downloads": -1, "filename": "tcpnetlock-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "311dadeceebbcb092ff5427da71a07d8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13214, "upload_time": "2018-06-17T04:00:30", "url": "https://files.pythonhosted.org/packages/5b/b6/0e32b210b84fb1a1e8c91c62bc81fab56f1b88d9dd83ed43488916ccc7a3/tcpnetlock-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a6fd2b416f4faad8313aee0074c9aeb", "sha256": "1e754ebeda64478dd5af4b2614d8f6f057ac90b589d121125301cf622359cf23" }, "downloads": -1, "filename": "tcpnetlock-0.0.7.tar.gz", "has_sig": false, "md5_digest": "3a6fd2b416f4faad8313aee0074c9aeb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25411, "upload_time": "2018-06-17T04:00:32", "url": "https://files.pythonhosted.org/packages/06/bc/26be24131de54c394d9051741d24f3952eaa9f8ff3cbeff1cd1aae94d262/tcpnetlock-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "56bc51cb88f5ecc1b93621825efc9422", "sha256": "e42671b221cdccb54d0060da239a80392f6af3fda8ad7851ac38016bb7cbb537" }, "downloads": -1, "filename": "tcpnetlock-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56bc51cb88f5ecc1b93621825efc9422", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14025, "upload_time": "2018-06-18T05:58:07", "url": "https://files.pythonhosted.org/packages/7e/3e/6abc0b4bff6c57c0ba55ddedde31edaa95572afa9f8611fd19103d2f9de0/tcpnetlock-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8d3d70b334f1c0370a8bce5234f51049", "sha256": "c21ff1b227446858350f200187c230f410ab9124af0f1c9f588692068e703b8a" }, "downloads": -1, "filename": "tcpnetlock-0.0.8.tar.gz", "has_sig": false, "md5_digest": "8d3d70b334f1c0370a8bce5234f51049", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25387, "upload_time": "2018-06-18T05:58:09", "url": "https://files.pythonhosted.org/packages/15/f3/26ced5ac72b77915267f36afc33e4c928e11a9d6add667d805824d3fe112/tcpnetlock-0.0.8.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "95639f34b7e4a12b2c696f74c5327cc2", "sha256": "11ce8d58477ce0909c1fe51e16276e44aeeade8aaf6e63a7a6a0a14a6988c932" }, "downloads": -1, "filename": "tcpnetlock-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "95639f34b7e4a12b2c696f74c5327cc2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15530, "upload_time": "2018-06-20T23:06:19", "url": "https://files.pythonhosted.org/packages/d0/15/c0351fc1c1b9f00a5723c68b084230feb123d8a7586a833956be33189d25/tcpnetlock-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9fa80ab67e93b4c371954a10592df8e2", "sha256": "3ee1c68f8c45dab98897b89631b945821195fde1a7670cd9913f76021e7f4089" }, "downloads": -1, "filename": "tcpnetlock-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9fa80ab67e93b4c371954a10592df8e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27401, "upload_time": "2018-06-20T23:06:20", "url": "https://files.pythonhosted.org/packages/60/24/be5456ba9ef8b52951ac290e208dc22b535d7a834cd932a291661c0c4eb3/tcpnetlock-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "2551c3347f5cf7c9454b0caa503c394c", "sha256": "4281ebf48fc1850fdb2d87d19c41a2f2430d52c73aa6f2f26168faaffb09a642" }, "downloads": -1, "filename": "tcpnetlock-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2551c3347f5cf7c9454b0caa503c394c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17193, "upload_time": "2018-06-21T20:11:32", "url": "https://files.pythonhosted.org/packages/cf/42/2b274003f4fe3030a091755f7bf9a01133ff4878ab9a2750b2e81b7b8a4a/tcpnetlock-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "483e0517dd5a5d1d623535fefbdea40a", "sha256": "cb55e54219224e113faefcce5aa3bf9e823793467b60ee40f66557e35805be1e" }, "downloads": -1, "filename": "tcpnetlock-0.1.2.tar.gz", "has_sig": false, "md5_digest": "483e0517dd5a5d1d623535fefbdea40a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31338, "upload_time": "2018-06-21T20:11:33", "url": "https://files.pythonhosted.org/packages/4a/53/02cb29f15d71ed4c3c04496af9718a39d5c60608210f4258b6ca5dfed618/tcpnetlock-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "473913205e06d2b6c10b459a81fcb806", "sha256": "10d9dd78865183492a73d3f08c60470786efd57d0b90548c003760fc26701f39" }, "downloads": -1, "filename": "tcpnetlock-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "473913205e06d2b6c10b459a81fcb806", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18163, "upload_time": "2018-06-22T13:42:18", "url": "https://files.pythonhosted.org/packages/9c/61/b05002c6927fad43e28558fb2cda0cc1517aae3580f5ca71c92da087a7e4/tcpnetlock-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c1b57a749c67ffc9e550f04289855e04", "sha256": "cd699b9b4067b2bf7a6f209dfbf9ac627bbb48a52411e4d0392d7abe260232b2" }, "downloads": -1, "filename": "tcpnetlock-0.1.3.tar.gz", "has_sig": false, "md5_digest": "c1b57a749c67ffc9e550f04289855e04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33332, "upload_time": "2018-06-22T13:42:19", "url": "https://files.pythonhosted.org/packages/a9/12/16e2c00d9141154b29e9d7b6321f1d800686a274cb55120657d780225f76/tcpnetlock-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "dc9aa3a888be3d8a3e0e155f236bd7fd", "sha256": "6f58ab30395585e9639217777058473e3f22d9566d0e96acaca1c70e6aa67164" }, "downloads": -1, "filename": "tcpnetlock-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dc9aa3a888be3d8a3e0e155f236bd7fd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18527, "upload_time": "2018-06-26T14:03:02", "url": "https://files.pythonhosted.org/packages/0f/86/fe6e4f1cef5d2fe2a5ca01a19b87f8723d43bfb5ac9dc59be0c696a902df/tcpnetlock-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "89803c638bcf2e70715f69cbb7bc734a", "sha256": "9f664a3ff8a1fc6a0ac8c2c0b683e32d04c2e76dfcac6254c571982842a80977" }, "downloads": -1, "filename": "tcpnetlock-0.1.4.tar.gz", "has_sig": false, "md5_digest": "89803c638bcf2e70715f69cbb7bc734a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33723, "upload_time": "2018-06-26T14:03:04", "url": "https://files.pythonhosted.org/packages/4e/f1/050a767958232769017cddd958aba416512cad4f3c5919eee5cd74779de1/tcpnetlock-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "546e8ce0ecb0321c6211371b8da7c5ad", "sha256": "d4f67ae6e29ac4fff2c63beb45133a2671a2392b0475dd1bcfd9101e775614b2" }, "downloads": -1, "filename": "tcpnetlock-0.1.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "546e8ce0ecb0321c6211371b8da7c5ad", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18585, "upload_time": "2018-06-26T15:03:26", "url": "https://files.pythonhosted.org/packages/db/30/ad722f7124c0da747fcc43c803e19ec13e883231a64c86218969eac7abae/tcpnetlock-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "62879fe2fe4a8575e8e781a70c83da96", "sha256": "c390d51f8ee1353bcb1ea594295d503d6bf2e4dd365a9be289888ab2bd3eecc2" }, "downloads": -1, "filename": "tcpnetlock-0.1.5.tar.gz", "has_sig": false, "md5_digest": "62879fe2fe4a8575e8e781a70c83da96", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33938, "upload_time": "2018-06-26T15:03:28", "url": "https://files.pythonhosted.org/packages/07/bf/679b1f8946a5eae7d2f17e5e8073896a26c4fa93cf07f040a3f64b206bfa/tcpnetlock-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "2f3084fb9e4f7de352986ddcd0d13977", "sha256": "7423a7b0b9cb8d59888992c90c356560dc5111f38f778f7416c0b1fa6f5d4c77" }, "downloads": -1, "filename": "tcpnetlock-0.1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2f3084fb9e4f7de352986ddcd0d13977", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18662, "upload_time": "2018-07-06T15:54:18", "url": "https://files.pythonhosted.org/packages/d8/ae/c2a3907261620ab299337ece1161dc01e420fa36de4424e8435a4ab79351/tcpnetlock-0.1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "be54ad8cd557359366548afb1b2fc400", "sha256": "39627e05548c85a87f571b0a9c28b12095805c924c326697a7998c0c990bbb59" }, "downloads": -1, "filename": "tcpnetlock-0.1.6.tar.gz", "has_sig": false, "md5_digest": "be54ad8cd557359366548afb1b2fc400", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34030, "upload_time": "2018-07-06T15:54:19", "url": "https://files.pythonhosted.org/packages/a0/8f/4b88bfeb5c307d723af196336b76fd3fc8e5ee1ef303ab1fe62e367bab74/tcpnetlock-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "66fb7353fd6191ec201eb966568c9205", "sha256": "2f5990ea60a81cd4ff516fa44f2df5b638b3a79321a510550ebb329ae7804602" }, "downloads": -1, "filename": "tcpnetlock-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "66fb7353fd6191ec201eb966568c9205", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21189, "upload_time": "2018-07-19T23:46:47", "url": "https://files.pythonhosted.org/packages/18/70/858d8f92d9892d67cfcf4f744d3330f07919886a0c6167198af0c25b3bdd/tcpnetlock-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ad956b1d8827e7174a014fb0a29ebe31", "sha256": "5bf31ef77cb54aeee9f290bac91618dbf2e83c38a4a05dca9397cd5053cfa277" }, "downloads": -1, "filename": "tcpnetlock-0.1.7.tar.gz", "has_sig": false, "md5_digest": "ad956b1d8827e7174a014fb0a29ebe31", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35823, "upload_time": "2018-07-19T23:46:48", "url": "https://files.pythonhosted.org/packages/63/f8/b833b9d97ddbb0ee62680970e76f2eb1d9b4ecc640ef9a0de70104ac3bdb/tcpnetlock-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "caae5f0943af1543dd1daa18f45329bc", "sha256": "7e90f73498cb180448fe9ca50dd28728b9e32bf06cbba17ccd0a52e0a507e605" }, "downloads": -1, "filename": "tcpnetlock-0.1.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "caae5f0943af1543dd1daa18f45329bc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21473, "upload_time": "2018-07-20T20:11:32", "url": "https://files.pythonhosted.org/packages/c5/ef/ba877a2445efc763ac9a9a670a0d9d5062011d9ea9b17309305f095d15de/tcpnetlock-0.1.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35a76bdbb8a850130b30a84a6274c118", "sha256": "7a7e83eba4eb43fe5ef5690e2f3251ecf4712be1d04d05df999401c2c8243d2a" }, "downloads": -1, "filename": "tcpnetlock-0.1.8.tar.gz", "has_sig": false, "md5_digest": "35a76bdbb8a850130b30a84a6274c118", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36230, "upload_time": "2018-07-20T20:11:34", "url": "https://files.pythonhosted.org/packages/a2/bb/3b33453a10179b1c48087e5a026684f4e19cfb9ae515015301b3d57d15ec/tcpnetlock-0.1.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "caae5f0943af1543dd1daa18f45329bc", "sha256": "7e90f73498cb180448fe9ca50dd28728b9e32bf06cbba17ccd0a52e0a507e605" }, "downloads": -1, "filename": "tcpnetlock-0.1.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "caae5f0943af1543dd1daa18f45329bc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21473, "upload_time": "2018-07-20T20:11:32", "url": "https://files.pythonhosted.org/packages/c5/ef/ba877a2445efc763ac9a9a670a0d9d5062011d9ea9b17309305f095d15de/tcpnetlock-0.1.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "35a76bdbb8a850130b30a84a6274c118", "sha256": "7a7e83eba4eb43fe5ef5690e2f3251ecf4712be1d04d05df999401c2c8243d2a" }, "downloads": -1, "filename": "tcpnetlock-0.1.8.tar.gz", "has_sig": false, "md5_digest": "35a76bdbb8a850130b30a84a6274c118", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36230, "upload_time": "2018-07-20T20:11:34", "url": "https://files.pythonhosted.org/packages/a2/bb/3b33453a10179b1c48087e5a026684f4e19cfb9ae515015301b3d57d15ec/tcpnetlock-0.1.8.tar.gz" } ] }