{
"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"
}
]
}