{ "info": { "author": "George Punter", "author_email": "info@bboxx.co.uk", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n

CatOps

\n\nHighly trained cats for managing servers.\n\n![Dedicated server support agent.](https://github.com/BBOXX/CatOps/blob/master/docs/catops.jpg)\n\n## What is CatOps\n\nCatOps is a very simple NoOps framework for deploying your own ChatOps bot.\n\nCommands you wish to add to your CatOps implementation are added to a `plugins`\nfolder in the same directory, and will then be automatically imported and callable\nusing the function name.\n\n## Why CatOps\n\n- NoOps.\n - Deploy, rewrite, and redeploy FaaS easily with no worrying about setting up and managing servers.\n - Only charged when CatOps is called.\n\n- Codify common maintenance procedures.\n - Perform high level actions without intimate low level knowledge.\n - Prevent errors doing complicated but routine tasks. \n\n- Unify documentation.\n - CatOps can act as a unified go-to location for help, merging/pooling all documentation into one place.\n\n- Transparency.\n - Team members can see all actions taken by others in solving a problem. Organic learning.\n - No 'go-to' person for certain maintenance tasks.\n - Everyone aware of server changes. No-one surprised that the server is down if they see `/meow restart server` in the chat.\n - Spread knowledge; everyone becomes equally capable of solving problems.\n - Out of date help messages or documentation is more obvious to everyone.\n\n- Context-aware suggestions, suggest actions and display help depending on context.\n - Docs/procedures/etc are useful, but can be too much to read through, hard to find, not up to date. \n - Reduce clutter when trying to figure out next actions. \n\n- Reduce context switching.\n - No need for bash, Linux, ssh or VPN to fix most server issues.\n - No checking server logs.\n - Easily accesible and readble output.\n\n- Control access.\n - Only gives necessary access, no unnecessary ssh-ing into production!\n\n## Features\n\n- Completely NoOps. \n- Easily extensible.\n- Pay per invocation.\n- Provider agnostic.\n\n## Quick Start\n\n1. Install catops `pip install catops`\n2. Run `meow install [--template] [--target-dir]`\n3. Adjust the template according to your needs e.g. add Slack OAuth tokens, adjust service names etc.\n4. Install serverless dependencies `npm install` in the template directory.\n5. Run `serverless deploy`\n6. Configure your Slack app (i.e. set Slash command/Bot endpoint URLs to appropriate URLs)\n\n## Example\n\n### Handler\n\nEvery Lambda function needs a handler, which takes arguments `(event, context)`. In this case, it is necessary to respond instantly to the request with a `200` so the handler below calls the actual functionality asynchronously and then returns a `200` response.\n\n#### Example Handler\n\n```python handler.py\nimport json\nfrom six.moves.urllib.parse import parse_qs\nimport requests\nimport boto3\nfrom catops import convert_dispatch\n\n\ndef respond(event, context):\n \"\"\"Call handler.main asynchronously and then return instant response.\"\"\"\n lambda_client = boto3.client('lambda')\n response = {'statusCode':'200'}\n # Call actual function asynchronously\n lambda_client.invoke(\n FunctionName='CatOps-dev-dispatcher',\n InvocationType='Event',\n Payload=json.dumps(event))\n return response\n\n\ndef main(event, context):\n \"\"\"Main lamda function logic, to be called asynchronously.\"\"\"\n params = parse_qs(event.get('body'))\n payload = convert_dispatch(params)\n username = params.get('user_name', ['catops'])[0] \n\n # Post to Slack channel\n response_url = params.get('response_url')\n if type(response_url) is list:\n response_url = response_url[0]\n r = requests.post(response_url, data=json.dumps(payload))\n if not r.ok:\n print(r)\n print(r.reason)\n print(r.text)\n return\n```\n\n### Plugins\n\nCatOps works around plugins.\n\n- Plugins are python files stored in the 'plugins/' directory.\n- CatOps scans this directory for valid functions to import.\n- All files and/or functions starting with `_` are ignored. (`_` means they are private and will not be added to the CatOps dispatcher)\n- Other functions are added to the CatOps dispatcher and can be called via `/catops [argv]`\n- All functions need to have the arguments `(argv, params)`\n - argv will contain the arguments passed to the function e.g. for `/catops role --user t.user`, argv will contain `['role', '--user', 't.user']\n - params will contain the parse Lambda event body, which contains all the information from Slack e.g. `{\"text\": ... , \"username\": ..., \"response_url\": ...}`.\n\n#### Example plugin\n\n```python plugins/example.py\n\"\"\"example.py - example plugin for ChatOps.\"\"\"\nfrom catops import create_slack_payload\n\ndef ping(argv, params):\n \"\"\"Check is working.\"\"\"\n text = '@{} Meow!'.format(params.get('user_name', ['CatOps'])[0]),\n return create_slack_payload(text=text)\n```\n\n### Serverless configuration\n\n```yaml serverless.yml\nservice: CatOps\n\npackage:\n include:\n - handler.py\n - plugins/**\n\ncustom:\n pythonRequirements:\n slim: true\n\nprovider:\n name: aws\n stage: ${opt:stage, 'dev'}\n runtime: python3.6\n profile: serverless\n # Permissions for the lambda function\n # If using boto3, ensure correct permissions\n # have been granted to the lambda function\n iamRoleStatements:\n - Effect: Allow\n Action:\n - lambda:InvokeFunction\n - lambda:InvokeAsync\n Resource: \"*\"\n\nfunctions:\n dispatcher:\n handler: handler.main\n respond:\n handler: handler.respond\n events:\n - http:\n path: ping\n method: post\n\nplugins:\n - serverless-python-requirements\n```\n\n### Deploy and Test\n\n```bash\nserverless deploy\nserverless invoke --function dispatcher --path /path/to/json/data --log\n```\n\nSee [examples](https://github.com/BBOXX/CatOps/tree/master/examples) and [templates](https://github.com/BBOXX/CatOps/tree/master/catops/templates) for more.\n\n## Useful functions\n\n```python\n# auth.py\ndef verify_request(event, slack_secret, timeout=True):\n \"\"\"Verify that Lambda event came from Slack\"\"\"\n\ndef get_user_slack(event, oauth, team_id=None, channel_id=None):\n \"\"\"Check whether user exists and is in specified team and channel.\n\n Arguments:\n event - AWS Lambda event\n oauth - Slack OAUTH token\n team_id - Slack team_id (workspace, i.e. BBOXX)\n channel_id - Channel user must be in\n Returns:\n False, err_msg\n True, user_dict with id, name, team_id, channel_id, email\n \"\"\"\n\n# dispatcher.py\ndef dispatch(command, params=None, plugin_dir='plugins/'):\n \"\"\"Create Dispatcher object and run parse_command on (command, params)\"\"\"\n\n# helpers.py\ndef get_slack_colour(level):\n \"\"\"Return Slack colour value based on log level.\"\"\"\n\ndef get_text(params):\n \"\"\"Return event_text from parse_qs event.get('body').\"\"\"\n\ndef create_slack_attachment(fallback=None,\n color=None,\n pretext=None,\n author_name=None,\n author_link=None,\n author_icon=None,\n title=None,\n title_link=None,\n text=None,\n fields=None,\n image_url=None,\n thumb_url=None,\n footer=None,\n footer_icon=None,\n ts=None\n ):\n \"\"\"Create slack attachment payload\n See https://api.slack.com/docs/message-attachments for more info.\n\n Arguments:\n fallback - Required plain-text summary of the attachment\n [color] - Colour of the attachment\n [pretext] - Optional text that appears above the attachment block\n [author_name]\n [author_link]\n [author_icon] - URL to author icon\n [title] - Title of the attachment\n [title_link]\n [text] - Optional text that appears inside the attachment\n [fields] - Array of dicts containing more values\n [image_url] - URL to image attached\n [thumb_url] - URL to image thumbnail\n [footer] - Footer message\n [footer_icon] - URL to footer icon\n [ts] - timestamp\n \"\"\"\n\ndef create_slack_payload(response_type='ephemeral', text=\"\", attachments=None):\n \"\"\"Create a Slack payload formatted correctly.\"\"\"\n\ndef convert_dispatch(params, convert_function=None, plugin_dir='plugins/'):\n \"\"\"Call dispatch and convert the output accordingly into a payload.\"\"\"\n\n# slack_handler.py\n\nclass SlackHandler(logging.Handler):\n \"\"\"Logger slack_handler which posts json log body to lambda_url.\"\"\"\n\n# install.py\n\ndef install(argv=None):\n \"\"\"Install catops serverless Slack template.\"\"\"\n\n# parser.py \nclass ArgumentParserError(Exception):\n \"\"\"Error raised by ArgumentParser\"\"\"\n pass\n\n\nclass CatParser(argparse.ArgumentParser):\n \"\"\"Overrides error method to throw an error instead of exiting\"\"\"\n def error(self, message):\n raise ArgumentParserError(message)\n\n```\n\n## Installation\n\n```bash\nsudo apt-get install npm\nsudo npm install -g serverless\nnpm install serverless-python-requirements\npip install catops\n```\n\nInstall `serverless-python-requirements` in the same dir as `serverless.yml`.\n\n## Limitations\n\n- Passive rather than active; needs to be triggered (e.g. by Slack slash commands (could run it every command))\n- Limitations of FaaS\n - Max size (256MB for AWS Lambda)\n - Execution time limit (5 minute for AWS Lambda)\n - No state (recommend using a cloud-based database for state e.g. DynamoDB for AWS)\n- No autocomplete inside of Slack.\n\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bboxx/CatOps", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "catops", "package_url": "https://pypi.org/project/catops/", "platform": "", "project_url": "https://pypi.org/project/catops/", "project_urls": { "Homepage": "https://github.com/bboxx/CatOps" }, "release_url": "https://pypi.org/project/catops/1.0.0/", "requires_dist": [ "requests", "six", "slacker" ], "requires_python": ">=2.7.0", "summary": "Highly trained cats for managing servers.", "version": "1.0.0" }, "last_serial": 4196668, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "50b428e964d89b5c267965c4432dbf3d", "sha256": "b233ebc2bd085f3bfe79c28ca654b94cf844d5abba2a8fefb90e9a062e2fd2a6" }, "downloads": -1, "filename": "catops-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "50b428e964d89b5c267965c4432dbf3d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 5883, "upload_time": "2018-07-11T13:06:21", "url": "https://files.pythonhosted.org/packages/4c/b3/9ef8e55b8bc7e281e8f509de381a4807bf5adc8b9e42a87b1610d72e2428/catops-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2f3d78cae2a215ddf41021d775d9891a", "sha256": "6280d6e5f49255ad99e2421aaac470dd69c40955d0642ded886b2a906a4c5f72" }, "downloads": -1, "filename": "catops-0.0.1.tar.gz", "has_sig": false, "md5_digest": "2f3d78cae2a215ddf41021d775d9891a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 6149, "upload_time": "2018-07-11T13:06:23", "url": "https://files.pythonhosted.org/packages/7f/cf/ad4b2d9edca2123ab0479ffc95d94e153b5f68ce264d4f5f1f52c4d471ad/catops-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "c2724ce8d0cafb341e149ea906f70668", "sha256": "3aeaa68cf25d7ba14446bf290faebeeef1dc46b06cd64217499236c8a006d9b7" }, "downloads": -1, "filename": "catops-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c2724ce8d0cafb341e149ea906f70668", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6669, "upload_time": "2018-07-12T11:11:36", "url": "https://files.pythonhosted.org/packages/6d/cc/40c1577111e53878076607d896e9e63c09e5e2d9242229301886d0ccce86/catops-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "22bfa90b1b27068609c0aaefedfe9682", "sha256": "48cc8dffdcc7c19fb9d8ae732be3e8772457cb4e4dfce0b04ea92d5d343b9292" }, "downloads": -1, "filename": "catops-0.0.2.tar.gz", "has_sig": false, "md5_digest": "22bfa90b1b27068609c0aaefedfe9682", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7038, "upload_time": "2018-07-12T11:11:38", "url": "https://files.pythonhosted.org/packages/4c/6d/1d0034eef7160816e08d2ff1c091ab7419875dce49d300bac485ebeff016/catops-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "1334d08a61079af4145649ee54daf6b5", "sha256": "0b4465fba2de4822c5145c22e32d34c9d0a4d16bbe0132986962b22992609f1f" }, "downloads": -1, "filename": "catops-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1334d08a61079af4145649ee54daf6b5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6671, "upload_time": "2018-07-12T11:12:49", "url": "https://files.pythonhosted.org/packages/99/90/1f89ecf8993247c0c9417dbf3affe7a9f6d78251659b23c14c6447d255c0/catops-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "39d3c9010cf54aba77296c05446b1ca2", "sha256": "dd7fa4762fb4144da36495618774f53eed4665641d5767b4b25403e01e37b4e0" }, "downloads": -1, "filename": "catops-0.0.3.tar.gz", "has_sig": false, "md5_digest": "39d3c9010cf54aba77296c05446b1ca2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7037, "upload_time": "2018-07-12T11:12:50", "url": "https://files.pythonhosted.org/packages/60/a2/f12077b1b7a0193dc1d0ae3baf2dc82a07eae3511ab5039370012bc3d4eb/catops-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "26d9b3f74125d94f8f8a48758432f8b3", "sha256": "c711a5b67ec01c66b76742f1a0713f1b6af24df85f28b30723aed99184533611" }, "downloads": -1, "filename": "catops-0.0.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "26d9b3f74125d94f8f8a48758432f8b3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 9788, "upload_time": "2018-07-12T11:46:13", "url": "https://files.pythonhosted.org/packages/b5/94/e9b7f09330b9a494ca5978f22695239d1b1973ec8826b587e2f2e68d54e5/catops-0.0.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b6ab5194378323912a889960eb64568", "sha256": "4ed8c7a105e0b18ac75760973985bf13d256412a0c70fe220cf00369d2abb0fd" }, "downloads": -1, "filename": "catops-0.0.4.tar.gz", "has_sig": false, "md5_digest": "6b6ab5194378323912a889960eb64568", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7329, "upload_time": "2018-07-12T11:46:14", "url": "https://files.pythonhosted.org/packages/9b/1e/4e51ff8f447787b93263ad04a7a68e009c2844add8864877e038533c7e7b/catops-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "0b7f695848b0001977bde3e45618b0b7", "sha256": "6f85af411b886fbfa4bd12e0d6d81a0ddfaf59da3745d4c27fb24bd4ba567329" }, "downloads": -1, "filename": "catops-0.0.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0b7f695848b0001977bde3e45618b0b7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 7021, "upload_time": "2018-07-12T11:52:11", "url": "https://files.pythonhosted.org/packages/e1/23/016f6d42337724987aa8a9bb9279b2b99b4040559355a45df855eb5d1a72/catops-0.0.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3f6f991dd4e52ac81ae4489897d7fe5d", "sha256": "c882910c88ff0b87ffedac644e5dbaf6fdee59eae980e23c88e7dc41cc3878fe" }, "downloads": -1, "filename": "catops-0.0.5.tar.gz", "has_sig": false, "md5_digest": "3f6f991dd4e52ac81ae4489897d7fe5d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 6073, "upload_time": "2018-07-12T11:52:12", "url": "https://files.pythonhosted.org/packages/0c/f5/e2948125f400a234f0a2d96d77c3e82ec39d5a668ee2d70a98df177ff370/catops-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "42d4ca3bec09d18c8349efb567256d6d", "sha256": "71be1e167d62b65a614afb23002463b4901372d0bc05d3e2b14fefd16fa42593" }, "downloads": -1, "filename": "catops-0.0.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "42d4ca3bec09d18c8349efb567256d6d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6413, "upload_time": "2018-07-12T14:51:14", "url": "https://files.pythonhosted.org/packages/fd/e6/22b60985037722a39b5f01d7a0652d13320b6e251d14de11b7e7a89edbeb/catops-0.0.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e27131da644f1570a4533c467f290385", "sha256": "be488b56597d782b6e7af31985af067f389a6617f96fb92c87343438b35e3a57" }, "downloads": -1, "filename": "catops-0.0.6.tar.gz", "has_sig": false, "md5_digest": "e27131da644f1570a4533c467f290385", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7346, "upload_time": "2018-07-12T14:51:15", "url": "https://files.pythonhosted.org/packages/68/67/6afa2a8ba54d8ba1865f795b84f399ae11e76b16c6a1a1bb24fb270bd09a/catops-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "59bde22fd7be5692f17146c44bcbba03", "sha256": "aad03d20d7df118ae9549f8837bf9a198626e2e8dd7dacd30aeff0025d48a48c" }, "downloads": -1, "filename": "catops-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "59bde22fd7be5692f17146c44bcbba03", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6365, "upload_time": "2018-07-12T15:07:13", "url": "https://files.pythonhosted.org/packages/3f/66/c669dfd219fb6b4f8544a2af55bd257cde88b8a8bd521fe996526978f850/catops-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc0ab16d1a25a917906f5d506de998b3", "sha256": "7cad3f9a9162d05f51cfe2243706b9c42a177b0e3a579bdd502168c370235dd4" }, "downloads": -1, "filename": "catops-0.0.7.tar.gz", "has_sig": false, "md5_digest": "fc0ab16d1a25a917906f5d506de998b3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7285, "upload_time": "2018-07-12T15:07:15", "url": "https://files.pythonhosted.org/packages/ea/47/52a5254f361150ce5e348d99c03b08df6682d86cd88be51cd7e21199d7b9/catops-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "8d982675a89bd3fa19cb329cb7757dda", "sha256": "7aa55cd7c7d13015f6df689ec4d3eebd16d4ae7316e8779b595c23f870de4cab" }, "downloads": -1, "filename": "catops-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8d982675a89bd3fa19cb329cb7757dda", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6362, "upload_time": "2018-07-12T15:32:52", "url": "https://files.pythonhosted.org/packages/fa/10/2fc5a9a052ab2b5901d5d0c0fab37a9d70934baca93853511b5cb31ff4da/catops-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d8f7fd64f8a5dd7aac07bfe2236e050", "sha256": "082c9aad4be8cb6f063b672364ecc38649101ef78751e777e05cfbc180c88929" }, "downloads": -1, "filename": "catops-0.0.8.tar.gz", "has_sig": false, "md5_digest": "5d8f7fd64f8a5dd7aac07bfe2236e050", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7272, "upload_time": "2018-07-12T15:32:53", "url": "https://files.pythonhosted.org/packages/7a/70/3a3e80b874cb3c14a514c798f1ee4b2b0a53279d3331ea685959b69e9e6f/catops-0.0.8.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "746b15118f450035ba83a240dffc8e7c", "sha256": "6d11e86a7869971df4c0a73cb58354d2302024fd4e3a61613cb2e86bb20c00b2" }, "downloads": -1, "filename": "catops-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "746b15118f450035ba83a240dffc8e7c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6361, "upload_time": "2018-07-13T10:34:12", "url": "https://files.pythonhosted.org/packages/0c/1c/d8258890741a3df28a2bf6b69af6bff31b21a55904a84823d5cb729d2c27/catops-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0482ebbee9115ac6aa43f2efcb7d03b5", "sha256": "4bc2476d39b65330e7d54a7a371fb718d235a95bd58a42011706ec8d304abdc1" }, "downloads": -1, "filename": "catops-0.1.0.tar.gz", "has_sig": false, "md5_digest": "0482ebbee9115ac6aa43f2efcb7d03b5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7277, "upload_time": "2018-07-13T10:34:14", "url": "https://files.pythonhosted.org/packages/22/d4/3ae9444fca8349918bfc765df7af23204b6b3be1e4e082e8bd5168dd20ad/catops-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "b96801443032047d0bb8da9fa5d34ba9", "sha256": "f369cb693f38c86c2275e5e8f41895f2976835514a46f36fedcaf04ac0e8cdcc" }, "downloads": -1, "filename": "catops-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b96801443032047d0bb8da9fa5d34ba9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 6447, "upload_time": "2018-07-13T15:07:30", "url": "https://files.pythonhosted.org/packages/53/46/b11078a3b1a3a992d60d97099259ba02e07deb87154f2b956af0af88edf8/catops-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4c844d42980e0a708d233f4bbe272994", "sha256": "dbfba02b2e9a66792c6173a0fc7319d3afd1d219271185f645850761c5da343c" }, "downloads": -1, "filename": "catops-0.1.1.tar.gz", "has_sig": false, "md5_digest": "4c844d42980e0a708d233f4bbe272994", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 7368, "upload_time": "2018-07-13T15:07:32", "url": "https://files.pythonhosted.org/packages/44/16/6336baf8096e739d197e1ef44a3bd50a11d2963f323da5bd01368b368e1e/catops-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "11a2108e6b936d432487fbf8bd106918", "sha256": "96a5f503026813b3f90ef37b43c78445aa6817c4d73ecb3320026377c87490a2" }, "downloads": -1, "filename": "catops-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "11a2108e6b936d432487fbf8bd106918", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 7050, "upload_time": "2018-07-16T11:35:31", "url": "https://files.pythonhosted.org/packages/f3/00/6234fc1bf6b101ec0d8145a0b23be4aa9b3d618367c0fb386e6077e61c69/catops-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bcbd61c9966e405809449447cd36d11", "sha256": "0a6503fb12d910b14b6d1d698453cde6f8bcbb8e9ceafd5d8bee5a5ef2dc155e" }, "downloads": -1, "filename": "catops-0.1.2.tar.gz", "has_sig": false, "md5_digest": "2bcbd61c9966e405809449447cd36d11", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 8043, "upload_time": "2018-07-16T11:35:32", "url": "https://files.pythonhosted.org/packages/ed/cd/eaa4d6ecefc078e285168741fb001b2ce35342371cc6c5d1c41c08e7498d/catops-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "58ad1b470eff6c6ca60d1680fb9384e4", "sha256": "a22baa9a25fd50f3cad9cc37ee007983f52e2c4fa60e2bcbac4d94284b039314" }, "downloads": -1, "filename": "catops-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "58ad1b470eff6c6ca60d1680fb9384e4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 7062, "upload_time": "2018-07-17T15:43:15", "url": "https://files.pythonhosted.org/packages/59/85/87b4f314f7b23597ca69e3212bb30aac08713f6ab296f81e6356e6de139b/catops-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "73e981f371e00e62ece6811cb57e6d5e", "sha256": "e6c79728cabef8b77f4a53f1a679f85f22835a97a4401f104e16a0a2e14f955e" }, "downloads": -1, "filename": "catops-0.1.3.tar.gz", "has_sig": false, "md5_digest": "73e981f371e00e62ece6811cb57e6d5e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 8070, "upload_time": "2018-07-17T15:43:16", "url": "https://files.pythonhosted.org/packages/e6/7f/5cbdbc22404fbc4a9821c9fb0708d842fced9ad22fe76c1c9b75e1e651f1/catops-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "32a232e3a6ccf3d19a9a806e59436f05", "sha256": "a9ac8ca85b07d5b977a76b7c596e13ef24f9a7d2c724616b5824e0b8775e733c" }, "downloads": -1, "filename": "catops-0.1.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "32a232e3a6ccf3d19a9a806e59436f05", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 8993, "upload_time": "2018-07-19T14:14:33", "url": "https://files.pythonhosted.org/packages/ea/90/d20523ef3b1358b6499a064025915a52a8225c21a369eb90aa7a000c0c5f/catops-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2cbb1ccafea734ef7dbc1b442eef0ed5", "sha256": "0e42ac359e270798171d3f1e6e4815b3266c0ed194ef6a33e4fa581fdbf6db40" }, "downloads": -1, "filename": "catops-0.1.4.tar.gz", "has_sig": false, "md5_digest": "2cbb1ccafea734ef7dbc1b442eef0ed5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 10821, "upload_time": "2018-07-19T14:14:34", "url": "https://files.pythonhosted.org/packages/9e/a6/046b92eeb0d994636aa8621dfa3fd934eb5ca051dbc704c2e0461002f191/catops-0.1.4.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "e404950137db192f59b53ca5f0f2db2d", "sha256": "2af08ac9464311afdfb52ff9bec9465dc8d60e1ca8f692ca6c6fe77a09a9eb79" }, "downloads": -1, "filename": "catops-0.1.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e404950137db192f59b53ca5f0f2db2d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 33884, "upload_time": "2018-07-23T15:26:32", "url": "https://files.pythonhosted.org/packages/d8/0c/0c7aa35b9ecbac5ce3c82a643736a5296ab5de40b709e6fcdf8788edf367/catops-0.1.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "346f860b04bc182bea42bffb0bdb3104", "sha256": "4e5db5f212becbe9e1c1447d09f37b8dc1b5a1e20f23f6eeeacff02d90b0ba95" }, "downloads": -1, "filename": "catops-0.1.7.tar.gz", "has_sig": false, "md5_digest": "346f860b04bc182bea42bffb0bdb3104", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 12495, "upload_time": "2018-07-23T15:26:33", "url": "https://files.pythonhosted.org/packages/c1/c1/a63bd2cf137361bed39aa178562321f927f0431378adf033d42dd5a175e6/catops-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "543aec63c59dd9a337b59841f7be800d", "sha256": "811dc8fbc957c708e31e609f4c52a2a8ee2b71ac52ba5b485a2f40aa1282552c" }, "downloads": -1, "filename": "catops-0.1.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "543aec63c59dd9a337b59841f7be800d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 33926, "upload_time": "2018-07-25T15:36:37", "url": "https://files.pythonhosted.org/packages/d9/5d/b6448517d416217b9baf85191f1075b9d21c8f45f56f48c955c37b3b23d0/catops-0.1.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "082fd3c137317c4733c09948a1a235a2", "sha256": "5ecf68681ff5a6f148c9cc5387a1e1bfa052f970d87148592c29b113f1ea6202" }, "downloads": -1, "filename": "catops-0.1.8.tar.gz", "has_sig": false, "md5_digest": "082fd3c137317c4733c09948a1a235a2", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 12526, "upload_time": "2018-07-25T15:36:39", "url": "https://files.pythonhosted.org/packages/73/a6/97b841ebd3cc21f1b2603ff066bbdcbdf04af7747eb3da66e1767a268353/catops-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "8c8794ead439d675d6e4f27f4c3f8da2", "sha256": "c9e4fe41eaf0563a3540fe64e87f1f5a1fbaac8c07be5bb060c625273c5bb6cc" }, "downloads": -1, "filename": "catops-0.1.9-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8c8794ead439d675d6e4f27f4c3f8da2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34055, "upload_time": "2018-08-10T11:39:32", "url": "https://files.pythonhosted.org/packages/c4/8e/46fd0ee6d2c5ed55e8fcc15fc0969cb1f8497baf384bc2e84f2afdd7c572/catops-0.1.9-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "45711337ecc5583924dc76841070dedd", "sha256": "4f064c5332431ef3edb03cf687e380b0324059e112bbc3771f3bef0fd4b10663" }, "downloads": -1, "filename": "catops-0.1.9.tar.gz", "has_sig": false, "md5_digest": "45711337ecc5583924dc76841070dedd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15871, "upload_time": "2018-08-10T11:39:33", "url": "https://files.pythonhosted.org/packages/1e/d8/ef379345dbe9497a95a16ed4517e202f99b8d7d7c663191033e996041e9f/catops-0.1.9.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "5355ca9941b0457e2c5977620e6e99eb", "sha256": "ffb4acbadf120d63ce6c85cb1b4f79d404fd700d72023faad1a438ec19728581" }, "downloads": -1, "filename": "catops-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5355ca9941b0457e2c5977620e6e99eb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34001, "upload_time": "2018-08-10T13:57:09", "url": "https://files.pythonhosted.org/packages/3a/3f/acd1637ea80c7fe9099e605cf528d2e0b3c6284fa058d65403d6fd6adf37/catops-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4a7117ff8a65280368c16ed20ee72761", "sha256": "10b1e2b14ef3e0d2fd00846c8bbce982d8f000fe235562670bb10d9d6f12a1ef" }, "downloads": -1, "filename": "catops-0.2.0.tar.gz", "has_sig": false, "md5_digest": "4a7117ff8a65280368c16ed20ee72761", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15792, "upload_time": "2018-08-10T13:57:10", "url": "https://files.pythonhosted.org/packages/32/c6/f8d7d947ef77eb1b3b4e747f1451ddd0c36319a9a9b9431c6209f1d2359c/catops-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "5596ecd72cfe9bf06405953fbd7df8b2", "sha256": "070fa2fd1943f88d61e77c3b8ee9b5156208398ad3a91025551d693a4c001478" }, "downloads": -1, "filename": "catops-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5596ecd72cfe9bf06405953fbd7df8b2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34035, "upload_time": "2018-08-10T13:59:39", "url": "https://files.pythonhosted.org/packages/9f/8f/9bc9a0da01d74131d65277e54e92b0279ac0152395d03fa664728e13fed8/catops-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1b461133b0fb739805e0c6492925f7f4", "sha256": "8c662625c83e6d89f4e57e1b6800441c9d4f21e06fa52031687c43f87a6a88d1" }, "downloads": -1, "filename": "catops-0.2.1.tar.gz", "has_sig": false, "md5_digest": "1b461133b0fb739805e0c6492925f7f4", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15821, "upload_time": "2018-08-10T13:59:40", "url": "https://files.pythonhosted.org/packages/15/5f/6dffa784743432b22535de466bb884a94b64a25709e443a2f9ad1aa9fe7d/catops-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "832a1236e8345e665919da96c8ce205e", "sha256": "18dc8d8514a4fc55f7b98b2fdedc6800fcda7f1b566247e1599f482d046281ad" }, "downloads": -1, "filename": "catops-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "832a1236e8345e665919da96c8ce205e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34047, "upload_time": "2018-08-10T14:56:45", "url": "https://files.pythonhosted.org/packages/78/4b/b1e09784bc22043c776b4d43d3af0531df8ae6ff4f8acdbf07a165c303c8/catops-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "071bd5639d91a175e2be2f776a2d38dd", "sha256": "e98ee39bcc3246c83959ed78e259a3038c1164aec41351890a3e48785fd0a8d6" }, "downloads": -1, "filename": "catops-0.2.2.tar.gz", "has_sig": false, "md5_digest": "071bd5639d91a175e2be2f776a2d38dd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15856, "upload_time": "2018-08-10T14:56:46", "url": "https://files.pythonhosted.org/packages/90/64/fcb045005ca6b7a664dc404ceef3659e878ace57e225cf8c64b541bd1600/catops-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "f0ffca7f8c78baeb06e274a0e23a6a35", "sha256": "ed061b626c73f31f0ce9e350e1c54fd612432f413a556de83cd78e4f2142f062" }, "downloads": -1, "filename": "catops-0.2.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f0ffca7f8c78baeb06e274a0e23a6a35", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34049, "upload_time": "2018-08-10T15:31:01", "url": "https://files.pythonhosted.org/packages/b2/b8/aef1fecfb4d12f848d2f95a066bbfdf5a5c877e1e7c17ab24e9e207cee69/catops-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "04ff9cf4da4c1376e47e4f85ac0bb473", "sha256": "76861797a724dc0fff0489df4b1dd215df3c5e0a6bdff878f93f83bfb4ad0fd2" }, "downloads": -1, "filename": "catops-0.2.3.tar.gz", "has_sig": false, "md5_digest": "04ff9cf4da4c1376e47e4f85ac0bb473", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15857, "upload_time": "2018-08-10T15:31:02", "url": "https://files.pythonhosted.org/packages/66/c5/f11982417414270594564bcbbf3b111f63cadc47fcd3cb0242363a1a232e/catops-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "83e0ea5c2cf8398b370384a9b6daef19", "sha256": "f46fa8e4ebef28d20e1a0a5a75ef32fc132fd0da744d3d6f14f422b0fc35c8f9" }, "downloads": -1, "filename": "catops-0.2.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "83e0ea5c2cf8398b370384a9b6daef19", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34071, "upload_time": "2018-08-16T14:40:00", "url": "https://files.pythonhosted.org/packages/48/db/8e13f5cfec7b39142c24666fb820ebc13b5ca02722eed7be2b1288f9cb96/catops-0.2.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afc312c4d0f0c145d7af3902e970f705", "sha256": "00923ba718eeb5d56064f56e3ca26259736c73524089423aef94106031ca35a6" }, "downloads": -1, "filename": "catops-0.2.4.tar.gz", "has_sig": false, "md5_digest": "afc312c4d0f0c145d7af3902e970f705", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15869, "upload_time": "2018-08-16T14:40:02", "url": "https://files.pythonhosted.org/packages/b9/73/5d78fed71ae1c0b7abf95dc514b26d434e677813ae87ae6f2970f723c6b8/catops-0.2.4.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "54f87664a964e9a415fbaf3eda72859d", "sha256": "03e1860c4ec79c9e4e95cf8d0dbf5d419d685453ff0342ea662b7ab1d8b2472b" }, "downloads": -1, "filename": "catops-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "54f87664a964e9a415fbaf3eda72859d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34191, "upload_time": "2018-08-22T15:46:35", "url": "https://files.pythonhosted.org/packages/18/49/1a86919aaeeaac047a65e0b8896ff50699d52492097dc1d60d97cc468ac5/catops-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d3655acb604a1540f5426eee1b51b24", "sha256": "7e279484e5d85df855223a8e61f844c971aa6f97d0bbec1b88e2ff379d3cc488" }, "downloads": -1, "filename": "catops-1.0.0.tar.gz", "has_sig": false, "md5_digest": "2d3655acb604a1540f5426eee1b51b24", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15993, "upload_time": "2018-08-22T15:46:36", "url": "https://files.pythonhosted.org/packages/55/83/50f2d498b11ffed7bac0c02051f532df170bbaf898de02b2f90dd76814a5/catops-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "54f87664a964e9a415fbaf3eda72859d", "sha256": "03e1860c4ec79c9e4e95cf8d0dbf5d419d685453ff0342ea662b7ab1d8b2472b" }, "downloads": -1, "filename": "catops-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "54f87664a964e9a415fbaf3eda72859d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7.0", "size": 34191, "upload_time": "2018-08-22T15:46:35", "url": "https://files.pythonhosted.org/packages/18/49/1a86919aaeeaac047a65e0b8896ff50699d52492097dc1d60d97cc468ac5/catops-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2d3655acb604a1540f5426eee1b51b24", "sha256": "7e279484e5d85df855223a8e61f844c971aa6f97d0bbec1b88e2ff379d3cc488" }, "downloads": -1, "filename": "catops-1.0.0.tar.gz", "has_sig": false, "md5_digest": "2d3655acb604a1540f5426eee1b51b24", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.0", "size": 15993, "upload_time": "2018-08-22T15:46:36", "url": "https://files.pythonhosted.org/packages/55/83/50f2d498b11ffed7bac0c02051f532df170bbaf898de02b2f90dd76814a5/catops-1.0.0.tar.gz" } ] }