{ "info": { "author": "Cameron Simpson", "author_email": "cs@cskk.id.au", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 3", "Topic :: Utilities" ], "description": "Release 20190729:\nGet DEVNULL via cs.py3 instead of directly from subprocess.\n\nSvcD class and \"svcd\" command to run persistent service programmes.\n\nThis provides the features one wants from a daemon\nfor arbitrary commands providing a service:\n\n* process id (pid) files for both svcd and the service command\n* filesystem visible status (command running, service enabled)\n via `cs.app.flag `_\n* command restart if the command exits\n* command control (stop, restart, disable)\n via `cs.app.flag `_\n* test function to monitor for service viability;\n if the test function fails, do not run the service.\n This typically monitors something like\n network routing (suspend service while laptop offline)\n or a ping (suspend ssh tunnel while target does not answer pings).\n* signature function to monitor for service restart;\n if the signature changes, restart the service.\n This typically monitors something like\n file contents (restart service on configuration change)\n or network routing (restart ssh tunnel on network change)\n* callbacks for service command start and end,\n for example to display desktop notifications\n\nI use this to run persistent ssh port forwards\nand a small collection of other personal services.\nI have convenient shell commands to look up service status\nand to start/stop/restart services.\n\nSee `cs.app.portfwd `_\nwhich I use to manage my ssh tunnels;\nit is a single Python programme\nrunning multiple ssh commands, each via its own SvcD instance.\n\n## Function `main(argv=None)`\n\nCommand line main programme.\n\n## Class `SvcD`\n\nMRO: `cs.app.flag.FlaggedMixin` \nA process based service.\n\n### Method `SvcD.__init__(self, argv, name=None, environ=None, flags=None, group_name=None, pidfile=None, sig_func=None, test_flags=None, test_func=None, test_rate=None, restart_delay=None, once=False, quiet=False, trace=False, on_spawn=None, on_reap=None)`\n\nInitialise the SvcD.\n\nParameters:\n* `argv`: command to run as a subprocess.\n* `flags`: a cs.app.flag.Flags -like object, default None;\n if None the default flags will be used.\n* `group_name`: alert group name, default \"SVCD \" + `name`.\n* `pidfile`: path to pid file, default $VARRUN/{name}.pid.\n* `sig_func`: signature function to compute a string which\n causes a restart if it changes\n* `test_flags`: map of {flagname: truthiness} which should\n be monitored at test time; truthy flags must be true and\n untruthy flags must be false\n* `test_func`: test function with must return true if the comannd can run\n* `test_rate`: frequency of tests, default TEST_RATE\n* `restart_delay`: delay before start of an exiting command,\n default RESTART_DELAY\n* `once`: if true, run the command only once\n* `quiet`: if true, do not issue alerts\n* `trace`: trace actions, default False\n* `on_spawn`: to be called after a new subprocess is spawned\n* `on_reap`: to be called after a subprocess is reaped\n\n\n\n#Release Log#\n\nRelease 20190729:\nGet DEVNULL via cs.py3 instead of directly from subprocess.\n\nRelease 20190602.2:\nAnother doc tweak.\n\nRelease 20190602.1:\nImprove module documentation formatting.\n\nRelease 20190602:\nSupport alert groups.\nCatch and report exceptions from the monitor signature function.\nPython 2 port fix for DEVNULL.\n\nRelease 20171118:\nBugfix for su invocation in setuid mode. Improved signature command tracing with -x option.\n\nRelease 20171026:\nImproved logic around signature changes.\n\nRelease 20171025:\nNew \"-F flag,...\" option for svcd. Improve stop logic. Other small fixes.\n\nRelease 20170906:\nInitial PyPI release.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://bitbucket.org/cameron_simpson/css/commits/all", "keywords": "python2,python3", "license": "GNU General Public License v3 or later (GPLv3+)", "maintainer": "", "maintainer_email": "", "name": "cs.app.svcd", "package_url": "https://pypi.org/project/cs.app.svcd/", "platform": "", "project_url": "https://pypi.org/project/cs.app.svcd/", "project_urls": { "Homepage": "https://bitbucket.org/cameron_simpson/css/commits/all" }, "release_url": "https://pypi.org/project/cs.app.svcd/20190729/", "requires_dist": null, "requires_python": "", "summary": "SvcD class and \"svcd\" command to run persistent service programmes.", "version": "20190729" }, "last_serial": 5597677, "releases": { "20170906": [ { "comment_text": "", "digests": { "md5": "c57792a19c365cfc4720f9a20eac8ee9", "sha256": "882d4baa76c95f50b6f5110d2f0bce28877c8cc8542c29ae896b1cbdafe9481a" }, "downloads": -1, "filename": "cs.app.svcd-20170906.tar.gz", "has_sig": false, "md5_digest": "c57792a19c365cfc4720f9a20eac8ee9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6462, "upload_time": "2017-09-05T23:24:03", "url": "https://files.pythonhosted.org/packages/ba/4d/cce675e327acc573e2d58b8c5c46af18f189dd3df8a97782d2ed673197f1/cs.app.svcd-20170906.tar.gz" } ], "20171025": [ { "comment_text": "", "digests": { "md5": "73923db9da24e181e5cdc8c58493d7a0", "sha256": "1407eda291c609babf22566367c3d668236e4d7051d771e98789be959b4ae920" }, "downloads": -1, "filename": "cs.app.svcd-20171025.tar.gz", "has_sig": false, "md5_digest": "73923db9da24e181e5cdc8c58493d7a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6780, "upload_time": "2017-10-25T00:46:41", "url": "https://files.pythonhosted.org/packages/d3/e5/17b875c0287867468002fff69e2139b623b7df9d9048d1f9c290a6d6d951/cs.app.svcd-20171025.tar.gz" } ], "20171026": [ { "comment_text": "", "digests": { "md5": "f3103fe88ac84b3eb2b7fa3b97470a21", "sha256": "dcc71ad27c581ba64b79deb01938c9e9d260bad3c6e9c815ebaee76f2d0a7ade" }, "downloads": -1, "filename": "cs.app.svcd-20171026.tar.gz", "has_sig": false, "md5_digest": "f3103fe88ac84b3eb2b7fa3b97470a21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6883, "upload_time": "2017-10-25T23:38:18", "url": "https://files.pythonhosted.org/packages/42/de/f09a1fafb10d34b1c14ba27f10346d3a71ef8b71d39935be48ebbba295b7/cs.app.svcd-20171026.tar.gz" } ], "20171118": [ { "comment_text": "", "digests": { "md5": "75d42278d7c79f55286c9b6b3bde3fd4", "sha256": "db5263b8aeb7d1700e0969d10dd9a53cbe1317c5a367f72ced678e460c774793" }, "downloads": -1, "filename": "cs.app.svcd-20171118.tar.gz", "has_sig": false, "md5_digest": "75d42278d7c79f55286c9b6b3bde3fd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6928, "upload_time": "2017-11-18T08:37:54", "url": "https://files.pythonhosted.org/packages/eb/2e/4e002f4fe44e6baae606aaa0e842521462c125ae935662089e0a79c88c0d/cs.app.svcd-20171118.tar.gz" } ], "20190602": [ { "comment_text": "", "digests": { "md5": "bbd6d35429f7a426781d2249e7752ba6", "sha256": "de00eaf47e3668e7c48591aa2761c5b356c42ff20dcc6d7273e6ebdd544dfff2" }, "downloads": -1, "filename": "cs.app.svcd-20190602.tar.gz", "has_sig": false, "md5_digest": "bbd6d35429f7a426781d2249e7752ba6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7770, "upload_time": "2019-06-02T00:13:49", "url": "https://files.pythonhosted.org/packages/89/52/bf34a5e564b174a97db9281647b46de32465b9e87281c2f4342f9b1af10c/cs.app.svcd-20190602.tar.gz" } ], "20190602.1": [ { "comment_text": "", "digests": { "md5": "68b65c28a5b622fb7054de1aea306f9b", "sha256": "a3ed248c0b603f4851cfe0beed1185039050fc80e23b8022ae6b045d4ed83d28" }, "downloads": -1, "filename": "cs.app.svcd-20190602.1.tar.gz", "has_sig": false, "md5_digest": "68b65c28a5b622fb7054de1aea306f9b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7737, "upload_time": "2019-06-02T00:17:23", "url": "https://files.pythonhosted.org/packages/8d/bd/e858ea90a536e3ef25e1e35b012c6b1a71300696f9d5457a345a53c3adb3/cs.app.svcd-20190602.1.tar.gz" } ], "20190602.2": [ { "comment_text": "", "digests": { "md5": "bd6784450fdd438ea9d8da492ce51e2f", "sha256": "b03eb157fad106b44b86451f14ab5645c75691fab5ee6e35fe5a0c3fb587d2ef" }, "downloads": -1, "filename": "cs.app.svcd-20190602.2.tar.gz", "has_sig": false, "md5_digest": "bd6784450fdd438ea9d8da492ce51e2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7751, "upload_time": "2019-06-02T00:18:17", "url": "https://files.pythonhosted.org/packages/bf/7e/fe7ed180067679fca6fb772e81e89022df46f09458998285f13784c294ba/cs.app.svcd-20190602.2.tar.gz" } ], "20190729": [ { "comment_text": "", "digests": { "md5": "ab377eadadaaa3d78f97db1359c071f5", "sha256": "1a009479b04af1022eeb348469339fed5abe36ad6972e033950e9ea2d8b6a2f2" }, "downloads": -1, "filename": "cs.app.svcd-20190729.tar.gz", "has_sig": false, "md5_digest": "ab377eadadaaa3d78f97db1359c071f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8831, "upload_time": "2019-07-29T04:54:19", "url": "https://files.pythonhosted.org/packages/cb/ab/653465a0b59173cb42954474661f731f4d6d7bd0ba2b773700e08505fc15/cs.app.svcd-20190729.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ab377eadadaaa3d78f97db1359c071f5", "sha256": "1a009479b04af1022eeb348469339fed5abe36ad6972e033950e9ea2d8b6a2f2" }, "downloads": -1, "filename": "cs.app.svcd-20190729.tar.gz", "has_sig": false, "md5_digest": "ab377eadadaaa3d78f97db1359c071f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8831, "upload_time": "2019-07-29T04:54:19", "url": "https://files.pythonhosted.org/packages/cb/ab/653465a0b59173cb42954474661f731f4d6d7bd0ba2b773700e08505fc15/cs.app.svcd-20190729.tar.gz" } ] }