{ "info": { "author": "Graham Bell", "author_email": "g.bell@eaobservatory.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Programming Language :: Python", "Topic :: System :: Monitoring" ], "description": "Crab\n====\n\n.. startcrabintro\n\nCrab is a dashboard system for monitoring cron jobs, or other scheduled\ntasks. The Crab server receives messages when tasks start or finish,\nand displays the status of all of the tasks via a web interface. It\ncan also send notifications by email, for example to warn if a task\nfails, is missed or does not complete within its time-out period.\n\nTasks communicate with the Crab server by JSON messages sent by HTTP\nPUT requests. The finish message includes the status of the job,\nand any output from it. Further messages are used to import and\nexport the client's crontab, which the server uses to determine the\nintended schedule.\n\n.. endcrabintro\n.. startcrabinstall\n\nRequirements\n------------\n\nPackages\n~~~~~~~~\n\n* `crontab`_ (0.15 or newer)\n* `CherryPy`_ (`PyPI entry `__)\n* `Mako`_ (`PyPI entry `__)\n* `jQuery`_\n* `PyRSS2Gen`_ (optional)\n* `Font Awesome`_ (optional)\n* `ansi_up`_ (optional)\n* `MySQL Connector`_ (needed only if using a MySQL database)\n\n.. _`crontab`: http://pypi.python.org/pypi/crontab/\n.. _`CherryPy`: http://www.cherrypy.org/\n.. _`Mako`: http://www.makotemplates.org/\n.. _`jQuery`: http://jquery.com/\n.. _`PyRSS2Gen`: http://pypi.python.org/pypi/PyRSS2Gen/\n.. _`Font Awesome`: http://fortawesome.github.com/Font-Awesome\n.. _`ansi_up`: https://github.com/drudru/ansi_up\n.. _`MySQL Connector`: http://dev.mysql.com/downloads/connector/python/\n\nPython Version\n~~~~~~~~~~~~~~\n\nCrab server\n Has been tested on Python 2.6, 2.7 and 3.2.\n\nClient library and utilities\n Works with Python 2.4 in addition to the above versions (but\n may require the ``pytz`` and ``simplejson`` packages also to be\n installed).\n\nInstallation\n------------\n\nThe Crab server, clients and libraries can be installed as follows::\n\n python setup.py install\n\nIf necessary, the ``--install-data`` option can be used to configure\nthe location in which the templates (``templ``), resources (``res``)\nand example files (``doc``) should be installed.\n\nTo run Crab without installing it, and if any of the Python dependencies\nlisted above can not be installed, they can be symlinked into the ``lib``\ndirectory in the following locations::\n\n lib/PyRSS2Gen.py\n lib/cherrypy\n lib/crontab\n lib/mako\n\nThe jQuery JavaScript library should be copied or symlinked into\nCrab's ``res`` directory as::\n\n res/jquery.js\n\nTo use Font Awesome icons, copy or symlink its ``fonts`` directory into\nCrab's ``res`` directory, and also place its stylesheet inside\nthat subdirectory, giving::\n\n res/fonts/font-awesome.css\n res/fonts/fontawesome-webfont.*\n\nNote that Font Awesome is not backward compatible between major\nversion numbers. Crab now uses version 4 of Font Awesome.\n\nTo use ansi_up to interpret ANSI color commands in cron job output,\ncopy or symlink the ``ansi_up.js`` file into Crab's ``res`` directory::\n\n res/ansi_up.js\n\n.. endcrabinstall\n\nThe Crab Server\n---------------\n\n.. startcrabserver\n\nDatabase Creation\n~~~~~~~~~~~~~~~~~\n\nA SQLite database file can be prepared for Crab using the\nschema provided::\n\n % sqlite3 crab.db < doc/schema.sql\n\nAlternatively if you are going to be using MySQL for your\nCrab database, create the database::\n\n % mysqladmin -u root -p create crab\n\nand create a user account for crab, changing the password\n(the \"identified by\" clause) to something suitable::\n\n % mysql -u root -p mysql\n > create user 'crab'@'localhost' identified by 'crab';\n > grant all on crab.* to 'crab'@'localhost';\n > flush privileges;\n\nYou can prepare a table creation script suitable for MySQL\nusing the Makefile in the `doc` directory of the source package::\n\n % make -C doc schema_mysql.sql\n % mysql -u crab -p crab < doc/schema_mysql.sql\n\nConfiguration\n~~~~~~~~~~~~~\n\nThe Crab server is configured by a ``crabd.ini`` file which can\nbe placed either in ``/etc/crab/`` or ``~/.crab/``. Note that this\nis a CherryPy configuration file, which is read slightly differently to\ntypical ``.ini`` files which use Python's ConfigParser. ::\n\n % cp doc/crabd.ini ~/.crab/\n\nThe example ``crabd.ini`` file should be edited to uncomment the\n``[crab]`` and ``[store]`` sections. The ``home`` and ``file`` entries\nmust point to the location of Crab's data files and the database file\njust created. By default the data files are installed in ``share/crab``\nrelative to the Python system prefix (``sys.prefix``).\n\nThere is also an ``[outputstore]`` section in the server configuration\nfile. This allows the output from cron jobs and raw crontab files\nto be stored separately, and can be used to prevent the main\ndatabase from becoming excessively large.\n\nIf you would like to have Crab delete the history of job events over\na certain age, you can have it run a cleaning service by enabling the\n``[clean]`` section of the server configuration file. Here you can\nselect the cleaning schedule and length of history to keep. A fairly\nfrequent cleaning schedule is recommended to avoid the accumulation\nof a large number of old events so that each cleaning operation does\nnot take long. If the file output store is being used, the cleaning\nservice will remove only the event records and not the output\ntext. You can remove old output text separately, for example by running\nin your output store directory::\n\n % find output -type f -mtime +90 -delete\n % find output -type d -empty -delete\n\nRunning\n~~~~~~~\n\nThe Crab server is run as ``crabd``. When the server\nis executed directly, it will stay in the foreground::\n\n % crabd\n\nIt can also be run in the background with the ``crabd-check`` script,\nwhich checks that it is not still running from a previous invocation of\n``crabd-check``. Therefore this is suitable for running from cron\nto keep the server running::\n\n PYTHONPATH=/path/to/crab/lib\n PATH=/path/to/crab/scripts:/bin:/usr/bin\n 7-57/10 * * * * CRABIGNORE=yes crabd-check\n\nWith the server running, the Crab dashboard should be visible from\na web browser, by default on port 8000. The Crab clients will use this\nsame web service to communicate with the server.\n\nMigrating Job Information\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Crab server has the ability to export and import cron job information,\nincluding:\n\n* The list of cron jobs.\n* The configuration and notifications attached to each job.\n* General host/user-based notifications.\n* Raw crontabs.\n\nYou can write this information to a JSON file using the ``--export``\noption::\n\n % crabd --export job_information.json\n\nSimilarly you can read information with the ``--import`` option::\n\n % crabd --import job_information.json\n\nThis merges the information from the file with the server's existing\nconfiguration. You can also give a file name of ``-`` to export\nto standard output or read from standard input.\n\n.. endcrabserver\n\nMonitoring Cron Jobs\n--------------------\n\n.. startcrabclient\n\nThere are two Crab client commands: the ``crab`` utility, and\nthe ``crabsh`` wrapper shell. Cron jobs can either be run under\n``crabsh``, or they can be updated to report their own status\nto the Crab server.\n\nConfiguration\n~~~~~~~~~~~~~\n\nThe Crab clients are configured by a ``crab.ini`` file which can\nbe placed either in ``/etc/crab/`` or ``~/.crab/``. The file\nspecifies how to contact the Crab server, and the username and\nhostname which the client will use to report cron jobs. ::\n\n % cp doc/crab.ini ~/.crab/\n\nThe configuration can be checked with the ``crab info`` command.\nThis reports the settings, and indicates which configuration\nfiles were read. It is a useful way to check that everything\nis in order before importing a crontab.\n\nThe ``crabsh`` Wrapper\n~~~~~~~~~~~~~~~~~~~~~~\n\n``crabsh`` is a wrapper script designed to act like a shell. It can\ntherefore be invoked by cron via the ``SHELL`` variable, for example::\n\n PYTHONPATH=/path/to/crab/lib\n SHELL=/path/to/crab/scripts/crabsh\n 0 10 * * 1-5 CRABID=test echo \"Test cron job\"\n\nWhere the rules following the ``SHELL`` assignment will be run with the\nwrapper. The ``PYTHONPATH`` will need to be set if Crab is not installed\nwhere the system can find it. Cron requires the full path when\nspecifying the ``SHELL``. The ``CRABID`` parameter is used to\ngive the cron job a convenient and unique name. This is optional,\nunless there are multiple jobs with the same command,\nin which case they would otherwise be indistinguishable.\nHowever if it specified, then it must be unique for a given\nhost and user, as the Crab server will use it in preference\nto the command string to identify cron job reports.\n\n``crabsh`` will notify the server when the job starts, and when it finishes,\nassuming it succeeded if the exit status was zero.\n\nCrab-aware Cron Jobs\n~~~~~~~~~~~~~~~~~~~~\n\nAlternatively a cron job can report its own status to the Crab server.\nThe most straightforward way to do this is to execute the ``crab``\nutility. So a cron job written as a shell script could include\ncommands such as::\n\n % crab start -c \"$0\"\n % crab finish -c \"$0\"\n % crab fail -c \"$0\"\n\nIn this way you can also report a warning with ``crab warning`` or an\nunknown status with ``crab unknown``.\n\nPython\n If the cron job is written in Python, it could import ``crab.client``\n directly and make use of the ``CrabClient`` class.\n\nPerl\n A Perl module `WWW::Crab::Client`_ is also available.\n\n.. _`WWW::Crab::Client`: http://search.cpan.org/perldoc?WWW::Crab::Client\n\nOther languages\n Other language libraries could be written. They would need to make\n HTTP PUT requests with an appropriate JSON message.\n\nManaging the Cron Job List\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe Crab server needs to be given the schedule for each job so that it\ncan detect when a job is late or missed. This is done by \"importing\"\na user's crontab file::\n\n % crab import\n\nThe database entries can then be checked by \"exporting\" them,\nagain using the ``crab`` utility::\n\n % crab export\n > CRON_TZ=Pacific/Honolulu\n > 0 10 * * 1-5 CRABID=test echo \"Test cron job\"\n\nThe output is a set of crontab-style lines representing the entries\nfrom the database. The crontab can be retrieved exactly as last imported\n(from a separate database table containing the raw crontab) by giving\nthe ``--raw`` option as follows::\n\n % crab export --raw\n\nThis is useful as a backup in case a crontab is accidentally lost.\nHowever it will not contain any new jobs which have been added automatically\nby the Crab server since the last import.\n\nCron Job Parameters\n~~~~~~~~~~~~~~~~~~~\n\nIn order to specify the Crab specific parameters of a cron job,\nBourne-style shell variables at the start of a command are used.\nThe syntax for each cron job is as follows::\n\n [CRABIGNORE=yes] [CRABID=] \n\nA command starting with CRABIGNORE set to a value other than\n0/no/off/false will be ignored when importing a crontab,\nand ``crabsh`` will not report its status to the Crab server.\n\nA CRABID specification will override any CRABID environment variable\nin effect, and is a better way of specifying the identifier as it\ncan not apply to more than one cron job. There should not be multiple\njobs with the same identifier for any user and host.\n\nThe Crab parameters can be placed in any order before the remainder of the\ncommand string, but they must precede any other variables.\n\nEnvironment Variables\n~~~~~~~~~~~~~~~~~~~~~\n\nCRABECHO\n If present and not set to 0/no/off/false then ``crabsh`` will print out\n the standard output and standard error it receives from the cron job.\n This allows the output to be sent by email via cron's default\n behavior as well as being captured by the Crab system.\n\nCRABHOME\n If present overrides the Crab server home directory, where the\n ``res`` and ``templ`` directories are to be found.\n\nCRABHOST\n Specifies the Crab server to which clients should connect, overriding\n the setting in the configuration file.\n\nCRABID\n Specifies the job identifier which ``crabsh`` will use to file reports\n if there is no ``CRABID=`` variable at the start of the cron command.\n This should be used with caution to avoid specifying the same\n identifier for multiple cron jobs.\n\nCRABIGNORE\n Prevents Crab from acting on specific cron jobs. Jobs imported\n with this value present and not set to 0/no/off/false will not\n be entered into the database. Additionally if the ``crabsh``\n wrapper script is used to run such a job, it will not report its\n status to the Crab server.\n\nCRABPIDFILE\n Gives the path to a PID file which ``crabsh`` should use to control\n the execution of a cron job. When this parameter is set, it will\n use the file to try not to run multiple copies of the job at the\n same time. Each job should have a separate PID file, so this\n parameter is most conveniently given at the start of a command string.\n\nCRABPORT\n Specifies the port on the Crab server, overriding the setting in the\n configuration file.\n\nCRABSHELL\n The shell which ``crabsh`` will use to invoke the cron job command.\n Defaults to ``/bin/sh`` regardless of the user's shell to replicate\n cron's behavior.\n\nCRABSYSCONFIG\n The directory to be searched for system-level configuration files.\n If not set, then /etc/crab will be used.\n\nCRABUSERCONFIG\n A directory to search for user-level configuration files. If not\n set then ~/.crab will be used.\n\nCRON_TZ\n Cron reads this variable to know in which timezone to interpret\n the crontab schedule. When the server receives a crontab,\n it will check for this timezone and use it to override the\n general timezone which the ``crab`` utility will send with\n the crontab (if it is able to determine it).\n\nMAILTO\n Configures the email address to which cron sends email. This is\n useful when ``CRABECHO`` is on, or if ``crabsh`` needs to report\n a failure to contact the Crab server.\n\nSHELL\n Cron uses this variable to select the shell which will be used\n to execute the cron jobs. The full path must be specified.\n Crab does not use this variable itself.\n\nTZ\n This can be set to the system timezone, in which case ``crab import``\n will use it as the default timezone for the crontab.\n\n\n.. endcrabclient\n.. startcrabweb\n\nThe Web Interface\n-----------------\n\nThe Crab dashboard allows the status of the jobs to be monitored.\nOn this page, the job status column will change color to indicate\nthe status, and it will flash while the job is running. Clicking\non the status will lead to the most recent output recorded for\nthe job.\n\nThe host and user columns contain links leading to a summary page\nof the cron jobs for a given user or host. From this page,\nthe links below each table can be used to show deleted jobs,\nand to display the raw crontab as last imported.\n\nClicking on a job ID or command link leads to the job information\npage, giving a summary of the job's parameters and a table of the\nmost recent events. Clicking the status of any job finish\nevent leads to the corresponding output.\n\nJob Configuration\n~~~~~~~~~~~~~~~~~\n\nBelow the summary on the job information page, there is a link\nallowing the job's configuration to be edited.\nIf a job is deleted, then its configuration is considered to be\norphaned. In this case, when configuring a job for which\nno configuration exists, the system will offer a list of\norphaned configurations for re-linking. This should be used\nwhen the job is actually the continuation of a previous job.\nNote that notifications which are attached to specific jobs\nare linked via the configuration. Therefore re-linking the\nconfiguration will re-attach all associated notifications.\n\nHowever this problem can generally be avoided by giving the jobs\nsuitable names via the ``CRABID`` parameter. Crab will then be able\nto recognize jobs by name even if the command string changes.\n\nThe grace period\nspecifies how close to the scheduled time the job must start\nin order not to be considered missed. The time-out is the\nmaximum expected duration of the job. If it runs for longer\nthan this, it will be marked as stopped with timed-out (error) status.\nNote that the job may actually still be running when this status is\ndisplayed. If the job is restarted, or reported as already running,\nduring the time-out period, then the time-out is reset.\nIf either of these timing parameters are left blank then the default\nvalues of 2 minutes grace period and 5 minutes time-out will be used.\n\nRegular expression patterns used to determine success or failure\nand to identify warnings can be given. These patterns are compared\nto the standard output and standard error of the job when it finishes,\nbut do not override a more severe status. For example if a job is reported\nas finishing with failure, then it will be logged as such even\nif the success or warning patterns match. If none of the patterns\nmatch then the status is logged as it was reported, unless a\nsuccess pattern was defined. If the success pattern does not match\nthen the status will be failure if the was no failure pattern\nor unknown if there was a failure pattern which did not match.\n\nThe \"Inhibit execution\" checkbox can be use to temporarily\nrequest that a job not be run. This setting is stored in\nthe Crab server and passed to the client when it reports\nthat a job is being started. Note that there is no guarantee\nthat the job will not be run while this option is selected: the\nclient could fail to connect to the server before\nstarting the job, or it could choose to ignore the\ninhibit setting. The ``crabsh`` wrapper shell reads a\nconfiguration parameter ``allow_inhibit`` from the ``crabsh``\nsection of the ``cran.ini`` file to determine whether\ninhibit requests should be honored. (The default value\nis true, i.e. it will not run the job if it receives the\ninhibit flag in response to its job starting message.)\n\nThe job configuration page also allows jobs to be marked as deleted.\nNormally this would be done by importing a new crontab without that\njob in it, but having this available on the web interface is useful\nin situations such as the host being inaccessible. Note that\nif a start or finish event is received from the job, but the\nCrab server is still able to identify it, then the job\nshould be automatically marked as not deleted.\n\nThere is also the option to alter the job identifier. However\ncare must be taken to also update it in the job itself, for\nexample via the ``CRABID`` parameter in the crontab. If the\nidentifier is changed via the web server but not in the job,\nthen the Crab server will identify it as a new job the next time it\nreceives a start or finish report from it.\n\nNotifications\n~~~~~~~~~~~~~\n\nCrab includes a configurable notifications system, which currently\nsupports sending notification messages by email. Notifications\ncan either be attached to a specific job, or configured\nby host name and/or by user name.\n\nA link below the summary on the job information page allows\nnotifications to be attached to that job. Check-boxes\nfor each notification can be used to select which\nseverity of events should be featured, and whether the job\noutput should be included. The schedule box should contain\na cron-style schedule specification (e.g. ``0 12 * * *``),\nand if left blank, will default to the value given in the\n``crabd.ini`` file, allowing all notification schedules to be\nmanaged in one place. Notifications will only be sent if there\nare relevant events, so it is possible to request\nalmost-immediate error warnings by including a schedule of\n``* * * * *`` and selecting errors only.\n\nThe add and delete links can be used to\nadd and remove notifications, but the changes are not saved\nuntil the ``Configure`` button is clicked.\n\nThe drop-down menu which appears when the mouse is positioned\nover the Crab heading at the top of each page includes a link to\nthe main notifications page. This allows notifications to be\nconfigured by host name and/or by user name. Notifications\nwill include any jobs where the host and user match the specified\nvalues, but if either is left blank, then it will match all entries.\n\nAdditional Job Actions\n~~~~~~~~~~~~~~~~~~~~~~\n\nDepending on the state of a job, additional links may appear\nbelow the summary on the job information page.\nThese are:\n\n* \"Clear status\": this appears when the job is in a warning or\n error state.\n Selecting this option sets the job state to \"Cleared\",\n which you can use to acknowledge the problem.\n The job's status will then be shown in green on the dashboard.\n\n* \"Resume inhibited job\": this appears when the inhibit setting\n has been selected on the job configuration page.\n The link provides a convenient means of removing the\n inhibit setting.\n\n.. endcrabweb\n\nScreenshots\n~~~~~~~~~~~\n\n* The dashboard page:\n\n .. image:: http://grahambell.github.io/crab/img/screenshot-dashboard.png\n\n* View of cron jobs by host:\n\n .. image:: http://grahambell.github.io/crab/img/screenshot-host.png\n\n* Information page for a cron job:\n\n .. image:: http://grahambell.github.io/crab/img/screenshot-job.png\n\nCopyright\n---------\n\n| Copyright (C) 2012-2014 Science and Technology Facilities Council.\n| Copyright (C) 2015-2016 East Asian Observatory.\n\nCrab is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with Crab. If not, see .\n\nAdditional Links\n----------------\n\n* `Crab entry on PyPI `_\n* `Documentation at Read the Docs `_\n* `Repository at GitHub `_\n* `ADASS article about Crab `_", "description_content_type": null, "docs_url": null, "download_url": null, "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/grahambell/crab", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "crab", "package_url": "https://pypi.org/project/crab/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/crab/", "project_urls": { "Homepage": "http://github.com/grahambell/crab" }, "release_url": "https://pypi.org/project/crab/0.5.0/", "requires_dist": null, "requires_python": null, "summary": "Cron alert board", "version": "0.5.0" }, "last_serial": 2015108, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "93c35f382daeb548bd5b7586487c4bd7", "sha256": "e36a3e0bd04f0548a5f6a6c4e8a2275214add985e5f0b50b3ce74b57e56f4619" }, "downloads": -1, "filename": "crab-0.1.0.tar.gz", "has_sig": false, "md5_digest": "93c35f382daeb548bd5b7586487c4bd7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56669, "upload_time": "2012-10-05T18:54:59", "url": "https://files.pythonhosted.org/packages/1a/18/8f99c9be524b0498d05c6691a25128ef265f2caea116b76c1085bd76e088/crab-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f72e5014602cd60d00a93dd1c0edad79", "sha256": "9a044fadaf704efa831102e29c0aefb300194afe853ae94ab3ad1c212687476d" }, "downloads": -1, "filename": "crab-0.2.0.tar.gz", "has_sig": false, "md5_digest": "f72e5014602cd60d00a93dd1c0edad79", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 60690, "upload_time": "2012-10-17T22:42:03", "url": "https://files.pythonhosted.org/packages/56/d7/efcd07c5da3106ff4432fd234909569954f66eec1e8e2f2e32d05aaf7776/crab-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4cf07bf8e602d60f37229acf57b5bdf0", "sha256": "43562052806414c9d37d1d380b4ad0c20491260b978eda51142bee24b9b289f2" }, "downloads": -1, "filename": "crab-0.3.0.tar.gz", "has_sig": false, "md5_digest": "4cf07bf8e602d60f37229acf57b5bdf0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63793, "upload_time": "2013-03-29T01:01:50", "url": "https://files.pythonhosted.org/packages/87/8e/dd3bb52bc359178276c9bf3b3d08f19e55e8dda35171cad736e1868f250e/crab-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "791207a10076ddbb0be04e144219143a", "sha256": "fc4e27b09228e4c756c32f474000263071da67b68daacd93d947814011cc6487" }, "downloads": -1, "filename": "crab-0.4.0.tar.gz", "has_sig": false, "md5_digest": "791207a10076ddbb0be04e144219143a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66509, "upload_time": "2013-08-30T00:30:16", "url": "https://files.pythonhosted.org/packages/e8/58/3a0be4f4ef4cf7568307d0b9634ffca1bb70e2f1ad96f37145d6853043dd/crab-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "be261eb1e59723ba5f25edf41feb89c4", "sha256": "6a33514ca61c18fd547bbe5687cd636f58f2d214a698fbe91cac2c10cef68a0b" }, "downloads": -1, "filename": "crab-0.4.1.tar.gz", "has_sig": false, "md5_digest": "be261eb1e59723ba5f25edf41feb89c4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66571, "upload_time": "2013-09-04T19:48:51", "url": "https://files.pythonhosted.org/packages/e1/61/1c54830e1cb4aee169bf439b57881f9fb3b41f450137b707a79e03704bdb/crab-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "a3283eb90d02cf80006177fd4f070c66", "sha256": "246a36cc22da843e76a1fdf1955c48d3acfc5e18e94c7a9317e9a42f28a6fc91" }, "downloads": -1, "filename": "crab-0.4.2.tar.gz", "has_sig": false, "md5_digest": "a3283eb90d02cf80006177fd4f070c66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67500, "upload_time": "2014-02-22T01:11:54", "url": "https://files.pythonhosted.org/packages/79/22/3177eb5468bcbb42d0427f6bc83ee90b8a678fcb9789d09ec7925a5946a5/crab-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "5ba9929c3803768d4ce66c5962d9486b", "sha256": "6471f9963e61e2d67b7e1f4dff60dbdf5199a83ebbd3951782be32f413695c57" }, "downloads": -1, "filename": "crab-0.5.0.tar.gz", "has_sig": false, "md5_digest": "5ba9929c3803768d4ce66c5962d9486b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80877, "upload_time": "2016-01-27T21:50:15", "url": "https://files.pythonhosted.org/packages/3d/22/b86638693dd458b0e19243cd2d1180045ef88d3838d8353226afa2c6115e/crab-0.5.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5ba9929c3803768d4ce66c5962d9486b", "sha256": "6471f9963e61e2d67b7e1f4dff60dbdf5199a83ebbd3951782be32f413695c57" }, "downloads": -1, "filename": "crab-0.5.0.tar.gz", "has_sig": false, "md5_digest": "5ba9929c3803768d4ce66c5962d9486b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80877, "upload_time": "2016-01-27T21:50:15", "url": "https://files.pythonhosted.org/packages/3d/22/b86638693dd458b0e19243cd2d1180045ef88d3838d8353226afa2c6115e/crab-0.5.0.tar.gz" } ] }