{ "info": { "author": "HacKan", "author_email": "hackan@rlab.be", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3 :: Only", "Topic :: System :: Monitoring", "Topic :: Utilities", "Typing :: Typed" ], "description": "# HealthChecker\n\nA very simple python script to check the *health* of a service: make a GET request to it and if it answers it on time, then it's alive. \nAdditionally, it can write the result of the operation in a git repo hosted on Github. Or notify dead services through a POST.\n\nActions are logged using Python's standard logger and displayed according to the log level set.\n\nThis app was thought mainly for our [status page](https://github.com/rlyehlab/status). It's currently being maintained in our [repository](https://git.rlab.be/sysadmins/healthchecker).\n\n## Requirements\n\n* Python 3.7+\n* PyGithub 1.43+\n* requests 2.21+\n\n## Usage\n\n```\nusage: healthchecker [-h] [--gh-repo GH_REPO] [--gh-filename GH_FILENAME]\n [--gh-branch GH_BRANCH] [--gh-token GH_TOKEN]\n [--gh-email GH_EMAIL] [--notify-url NOTIFY_URL]\n [--notify-payload NOTIFY_PAYLOAD]\n [--notify-header NOTIFY_HEADER] [--notify-json]\n [--version] [--validation VALIDATION]\n [url [url ...]]\n\nHealthChecker v1.0.1 by HacKan (https://hackan.net) FOSS under GNU GPL v3.0 or\nnewer. Checks URLs through HTTP GET requests to verify their availability.\nOptionally writes the status result to a file in Github. Using Github requires\nthe repository name, the filename and an API token. Besides the ones listed\nbelow, the following env vars exist: HEALTHCHECKER_LOG_LEVEL sets the minimal\nlogging level and defaults to info (can be: debug, info, warning, error,\ncritical); HEALTHCHECKER_REQUESTS_TIMEOUT sets the amount of time in seconds\nto wait for services to respond and defaults to 10 seconds (setting a very low\nvalue might cause several false positives). Note: command-line parameters will\nalways supersede env vars.\n\npositional arguments:\n url (HEALTHCHECKER_URLS (comma-separated)) URL to check\n\noptional arguments:\n -h, --help show this help message and exit\n --version show version and exit\n --validation VALIDATION\n (HEALTHCHECKER_URLS_VALIDATION (comma-separated))\n string to find in the body of a request to an URL as a\n validation, one per URL (or the last one is used for\n the remaining URLs) (this parameter can be repeated as\n needed)\n\ngithub options:\n --gh-repo GH_REPO (HEALTHCHECKER_GITHUB_REPO) repository in the form of\n / (case insensitive), i.e.:\n HacKanCuBa/b2rsum\n --gh-filename GH_FILENAME\n (HEALTHCHECKER_GITHUB_FILENAME) filename to modify\n (include path if it is in a subdir such as\n path/to/file.ext)\n --gh-branch GH_BRANCH\n (HEALTHCHECKER_GITHUB_BRANCH) branch where commits are\n done (defaults to master)\n --gh-token GH_TOKEN (HEALTHCHECKER_GITHUB_API_TOKEN) API token or\n client_id,client_secret (bypasses the one supplied\n through the environment)\n --gh-email GH_EMAIL (HEALTHCHECKER_GITHUB_COMMITTER_EMAIL) git committer\n email (the committer name is hardcoded to\n HealthChecker)\n\nnotify options:\n --notify-url NOTIFY_URL\n (HEALTHCHECKER_NOTIFY_URL) URL to POST the status\n notification\n --notify-payload NOTIFY_PAYLOAD\n (HEALTHCHECKER_NOTIFY_PAYLOAD) payload to send to the\n notify URL: it is prepended to the comma-separated\n list of URLs that failed validation, unless that it\n contains the string HEALTHCHECKER_FAILED_URLS (case\n sensitive), where it will replace that string by the\n comma-separated list of URLs, and send the entire\n payload\n --notify-header NOTIFY_HEADER\n (HEALTHCHECKER_NOTIFY_HEADERS (comma-separated))\n header to send to the notify URL, which must be\n specified as name and value separated by a semicolon:\n
:
(this parameter can be\n repeated as needed)\n --notify-json (HEALTHCHECKER_NOTIFY_JSON (true/false)) send the\n payload JSON encoded (it also adds the proper Content-\n Type header)\n```\n\n### Environment variables\n\n* `HEALTHCHECKER_GITHUB_REPO`: repository in the form of / (case insensitive), i.e.: HacKanCuBa/b2rsum.\n* `HEALTHCHECKER_GITHUB_FILENAME`: filename to modify (include path if it is in a subdir such as path/to/file.ext).\n* `HEALTHCHECKER_GITHUB_BRANCH`: branch where commits are done (defaults to master).\n* `HEALTHCHECKER_GITHUB_API_TOKEN`: API token or client_id,client_secret (bypasses the one supplied through the environment).\n* `HEALTHCHECKER_GITHUB_COMMITTER_EMAIL`: git committer email (the committer name is hardcoded to HealthChecker).\n* `HEALTHCHECKER_URLS`: URLs to check, comma-separated.\n* `HEALTHCHECKER_LOG_LEVEL`: minimal logging level, defaults to info (can be: debug, info, warning, error, critical).\n* `HEALTHCHECKER_REQUESTS_TIMEOUT`: amount of time in decimal seconds to wait for services to respond and defaults to 10 seconds (setting a very low value might cause several false positives).\n* `HEALTHCHECKER_NOTIFY_URL`: URL to send failed checks via POST as notification, comma-separated.\n* `HEALTHCHECKER_URLS_VALIDATION`: comma-separated list of validations to run on given URLs.\n* `HEALTHCHECKER_NOTIFY_PAYLOAD`: payload to send to the notify URL: it is prepended to the comma-separated list of URLs that failed validation, unless that it contains the string `HEALTHCHECKER_FAILED_URLS` (case sensitive), where it will replace that string by the comma-separated list of URLs, and send the entire payload.\n * Example 1: `HEALTHCHECKER_NOTIFY_PAYLOAD=here comes the failed urls...`\n * Example 2: `HEALTHCHECKER_NOTIFY_PAYLOAD={\"data\": \"HEALTHCHECKER_FAILED_URLS\"}`\n* `HEALTHCHECKER_NOTIFY_HEADERS`: headers to send to the notify URL, which must be specified as name and value separated by a semicolon: `header name`:`header value`, and successive headers separated by comma.\n * Example 1: `HEALTHCHECKER_NOTIFY_HEADERS=X-Auth:4c18a291d7d8e7946cb9db9cbb3e1f49`\n * Example 2: `HEALTHCHECKER_NOTIFY_HEADERS=Content-Type:application/json,X-MyVal:1`\n* `HEALTHCHECKER_NOTIFY_JSON`: (true/false) send the payload JSON encoded (it also adds the proper Content-Type header).\n\n### Examples\n\nSimply print checks result:\n\n```\n:~$ healthchecker https://rlab.be adm.rlab.be\nINFO 2019-04-09 01:06:37 Begin checking URL https://rlab.be...\nINFO 2019-04-09 01:06:37 Begin checking URL http://adm.rlab.be...\nINFO 2019-04-09 01:06:37 Finish checking URL https://rlab.be: alive and OK\nINFO 2019-04-09 01:06:37 Finish checking URL http://adm.rlab.be: alive and OK\n```\n\nNotify failed services to an endpoint: `healthchecker --notify-url https://eoc.rlab.be/api/v1/status/ https://rlab.be http://wiki.rlab.be`\n\nWrite to a file in Github and be very verbose:\n\n```\n:~$ HEALTHCHECKER_LOG_LEVEL=debug healthchecker --gh-repo rlyehlab/sysadmins --gh-filename data/healthcheck.json --gh-token ab410...2cc https://git.rlab.be\nINFO 2019-04-09 01:07:32 Begin checking URL https://git.rlab.be...\nERROR 2019-04-09 01:07:32 Error GETing data from/to https://git.rlab.be: ConnectionError(MaxRetryError(\"HTTPConnectionPool(host='git.rlab.be', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno -2] Name or service not known'))\"))\nDEBUG 2019-04-09 01:07:32 Request to https://git.rlab.be took 0.18 seconds\nINFO 2019-04-09 01:07:32 Finish checking URL http://git.rlab.be: dead\nINFO 2019-04-09 01:07:33 Getting repository information...\nINFO 2019-04-09 01:07:38 File data/healthcheck.json updated: 0335a8088f5aff42f078a9396916c8adbcc1a6c3\n```\n\nParameters can be passed through env vars and/or through command-line indistinctly (command-line parameters will always supersede env vars):\n\n```\n:~$ HEALTHCHECKER_URLS_VALIDATION=\"Services | Administration,Adventurous writings by R'lyeh Sysadmins\" healthchecker --notify-url 127.0.0.1:8000 https://adm.rlab.be https://blog.adm.rlab.be\nINFO 2019-04-09 00:59:44 Begin checking URL https://adm.rlab.be...\nINFO 2019-04-09 00:59:44 Begin checking URL https://blog.adm.rlab.be...\nINFO 2019-04-09 00:59:44 Finish checking URL https://blog.adm.rlab.be: alive and OK\nINFO 2019-04-09 00:59:44 Finish checking URL https://adm.rlab.be: alive and OK\n```\n\nAll checks were OK, but should one fail...:\n\n```\nHEALTHCHECKER_LOG_LEVEL=debug HEALTHCHECKER_URLS_VALIDATION=\"Services | Administration,Adventurous writings by R'lyeh Sysadmins\" python -m healthchecker --validation \"non-existent string\" --notify-url 127.0.0.1:8000 https://adm.rlab.be https://blog.adm.rlab.be\nINFO 2019-04-09 01:03:39 Begin checking URL https://adm.rlab.be...\nINFO 2019-04-09 01:03:39 Begin checking URL https://blog.adm.rlab.be...\nDEBUG 2019-04-09 01:03:40 Request to https://blog.adm.rlab.be took 0.18 seconds\nINFO 2019-04-09 01:03:40 Finish checking URL https://blog.adm.rlab.be: alive but not OK\nDEBUG 2019-04-09 01:03:40 Request to https://adm.rlab.be took 0.30 seconds\nINFO 2019-04-09 01:03:40 Finish checking URL https://adm.rlab.be: alive but not OK\nDEBUG 2019-04-09 01:03:40 Notifying http://127.0.0.1:8000 with headers: {} and payload: https://adm.rlab.be,https://blog.adm.rlab.be\nERROR 2019-04-09 01:03:40 Error POSTing data from/to http://127.0.0.1:8000: ConnectionError(MaxRetryError(\"HTTPConnectionPool(host='127.0.0.1', port=8000): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 111] Connection refused'))\"))\nDEBUG 2019-04-09 01:03:40 Request to http://127.0.0.1:8000 took 0.00 seconds\nERROR 2019-04-09 01:03:40 Could not notify http://127.0.0.1:8000\n```\n\nNote that nobody was listening at `127.0.0.1:8000` so the notification failed as well.\n\n## Run\n\nCan be run as a python module `python -m healthchecker ...` or directly as a CLI tool `healthchecker ...`. Read below on how to run the *docker* image.\n\n### PyPi\n\nHealthChecker is in PyPi and can be installed with any standard tool such as *pip* (`pip install healthchecker`) or *pipenv* (`pipenv install healthchecker`). To add it as a dependency in your project it's recommended to use the [hash parameter for pip](https://pip.pypa.io/en/stable/reference/pip_install/#hash-checking-mode). Hashes (and more) are listed in every [release](https://git.rlab.be/sysadmins/healthchecker/releases).\n\n### Repo\n\nClone [the repo](https://git.rlab.be/sysadmins/healthchecker) and install requirements:\n\n* installing requirements with *pip*: `pip install -r requirements`.\n* installing requirements with *pipenv* (recommended): `pipenv install`. Then start virtualenv with `pipenv shell`.\n\n### Docker\n\n#### Build\n\nBuild locally with `docker build --compress --pull --rm --tag registry.rlab.be/sysadmins/healthchecker:latest .`\n\n#### Pull\n\nYou can pull from our registry with `docker pull registry.rlab.be/sysadmins/healthchecker:latest`\n\n#### Run\n\nRun with `docker run --rm registry.rlab.be/sysadmins/healthchecker:latest ...`\n\nAlternatively, use env vars by creating an env file and passing it to docker:\n\n```\ncp env .env\nvim .env # edit and populate vars\ndocker run --rm --env-file .env registry.rlab.be/sysadmins/healthchecker:latest\n```\n\n## Deploy\n\nThis can be deployed in a server creating a SystemD service and timer (the image will be pulled by Docker on first run):\n\n1. Service\n\nCreate an env file where ever you want, as in `/srv/healthchecker/.env` (protect access to it with linux permissions). It can be anywhere with any name, just point it in the parameter `--env-file` in the service file. Then create the service file `/etc/systemd/system/healthchecker.service`:\n\n```\n[Unit]\nDescription=HealthChecker Service\nRequires=docker.service\nAfter=network.target docker.service\n\n[Service]\nType=simple\nExecStart=/usr/bin/docker run --rm --env-file /srv/healthchecker/.env registry.rlab.be/sysadmins/healthchecker:latest\nUser=root\nGroup=docker\n```\n\nAlternatively, you can skip env file usage and write every parameter in the `ExecStart` line, but writing the API token there means it will be visible in the process list which is usually not a good idea.\n\n2. Timer:\n\nCreate the timer file `/etc/systemd/system/healthchecker.timer` (use the same name as the service but with the `.timer` extension):\n\n```\n[Unit]\nDescription=HealthChecker Service Timer\n\n[Timer]\nOnBootSec=600\nOnUnitActiveSec=5m\n\n[Install]\nWantedBy=multi-user.target\n```\n\nThis sample is set to run the service 5 minutes after boot and then every 5 minutes. Read the [documentation](https://wiki.archlinux.org/index.php/Systemd/Timers) if you need to set different parameters.\n\n3. Reload SystemD services: `systemctl daemon-reload`\n4. Enable the timer: `systemctl enable healthchecker.timer`\n5. Start it: `systemctl start healthchecker.timer`\n\nTip: you can see the execution log with `journalctl -u healthchecker` (or the service name used). Check journalctl help for additional filtering options.\n\n*Thanks @snkisuke for your help with this section*.\n\n## Developing and PRing\n\nFor more information and use cases, refer to [DEVELOPERS.md](DEVELOPERS.md).\n\n## Collaborators\n\nMany thanks to those that collaborate with this project (in alphabetical order): @erus, @seykron, @snkisuke.\n\n## License\n\n**HealthChecker** is made by [HacKan](https://hackan.net) under GNU GPL v3.0+. You are free to use, share, modify and share modifications under the terms of that [license](LICENSE).\n\n Copyright (C) 2019 HacKan (https://hackan.net)\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNU General Public License for more details.\n\n You should have received a copy of the GNU General Public License\n along with this program. If not, see .\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "https://git.rlab.be/sysadmins/healthchecker/releases", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://git.rlab.be/sysadmins/healthchecker", "keywords": "check ping response monitoring", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "healthchecker", "package_url": "https://pypi.org/project/healthchecker/", "platform": "POSIX :: Linux", "project_url": "https://pypi.org/project/healthchecker/", "project_urls": { "Download": "https://git.rlab.be/sysadmins/healthchecker/releases", "Homepage": "https://git.rlab.be/sysadmins/healthchecker" }, "release_url": "https://pypi.org/project/healthchecker/1.0.1/", "requires_dist": [ "PyGithub (~=1.43)", "requests (~=2.21)" ], "requires_python": ">=3.7", "summary": "Check sites health and publish results in a file in Github", "version": "1.0.1" }, "last_serial": 5435782, "releases": { "0.6.1": [ { "comment_text": "", "digests": { "md5": "98567a5da4c94e6afdd579bde085acee", "sha256": "b08b3fc3a424b426ab7356d19780c061652f2376906f539fe344d7b20a9e2dea" }, "downloads": -1, "filename": "healthchecker-0.6.1-py3.7.egg", "has_sig": false, "md5_digest": "98567a5da4c94e6afdd579bde085acee", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.7", "size": 16119, "upload_time": "2019-04-09T04:25:01", "url": "https://files.pythonhosted.org/packages/c4/eb/9730ab15788f57217b3746194106056840210c7597df36d8edcd853a30f5/healthchecker-0.6.1-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "0ebd0c187e7abbc38e0bb08a67d516b4", "sha256": "66d07fdeb221cf0ce44a0f6f2135dfa9c2a860ab70ea015a03ad40e1bc6e1695" }, "downloads": -1, "filename": "healthchecker-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0ebd0c187e7abbc38e0bb08a67d516b4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28936, "upload_time": "2019-04-09T04:24:59", "url": "https://files.pythonhosted.org/packages/a3/21/7167bf1d24128662daa44475c6b969802010b88a5b5a52e9b5cdf18f08e2/healthchecker-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90f52217dcdc4fbf9f5455ab6b653029", "sha256": "b75318c6fda5a9f45596f479bd9420a5f85ea2b1640f81d692b47b9df56ac90f" }, "downloads": -1, "filename": "healthchecker-0.6.1.tar.gz", "has_sig": false, "md5_digest": "90f52217dcdc4fbf9f5455ab6b653029", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 16398, "upload_time": "2019-04-09T04:25:03", "url": "https://files.pythonhosted.org/packages/06/6a/4898225f5dac24d9c88720e8ec2e691fade3822a256cbfb96238d3e4abc3/healthchecker-0.6.1.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "84f8067c7cec87eed0bcd253f9da7fc6", "sha256": "3c3ab5dc313eac0d91656c9f089ac5650994b41537c8fa975fa59aede8aaf30b" }, "downloads": -1, "filename": "healthchecker-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "84f8067c7cec87eed0bcd253f9da7fc6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 28952, "upload_time": "2019-04-10T01:34:13", "url": "https://files.pythonhosted.org/packages/3f/6a/adc5ffd635e35243a3480064449649c4f5c6c33fbb2db8ed1dce6d9a66e3/healthchecker-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b5616ad481aa611315b0a61fe7119ddd", "sha256": "e716b28d492770badf4da9cc57de2b1480c40c5dfc00ed27646b1631b92b205d" }, "downloads": -1, "filename": "healthchecker-0.7.0.tar.gz", "has_sig": false, "md5_digest": "b5616ad481aa611315b0a61fe7119ddd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 16413, "upload_time": "2019-04-10T01:34:14", "url": "https://files.pythonhosted.org/packages/e6/96/ea3da76290c626330edcbdf326df64beb1a1b5c21df8e3e07b52ad399d7f/healthchecker-0.7.0.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "a5b9f025c80e6ee342153afea66e7537", "sha256": "d72898b3006a7447541701726c0eb3fe2bee7f3f1af56a42420f2259b71e7013" }, "downloads": -1, "filename": "healthchecker-0.8.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a5b9f025c80e6ee342153afea66e7537", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 30698, "upload_time": "2019-04-18T03:00:22", "url": "https://files.pythonhosted.org/packages/94/15/94f409cb9f29f1ff6a6ba54cda80a1b9c65ab14e39a27d392252b2eab479/healthchecker-0.8.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0b83e0d19bcd2e8807b42fb0c75a9888", "sha256": "1a5e3e2cbcf79679eaabdf0099101cf3e2a9af5b05c7970e527d834660bb38fe" }, "downloads": -1, "filename": "healthchecker-0.8.2.tar.gz", "has_sig": false, "md5_digest": "0b83e0d19bcd2e8807b42fb0c75a9888", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 17591, "upload_time": "2019-04-18T03:00:24", "url": "https://files.pythonhosted.org/packages/6f/78/5d8a8a77106d499ccbc7a88581c85a1d783438dda3aed2becce602a2538a/healthchecker-0.8.2.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "e1861341922f35b94d2c0471cf4b2cc1", "sha256": "858b47b014ca2efebf31668551202bbf35e73c303c36c42d646b5b415fff9c78" }, "downloads": -1, "filename": "healthchecker-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e1861341922f35b94d2c0471cf4b2cc1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 31234, "upload_time": "2019-06-22T01:25:57", "url": "https://files.pythonhosted.org/packages/5f/98/20a1f485a27bf82781a51ee5d5a71f8e0c02329b0f608a09f6762a255559/healthchecker-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e31a0e3327b85c903fb5c3f757d4c1a8", "sha256": "e4a3b102de2f805e5a89bd7f881d0d9c6e53582b7e5b1d0ac098afbc69511503" }, "downloads": -1, "filename": "healthchecker-1.0.0.tar.gz", "has_sig": false, "md5_digest": "e31a0e3327b85c903fb5c3f757d4c1a8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 17722, "upload_time": "2019-06-22T01:25:59", "url": "https://files.pythonhosted.org/packages/5c/3b/ea058816b9b98dfba4ecdee9f0ae4b890dda48598b2de66d00ec899b7b13/healthchecker-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "7942bb9e2cf910732166dda1b25bf6b1", "sha256": "245f0e1c300250f2f340c6cb1cee3239eef9d48462d1d681cf71507ff6f77b4f" }, "downloads": -1, "filename": "healthchecker-1.0.1-py3-none-any.whl", "has_sig": true, "md5_digest": "7942bb9e2cf910732166dda1b25bf6b1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 31507, "upload_time": "2019-06-22T22:33:13", "url": "https://files.pythonhosted.org/packages/15/04/f78855c63b845bfc8c622c462aee5359f93d3595996dbe1090aff862e2b9/healthchecker-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7ea6d9254cfac36c30cd7e19294c29b4", "sha256": "d56fec1a26957350103a55288d585e0eca1bfc70357ed02622daf059dad33684" }, "downloads": -1, "filename": "healthchecker-1.0.1.tar.gz", "has_sig": false, "md5_digest": "7ea6d9254cfac36c30cd7e19294c29b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 18388, "upload_time": "2019-06-22T22:33:15", "url": "https://files.pythonhosted.org/packages/8a/71/8542c69ceb60cc7f5451760567ca6144a176735d2c10c1145e610e78d8b0/healthchecker-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "7942bb9e2cf910732166dda1b25bf6b1", "sha256": "245f0e1c300250f2f340c6cb1cee3239eef9d48462d1d681cf71507ff6f77b4f" }, "downloads": -1, "filename": "healthchecker-1.0.1-py3-none-any.whl", "has_sig": true, "md5_digest": "7942bb9e2cf910732166dda1b25bf6b1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 31507, "upload_time": "2019-06-22T22:33:13", "url": "https://files.pythonhosted.org/packages/15/04/f78855c63b845bfc8c622c462aee5359f93d3595996dbe1090aff862e2b9/healthchecker-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7ea6d9254cfac36c30cd7e19294c29b4", "sha256": "d56fec1a26957350103a55288d585e0eca1bfc70357ed02622daf059dad33684" }, "downloads": -1, "filename": "healthchecker-1.0.1.tar.gz", "has_sig": false, "md5_digest": "7ea6d9254cfac36c30cd7e19294c29b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 18388, "upload_time": "2019-06-22T22:33:15", "url": "https://files.pythonhosted.org/packages/8a/71/8542c69ceb60cc7f5451760567ca6144a176735d2c10c1145e610e78d8b0/healthchecker-1.0.1.tar.gz" } ] }