{ "info": { "author": "Tim Savannah", "author_email": "kata198@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: System :: Boot :: Init" ], "description": "usrsvc\n======\n\nA service manager for running/managing/monitoring/auto-restarting daemons and services at the user (non-root) level\n\nIntended for managing services/daemons running as service account users.\n\n\nDesign\n------\n\nusrsvc comes in two parts, *usrsvc* (tool to start/stop/restart/get status of services) and *usrsvcd* (daemon which keeps services running, monitors running services, etc). \n\nYou may use *usrsvc* standalone, or in conjunction with *usrsvcd*.\n\n\n**No Parent/Child**\n\nContrary to other service managers, such as supervisord, usrsvcd does NOT require itself be the parent of the processes it manages. This allows usrsvcd to be restarted, updated, or not run at all, without affecting the services it manages.\n\nIn the supervisord world, if you need to update the running supervisord, you must also restart all processes that it is managing which causes an unnecessary outage.\n\nAll services started by *usrsvc* or *usrsvcd* have \"init\" as the parent (or systemd under some system configurations).\n\n\n\n**Capturing/Managing existing processes**\n\nBecause no parent-child relationship is required or even used, usrsvc is able to manage already-running processes. There are several configurable means for usrsvc to identify and match the services you define to running processes.\n\n\n\n**Modular / Resilient**\n\n\nInstead of one monolithic daemon, usrsvc is broken into *usrsvc* (tool to start/stop/restart/status), daemon *usrsvcd* (tool to manage autostart, autorestart, monitoring), and in the future an XLMRPC daemon for a web interface.\n\nEach tool does exactly just what it needs to do, and is designed to recover from any failure scenario and keep going. \n\nYou can, for example, run \"usrsvcd reread\" (or send USR1 signal to usrsvcd process) to have it attempt to reread the configuration. If there is an error with the new configuration, it will be logged, and the old configuration retained. \nIf the new configuration passes validation, the changes will be applied to the next set of operations performed by usrsvcd. Unlike other service managers, *usrsvcd* will not crash with a configuration error.\n\n\nSeveral commands / log entries give a JSON output so they can be parsed and used by an external application.\n\n\n\n**Process Monitoring**\n\n\n*usrsvcd* provides the ability to monitor the processes it manages beyond just whether it is stopped/started. These are configurable, optional, and defined per-service (see \"Monitoring\" section below.)\n\n\n\n**No root / Isolation**\n\nusrsvc is designed to run at the service account level, per best-practices of security isolation. It requires no root configuration or service to be running; everything is isolated to the user account running the service (like \"web\" or \"django\")\n\nEach account has its own independent configurations, and runs its own instance of *usrsvcd*, providing further isolation between application groups.\n\n\n\n**Simple Configuration**\n\nAll of the configuration is through simple ini-style config files, and supports defining and inheriting default settings to prevent duplication across programs.\n\n\n\n**Verbose**\n\nUsrsvc and usrsvcd are very verbose with logging, and try to be as specific as possible. All logs contain timestamps and meaningful error codes/descriptions, to simplify and even make possible evaluation of issues with your services.\n\n\n\n**Email Alerts**\n\nWhen the \"email_alerts\" property is set on a Program or a Program Group, an email will be sent when Monitoring triggers a restart, or the program is found to not be running and is started by usrsvcd.\n\n\n\nProcess Identification\n----------------------\n\nThe primary method for managing processes are through pidfiles. Every program is required to have a pidfile defined in its configuration.\n\n\nWhen autopid = True (default), usrsvc will manage the pidfile. If you set autopid = False, your application will need to generate its own pidfile (not recommended).\n\nThe process identified by the pid file will be checked against *proctitle_re*, and if they don't match, the pid file will be considered stale and removed.\n\n\n**Starting Processes**\n\nWhen usrsvc starts a process, it will run for *success_seconds*, in which time it will try to match a process (based on *proctitle_re*), and ensure that process is still running at the end of that period.\n\n\nWhen useshell = True, usrsvc will fork and exec a bash process (provided as *command*) which should launch your process, or when useshell = False, it will launch the given *command* directly.\n\nThat process, and its children, and all of their children, etc, will be checked against *proctitle_re* for a match.\n\nIf your process takes a long time to start, you will likely need to increase *success_seconds* from its default value.\n\nWhen the process is matched, and the period ends, usrsvc will write the pidfile (autopid = True) and return success, otherwise it will return failure.\n\n\n**Scanning for Processes**\n\nWhen *scan_for_process* is True (default), in the absense of a pid file, or when a pid file is declared stale (does not match *proctitle_re*),\n usrsvc will scan all processes running as the current user for one that matches *proctitle_re*.\n\n\nIf a match is found, it will update the pidfile with the matched program.\n\nIf at all possible, you should ensure that you have unique proctitles for your applications, such that you can safely have *scan_for_process* = True. \n\nThis provides a fallback in the case that a service is started via some other means, or the pid file is removed or otherwise corrupted.\n\nIn addition to working as a fallback, this allows you to attach usrsvc to any existing running service, *without the need to restart that service*.\nYou can attach and detach usrsvc to any process at-will.\n\nAfter a process is found via scan, its pid will be written to the pidfile, which is the primary (and most efficient) means of associating a process to a name.\n\n\nMany services have the means to set the proctitle to something unique, via setproctitle system call, python library \"setproctitle\", etc.\n\nIt is recommended whenever possible to have *scan_for_process* be True, to add the extra resiliency and managibility.\n\n\n\nusrsvc (tool)\n-------------\n\n\nThe \"usrsvc\" tool handles the basic operations of starting/stopping/restarting/status of a service. You can use this with or without *usrsvcd* running to manage services.\n\n\n\tUsage: usrsvc (Options) [start/stop/restart/status] [program name]\n\n\t\tPerforms the requested action on the given program name.\n\n\t\t\"all\" can be used in place of \"program name\" to perform the given task on all configured programs. (see Parallel below)\n\n\t \n\tusrsvc is the tool for performing specific actions on services, usrsvcd is the related daemon for autorestart/monitoring, etc.\n\n\n\tOptions:\n\n\t\\-\\-\\-\\-\\-\\-\\-\\-\n\n\n\t\tParallel:\n\n\t\t\tWhen doing start/stop/restart all, you may add \"\\-\\-parallel\" or \"\\-P\" to perform \n\n\t\t\tthe action on all items in parallel.\n\n\t\t\t \n\n\tConfig:\n\n\t\\-\\-\\-\\-\\-\\-\\-\n\n\n\t\tUsrsvc uses the config file found at $HOME/usrsvc.cfg (/home/media/usrsvc.cfg).\n\n\n\tDocumentation\n\n\t\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\\-\n\n\n\t\tRun \"usrsvc \\-\\-readme\" or see https://github.com/kata198/usrsvc/blob/master/README.md \n\n\t\t for more documentation.\n\n\nThe tool will output some basic information about what happened, and give a meaningful return code (0 = success, otherwise see https://raw.githubusercontent.com/kata198/usrsvc/master/usrsvcmod/constants.py \"ReturnCodes\" object for the list of return codes used and descriptions).\n\nUsrsvc will be as verbose as possible in identifying why a program failed to start and stay running, to ease debugging.\n\n\n**Example Usage**\n\nstart:\n\n\t[myuser]$ usrsvc start MagicLooper\n\n\t[Tue Mar 8 22:14:34 2016] - Started MagicLooper:\n\n\n\t{'args': ['/home/svcact/bin/MagicLooper.py'], 'cmdline': '/usr/bin/python /home/svcact/bin/MagicLooper.py', 'pid': 12467, 'executable': '/usr/bin/python', 'running': True}\n\n\n\nstatus:\n\n\t[myuser]$ usrsvc status MagicLooper\n\n\t[Tue Mar 8 22:14:55 2016] - MagicLooper is running:\n\n\n\t{'args': ['/home/svcact/bin/MagicLooper.py'], 'cmdline': '/usr/bin/python /home/svcact/bin/MagicLooper.py', 'pid': 12467, 'executable': '/usr/bin/python', 'running': True}\n\n\nstop:\n\n\t[myuser]$ usrsvc stop MagicLooper\n\n\t[Tue Mar 8 22:15:37 2016] - Stopping MagicLooper [12467]\n\n\t[Tue Mar 8 22:15:37 2016] - MagicLooper terminated\n\n\n\nusrsvcd (daemon)\n----------------\n\nThe *usrsvcd* daemon handles the autostart, autorestart, and monitoring of the configured services. It is optional, but required for advanced features.\n\n\n\tUsage: usrsvcd (Optional: [action])\n\n\n\tUsrsvcd is the daemon portion of usrsvc which actively monitors processes,\n\n\t provides autostart, autorestart, and other advanced features.\n\n\n\tIf \"action\" is omitted, it will assume the default, \"start\".\n\n\n\t\tActions:\n\n\n\t\t\tcheckconfig - Try to parse config files and validate correctness, without affecting the running usrsvcd instance. Returns non-zero on failure.\n\n\t\t\treread - Sends SIGUSR1 to the running usrsvcd process, which will cause it to reread configs and immediately apply the changes to the running instance.\n\n\t\t\t\t\t\t\t\t\t\tIf there are errors in the configs, a message will be logged by the usrsvcd process and it will retain its current configuration state.\n\n\t\t\trestart - Restarts the usrsvcd daemon cleanly\n\n\t\t\tstatus - Checks if usrsvcd is running. Returns non-zero on failure\n\n\t\t\tstop - Stops running instance of usrsvcd\n\n\n\tUses main config file in $HOME/usrsvc.cfg\n\n\nThe *usrsvcd* process will pick up the state of any configured services (whether they are running, what their pid is, etc) when it starts. Unlike other managers, it does not need to restart the program to begin managing it.\n\n\n\n**Updating Configuration**\n\nWith usrsvcd, you can add or remove a service, or change the properties of an existing service, without disruption of any of the applications.\n\n\nSimply make the changes to the configuration, and run *usrsvcd checkconfig* to validate against any configuration errors. If there are errors, you will be alerted to what they are, and *usrsvcd* will continue to operate off the last good configuration.\n\nWhen you are satisfied and have validated your changes, run *usrsvcd reread* to tell usrsvcd to update its internal copy of your configuration. Usrsvcd will perform a check prior to loading the new config, and will alert you if there is an error (and retain the last good config).\n\n\nAfter your changes have been validated, usrsvcd will apply the updates following the completion of its current operation set. This makes it safe to update at any time, without worry of disruption to applications.\n\nThere is no need to restart usrsvcd to apply a configuration change.\n\n\n\nConfiguration\n=============\n\n\nConfiguration starts with the \"main\" config at $HOME/usrsvc.cfg . This file defines some basic info, or can contain your full configuration if you want. The recommended usage is to provide the \"config_dir\" property therein, which specifies a directory. In that directory, all files ending in \".cfg\" will be processed, allowing you to have each Program defined in its own config, default settings in another config, etc. This makes it simpler to manage and add/remove services.\n\n\nConfiguration is \"configobj\" style, which closely mimics ini-style but supports subsections.\n\nThe following are the sections and their meanings. [Main] must be defined in $HOME/usrsvc.cfg, but otherwise any of the sections can appear in any config file.\n\n\nMain Config\n-----------\n\n**[Main]**\n\nThe [Main] section must be found in $HOME/usrsvc.cfg, and can contain any of the following properties:\n\n\n* config_dir - This defines a directory which will be searched for additional configuration. Anything with a \".cfg\" suffix will be processed as a config.\n\n* pidfile - REQUIRED - This defines the location where *usrsvcd* will store its own pid.\n\n* usrsvcd_stdout - If defined, usrsvcd will log stdout to this file instead of the default stdout (likely a terminal). Must be an absolute path.\n\n* usrsvcd_stderr - If defined, usrsvcd will log stderr to this file instead of the default stderr (likely a terminal). Use the value \"stdout\" to log stderr to the same location as stdout, otherwise must be an absolute path.\n\n* sendmail_path - If defined and not \"auto\", this should be the path to the \"sendmail\" application. This is used as the sender program when \"email_alerts\" is set on a Program. If not defined or auto, /usr/sbin/sendmail, /usr/bin/sendmail, and every element in PATH will be checked.\n\n\nProgram Config\n--------------\n\n\n**[Program:myprogram]**\n\nEach \"Program\" section can be in any config file, and defines a Program that will be managed by usrsvc. Following the colon is the program name (in this case, \"myprogram\") and must be unique. This will assign the name that will be used to identify the program (e.x. \"usrsvc start myprogram\")\n\n\nThe \"Program\" section has the following properties:\n\n\n* command - REQUIRED - Full command and arguments to execute. If #useshell# is True, this can contain shell-isms\n\n* useshell - Boolean, default False. If True, will invoke your application through a shell. You can use shell expressions in this mode. Use \"False\" if you don't need this.\n\n* pidfile - REQUIRED - Path to a pidfile. If #autopid# is False, your app must write its pid to this file. Otherwise, usrsvcd will mangage it, even with #scan_for_process# or other methods.\n\n* enabled - Boolean, default True. Set to \"False\" to disable the program from being managed by \"usrsvcd\"\n\n* autopid - Default True, boolean. If True, \"usrsvc\" and \"usrsvcd\" will write the pid of the launched program to the pidfile, i.e. managed. If your application forks-and-exits, you can set this to FAlse and write your own pid, or use #scan_for_process#\n\n* scan_for_process - Default True, boolean. If True, \"usrsvc\" and \"usrsvcd\" will, in the absense of a pidfile which matches with #proctitle_re#, use #proctitle_re# and scan running processes for the application. This can find applications even when the pidfile has gone missing.\n\n* proctitle_re - None or a regular expression which will match the proctitle (can be seen as last col in \"ps auxww\"). If none provided, a default wherein the command and arguments are used, will work in almost all instances. Some applications modify their proctitle, and you may need to use this to match them.\n\n\n\n* autostart - Default True, boolean value if program should be started if not already running when \"usrsvcd\" is invoked\n\n* autorestart - Default True, boolean value if program should be restarted if it stopped while \"usrsvcd\" is running\n\n* maxrestarts - Default 0, integer on the max number of times usrsvcd will try to automatically restart the application by \"usrsvcd\". If it is seen running again naturally, this counter will reset. 0 means unlimited restarts.\n\n* restart_delay - Default 0, integer on the miminum number of seconds between a failing \"start\" and the next \"restart\" attmept by \"usrsvcd\". \n\n* success_seconds - Default 2, Float, The number of seconds usrsvc will wait before considering a program successfully started. The created process must both match and still be running at the end of this period to be marked successful.\n\n* term_to_kill_seconds : Default 8, Float on the number of seconds the application is given between SIGTERM and SIGKILL.\n\n\n\nNOTE: The following stdout/stderr are opened in \"append\" mode always. \n\n* stdout - REQUIRED - Absolute path to a file to be used for stdout\n\n* stderr - Absolute path to a file to be used for stderr, or \"stdout\" to redirect to stdout. Default is to redirect stderr to stdout. May be same filename as stdout.\n\n* defaults - This can reference a \"DefaultSettings\" section defined elsewhere, i.e. to reference [DefaultSettings:MySettings] use \"defaults=MySettings\". If provided, this Program will inherit the settings defined in the DefaultSettings as the defaults. Anything provided explicitly in this Program will override those found in the defaults.\n\n* inherit_env - Boolean, default True. If True, will inherit the env from \"usrsvc\" or \"usrsvcd\". Otherwise, will only use the Env as defined in the Env subsection.\n\n* email_alerts - String, if set, when usrsvcd starts/restarts a process, an email alert will go to this address.\n\n\nProgram Subsections\n-------------------\n\nYour *Program* config may contain the following subsections, and their properties.\n\n\n**[[Env]]**\n\nA series of key=value items which will be present in the environment prior to starting this Program.\n\n\n\n**[[Monitor]]**\n\nThe Monitor subsection specifies if and how your *Program* will be monitored. Monitoring can determine if a *Program* has stopped running, or exceeded some bounds, and trigger a restart.\n\nCurrently, *Monitor* can contain the following properties:\n\n* monitor_after - Minimum number of seconds that program needs to be running before monitoring will begin. Default 30. 0 disables this feature.\n\n(Activity File Monitoring)\n\nThe following two properties deal with \"activity file\" monitoring, that is ensuring that a file or directory is updated within a specified number of seconds.\n\n* activityfile - File or Directory which must be modified every #activityfile_limit# seconds, or program will be restarted. Default undefined/empty string disables this.\n\n* activityfile_limit - If activityfile is defined, this is the number of seconds is the maximum that can go between modifications of the provided #activityfile# before triggering a restart.\n\n(RSS Limit Monitoring)\n\nThe following property triggers the \"rss limit\" monitor. This monitor checks the Resident Set Size (non-shared memory an application is using), and restarts if it exceeds a given threshold.\n\n* rss_limit - Default 0, if greater than zero, specifies the maximum RSS (resident set size) that a process may use before being restarted. This is the \"private\" memory (not including shared maps, etc) used by a process.\n\n\n*Example Program Config:* \n\n\n\t[Program:myprogram]\n\n\n\tcommand = /home/myusr/bin/myprogram.py arg1 arg2\n\n\tpidfile = /home/myusr/pids/myprogram.pid\n\n\tstdout = /home/myusr/logs/myprogram.log\n\n\tstderr = stdout\n\n\n\t[[Env]]\n\n\n\t\tDB_USER = superdb\n\n\t\tDB_NAME = mydatabase\n\n\n\nInheritable Settings\n--------------------\n\nYou can define default settings in a .cfg file within your *config_dir* that can be inherited by other programs. Use this to reduce duplication, and change things en masse.\n \nSet the *defaults* property of a Program to the name given to a *DefaultsSettings* section to have that Program inherit those defaults.\n\nAny properties defined by the Program explicitly will override any defaults inherited.\n\n\n*Example DefaultSetings*\n\n\n\t[DefaultSettings:mydefaults]\n\n\t\t\t\tsuccess_seconds = 5\n\n\t\t\t\trestart_delay = 3\n\n\t\t\t\tmax_restarts = 3\n\n\t\t\t\temail_alerts = nobody@example.com\n\n\nSystemd Integration\n-------------------\n\nAs of 1.5.9 usrsvcd is integrated with systemd. In the source distribution, you'll find a \"systemd\" directory which contains a unit, and an install.sh script to install it.\n\nIf usrsvcd is installed somewhere other than \"/usr/bin/usrsvcd\", you'll need to modify the lines in \"usrsvcd@.service\" that start with \"Exec\" with the correct path.\n\n\nUse \"systemctl start usrsvcd@myuser\" to start usrsvcd as \"myuser\"\n\nUse \"systemctl enable usrsvcd@myuser\" to enable usrsvcd to start as \"myuser\" on boot.\n\nAs per the design of usrsvc, you can have multiple daemons enabled for multiple users.\n\n\nExamples\n--------\n\nAn example configuration can be found in the \"examples\" directory ( https://github.com/kata198/usrsvc/tree/master/examples ). The \"usrsvc.cfg\" is the main configuration file (to be located in $HOME/usrsvc.cfg), and the \"cfg\" directory is intended to be \"/home/myusr/usrsvc.d/cfg\" (per config_dir value in usrsvc.cfg\n\n\n\nContact Me\n----------\n\nYou may reach me for support, questions, feature requests, or just to let me know you're using it! Use the email kata198 at gmail.\n\n\n\nChanges\n-------\n\nThe Changelog can be found at: https://raw.githubusercontent.com/kata198/usrsvc/master/ChangeLog", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/kata198/usrsvc", "keywords": "usrsvc,usrsvcd,daemon,user,services,service,init,script,start,stop,restart,manage,programs,applications,supervisor,supervisord,systemd,daemontools", "license": "GPLv2", "maintainer": "Tim Savannah", "maintainer_email": "kata198@gmail.com", "name": "usrsvc", "package_url": "https://pypi.org/project/usrsvc/", "platform": "", "project_url": "https://pypi.org/project/usrsvc/", "project_urls": { "Homepage": "https://github.com/kata198/usrsvc" }, "release_url": "https://pypi.org/project/usrsvc/1.5.13/", "requires_dist": null, "requires_python": "", "summary": "A service manager for running/managing/monitoring/auto-restarting daemons and services at the user (non-root) level", "version": "1.5.13" }, "last_serial": 4444981, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "cf94ae73c480e2364ac1c2355c6e010a", "sha256": "12523cd1dcc16d0204f0402fcf60ebc2a37ec705d8b9dc934ea29443a9167eff" }, "downloads": -1, "filename": "usrsvc-1.0.0.tar.gz", "has_sig": false, "md5_digest": "cf94ae73c480e2364ac1c2355c6e010a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33508, "upload_time": "2016-03-09T22:19:44", "url": "https://files.pythonhosted.org/packages/aa/5c/f384ed21df9ed78e0dc673067f625ec24490c6b6fdf35872fe753eab5a12/usrsvc-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "3f5dad53970f52979257b4557840da3e", "sha256": "1b7c51c031b0d799e927b475d20a0308659f3b157b40d936741a1e38cbef577a" }, "downloads": -1, "filename": "usrsvc-1.0.1.tar.gz", "has_sig": false, "md5_digest": "3f5dad53970f52979257b4557840da3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33496, "upload_time": "2016-03-09T22:21:47", "url": "https://files.pythonhosted.org/packages/3a/a8/1cf73dd803f60d7df068775d24896aeb3a98665084b671a28071cc1abe99/usrsvc-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "af89205df0a06ed5dc759be070b88d2e", "sha256": "94cb27dc71c90c95bdf407dfdf4df3ad6497559aef4e702f205274cbf932d13f" }, "downloads": -1, "filename": "usrsvc-1.1.0.tar.gz", "has_sig": false, "md5_digest": "af89205df0a06ed5dc759be070b88d2e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38255, "upload_time": "2016-03-11T23:46:54", "url": "https://files.pythonhosted.org/packages/c2/33/7a23d0691bb55c18fe119b86773eb48d7a9ad7e938748fc5b834d424d564/usrsvc-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "5c2b2fb207d54657d9489108208835c8", "sha256": "0dc05d93d52b8e9d00ab38147d134de712ede95e93c0f13c24f599955191ff12" }, "downloads": -1, "filename": "usrsvc-1.1.1.tar.gz", "has_sig": false, "md5_digest": "5c2b2fb207d54657d9489108208835c8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38544, "upload_time": "2016-03-11T23:58:29", "url": "https://files.pythonhosted.org/packages/b9/53/52c55680a641d55d04e5bb0a6ce6e384c2874de869468cee276c5ebff3e0/usrsvc-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "9151c630a16a3792c958bf1eb821b124", "sha256": "b1d2aed69f75532bb6ecd8b57b6582b5e7db707616310df7a7b703c055c25a8a" }, "downloads": -1, "filename": "usrsvc-1.2.0.tar.gz", "has_sig": false, "md5_digest": "9151c630a16a3792c958bf1eb821b124", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38286, "upload_time": "2016-03-21T15:33:22", "url": "https://files.pythonhosted.org/packages/46/b8/fc27e26d201c3f44a682efdebef051965eede1e85ef33e2c0d422f74cdaf/usrsvc-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "b357d599100188b57da9335a8c2c55fb", "sha256": "e281ba1e1465900376c1bbc79a70029eb4ff652ef8eb653700ce6b6d1c225a68" }, "downloads": -1, "filename": "usrsvc-1.2.1.tar.gz", "has_sig": false, "md5_digest": "b357d599100188b57da9335a8c2c55fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43588, "upload_time": "2016-04-28T19:22:51", "url": "https://files.pythonhosted.org/packages/1c/27/b954509910bbe83de883198c3e8cf434d57e8152de8d726b1ee3ca09ac13/usrsvc-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "739cbd1d50e8f8c231eeb2abdc9f691f", "sha256": "2d1901132b281a09c2779ed59bf89fbe32e5a10a7d87ded5d0679929b270a5ac" }, "downloads": -1, "filename": "usrsvc-1.2.2.tar.gz", "has_sig": false, "md5_digest": "739cbd1d50e8f8c231eeb2abdc9f691f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44805, "upload_time": "2016-05-12T03:39:35", "url": "https://files.pythonhosted.org/packages/98/4a/0dcb1325857fff5ebcc713d6c54fe5f1c485130323acec07451318e8f0f5/usrsvc-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "d28fc0cd3d5c32f61e4f8fb3f9617e86", "sha256": "2255455c39a8ac61bc84bae19532b1d67442ec0707fc155a3fd62179ae610729" }, "downloads": -1, "filename": "usrsvc-1.2.3.tar.gz", "has_sig": false, "md5_digest": "d28fc0cd3d5c32f61e4f8fb3f9617e86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50331, "upload_time": "2016-05-16T23:00:10", "url": "https://files.pythonhosted.org/packages/34/4e/739e37130d2cdb14d68773e9ff68cee6b2aac7db8320eaffdd6a3c1d79dc/usrsvc-1.2.3.tar.gz" } ], "1.2.4": [ { "comment_text": "", "digests": { "md5": "1899c580c55f3b2c1d32cc9d21977c4e", "sha256": "920676ad7962656a8e6c41294b4ffd01d72b25e8db5645384b4b4a44671c5197" }, "downloads": -1, "filename": "usrsvc-1.2.4.tar.gz", "has_sig": false, "md5_digest": "1899c580c55f3b2c1d32cc9d21977c4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50397, "upload_time": "2016-05-16T23:10:10", "url": "https://files.pythonhosted.org/packages/57/f7/3a23105aec4dee56e8e299f6a41e98315501c668e04ab56658b30e1bcf86/usrsvc-1.2.4.tar.gz" } ], "1.2.5": [ { "comment_text": "", "digests": { "md5": "51311e8133073b6bdd3094fa774eb296", "sha256": "2337a8f5f34afe880ccdb2df5701495a6764f43b698eb0e355f54728a8e1a277" }, "downloads": -1, "filename": "usrsvc-1.2.5.tar.gz", "has_sig": false, "md5_digest": "51311e8133073b6bdd3094fa774eb296", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44909, "upload_time": "2016-05-17T20:46:22", "url": "https://files.pythonhosted.org/packages/61/e0/ae5f14fd5af0b4222880ba9b26fd6a98e664550cb80558959e5735a9ff6c/usrsvc-1.2.5.tar.gz" } ], "1.2.6": [ { "comment_text": "", "digests": { "md5": "69b2fc06ab1dee4944e7ce8dcd3a1f02", "sha256": "207d3fc94033895766e7bfe67e5fb2a918646129b5932516e60bbfcfeb48814f" }, "downloads": -1, "filename": "usrsvc-1.2.6.tar.gz", "has_sig": false, "md5_digest": "69b2fc06ab1dee4944e7ce8dcd3a1f02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50556, "upload_time": "2016-05-23T20:11:49", "url": "https://files.pythonhosted.org/packages/0b/a5/8d66fd29d14f2f6c48ebb3bbf70ce0e5cc4f742343ffb91fb6589928f72d/usrsvc-1.2.6.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "aeafba894b937c23dc9bacad876de467", "sha256": "86ca1c4b6b1cc680494d988c2b5b26303bef7b167cd606a9414cdbb4518e94ab" }, "downloads": -1, "filename": "usrsvc-1.3.0.tar.gz", "has_sig": false, "md5_digest": "aeafba894b937c23dc9bacad876de467", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46495, "upload_time": "2016-05-23T20:16:46", "url": "https://files.pythonhosted.org/packages/2e/0b/95090cec92ab5813b5461bd5595c1b213cd2b01088bf86c2eb0a19eb5503/usrsvc-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "", "digests": { "md5": "f7955bb6eb1a82a77474702342d9e8df", "sha256": "9472cbc5e6f8677ed9a496de57c8f2c7142c89021665a6e824f4146a7f299260" }, "downloads": -1, "filename": "usrsvc-1.3.1.tar.gz", "has_sig": false, "md5_digest": "f7955bb6eb1a82a77474702342d9e8df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46556, "upload_time": "2016-05-23T20:53:16", "url": "https://files.pythonhosted.org/packages/e0/4c/3a3dd4523090bfd6d013da3e7df744197e32c5f0f048d18971b5f8afa44d/usrsvc-1.3.1.tar.gz" } ], "1.3.2": [ { "comment_text": "", "digests": { "md5": "5e26aca10bb4fe232e2e56fae970ebf4", "sha256": "9deb86dcd714c04dae3a7272360ce65304b85d84b2a345216ad832e2706244f9" }, "downloads": -1, "filename": "usrsvc-1.3.2.tar.gz", "has_sig": false, "md5_digest": "5e26aca10bb4fe232e2e56fae970ebf4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46855, "upload_time": "2016-05-23T21:55:14", "url": "https://files.pythonhosted.org/packages/0a/cc/5df3ffb45068ae46f2201963f2ee545b4a215687caab88d1ad680eab59dd/usrsvc-1.3.2.tar.gz" } ], "1.3.3": [ { "comment_text": "", "digests": { "md5": "c90cedf87f8a8e2bdfb270587d1dee7f", "sha256": "200f99fae13c9e6e5c31336dfeccba0a39c69bd00bebcd98bee1d195e6538291" }, "downloads": -1, "filename": "usrsvc-1.3.3.tar.gz", "has_sig": false, "md5_digest": "c90cedf87f8a8e2bdfb270587d1dee7f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47001, "upload_time": "2016-05-23T22:43:42", "url": "https://files.pythonhosted.org/packages/22/0c/aa044e1e3f2cb1207f45ed994aa980841c069afd8ba84c95755d0b67c42d/usrsvc-1.3.3.tar.gz" } ], "1.3.4": [ { "comment_text": "", "digests": { "md5": "d254712ee43c7b9c398f73a503a45223", "sha256": "a456c70db45398f287f6419af99d9e88b9297faebcfc50d14617f65962aec977" }, "downloads": -1, "filename": "usrsvc-1.3.4.tar.gz", "has_sig": false, "md5_digest": "d254712ee43c7b9c398f73a503a45223", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46580, "upload_time": "2016-05-27T18:00:15", "url": "https://files.pythonhosted.org/packages/85/e4/73fa1205e3cd5429a15a96c30cdb2903ff6efed5dc84225be219dd6cd67f/usrsvc-1.3.4.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "51fdfd983714eadb09fc5ad56c7398d3", "sha256": "9e2b157c97043fe179405620e60a0cf7f65ebaeb5f156e0b439ea89d618dbd35" }, "downloads": -1, "filename": "usrsvc-1.4.0.tar.gz", "has_sig": false, "md5_digest": "51fdfd983714eadb09fc5ad56c7398d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50551, "upload_time": "2016-05-31T02:43:43", "url": "https://files.pythonhosted.org/packages/3f/15/1694950de60b2bea733e16c928f92eb88007acf22f4277e6702ab0926508/usrsvc-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "14390f08fe09ad05330cd7d667697ce1", "sha256": "db59275e8d769d3d65f539b713a8a99c6386480d9e99bfccea1f3c06e9cf20c3" }, "downloads": -1, "filename": "usrsvc-1.4.1.tar.gz", "has_sig": false, "md5_digest": "14390f08fe09ad05330cd7d667697ce1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50560, "upload_time": "2016-05-31T04:00:39", "url": "https://files.pythonhosted.org/packages/ed/c2/f4b06b523dfc18e13d301ac5ef4074cc7ab87530e77f4257cc320229a84a/usrsvc-1.4.1.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "a8b38f26d3c5f79e5fbcc5c63417619d", "sha256": "b1076d671cd66437a33a1b32da9c26ee436be4dbf27da2c26a6efd4a7e7a8823" }, "downloads": -1, "filename": "usrsvc-1.5.0.tar.gz", "has_sig": false, "md5_digest": "a8b38f26d3c5f79e5fbcc5c63417619d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53111, "upload_time": "2016-06-01T19:27:46", "url": "https://files.pythonhosted.org/packages/ce/ed/cf30688a156286f050a6d452e55d073e573cd06196aca4337a39682f60f3/usrsvc-1.5.0.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "0fdc3a057fc299942f8f74ac89c8dd72", "sha256": "e2e929967d4fa63226c148450046600e9b8533fb03dbacfefc13714d8b801c03" }, "downloads": -1, "filename": "usrsvc-1.5.1.tar.gz", "has_sig": false, "md5_digest": "0fdc3a057fc299942f8f74ac89c8dd72", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53119, "upload_time": "2016-06-09T23:26:12", "url": "https://files.pythonhosted.org/packages/8d/fc/a4ff69706a0f5c648e2202fd2292ecaddc2186acfdc730c743149a511a51/usrsvc-1.5.1.tar.gz" } ], "1.5.10": [ { "comment_text": "", "digests": { "md5": "3ba6ea9d4bddb27a632045566707ecc4", "sha256": "ec409b75fd95c4c8d17a2bc3ba587a43cccc667a12421b487974ab5197ba6f70" }, "downloads": -1, "filename": "usrsvc-1.5.10.tar.gz", "has_sig": false, "md5_digest": "3ba6ea9d4bddb27a632045566707ecc4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63015, "upload_time": "2016-09-08T23:22:52", "url": "https://files.pythonhosted.org/packages/05/59/d2e4f3b364a2d23b5d337b173572a948b76d8378db82056ccfd70a667c9e/usrsvc-1.5.10.tar.gz" } ], "1.5.11": [ { "comment_text": "", "digests": { "md5": "f045175d62f7cb5560d63453fb6036fe", "sha256": "1bafd5740c0e07da464832bd77d56f6a1602466932eee7ed9e9fd2ef9ea5e90c" }, "downloads": -1, "filename": "usrsvc-1.5.11.tar.gz", "has_sig": false, "md5_digest": "f045175d62f7cb5560d63453fb6036fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56614, "upload_time": "2017-06-05T05:18:38", "url": "https://files.pythonhosted.org/packages/69/06/f4106cc819f0c2cf0e414807ab21a3a6f0c9c815ccd2397492dbad2c1bf2/usrsvc-1.5.11.tar.gz" } ], "1.5.12": [ { "comment_text": "", "digests": { "md5": "99d6a5a161fdddede1105dc1a8c7984b", "sha256": "498045ff093ddf8afd5b729d3f5ea35e924f36aa01273cd3f2b314135c704f04" }, "downloads": -1, "filename": "usrsvc-1.5.12.tar.gz", "has_sig": false, "md5_digest": "99d6a5a161fdddede1105dc1a8c7984b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63991, "upload_time": "2017-06-05T05:38:39", "url": "https://files.pythonhosted.org/packages/16/3f/0609f942e0d26ba2cc5d07913615333dc3c7e52700eee843560056cf8247/usrsvc-1.5.12.tar.gz" } ], "1.5.13": [ { "comment_text": "", "digests": { "md5": "19009154d275ec6c2f143d7ca55c752b", "sha256": "e65c82573db5bc2c647e1ec9a6ad575f441e6ecd25c8f1bea65c8063fdb5c90a" }, "downloads": -1, "filename": "usrsvc-1.5.13.tar.gz", "has_sig": false, "md5_digest": "19009154d275ec6c2f143d7ca55c752b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62768, "upload_time": "2018-11-02T15:16:09", "url": "https://files.pythonhosted.org/packages/3c/f1/b4108553739a25526f845acf517b128809694e0c7a7c1d53ec9c406d0cbc/usrsvc-1.5.13.tar.gz" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "613d246e2851bcb38773080095d6387c", "sha256": "d99df664b14a783cf3ea50e585112cd03992cab39221fcb999b5eceb76147928" }, "downloads": -1, "filename": "usrsvc-1.5.2.tar.gz", "has_sig": false, "md5_digest": "613d246e2851bcb38773080095d6387c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52620, "upload_time": "2016-06-16T23:08:55", "url": "https://files.pythonhosted.org/packages/a6/b2/6388c1965129bb8d63f3eb8712fc96b53ea016723bc61c756556c989b25e/usrsvc-1.5.2.tar.gz" } ], "1.5.3": [ { "comment_text": "", "digests": { "md5": "fff848a0ce534c77a9b0a6ee95bcd77e", "sha256": "dd756d9c02a6862e96a6c37cf40bb9e76bd531151e73428152f63b8c72191873" }, "downloads": -1, "filename": "usrsvc-1.5.3.tar.gz", "has_sig": false, "md5_digest": "fff848a0ce534c77a9b0a6ee95bcd77e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52665, "upload_time": "2016-06-17T16:51:15", "url": "https://files.pythonhosted.org/packages/3a/49/1b4bbccfde747aa7e5ae0e956360d13f55ebd10014c28ad7729e3b41538e/usrsvc-1.5.3.tar.gz" } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "c4708f914b72120583cece65cf01886f", "sha256": "4b4f406a5ba683775eed04595b4b2c2b503b5ac3a100868eebb279a1498cf784" }, "downloads": -1, "filename": "usrsvc-1.5.4.tar.gz", "has_sig": false, "md5_digest": "c4708f914b72120583cece65cf01886f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56595, "upload_time": "2016-06-23T20:43:44", "url": "https://files.pythonhosted.org/packages/bd/e3/5127fccc4023e8b38f0d493f7fa3101492d5112ef269356a0ebf24e7ada0/usrsvc-1.5.4.tar.gz" } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "3956744e8a83c508baac62f6e66ee2b2", "sha256": "aefa93e08b32411aaed252391150c04962433414339c9a29a4096908a39a1353" }, "downloads": -1, "filename": "usrsvc-1.5.5.tar.gz", "has_sig": false, "md5_digest": "3956744e8a83c508baac62f6e66ee2b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56639, "upload_time": "2016-06-23T20:49:55", "url": "https://files.pythonhosted.org/packages/76/b2/5a85d1cbcb213748d3336f4a82e156ef0c2d319d7f2acc8434361d09afcd/usrsvc-1.5.5.tar.gz" } ], "1.5.6": [ { "comment_text": "", "digests": { "md5": "a410a9e8ddfae20a9e18182fcce786b2", "sha256": "3576c789eef91b0a3cfc21701bd6d244833137ec4e1058d9316f13f3fa528cc5" }, "downloads": -1, "filename": "usrsvc-1.5.6.tar.gz", "has_sig": false, "md5_digest": "a410a9e8ddfae20a9e18182fcce786b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55499, "upload_time": "2016-06-27T04:14:13", "url": "https://files.pythonhosted.org/packages/8e/df/79f170fef11a730614dd614d7e89b95f292e722b57f56d7291acb17275bd/usrsvc-1.5.6.tar.gz" } ], "1.5.7": [ { "comment_text": "", "digests": { "md5": "1d8bf8544a3d53dfd2c95816ce189a07", "sha256": "41831d56aefa2c43f6297ffacc39d3f53fdd2836e55cd16de207268eb95bb868" }, "downloads": -1, "filename": "usrsvc-1.5.7.tar.gz", "has_sig": false, "md5_digest": "1d8bf8544a3d53dfd2c95816ce189a07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55569, "upload_time": "2016-07-29T03:25:03", "url": "https://files.pythonhosted.org/packages/53/93/9628308aa9909d200de61406b8b76234964b38d9c0ce8bdd7608a1ceefde/usrsvc-1.5.7.tar.gz" } ], "1.5.8": [ { "comment_text": "", "digests": { "md5": "f25011506c4614501887161eb252e8ff", "sha256": "010efaf4bd3dc4747f89484bc188c930c082f07b002d346a53ceb2531c3d5d92" }, "downloads": -1, "filename": "usrsvc-1.5.8.tar.gz", "has_sig": false, "md5_digest": "f25011506c4614501887161eb252e8ff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 55559, "upload_time": "2016-07-29T03:38:27", "url": "https://files.pythonhosted.org/packages/8a/2c/811c0b1938fac1c2acc6420e72f2c255e567c551727d0ab7c027e8684404/usrsvc-1.5.8.tar.gz" } ], "1.5.9": [ { "comment_text": "", "digests": { "md5": "3e64e5763d1dca5d26224a1c2cbd16b0", "sha256": "734cc1b193f5401be1d3ebe10b0c47f70f2f9a04810a2a43b8c441ab0ab39dc7" }, "downloads": -1, "filename": "usrsvc-1.5.9.tar.gz", "has_sig": false, "md5_digest": "3e64e5763d1dca5d26224a1c2cbd16b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62887, "upload_time": "2016-09-08T22:55:20", "url": "https://files.pythonhosted.org/packages/7d/04/f1f09ade5d8ed502a58636935ed7e7d222ecfd309d0e3a415a8c9ed6d3cb/usrsvc-1.5.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "19009154d275ec6c2f143d7ca55c752b", "sha256": "e65c82573db5bc2c647e1ec9a6ad575f441e6ecd25c8f1bea65c8063fdb5c90a" }, "downloads": -1, "filename": "usrsvc-1.5.13.tar.gz", "has_sig": false, "md5_digest": "19009154d275ec6c2f143d7ca55c752b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 62768, "upload_time": "2018-11-02T15:16:09", "url": "https://files.pythonhosted.org/packages/3c/f1/b4108553739a25526f845acf517b128809694e0c7a7c1d53ec9c406d0cbc/usrsvc-1.5.13.tar.gz" } ] }