{ "info": { "author": "Dan Ryan, Mike Kazantsev", "author_email": "dan@seattlemesh.net, mk.fraggod@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: No Input/Output (Daemon)", "Environment :: Other Environment", "Intended Audience :: Customer Service", "Intended Audience :: Telecommunications Industry", "License :: OSI Approved", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Natural Language :: English", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 2 :: Only", "Topic :: Communications :: Telephony", "Topic :: Multimedia :: Sound/Audio", "Topic :: Multimedia :: Sound/Audio :: Mixers", "Topic :: Multimedia :: Sound/Audio :: Speech" ], "description": "PagingServer\n============\n\nSIP-based Announcement / PA / Paging / Public Address Server system.\n\nMain component of this project is a script to run PJSUA_ SIP client connected to\na PulseAudio_ sound server routing audio to whatever sound cards and speaker\nsets.\n\nIt picks up calls, plays klaxon on speakers, followed by the announcement made\nin that call. Music plays in-between announcements.\n\nScript controls PJSUA and PulseAudio (muting/unmuting streams there) to make\nthem work to that effect.\n\n|\n\n.. contents::\n :backlinks: none\n\n\n\nUsage\n-----\n\nAfter installation (see below), the script should be configured, providing it\nwith at least the SIP account data for the general usage.\n\nConfiguration file (`ini format`_) locations:\n\n* paging.conf\n* /etc/paging.conf\n* callpipe.conf\n* /etc/callpipe.conf\n* Paths specified on the command line.\n\nAll files will be looked up and parsed in that order, values in next ones\noverriding corresponding ones in the previous and defaults.\n\nSee output of ``paging --help`` for info on how to specify additional\nconfiguration, more up-to-date list of default paths, as well as general\ninformation for all the other options available.\n\nProvided `paging.example.conf`_ file has all the available configuration options\nand their descriptions.\n\nTo see default configuration options, use ``paging --dump-conf-defaults``, and\nrun ``paging --dump-conf ...`` to see the actual options being picked-up and\nused at any time.\n\nThere are two general (supported) ways to start and run the script:\n\n* In the foreground (non-forking).\n* As a systemd service.\n\nBoth are described in more detail below.\n\n\nStart/run in the foreground\n```````````````````````````\n\nFirst - make sure PulseAudio_ and its ALSA_ backend are configured (and unmuted,\nin case of ALSA) as they should be and pulse server can run/runs for same user\nthat this script will be running as.\n\nHow to do that is out of scope for this README.\n\nThen just run the thing as::\n\n % paging\n\nCan be used directly from terminal, or with any init system or daemon manager,\nincluding systemd, upstart, openrc, runit, daemontools, debian's\n\"start-stop-daemon\", simple bash scripts, etc.\n\nFor systemd in particular, see the \"Running as a systemd service\" section below.\n\nRunning from terminal to understand what's going on, these options might be also\nuseful::\n\n % paging --debug\n % paging --debug --pjsua-log-level 10\n % paging --dump-conf\n\nSee also \"Installation\" and \"Audio configuration\" sections below.\n\n\nRunning as a systemd service\n````````````````````````````\n\nThis method should be preferred, as it correctly notifies init when service is\nactually ready (i.e. pjsua inputs/outputs initialized), so that others can be\nscheduled around that, and primes watchdog timer, detecting if/when app might\nhang due to some bug.\n\nProvided ``paging.service`` file (in the repository, just an ini file) should be\ninstalled to ``/etc/systemd/system``, and assumes following things:\n\n* PagingServer app should be run as a \"paging\" user, which exists on the system\n (e.g. in ``/etc/passwd``).\n\n* \"paging.py\" script, its \"entry point\" or symlink to it is installed at\n ``/usr/local/bin/paging``.\n\n* Configuration file can be read from one of default paths\n (see above for a list of these).\n\n* Optional python-systemd_ module dependency is installed.\n\nWith all these correct, service can then be used like this:\n\n* Start/stop/restart service::\n\n % systemctl start paging\n % systemctl stop paging\n % systemctl restart paging\n\n* Enable service(s) to start on OS boot::\n\n systemctl enable paging\n\n* See if service is running, show last log entries: ``systemctl status paging``\n* Show all logs for service since last OS boot: ``journalctl -ab -u paging``\n\n* Continously show (\"tail\") all logs in the system: ``journalctl -af``\n\n* Brutally kill service if it hangs on stop/restart:\n ``systemctl kill -s KILL paging``\n (will be done after ~60s by systemd automatically).\n\nSee `systemctl(1) manpage`_ for more info on such commands.\n\nIf either app itself is installed to another location (not\n``/usr/local/bin/paging``) or extra command-line parameters for it are required,\n``ExecStart=`` line can be altered either in installed systemd unit file\ndirectly, or via ``systemctl edit paging``.\n\n``systemctl daemon-reload`` should be run for any modifications to\n``/etc/systemd/system/paging.service`` to take effect.\n\nSimilarly, ``User=paging`` line can be altered or overidden to change system uid\nto use for the app.\n\nIf python-systemd module is unavailable, following lines should be dropped from\nthe ``paging.service``::\n\n Type=notify\n WatchdogSec=...\n\nAnd ``--systemd`` option removed from ``ExecStart=`` line, so that app would be\nstarted as a simple non-forking process, which will then be treated correctly by\nsystemd without two options above.\n\n\n\nInstallation\n------------\n\nThis is a regular package for Python 2.7 (not 3.X), but with some extra\nrun-time requirements (see below), which can't be installed from PyPI.\n\nPackage itself can be installed at any time using pip_, e.g. via ``pip install\nPagingServer`` (this will try to install stuff to /usr!!!).\n\nUnless you know python packaging though, please look at `pip2014.com`_, `python\npackaging tutorial`_, documentation below for easy installation (from\npackages/repo) on specific systems.\n\n\nRequirements\n````````````\n\n* `Python 2.7`_ (NOT 3.X).\n\n* PJSUA_ (PJSIP User Agent) and its python bindings.\n\n Can be packaged as \"pjsip\", \"pjsua\" or \"pjproject\" in linux distros.\n\n Python bindings (from the same tarball) can also be packaged separately as\n \"python-pjproject\" or something like that.\n\n If either of those isn't available, be sure to build and install pjsua AND its\n python bindings manually from the same sources, and NOT e.g. install pjsua\n from package and then build bindings separately.\n\n* PulseAudio_\n\n* `pulsectl python module`_\n\n* (optional) ffmpeg_ binary - if audio samples are not wav files (will be\n converted on every startup, if needed).\n\n* (optional) python-systemd_ - only if ``--systemd`` option is used (e.g. with\n shipped .service file).\n\n Developed and shipped separately from main systemd package since v223\n (2015-07-29), likely comes installed with systemd prior to that.\n\n Would probably make sense to install that module from OS package, which should\n be available if systemd is used there as init by default.\n\n* (optional) raven_ python module - for reporting any errors via sentry.\n\n\nDebian Jessie\n`````````````\n\n* Installing everything via debian packages from third-party repository.\n\n Running this one-liner should be the easiest way by far::\n\n wget -O- https://raw.githubusercontent.com/AccelerateNetworks/PagingServer/master/setup-scripts/install.debian_jessie.from_debs.sh | bash\n\n Or, if ``wget ... | bash`` sounds too scary, same exact steps as in that\n script are::\n\n # apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3D021F1F4C670809\n # echo 'deb http://paging-server.ddns.net/ jessie main' >/etc/apt/sources.list.d/paging-server.list\n # apt-get update\n\n # apt-get install --no-install-recommends pulseaudio pulseaudio-utils alsa-utils\n # apt-get install paging-server python-systemd\n\n # useradd -rm -s /bin/false -G audio paging\n # install -o root -g paging -m640 -T /usr/share/doc/paging-server/paging.example.conf /etc/paging.conf\n\n Configure, set-levels and unmute alsa/pulse, if necessary (depends heavily on\n the specific setup)::\n\n # alsamixer\n # nano /etc/pulse/default.pa\n\n Then edit config in ``/etc/paging.conf`` and start/enable the daemon::\n\n # nano /etc/paging.conf\n # systemctl start paging\n # systemctl enable paging\n\n See \"Usage\" section for more details on how to run the thing.\n\n Packages here are built with `install.debian_jessie.sh`_ script described in\n the next section.\n\n* Building/installing everything on-site with one script.\n\n It's possible to install all required packages, building missing ones where\n necessary by running `install.debian_jessie.sh`_ script from the repository as\n a root user (as it runs apt-get and such)::\n\n # wget https://raw.githubusercontent.com/AccelerateNetworks/PagingServer/master/setup-scripts/install.debian_jessie.sh\n # bash install.debian_jessie.sh -x\n\n (running without -x flag will issue a warning message and exit)\n\n It's safe to run the script several times or on a machine where some of the\n requirements (see the list above) are installed already - should skip steps\n that are already done or unnecessary.\n\n Script builds everything into deb packages, stores each in\n ``/var/tmp/PagingServer.debs``, and installs them.\n\n Also creates ``apt-get-installed.list`` file in the same directory, where\n every package name it has passed to apt-get (i.e. packages that it has\n installed via apt-get) is recorded, in case there might be a need to clean\n these up later.\n\n After successful installation, enable/run the service as described in \"Usage\" section.\n\n* Manual installation.\n\n Follow roughly same steps as what `install.debian_jessie.sh`_ script does.\n\n\n\nOther systems\n`````````````\n\nJust build/install all the requirements above from OS packages or however.\n\n\n\nAudio configuration\n-------------------\n\nOverview of the software stack related to audio flow:\n\n* PJSUA picks-up the calls, decoding audio streams from SIP connections.\n\n* PJSUA outputs call audio to via PortAudio_.\n\n* PortAudio can use multiple backends on linux systems, including:\n\n * ALSA_ libs (and straight down to linux kernel)\n * OSS (/dev/dsp*, only supported through emulation layer in modern kernels)\n * JACK sound server\n * PulseAudio_ sound server (through ALSA compatibility layer)\n\n In this particular implementation, PulseAudio backend is assumed.\n\n* PulseAudio serves as a \"hub\", receiving streams from music players (mpd_\n instances), klaxon sounds, calls picked-up by PJSUA.\n\n Depending on PulseAudio and music players' configuration, these outputs can be\n then mixed together and mapped to audio cards (or specific channels of these)\n as necessary.\n\n* PulseAudio outputs sound through ALSA libs and that goes to kernel driver and\n hardware, eventually.\n\n Here make sure that ALSA is also configured properly - sound hardware unmuted,\n volume level is set correctly and any other necessary mixer controls are set.\n\n This all is usually easy to do with \"alsamixer\" tool.\n\nWhole stack can always be tested with command like this::\n\n % paging --test-audio-file my-sound.wav\n\nThat option makes script just play the specified file through pjsua (as it would\noutput the sound of the incoming call or a klaxon sound) and exit.\n\nIf that works correctly, all that sound output pipeline from pjsua to alsa\nshould be fine.\n\n\nPagingServer audio configuration\n````````````````````````````````\n\nConfiguration here can be roughly divided into these sections (at the moment):\n\n\n* Sound output settings for PJSUA.\n\n Related configuration options:\n\n * pjsua-device\n * pjsua-conf-port\n\n As PortAudio (used by pjsua) can use one (and only one) of multiple backends\n at a time, and each of these backend can have multiple \"ports\" in turn,\n ``pjsua-device`` should be configured to use Pulse/ALSA backend \"device\".\n\n Usually when pulse is installed, \"pulse\" ALSA output gets configured, and that\n is what script uses by default, so no addition configuration should be\n necessary in that case.\n\n Otherwise, to see all devices that PJSUA and PortAudio detects, run::\n\n % paging --dump-pjsua-devices\n\n Detected sound devices:\n [0] HDA ATI SB: ID 440 Analog (hw:0,0)\n [1] HDA ATI SB: ID 440 Digital (hw:0,3)\n [2] HDA ATI HDMI: 0 (hw:1,3)\n [3] sysdefault\n [4] front\n [5] surround21\n [6] surround40\n ...\n [13] dmix\n [14] default\n [15] pulse\n [15] system\n [16] PulseAudio JACK Source\n\n (output is truncated, as it also includes misc info for each of these\n devices/ports that PortAudio/PJSUA provides)\n\n This should print a potentially-long list of \"playback devices\" (PJSUA\n terminology) that can be used for output there, as shown above.\n\n \"aplay -L\" command can also be used to match that with ALSA outputs.\n\n PortAudio-output should be specified either as numeric id (number in square\n brackets on the left) or regexp (python style) to match against name in the\n list via ``pjsua-device`` option.\n\n To avoid having any confusing non-ALSA (incl. pulse-alsa emulation) ports\n there, PortAudio can be compiled with only ALSA as a backend.\n\n ``pjsua-conf-port`` option can be used to match one of the \"conference ports\"\n from ``paging --dump-pjsua-conf-ports`` command output in the same fashion, if\n there will ever be more than one (due to more complex pjsua configuration, for\n example), otherwise it'll work fine with empty default.\n\n\n* Configuration for any non-call inputs (music, klaxons, etc) for pulse.\n\n Related configuration options:\n\n * klaxon\n * pulse-mute\n\n \"klaxon\" can be a path to any file that has sound in it (that ffmpeg would\n understand), and will be played before each announcement call gets picked-up.\n\n \"pulse-mute\" should be a regexp to match any sufficiently unique property of\n music streams, that would play in-between announcements.\n\n For example, if mpd_ player is used for music output, ``pulse-mute =\n ^application\\.name=mpd$`` setting should match and mute all running player\n instances as necessary.\n\n Script can be run with ``--debug --dump-pulse-props`` option to show\n properties of each PulseAudio stream, and info on when/whether they match\n ``pulse-mute`` option.\n\n See `paging.example.conf`_ for more detailed info on these options.\n\n\nAll settings mentioned here are located in the ``[audio]`` section of the\nconfiguration file.\n\nSee `paging.example.conf`_ for more detailed descriptons.\n\n\n\nMisc tips and tricks\n--------------------\n\nCollection of various things related to this project.\n\n\nPre-convert klaxon sound(s) to wav from any format\n``````````````````````````````````````````````````\n\nCan be done via ffmpeg_ with::\n\n ffmpeg -y -v 0 -i sample.mp3 -f wav sample.wav\n\nWhere it doesn't actually matter which format source \"sample.mp3\" is in - can be\nmp3, ogg, aac, mpc, mp4 or whatever else ffmpeg supports.\n\nMight help to avoid startup delays due to conversion of these on each run.\n\nIf pjsua will be complaining about sample-rate difference between wav file and\noutput, e.g. ``-ar 44100`` option can be used (after ``-f wav``) to have any\nsampling rate for the output file.\n\n\nBenchmark script (callram.py)\n`````````````````````````````\n\nDescription below is from old README.md file pretty much verbatim.\n\nWe've tested this script with thousands of calls, it is fairly reliable and\nlight on resources. Total CPU use on a Pentium 4 @ 2.8ghz hovered around 0.5%\nwith 4MB ram usage. identical figures were observed on a Celeron D @ 2.53Ghz,\nyou could probably get away with whatever your operating system requires to run\nin terms of hardware.\n\nTo benchmark, you'll need to set up callram.py.\n\n* Setting up callram.py\n\n This setup assumes you have PJSUA installed, if not, go back to Installation\n earlier in this readme and install it.\n\n* Put the files in the right places::\n\n sudo cp callram.py /opt/bin/callram.py\n sudo cp callram.example.conf /etc/callram.conf\n\n* Add your SIP account::\n\n sudo nano /etc/callram.conf\n\n Change the top 3 values to your SIP server, username (usually ext. number) and\n password.\n\n Then fill in both SIP URI: fields (uri= and to=) with the SIP URI of the\n client you'd like to test.\n\n SIP URIs are usually formatted as ``sip:@`` in\n most cases.\n\n The Domain may sometimes be an IPv4 or IPv6 address depending on your setup.\n\n* Run::\n\n /usr/bin/python /opt/bin/callram.py\n\n\nSending error reports to Sentry\n```````````````````````````````\n\nSentry_ is a \"modern error logging and aggregation platform\".\n\nPython raven_ module has to be installed in order for this to work.\n\nUncomment and/or set \"sentry_dsn\" option under the ``[server]`` section of the\nconfiguration file.\n\nIt can also be set via ``--sentry-dsn`` command-line option, e.g. in systemd\nunit distributed with the package, to apply on all setups where package is deployed.\n\n\n\nCopyright and License\n---------------------\n\n| Code and documentation copyright 2015 Accelerate Networks.\n| Code released under the GNU General Public License v2.0.\n| See LICENSE file in the repository for more details.\n| Docs released under Creative Commons.\n\n\n\n.. _PJSUA: http://www.pjsip.org/\n.. _PulseAudio: https://wiki.freedesktop.org/www/Software/PulseAudio/\n.. _ALSA: http://www.alsa-project.org/main/index.php/Main_Page\n.. _ini format: https://en.wikipedia.org/wiki/INI_file\n.. _paging.example.conf: https://github.com/AccelerateNetworks/PagingServer/blob/master/paging.example.conf\n.. _PortAudio: http://www.portaudio.com/\n.. _ffmpeg: http://ffmpeg.org/\n.. _systemctl(1) manpage: http://www.freedesktop.org/software/systemd/man/systemctl.html\n.. _mpd: http://musicpd.org/\n.. _Sentry: https://getsentry.com/\n.. _pip: http://pip-installer.org/\n.. _pip2014.com: http://pip2014.com/\n.. _python packaging tutorial: https://packaging.python.org/en/latest/installing.html\n.. _Python 2.7: http://python.org/\n.. _pulsectl python module: https://github.com/mk-fg/python-pulse-control\n.. _raven: https://pypi.python.org/pypi/raven/5.5.0\n.. _python-systemd: https://github.com/systemd/python-systemd\n.. _install.debian_jessie.sh: https://github.com/AccelerateNetworks/PagingServer/blob/master/setup-scripts/install.debian_jessie.sh\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/AccelerateNetworks/PagingServer", "keywords": "sip", "license": "GPL-2", "maintainer": "", "maintainer_email": "", "name": "PagingServer", "package_url": "https://pypi.org/project/PagingServer/", "platform": "", "project_url": "https://pypi.org/project/PagingServer/", "project_urls": { "Homepage": "https://github.com/AccelerateNetworks/PagingServer" }, "release_url": "https://pypi.org/project/PagingServer/19.5.2/", "requires_dist": null, "requires_python": "", "summary": "SIP-based Announcement / PA / Paging / Public Address Server system", "version": "19.5.2" }, "last_serial": 5339438, "releases": { "15.10.11": [ { "comment_text": "", "digests": { "md5": "cb1261c0378bf77610496e082bef996c", "sha256": "078fc1f6602791fc104dd3fca8ae248a655de3c889ca71d43318271a202e6e14" }, "downloads": -1, "filename": "PagingServer-15.10.11.tar.gz", "has_sig": true, "md5_digest": "cb1261c0378bf77610496e082bef996c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52201, "upload_time": "2015-10-10T20:30:47", "url": "https://files.pythonhosted.org/packages/76/8c/a3f0ce89d17f6ef0146e4d1a5ca15c35e38cebd2a9d13e7a2a498ab83d4f/PagingServer-15.10.11.tar.gz" } ], "15.10.14": [ { "comment_text": "", "digests": { "md5": "4a7756631e8b5b048512500000062e3a", "sha256": "1ef57ef26d25601949d9997bd17c060e95b0fbe8e1f269b221c1c7ab0f17c76d" }, "downloads": -1, "filename": "PagingServer-15.10.14.tar.gz", "has_sig": true, "md5_digest": "4a7756631e8b5b048512500000062e3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52559, "upload_time": "2015-10-12T17:12:25", "url": "https://files.pythonhosted.org/packages/f5/48/04c757a42431f07c8d8c1cd45af51d013d9156e75ba00ee0a522b788e86b/PagingServer-15.10.14.tar.gz" } ], "15.10.16": [ { "comment_text": "", "digests": { "md5": "03ef902c31bce892695d8da5df74cf11", "sha256": "4db7dd83893ab660457759c020264d8576ca085e5d4fb2666bcdd407bd3e34fa" }, "downloads": -1, "filename": "PagingServer-15.10.16.tar.gz", "has_sig": true, "md5_digest": "03ef902c31bce892695d8da5df74cf11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 52504, "upload_time": "2015-10-12T19:06:45", "url": "https://files.pythonhosted.org/packages/52/00/5a9695a657be7cabcad5038b2679765b23522947676c7121ecd670f29f8d/PagingServer-15.10.16.tar.gz" } ], "15.10.5": [ { "comment_text": "", "digests": { "md5": "52bc7a9c34e27f722cde9f132ba015d1", "sha256": "8dc672687f7c0deeb3a5ae70525d5e63b87d7562472a55660b77994559930399" }, "downloads": -1, "filename": "PagingServer-15.10.5.tar.gz", "has_sig": true, "md5_digest": "52bc7a9c34e27f722cde9f132ba015d1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48163, "upload_time": "2015-10-09T13:42:45", "url": "https://files.pythonhosted.org/packages/f6/50/75785e9e3bbfaaf7a0778d0485702f83f86c30eed91ed74625d2bfc68e4a/PagingServer-15.10.5.tar.gz" } ], "15.10.9": [ { "comment_text": "", "digests": { "md5": "c0795f5519fa532148c3ea76e43231cb", "sha256": "44c03fafb54465f5b130182135252a6f0fb84fd5c946e012932fc334410a597a" }, "downloads": -1, "filename": "PagingServer-15.10.9.tar.gz", "has_sig": true, "md5_digest": "c0795f5519fa532148c3ea76e43231cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 48169, "upload_time": "2015-10-09T14:36:12", "url": "https://files.pythonhosted.org/packages/c7/de/e3fb0a4b84dd065831a57f9bfeb9068e3fdb1493351dba7fcb23aad116cc/PagingServer-15.10.9.tar.gz" } ], "15.12.0": [ { "comment_text": "", "digests": { "md5": "a5bc0863952bac976abfd7b30ece7c47", "sha256": "98da3f1c5e0c285a0d42cd961f8c4630451a9cd7164bb32ba28f089dd069d4cc" }, "downloads": -1, "filename": "PagingServer-15.12.0.tar.gz", "has_sig": false, "md5_digest": "a5bc0863952bac976abfd7b30ece7c47", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53280, "upload_time": "2015-12-25T23:06:34", "url": "https://files.pythonhosted.org/packages/2c/69/e5b0f727f7c1817931a15c25e47604dab4b26d6d8e75cf10e665cf129053/PagingServer-15.12.0.tar.gz" } ], "15.12.15": [ { "comment_text": "", "digests": { "md5": "75b49381c27d03b2978bf2ed68846e41", "sha256": "51f0f13f47065d3e249eac03af496b595f5e7f144a219f38078e29bda2a31220" }, "downloads": -1, "filename": "PagingServer-15.12.15.tar.gz", "has_sig": false, "md5_digest": "75b49381c27d03b2978bf2ed68846e41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53582, "upload_time": "2015-12-30T20:36:38", "url": "https://files.pythonhosted.org/packages/6e/a3/0780ffe4f3937378305b9519c9f7e6715badb976d03f6937476ead35dd99/PagingServer-15.12.15.tar.gz" } ], "15.12.6": [ { "comment_text": "", "digests": { "md5": "bc5fc3f2b144541eda467c1c2a27ee7e", "sha256": "fda716ea12272a9965f75cc254e5151f8a224ee72d686bd2aad05c1424854599" }, "downloads": -1, "filename": "PagingServer-15.12.6.tar.gz", "has_sig": false, "md5_digest": "bc5fc3f2b144541eda467c1c2a27ee7e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53561, "upload_time": "2015-12-30T06:41:58", "url": "https://files.pythonhosted.org/packages/a5/84/0adfe476883826925eddc3070c80ff7698f38ff9b9b4349c6d6eaa4571c7/PagingServer-15.12.6.tar.gz" } ], "15.8.54": [ { "comment_text": "", "digests": { "md5": "52eee6eb55e5c0d19f0b333ae676fc4b", "sha256": "2868cfe45ab517080f3fc7c8f2595c1e1e7c7d6c3ea3462cd81da782945e758f" }, "downloads": -1, "filename": "PagingServer-15.8.54.tar.gz", "has_sig": true, "md5_digest": "52eee6eb55e5c0d19f0b333ae676fc4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10676, "upload_time": "2015-08-16T09:29:19", "url": "https://files.pythonhosted.org/packages/d4/2f/e266bb53a3071cfa88497632db4187fa03aa12f45e08db33593895366ed1/PagingServer-15.8.54.tar.gz" } ], "15.8.56": [ { "comment_text": "", "digests": { "md5": "75fd85cdd796f462ff2ba0834763a655", "sha256": "4ab02f85545700e18682a24fa43a0c394d5b35ea41fb17704d8aa528d34a06ac" }, "downloads": -1, "filename": "PagingServer-15.8.56.tar.gz", "has_sig": true, "md5_digest": "75fd85cdd796f462ff2ba0834763a655", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32120, "upload_time": "2015-08-16T09:39:29", "url": "https://files.pythonhosted.org/packages/d8/4f/06ccf7c6dfa94e5cc53aa8cde24f34dafc8b8ede8af52dfe936d8c429d0a/PagingServer-15.8.56.tar.gz" } ], "15.8.58": [ { "comment_text": "", "digests": { "md5": "95f0059d762a85df32c488b1357973bf", "sha256": "1810ba579ab4407fd831669f970f897beec28848c04e01d204aa484bab0a3998" }, "downloads": -1, "filename": "PagingServer-15.8.58.tar.gz", "has_sig": true, "md5_digest": "95f0059d762a85df32c488b1357973bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42881, "upload_time": "2015-08-16T11:33:10", "url": "https://files.pythonhosted.org/packages/fb/d7/cc61e08e12b3a54cf0a0e8e837cea5c2bc79e4f2b408d8eb4c07b81e6803/PagingServer-15.8.58.tar.gz" } ], "15.8.59": [], "15.8.61": [ { "comment_text": "", "digests": { "md5": "2fefda535f44b07b130e241d32b3ae73", "sha256": "56c9ef3e8bb75b477e544a22cd41348636185613eea55ccec2029f2ed3b30b26" }, "downloads": -1, "filename": "PagingServer-15.8.61.tar.gz", "has_sig": true, "md5_digest": "2fefda535f44b07b130e241d32b3ae73", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53736, "upload_time": "2015-08-16T16:09:50", "url": "https://files.pythonhosted.org/packages/13/65/206797391be7bd9baa96837d812c0dd200d0f48d6e71407c15969de41a11/PagingServer-15.8.61.tar.gz" } ], "15.8.62": [ { "comment_text": "", "digests": { "md5": "978632f3f187cd2c953f653b42f9265d", "sha256": "c430aa61a08372394b6df1aabb479741af90fd544ebb4f83ffaf4e37a2be86e8" }, "downloads": -1, "filename": "PagingServer-15.8.62.tar.gz", "has_sig": true, "md5_digest": "978632f3f187cd2c953f653b42f9265d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56457, "upload_time": "2015-08-16T17:22:27", "url": "https://files.pythonhosted.org/packages/dc/ce/39bef3133292d7537924ab9a1205ad64333eb27fa720b2c7b42e2e54da5f/PagingServer-15.8.62.tar.gz" } ], "15.8.66": [ { "comment_text": "", "digests": { "md5": "06e194c1ccea8ad846bafb745d56d2aa", "sha256": "1f9632c9282d7628542c4c5d5bf252c20bfe58bad08906ad2fa148b1c415a386" }, "downloads": -1, "filename": "PagingServer-15.8.66.tar.gz", "has_sig": true, "md5_digest": "06e194c1ccea8ad846bafb745d56d2aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56941, "upload_time": "2015-08-17T16:41:41", "url": "https://files.pythonhosted.org/packages/2d/fa/0c13bb522b3d9ce3bdb4fb9a93cec98fa2102e61a7e872f3350f0141aa1d/PagingServer-15.8.66.tar.gz" } ], "15.8.67": [ { "comment_text": "", "digests": { "md5": "bc7678257cc57b4f9408477a3c1e425f", "sha256": "edecccb46610e55dfa2433f14e16caeef9fed86cf563e30c7583c6702409b933" }, "downloads": -1, "filename": "PagingServer-15.8.67.tar.gz", "has_sig": true, "md5_digest": "bc7678257cc57b4f9408477a3c1e425f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57544, "upload_time": "2015-08-20T07:42:50", "url": "https://files.pythonhosted.org/packages/c4/6d/b2259a2b730025f358f5a9b3d66cffbdec18d6cb4cefcd7fd380f20d2eda/PagingServer-15.8.67.tar.gz" } ], "15.9.0": [ { "comment_text": "", "digests": { "md5": "086271e8399271d5f5eca3b26d0683ef", "sha256": "f1f6df3772e075e7bc2a2cf173fa3235be7a8ba3e1b10a34596accabdabc1259" }, "downloads": -1, "filename": "PagingServer-15.9.0.tar.gz", "has_sig": true, "md5_digest": "086271e8399271d5f5eca3b26d0683ef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35769, "upload_time": "2015-09-04T19:06:31", "url": "https://files.pythonhosted.org/packages/a1/3a/7953c7e431281aa90d94d0860827105b5cd0720260cfaba2abfe87ad0b71/PagingServer-15.9.0.tar.gz" } ], "15.9.5": [ { "comment_text": "", "digests": { "md5": "5e6a43b4a4a39502cc606c9b04ffdfd6", "sha256": "61d2103506398d620c1ec1b1140cc0dd04c76c219f4e30226bae05d5c5c09340" }, "downloads": -1, "filename": "PagingServer-15.9.5.tar.gz", "has_sig": true, "md5_digest": "5e6a43b4a4a39502cc606c9b04ffdfd6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44050, "upload_time": "2015-09-05T22:59:38", "url": "https://files.pythonhosted.org/packages/83/bb/a3b67588a4ff32d7bd1ee07fdb7096cf68545cfd308bc5e3ae8395ccb5c7/PagingServer-15.9.5.tar.gz" } ], "15.9.6": [ { "comment_text": "", "digests": { "md5": "230b02c279e94a6ba455e06dba7c0075", "sha256": "683ba787d2cda153b7ae204a88146c2235f72371fb424ce119cf3bce708c3cf4" }, "downloads": -1, "filename": "PagingServer-15.9.6.tar.gz", "has_sig": true, "md5_digest": "230b02c279e94a6ba455e06dba7c0075", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44299, "upload_time": "2015-09-05T23:13:01", "url": "https://files.pythonhosted.org/packages/3a/36/d8ff1ecd0aaf27634893798a87bcd0f00d49d8e4857a9ab430cf25800ff3/PagingServer-15.9.6.tar.gz" } ], "16.1.21": [ { "comment_text": "", "digests": { "md5": "b01b6f31a2a71cc9caf7a15997d9385c", "sha256": "8b63d4640836a019c659b3b15b3fdd93d09bff5422ea1282dc16cba2738a0a12" }, "downloads": -1, "filename": "PagingServer-16.1.21.tar.gz", "has_sig": false, "md5_digest": "b01b6f31a2a71cc9caf7a15997d9385c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22127, "upload_time": "2016-01-23T10:57:32", "url": "https://files.pythonhosted.org/packages/fd/5b/150cf7e00ea35c49872f52e9d3ea70af03ecbe0340569eeda5b3a340f1cd/PagingServer-16.1.21.tar.gz" } ], "16.1.28": [ { "comment_text": "", "digests": { "md5": "b405d8fee4096f2c87f5a7dfe247fe59", "sha256": "0ffb542ec21f7efb613867850e4980c2ecde028bf6839b62eac408833bbcf42c" }, "downloads": -1, "filename": "PagingServer-16.1.28.tar.gz", "has_sig": false, "md5_digest": "b405d8fee4096f2c87f5a7dfe247fe59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22084, "upload_time": "2016-01-23T22:10:39", "url": "https://files.pythonhosted.org/packages/6c/57/bc0fb6c23526c54330367fbde0f6ca209bf4c7b22e6817b1ac59f5f6c5a1/PagingServer-16.1.28.tar.gz" } ], "16.10.1": [ { "comment_text": "", "digests": { "md5": "9822d945d1cdc238e6bef8126971239c", "sha256": "ff19bd802842d09ab184036807a253276e4390eaed234963aaf8d4bdeced3be9" }, "downloads": -1, "filename": "PagingServer-16.10.1.tar.gz", "has_sig": false, "md5_digest": "9822d945d1cdc238e6bef8126971239c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24313, "upload_time": "2016-10-04T08:05:07", "url": "https://files.pythonhosted.org/packages/03/37/402b340299c8d47df5640e9ec603d6fcdf56a642280907681411a5d74177/PagingServer-16.10.1.tar.gz" } ], "16.4.4": [ { "comment_text": "", "digests": { "md5": "8664671ddc535b7db041289fadc495b3", "sha256": "f15e765f95eb237a36ecd6714888b337194058eb75c06e75c577bbb74c629a98" }, "downloads": -1, "filename": "PagingServer-16.4.4.tar.gz", "has_sig": false, "md5_digest": "8664671ddc535b7db041289fadc495b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24244, "upload_time": "2016-04-25T15:34:05", "url": "https://files.pythonhosted.org/packages/9d/be/2d5552a5814e6533f4f3e4d09fffbf721c4ae598bbe853cba92faed9fe98/PagingServer-16.4.4.tar.gz" } ], "16.4.5": [ { "comment_text": "", "digests": { "md5": "dba7a75ea0e62232b4c67cc2453bafa8", "sha256": "fbd0784908f90155ac804bfc6fc56cbffd18dbae4bc6e88665738a79b43319f2" }, "downloads": -1, "filename": "PagingServer-16.4.5.tar.gz", "has_sig": false, "md5_digest": "dba7a75ea0e62232b4c67cc2453bafa8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24210, "upload_time": "2016-04-26T06:27:12", "url": "https://files.pythonhosted.org/packages/e4/ff/4a08a02074ad272bd97e812afd07b0d458cb7197ebf9a43529e2837a2dc6/PagingServer-16.4.5.tar.gz" } ], "19.5.0": [ { "comment_text": "", "digests": { "md5": "238419a6bd46bb6c87f4b81d2745e442", "sha256": "38fad4dae72fbb14f3287b128f128c718177a85da58a56c8c03c86a1de5aa885" }, "downloads": -1, "filename": "PagingServer-19.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "238419a6bd46bb6c87f4b81d2745e442", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 28402, "upload_time": "2019-05-30T05:03:01", "url": "https://files.pythonhosted.org/packages/ab/24/fb38f7f67a9fc847fea3e0542e4861a6cc32cba7b76718edf5b4a0917836/PagingServer-19.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "80b659d33580c0197d639bdf1d27e0e0", "sha256": "73659b846d542f48811abc2ee004a784636071513d55e08ef6b05db98825a81a" }, "downloads": -1, "filename": "PagingServer-19.5.0.tar.gz", "has_sig": false, "md5_digest": "80b659d33580c0197d639bdf1d27e0e0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24586, "upload_time": "2019-05-30T05:02:58", "url": "https://files.pythonhosted.org/packages/b5/1b/fa1ddc925495731fef227b57efcdf87f325ed2182414780a621f98fb366c/PagingServer-19.5.0.tar.gz" } ], "19.5.1": [ { "comment_text": "", "digests": { "md5": "8cdbb87cefb9054a0bd9b267a5f71b0a", "sha256": "8f76c406e32e12a5b38be92eacd303601246ca957f96f83080ffee64739d67c9" }, "downloads": -1, "filename": "PagingServer-19.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "8cdbb87cefb9054a0bd9b267a5f71b0a", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 28467, "upload_time": "2019-05-30T05:35:28", "url": "https://files.pythonhosted.org/packages/73/d5/e632344b5eebfa752135d9f4c436273cac393734b904d5e589d146ae7dac/PagingServer-19.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cf109ed181e94aab33dcab3c264a724d", "sha256": "21cb5ddcbda7ced6076543f5abc0369c5729b97380d4559be84eb82c5d654b1a" }, "downloads": -1, "filename": "PagingServer-19.5.1.tar.gz", "has_sig": false, "md5_digest": "cf109ed181e94aab33dcab3c264a724d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24657, "upload_time": "2019-05-30T05:35:25", "url": "https://files.pythonhosted.org/packages/7b/3b/009977d422cbc62a6730108449a2e56f35773a632dbb10744f4b4c2af789/PagingServer-19.5.1.tar.gz" } ], "19.5.2": [ { "comment_text": "", "digests": { "md5": "efcb56741286a1b2e638b44eec136320", "sha256": "83f8595e6b3592a65c00ae22ebfefe6e898d017a0fe740977ad8d3e9cfd10b74" }, "downloads": -1, "filename": "PagingServer-19.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "efcb56741286a1b2e638b44eec136320", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 28469, "upload_time": "2019-05-30T20:26:09", "url": "https://files.pythonhosted.org/packages/b2/e0/2c55596b59652d024ef34964099940dd0c9642b25ca89df8602d955c7b7a/PagingServer-19.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49bc01327767d9d84f91daf26695dde3", "sha256": "af6ab6bbf7157bf56f8b52d6ee61d3ddc4435baa9f2b1c6bcba74322d24914f2" }, "downloads": -1, "filename": "PagingServer-19.5.2.tar.gz", "has_sig": false, "md5_digest": "49bc01327767d9d84f91daf26695dde3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24664, "upload_time": "2019-05-30T20:26:07", "url": "https://files.pythonhosted.org/packages/d1/a7/0ab7b74c3bb552f4d4f3068ecece286ebda102b93d4113c683e2902d5822/PagingServer-19.5.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "efcb56741286a1b2e638b44eec136320", "sha256": "83f8595e6b3592a65c00ae22ebfefe6e898d017a0fe740977ad8d3e9cfd10b74" }, "downloads": -1, "filename": "PagingServer-19.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "efcb56741286a1b2e638b44eec136320", "packagetype": "bdist_wheel", "python_version": "3.7", "requires_python": null, "size": 28469, "upload_time": "2019-05-30T20:26:09", "url": "https://files.pythonhosted.org/packages/b2/e0/2c55596b59652d024ef34964099940dd0c9642b25ca89df8602d955c7b7a/PagingServer-19.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "49bc01327767d9d84f91daf26695dde3", "sha256": "af6ab6bbf7157bf56f8b52d6ee61d3ddc4435baa9f2b1c6bcba74322d24914f2" }, "downloads": -1, "filename": "PagingServer-19.5.2.tar.gz", "has_sig": false, "md5_digest": "49bc01327767d9d84f91daf26695dde3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24664, "upload_time": "2019-05-30T20:26:07", "url": "https://files.pythonhosted.org/packages/d1/a7/0ab7b74c3bb552f4d4f3068ecece286ebda102b93d4113c683e2902d5822/PagingServer-19.5.2.tar.gz" } ] }