{ "info": { "author": "Stavros Korokithakis", "author_email": "hi@stavros.io", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8" ], "description": "Caduceus\n========\n\n[![pipeline status](https://gitlab.com/stavros/caduceus/badges/master/pipeline.svg)](https://gitlab.com/stavros/caduceus/commits/master)\n\nWhat is Caduceus?\n-----------------\n\nCaduceus is [that long stick with the intertwined snakes](https://en.wikipedia.org/wiki/Caduceus) that Hermes used to carry around.\nIt is also a service that will notify you if your scheduled tasks/cronjobs fail to run.\n\n\nMotivation\n----------\n\nYou know how you set all these cronjobs to run, and added fancy error reporting and things, only to realize too late that this doesn't help you at all when the server has been down for a month and nobody noticed?\nCaduceus won't let this happen again.\n\nRather than trigger on failure, Caduceus triggers on absence of success.\nServices have to actively check in (by visiting a URL), and, if they don't, Caduceus notifies you by email that the task has failed.\nIf the service starts working again, Caduceus will notify you of that as well.\n\n\nInstallation\n------------\n\nTo install Caduceus, you can just get it from PyPI:\n\n```bash\npip install caduceus\n```\n\nAlternatively, you can pull the Docker image:\n\n```bash\ndocker pull registry.gitlab.com/stavros/caduceus:latest\n```\n\n\nUsage\n-----\n\nTo run Caduceus, you need to configure it.\nThis is done by placing a file called `caduceus.toml` in the directory you want to run Caduceus in.\nThat directory is where the Caduceus SQLite database will be created.\n\nIf you installed Caduceus from the repo or with `pip`, just run it:\n\n```bash\ncaduceus\n```\n\nIt will load the configuration from the file, create its database and start running on `http://localhost:5000/`.\n\nTo run it via Docker:\n\n```bash\ndocker run -v (pwd):/caduceus registry.gitlab.com/stavros/caduceus:latest\n```\n\nConfiguration\n-------------\n\nHere's a sample configuration file (which is also available as `caduceus.toml.example` in the repository):\n\n```toml\n[config]\n# An optional secret key to use for checking in.\nsecret_key = \"somelongkey\"\n\n[alerting.email]\n# Where you want the notification emails sent if services don't check in.\nrecipient_emails = [ \"notifyme@example.com\", \"otherdev@example.com\" ]\n\n# SMTP server configuration, for sending email.\nfrom_addr = \"caduceus@example.com\"\nhostname = \"example.com\"\nport = 25\nusername = \"myuser\"\npassword = \"mypassword\"\nencryption = \"none\" # Can also be \"ssl\" or \"starttls\".\n\n[alerting.telegram]\napikey = \"#############:####################\"\nchat_id = \"99999999\"\n\n[alerts]\n# How alerts will be sent by default.\ndefault_channels = [ \"telegram\" ]\n\n# Your alerts go here.\n# An alert needs a short name (here, `cron`), and an interval it needs to check in by.\n[alerts.cron]\nevery = \"1h\"\n# You can override the alerting channels per-alert.\nchannels = [ \"email\" ]\n\n[alerts.backups]\nevery = \"1d\"\nchannels = [ \"email\", \"telegram\" ]\n\n# For alerts that use email, you can also override the recipient emails.\nrecipient_emails = [ \"thirdemail@example.com\" ]\n\n[alerts.alwaysfail]\nevery = \"1s\"\n# You can tell Caduceus to only notify every minute, instead of every second,\n# to prevent spam.\nnotify_every = \"1m\"\n```\n\nThe above config defines three services, `raidscrub`, `backups` and `alwaysfail`.\n`raidscrub` needs to check in every hour, `backups` needs to check in every day, and `alwaysfail` needs to check in every second.\nThat's why it was called that.\n\nHowever, as emailing you every second would get spammy, `notify_every` is set to one minute, so Caduceus will only email you once a minute, even though the alert will be considered failed if it doesn't check in once per second.\nYou will get an initial email right when the failure is detected (there is a 10 second notification resolution) and then emails every minute after that.\n\nAlways leave a bit of leeway in your tasks, to account for running time.\nIf a task starts at midnight one day and runs for an hour, it'll check in at 1am.\nIf the next day it runs for 61 minutes, it will check in more than a day later, so you'll get a \"failed\" email.\nTo avoid that, add an buffer of 10% or so to your alerts.\n\n\nChecking in\n-----------\n\nChecking in is done by retrieving a URL on the server.\nThe URL for checking in and resetting the alert timer is `/reset//`.\nFor example, to check in to `backups` if you haven't specified a `secret_key` (and if Caduceus is running on example.com), you'd simply do:\n\n```bash\ncurl http://example.com/reset/backups/\n```\n\nIf you *did* specify a secret key, just include it:\n\n```bash\ncurl http://example.com/reset/backups/?key=\n```\n\nIf your alert is set up for, say, one hour, and your task does not check in, you will get an email one hour after its last checkin, saying \"your task has not checked in\".\nIf it still doesn't check in, you'll get another email an hour after that, then an hour after that, etc, until it does, at which point you'll get an email saying that the job is now fine.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://gitlab.com/stavros/caduceus", "keywords": "caduceus tasks dead man switch notify", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "caduceus", "package_url": "https://pypi.org/project/caduceus/", "platform": "", "project_url": "https://pypi.org/project/caduceus/", "project_urls": { "Homepage": "https://gitlab.com/stavros/caduceus" }, "release_url": "https://pypi.org/project/caduceus/0.0.11/", "requires_dist": [ "apscheduler", "flask", "peewee", "requests", "toml", "schema", "pytimeparse" ], "requires_python": ">3.4.0", "summary": "Caduceus notifies you if your scheduled tasks/cron jobs did not run.", "version": "0.0.11" }, "last_serial": 5269988, "releases": { "0.0.11": [ { "comment_text": "", "digests": { "md5": "52e14e6f74ef53a9bc9efd913f51c70b", "sha256": "e831cb65b31ad26bc9628b0a5934b55128ca4002f6ca48cc4a68f402e724d79c" }, "downloads": -1, "filename": "caduceus-0.0.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "52e14e6f74ef53a9bc9efd913f51c70b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">3.4.0", "size": 13871, "upload_time": "2019-05-15T00:57:42", "url": "https://files.pythonhosted.org/packages/c6/a4/bbc0c2e5c0cc6811b4306052c0fa3383a1b396b14a35e142c4ae44f0fe81/caduceus-0.0.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6fa68814743c111d311c83cffcb3a13", "sha256": "daf2736b177fbf1ab12f92f568bc987b6f50a2370d48da08583f9696c77dd344" }, "downloads": -1, "filename": "caduceus-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "c6fa68814743c111d311c83cffcb3a13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.0", "size": 7440, "upload_time": "2019-05-15T00:53:19", "url": "https://files.pythonhosted.org/packages/22/3a/42a9178af742bd0752a5c842f22218f2799b63ae886205401e3f65f6ddf1/caduceus-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "422aa4492c5d93e3b3d594eca5c77306", "sha256": "435ba225b99b9c82db7ce8250d5a17143eddc06eccd281db1d45f062cd9945c3" }, "downloads": -1, "filename": "caduceus-0.0.11.tar.gz", "has_sig": false, "md5_digest": "422aa4492c5d93e3b3d594eca5c77306", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.4.0", "size": 7626, "upload_time": "2019-05-15T00:53:20", "url": "https://files.pythonhosted.org/packages/c8/d1/4c151ab230d989704b38efb9c18b44d91c2d31aa5b3d2a65343feb99062c/caduceus-0.0.11.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "a6428b6db8d399a01c0932469aaa4673", "sha256": "8dcf82a24eced821fbcf8c5cb8a1e77079cc549f74535673778046d82ea057eb" }, "downloads": -1, "filename": "caduceus-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a6428b6db8d399a01c0932469aaa4673", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 5851, "upload_time": "2018-07-14T01:41:31", "url": "https://files.pythonhosted.org/packages/db/b1/b277cdd7c2054951c2abf392ff6b0fd5e2184747f772278721b45bf1016f/caduceus-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "92aba3a1167fe893a165f60a764c7339", "sha256": "fb942308df9c9205e6d07660566a8925eeb798a057b2a25a80f97c434c9307fc" }, "downloads": -1, "filename": "caduceus-0.0.2.tar.gz", "has_sig": false, "md5_digest": "92aba3a1167fe893a165f60a764c7339", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5780, "upload_time": "2018-07-14T01:41:33", "url": "https://files.pythonhosted.org/packages/c1/1c/218f1f38d09b0f5b37b456f97a7ecb6a0fcfa2a69558efb71eb34c7fe45b/caduceus-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "939027340b89615a3e926c7b455e6e88", "sha256": "e96be1a7e686d6f789bd5e856e910117bf5adf6ba807e71dcff29c510e600aec" }, "downloads": -1, "filename": "caduceus-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "939027340b89615a3e926c7b455e6e88", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 5842, "upload_time": "2018-07-14T02:03:10", "url": "https://files.pythonhosted.org/packages/4f/e5/bfe28a4cc4533fc2a7e38dbec342ebde3c9bbbdcd67e876754a5bfa8a489/caduceus-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7b48275aa586cbead0798849c495e5fe", "sha256": "86ea5603e18b23084d5afb98f49f3fa5ddf381254861e377253a0b8e08fba32e" }, "downloads": -1, "filename": "caduceus-0.0.3.tar.gz", "has_sig": false, "md5_digest": "7b48275aa586cbead0798849c495e5fe", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5770, "upload_time": "2018-07-14T02:04:13", "url": "https://files.pythonhosted.org/packages/1a/6a/51aa5d2fdf29386f06084fecfe0235ecc512b0f0c3b72465a4fdbb418533/caduceus-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "1075458ae789b50105998b1d5feaafcd", "sha256": "c856abf92ce7cfef1b65ce24ecb950434e190d78b7397b1baaaa13f34d672e4a" }, "downloads": -1, "filename": "caduceus-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "1075458ae789b50105998b1d5feaafcd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 5858, "upload_time": "2018-07-15T11:31:51", "url": "https://files.pythonhosted.org/packages/e2/44/6f369970b8852a3d1274a10b331c0db4471c979a322d885a754f2dc1a575/caduceus-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f44bfac559f3a1f91786fdfa45c4c44", "sha256": "b6c78acf9edbbb70871bfaabfdf23437621369cb4c4b244cbf2ad06cbffef1f0" }, "downloads": -1, "filename": "caduceus-0.0.4.tar.gz", "has_sig": false, "md5_digest": "7f44bfac559f3a1f91786fdfa45c4c44", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5789, "upload_time": "2018-07-15T11:31:52", "url": "https://files.pythonhosted.org/packages/37/fa/1959afb531b664398be1c5dd8e59cc42e6ab412bb067b9afc5ddee32167d/caduceus-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "15f8d50279bea064c11f82321699f4cc", "sha256": "3b7d662bbfe2ece31c7812dd48d9d6548dbf830b8f893c9d059aa2cdbb3788a9" }, "downloads": -1, "filename": "caduceus-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "15f8d50279bea064c11f82321699f4cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 5932, "upload_time": "2018-07-15T12:27:16", "url": "https://files.pythonhosted.org/packages/3c/71/36a13971af44f510073e618b0ae3203f89b5cecd56662cd06298e0c898cb/caduceus-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd0aa94f8aa708353cbdef54f2fa12b4", "sha256": "fbac0c121247f41638b80f1523212662671537298dd46e36f656f4414a7f4d92" }, "downloads": -1, "filename": "caduceus-0.0.5.tar.gz", "has_sig": false, "md5_digest": "cd0aa94f8aa708353cbdef54f2fa12b4", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5858, "upload_time": "2018-07-15T12:27:17", "url": "https://files.pythonhosted.org/packages/32/7e/fadf3ff6937285a5eba905c93206ea3e3b3a3129191ba2603ed2c740f17b/caduceus-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "5266f7baa4ea23d641362ed285ac3cec", "sha256": "50600c737b012893d6478b60dce1f5f6213625aef09e26d44b8f58bc83f092b3" }, "downloads": -1, "filename": "caduceus-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "5266f7baa4ea23d641362ed285ac3cec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 6016, "upload_time": "2018-07-15T13:40:19", "url": "https://files.pythonhosted.org/packages/40/d9/087fdf98fc7d705dbe3efc9a831d4603be188740b1f0d1df0121d699e51c/caduceus-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e94d0bc212d1a1111f1d23a0bbd9300", "sha256": "cba31565063da1ef4ec648760c2e35bbd7e61627df34b2e6d5175935ccef1618" }, "downloads": -1, "filename": "caduceus-0.0.6.tar.gz", "has_sig": false, "md5_digest": "1e94d0bc212d1a1111f1d23a0bbd9300", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5960, "upload_time": "2018-07-15T13:40:20", "url": "https://files.pythonhosted.org/packages/ef/40/6104c6f4ce11f3f003a1dbf98bdbed2c7248d793bad71813f578e1c9bd63/caduceus-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "f0bae76f7a7668a28f78ff013c8b1324", "sha256": "6d0da40f9672595325562ccf6049ecb4ce9d182b7688d14385795eb9763a88ba" }, "downloads": -1, "filename": "caduceus-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "f0bae76f7a7668a28f78ff013c8b1324", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 6019, "upload_time": "2018-07-15T14:11:29", "url": "https://files.pythonhosted.org/packages/a9/03/bcfaf8b2cbaa6a6a1b66c7cf13720715d0e62a53c36140c3d6fa4435f195/caduceus-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9e122d2d9eb7008cf06402e0934450eb", "sha256": "5b040bf36194c01ca062d31f339eb0fef75831ff2fcb9fe3dcc3a8dbf51e3ca6" }, "downloads": -1, "filename": "caduceus-0.0.7.tar.gz", "has_sig": false, "md5_digest": "9e122d2d9eb7008cf06402e0934450eb", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 5961, "upload_time": "2018-07-15T14:11:30", "url": "https://files.pythonhosted.org/packages/34/0b/76d519f040b1b9a182cf8458fdc12d888406e954f6c796e124163309bc0e/caduceus-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "8cfbed4149203ab76136b1daf6b5ded3", "sha256": "674090b344a54def95839e61a3043f6807cf6a782e1c37317a102bb99cdfca06" }, "downloads": -1, "filename": "caduceus-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "8cfbed4149203ab76136b1daf6b5ded3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 6331, "upload_time": "2018-08-12T20:10:17", "url": "https://files.pythonhosted.org/packages/97/04/83f7b1e3ab19000e2036fe10be2b2e71b02d8ce38e6f51b89a489d095eda/caduceus-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "55d21379a88cf3be0d18c31f06fce928", "sha256": "0e9971c51fb6f37ea7465d6d6fc234957b575ce8d7a965adae101af8a2c7add6" }, "downloads": -1, "filename": "caduceus-0.0.8.tar.gz", "has_sig": false, "md5_digest": "55d21379a88cf3be0d18c31f06fce928", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 6294, "upload_time": "2018-08-12T20:10:19", "url": "https://files.pythonhosted.org/packages/3c/a0/919dff2719e2df8ded3fc468246a420bf659e0a75a545461161bb212dec0/caduceus-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "80efe9d4aa63c21a2ed68450b7c0f499", "sha256": "214c8d46541d0f9828f18ad922c6f37dfb0c281690b71b6dc5037d7ccf1a02ff" }, "downloads": -1, "filename": "caduceus-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "80efe9d4aa63c21a2ed68450b7c0f499", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.0.0", "size": 6949, "upload_time": "2018-09-08T00:29:19", "url": "https://files.pythonhosted.org/packages/56/12/54647a6a0ab279ec6f58b6ff41fceb4f44a6036500aee65ee8611bcf9219/caduceus-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a51c403d05a21c35848a953d6e7b477a", "sha256": "7461e6ab575765f95c509b2121db487c0e07b4309026f3436e59ca102e52b77b" }, "downloads": -1, "filename": "caduceus-0.0.9.tar.gz", "has_sig": false, "md5_digest": "a51c403d05a21c35848a953d6e7b477a", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.0.0", "size": 7150, "upload_time": "2018-09-08T00:29:21", "url": "https://files.pythonhosted.org/packages/19/de/bde28095f247a519382a0ce9888825940f7aa633fc48df58439a22c839b8/caduceus-0.0.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "52e14e6f74ef53a9bc9efd913f51c70b", "sha256": "e831cb65b31ad26bc9628b0a5934b55128ca4002f6ca48cc4a68f402e724d79c" }, "downloads": -1, "filename": "caduceus-0.0.11-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "52e14e6f74ef53a9bc9efd913f51c70b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">3.4.0", "size": 13871, "upload_time": "2019-05-15T00:57:42", "url": "https://files.pythonhosted.org/packages/c6/a4/bbc0c2e5c0cc6811b4306052c0fa3383a1b396b14a35e142c4ae44f0fe81/caduceus-0.0.11-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6fa68814743c111d311c83cffcb3a13", "sha256": "daf2736b177fbf1ab12f92f568bc987b6f50a2370d48da08583f9696c77dd344" }, "downloads": -1, "filename": "caduceus-0.0.11-py3-none-any.whl", "has_sig": false, "md5_digest": "c6fa68814743c111d311c83cffcb3a13", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">3.4.0", "size": 7440, "upload_time": "2019-05-15T00:53:19", "url": "https://files.pythonhosted.org/packages/22/3a/42a9178af742bd0752a5c842f22218f2799b63ae886205401e3f65f6ddf1/caduceus-0.0.11-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "422aa4492c5d93e3b3d594eca5c77306", "sha256": "435ba225b99b9c82db7ce8250d5a17143eddc06eccd281db1d45f062cd9945c3" }, "downloads": -1, "filename": "caduceus-0.0.11.tar.gz", "has_sig": false, "md5_digest": "422aa4492c5d93e3b3d594eca5c77306", "packagetype": "sdist", "python_version": "source", "requires_python": ">3.4.0", "size": 7626, "upload_time": "2019-05-15T00:53:20", "url": "https://files.pythonhosted.org/packages/c8/d1/4c151ab230d989704b38efb9c18b44d91c2d31aa5b3d2a65343feb99062c/caduceus-0.0.11.tar.gz" } ] }