{ "info": { "author": "Shadowbq", "author_email": "shadowbq@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 2 :: Only", "Topic :: Security" ], "description": "Robust ATD CLI tools\n================\n\n\n[![GitHub release](https://img.shields.io/github/release/shadowbq/robust-atd.svg?style=for-the-badge)](https://github.com/shadowbq/robust-atd/releases)\n[![license](https://img.shields.io/github/license/shadowbq/robust-atd.svg?style=for-the-badge)](/LICENSE)\n[![GitHub Release Date](https://img.shields.io/github/release-date/shadowbq/robust-atd.svg?style=for-the-badge)](https://github.com/shadowbq/robust-atd/releases)\n[![Code](https://img.shields.io/badge/Language-Python--2.7-ff69b4.svg?style=for-the-badge)](/README.md)\n\n\n\"Robust\" is a set of tools to leverage the HTTPS REST API of the [McAfee Advanced Threat Detection](http://www.mcafee.com/us/products/advanced-threat-defense.aspx) 3.8 - 4.x appliance.\n\n## Tools Overview\n\n* `robust` : basic cli submission of a single piece of malware to a MATD server.\n* `robust-profiles` : list the available MATD profiles\n* `robust-search` : search MATD via MD5 for a report.\n* `robust-watchdog` : monitor a directory for files and submit `multithreaded` to MATD\n* `robust-convict` : submit `multithreaded` a directory filled with samples and sort into malicious, clean, error, etc.\n* `robust-reporter` : parse offline the json files returned during large batch submissions.\n* `robust-version-checker` : Check the MATD Server Version\n\n## Important\n\nThis is *not a supported or official application of McAfee*. This work is based off of publicly available published documentation for integrating with the McAfee ATD REST API 3.6.x to 4.x\n\nOfficial API Documentation is available here:\n\n* https://support.mcafee.com/ServicePortal/faces/knowledgecenter?q=api&v=&p=Advanced+Threat+Defense\n\n## McAfee ATD - Advanced Threat defense\n\nMcAfee ATD is a commercial grade enterprise security sandbox analysis appliance. It main function is to provide advanced detection for stealthy, zero-day malware. McAfee Advanced Threat Defense is available as an on-premises appliance or a virtual form factor, with support for both private and public cloud with availability in the Azure Marketplace.\n\n* https://www.mcafee.com/us/products/advanced-threat-defense.aspx\n* https://www.mcafee.com/us/resources/data-sheets/ds-advanced-threat-defense.pdf\n\n## Install\n\nReq: Python 2.7.x.\n\nBug #5: https://github.com/shadowbq/robust-atd/issues/5 - ~~`pip install robust-atd`~~\n\nNote: Python 3.x is not supported.\n\n### PKG Download & Manual Install Alternative\n\nNote: `python setup.py install` will attempt to install dependencies from the internet via `pip`.\n\nFor offline runtime installation, please download the pip packages listed in the `requirements.txt`.\n\n### Virutalenv\n\nIt is recommended to install virtualenv & virtualenvwrapper via `Virtualenv Burrito`.\n\nSee: [README_PYTHON_UP.md](/README_PYTHON_UP.md)\n\n```\n$> mkvirtualenv robust\n$> workon robust\n$(robust)> wget https://github.com/shadowbq/robust-atd/archive/master.zip\n$(robust)> unzip master.zip\n$(robust)> cd master\n$(robust)> python setup.py install\n```\n\n-or-\n\n```\n$> mkvirtualenv --python=python2.7 robust\n$> workon robust\n$(robust)> pip install robust-atd\n```\n\n### Robust (DOT) Configuration file\n\nRobust will use the `~\\.robust` configuration file to load defaults into the scripts.\n\nThe configuration file is broken into multiple sections. If you use a section you must define all the settings in that section.\n\n * [auth]\n * [connection]\n * [convict]\n\nIt is recommended to set the file to `read-write` only for the current user, and remove all world `(-)rwx` permissions.\n\nAuthentication Section `[auth]` :\n\n```shell\n$(robust)> cat ~/.robust\n[auth]\nuser: admin\npassword: password.\n```\n\nConnection Detail Section `[connection]` :\n\n```shell\n$(robust)> cat ~/.robust\n[connection]\nip: atd.localhost.localdomain\nskipssl: true\nmaxthreads: 15\n```\n\nData Storage Section `[storage]`:\n\nNote: Datastorage locations will be created if they do not exist.\n\n```shell\n$(robust)> cat ~/.robust\n[storage]\nseverity: 3\ncleandir: ~/robust/clean\ndirtydir: ~/robust/dirty\nreportdir: ~/robust/reports\nerrordir: ~/robust/errors\n```\n\nThis file is expanded via the `os` module is compliant with windows user directories.\n\n\n## Robust:\n\nUsing `robust` for submitting samples.\n\n```\nusage: robust.py [-h] [-u USER] [-p PASSWORD] [-i ATD IP] [-n] -s\n FILE_TO_UPLOAD -a ANALYZER_PROFILE [-v] [--version]\n\nRobust McAfee ATD Python CLI tool\n\noptional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v, --verbosity increase output verbosity\n (default: None)\n -q, --quiet (q)uiet all output\n (default: False)\n\n\nAuthentication parameters:\n -u USER (u)sername for the API of the ATD\n (default: admin)\n -p PASSWORD (p)assword for username\n (default: password.)\n -i ATD IP (i)p or hostname address of ATD\n (default: atd.localhost.localdomain)\n -n do (n)ot verify the SSL certificate for the communications\n (default: False)\n\nSample parameters:\n -s FILE_TO_UPLOAD (s)ample or file to be analyzed\n (default: None)\n -a ANALYZER_PROFILE (a)nalyzer profile id to be used during analysis\n (default: None)\n\nExamples:\n robust.py -u admin -p password. -i atd.localhost.localdomain -s /usr/local/bin/file_to_scan -a 1\n```\n\n### Submitting a Sample\n\nA sample can be submitted via cli with full flags, `.robust` configuration file, or interrupt passwords.\n\n```shell\n$(robust)> robust.py -u admin -p password. -i atd.localhost.localdomain -s /home/malware/non-malicious-container/putty_upx_7.exe\n```\n\nUsing interrupt (interactive) passwords:\n\n```shell\n$(robust)> robust-profiles.py -n -l\nPassword: \nATD profiles: 1\nProfile id: 26\nName: Win XP Down Select (Online)\nOS: winXPsp3\nRun all down selects?: Off\n******************\n```\n\n### Managing Outputs\n\nUsing System Return codes with `-q` Quiet output flag. When the quiet flag is\nused for submitting samples or searching reports the *severity* of the application\nis returned as a system exit/return code. Negative return codes indicate *faults*\nor failure during submission.\n\n```\n(robust)>$ robust.py -n -a 26 -s ./.samples/Sample.exe -q\n(robust)>$ echo $?\n2\n```\n\nCommon Fault codes:\n\n```\n -1 ---> Error connecting to the ATD Server\n -2 ---> Error uploading file to the ATD Server\n -3 ---> Analysis failed\n -4 ---> Error getting report\n -5 ---> Error Obtaining vmprofilelist\n```\n\nMalware ranking:\n(If the severity level of the sample is 3 and above it is generally regarded a threat)\n```\n N/A -> Sample did not run\n -1 --> Sample is white listed\n 0 ---> No malicious activity detected (None)\n 1 ---> Sample is slightly suspicious (Low)\n 2 ---> Sample is somewhat/probably is suspicious\n 3 ---> Sample is malicious (Medium)\n 4 ---> Sample is malicious\n 5 ---> Sample is malicious (Very High)\n```\n## robust-version-checker\n\nYou can quickly test your connection settings in the CLI.\n\n```\n$(robust)> robust-version-checker.py -u robust -p password. -i atd.example.com -n\nConnection successful...\n\nSession Value: g7aenj99pfp0gbrogfbqsd9085\nUser ID: 57\nATD ver: 4.2.2.16\nATD Box heartbeat: 1519939175\n```\n\n## robust-profiles\n\nA tool designed to pull the *Analyzer Profile* policy list available to a specific user.\n\nPulling the Policy List - In order to submit a sample using `robust` you must identify the Analyzer Profile ID. `robust-profiles` assists in identifying the available profiles your user can submit samples to.\n\n```\n$(robust)> robust-profiles.py -n -l\nATD profiles: 10\nProfile id: 1\nName: Android\nOS: android\nRun All Selected?: Off\n******************\nProfile id: 26\nName: Win XP Down Select (Online)\nOS: winXPsp3\nRun All Selected?: Off\n******************\nProfile id: 25\nName: Windows XP Full Run (Offline)\nOS: winXPsp3\nRun All Selected?: On\n******************\nProfile id: 24\nName: Windows XP Full Run (Online)\nOS: winXPsp3\nRun All Selected?: On\n******************\n```\n\n## robust-search\n\nA tool designed to search and return reports for a specific md5 hash.\n\n```shell\n(robust)$> $ robust-search.py -m 2F7568342339CDB8321B52FF7BEBE661 -n\n(Sample.exe:2F7568342339CDB8321B52FF7BEBE661) = 2: \"Sample probably is suspicious\"\n```\n### Help details\n\n`robust-search` has the options `-w` and `-t` to collect the proper report on the submission.\n\n```\nusage: robust-search.py [-h] [-u USER] [-p PASSWORD] [-i ATD IP] [-n] -m MD5\n [-t {html,txt,xml,zip,json,ioc,stix,pdf,sample}]\n [-w FILENAME] [--version] [-v | -q]\n\nRobust McAfee ATD Python CLI tool\n\noptional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v, --verbosity increase output (v)erbosity\n \t\t(default: None)\n -q, --quiet (q)uiet all output\n \t\t(default: False)\n\nAuthentication parameters:\n -u USER (u)sername for the API of the ATD\n \t\t(default: admin)\n -p PASSWORD (p)assword for username\n \t\t(default: password.)\n -i ATD IP (i)p or hostname address of ATD\n \t\t(default: atd.localhost.localdomain)\n -n do (n)ot verify the SSL certificate for the communications\n \t\t(default: False)\n\nSearch parameters:\n -m MD5 (m)d5 32bit hash of the sample to search\n \t\t(default: None)\n\nReporting parameters:\n -t {html,txt,xml,zip,json,ioc,stix,pdf,sample}\n (t)ype of report requested\n \t\t(default: None)\n -w FILENAME (w)rite filename for saving the requested report\n \t\t(default: None)\n```\n\n\n## robust-watchdog\n\nA tool that watches a directory recursively for any new files to submit.\n\nExample CLI\n```\nusage: robust-watchdog.py [-h] -u USER [-p PASSWORD] -i ATD IP [-n] -a\n ANALYZER_PROFILE -d DIRECTORY [-e] [-j MAXTHREADS]\n [--version] [-v | -q]\n\nRobust McAfee ATD Python CLI tool\n\noptional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v, --verbosity increase output (v)erbosity\n \t\t(default: None)\n -q, --quiet (q)uiet all output\n \t\t(default: False)\n\nAuthentication parameters:\n -u USER (u)sername for the API of the ATD\n \t\t(default: None)\n -p PASSWORD (p)assword for username\n \t\t(default: None)\n -i ATD IP (i)p or hostname address of ATD\n \t\t(default: None)\n -n do (n)ot verify the SSL certificate for the communications\n \t\t(default: False)\n\nWatch parameters:\n -f (f)ollow and watch the directory for new files to submit\n (default: True)\n -a ANALYZER_PROFILE (a)nalyzer profile id to be used during analysis\n \t\t(default: None)\n -d DIRECTORY (d)irectory to watch for events\n \t\t(default: None)\n -e (e)xisting files in directory will be submitted\n \t\t(default: False)\n -j MAXTHREADS (j) max number of threads\n \t\t(default: 1)\n```\n\nLet it run in a shell and open another one or the file browser to create files in the /path/to/directory. Since the handler is printing the results, the output will reflect the flags chosen similar to `robust.py`:\n\nThe `-e` flag can be passed to cause all existing files in the directory (recurisively) to be submitted upon start.\n\n```shell\n(robust)$> robust-watchdog.py -a 26 -d ./ -n -e\n.\n...\n.\n.....\n```\n\n## robust-convict\n\n`robust-convict` is a tool designed like `robust-watchdog` but its purpose is to help sort large directories of malware samples into directories, while downloading their corresponding reports.\n\nExample Usage\n\n```\nrobust-convict.py -n -a 26 -c ./tmp/clean/ -x ./tmp/dirty/ -r ./tmp/reports/ -z ./tmp/errors/ -d ./tmp/preprocess -j 10 -t zip -q\n```\n\nOptions\n\n```\nusage: robust-convict.py [-h] [-u USER] [-p PASSWORD] [-i ATD IP] [-n] -a\n ANALYZER_PROFILE -d DIRECTORY [-e] [-y SEVERITY]\n [-c CLEANDIR] [-x DIRTYDIR] [-r REPORTDIR]\n [-z ERRORDIR]\n [-t {html,txt,xml,zip,json,ioc,stix,pdf,sample}]\n [-j MAXTHREADS] [--version] [-v | -q]\n\nRobust McAfee ATD Python CLI tool\n\noptional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v, --verbosity increase output (v)erbosity\n \t\t(default: None)\n -q, --quiet (q)uiet all output\n \t\t(default: False)\n\nAuthentication parameters:\n -u USER (u)sername for the API of the ATD\n \t\t(default: robust)\n -p PASSWORD (p)assword for username\n \t\t(default: ****<.robust>*****)\n -i ATD IP (i)p or hostname address of ATD\n \t\t(default: atd.localhost.localdomain)\n -n do (n)ot verify the SSL certificate for the communications\n \t\t(default: True)\n\nWatch parameters:\n -f (f)ollow and watch the directory for new files to submit\n (default: False)\n -a ANALYZER_PROFILE (a)nalyzer profile id to be used during analysis\n \t\t(default: None)\n -d DIRECTORY (d)irectory to watch for events\n \t\t(default: None)\n -e (e)xisting files in directory will be submitted\n \t\t(default: False)\n -j MAXTHREADS (j) max number of threads\n \t\t(default: 1)\n\nConvict parameters:\n -y SEVERITY (y) treat sample as dirty with this severity [0-5] or higher\n \t\t(default: 3)\n -c CLEANDIR (c) move clean files to this directory\n \t\t(default: ~/robust/clean/)\n -x DIRTYDIR (x) move processed dirty files to this directory\n \t\t(default: ~/robust/malware/)\n -r REPORTDIR (r) save reports to this directory\n \t\t(default: ~/robust/reports/)\n -z ERRORDIR (z) move error or skip files to this directory\n \t\t(default: ~/robust/errors/)\n -t {html,txt,xml,zip,json,ioc,stix,pdf,sample}\n (t)ype of report requested\n \t\t(default: None)\n```\n\n## robust-reporter\n\n`robust-reporter` is a tool designed to quickly summarize the downloaded `*.json` files in your 'reports' directory.\n\nOptions\n\n```\nusage: robust-reporter.py [-h] [-r REPORTDIR] [--version] [-v | -q]\n\nRobust McAfee ATD Python CLI tool\n\noptional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -v, --verbosity increase output (v)erbosity\n \t\t(default: None)\n -q, --quiet (q)uiet all output\n \t\t(default: False)\n\nReporter parameters:\n -r REPORTDIR (r) reports are processed or stored using this directory\n \t\t(default: ~/robust/reports/)\n```\nSample Run\n\n```\n$ robust-reporter.py\n82344C9864B0F1D120C0D1AB7F7C54C3 (---) : Somewhat/probably is suspicious(Low-Medium) - 24sec\nD012492123E4CF0CFB3A017A2E92C077 (Malware.Dynamic) : Malicious(High) - 194sec\nDB273A97C54E3E23F411EA7C9B5A82DA (Malware.Dynamic) : Malicious (Medium) - 53sec\n165A36C02B3FAAF4DE38F93A3DCB821B (---) : Somewhat/probably is suspicious(Low-Medium) - 36sec\nD10195670651A40C46C22972CD839E89 (Artemis!D10195670651) : Malicious (Very High) - 32sec\n8271093E0E78574428BBDDDA6F34A980 (Malware.Dynamic) : Malicious(High) - 192sec\n86DAFA0262BF217F5344A3B057C0DB06 (Malware.Dynamic) : Malicious(High) - 193sec\n8DA4CDC3E2EE16021F237EA7A043DA8E (Malware.Dynamic) : Malicious(High) - 191sec\n```\n\n## Tunning for Linux File Watchers\n\n### iNotify Tuning Parameters\n\nThe inotify(7) subsystem has three important tunings that impact robust's directory watching.\n\n```\n/proc/sys/fs/inotify/max_user_instances impacts how many different root dirs you can watch.\n/proc/sys/fs/inotify/max_user_watches impacts how many dirs you can watch across all watched roots.\n/proc/sys/fs/inotify/max_queued_events impacts how likely it is that your system will experience a notification overflow.\n```\n\nYou obviously need to ensure that `max_user_instances` and `max_user_watches` are set so that the system is capable of keeping track of your files.\n\n`max_queued_events` is important to size correctly; if it is too small, the kernel will drop events and robust won't be able to report on them. Making this value bigger reduces the risk of this happening.\n\n# Developers\n\n## Install Development\n\n```\n$(robust)> pip install -r devel-requirements.txt\n\n```\n\n## Development Tasks\n\n```shell\n(robust)$> invoke -l\nAvailable tasks:\n\n build Build the setup.py\n clean Clean up docs, bytecode, and extras\n codestats Run flake8 PeP8 tests for code stats\n release ``version`` should be a string like '0.4' or '1.0'.\n smell Run flake8 PeP8 tests\n test Run Unit tests\n\n```\n\n### Running the Test Suite\n\nNose is run via `invoke test`\n\n```\nClearing rm -rf build\nClearing rm -rf dist\nClearing rm -rf *.egg-info\nClearing rm -rf pyclient.log\nClearing rm -rf **/**/*.pyc\nClearing rm -rf **/*.pyc\nClearing rm -rf ./*.pyc\n...................\n-----------------------------------------------------------------------------\n19 tests run in 0.3 seconds (19 tests passed)\n117 E501 line too long (97 > 79 characters)\n7 F401 'ratd' imported but unused\n1 F841 local variable 'rb_rtnv' is assigned to but never used\n1 N802 function name should be lowercase\n5 W601 .has_key() is deprecated, use 'in'\n```\n\n### Additional LICENSE information\n\nA modified Fork of `atdcli.py` (Carlos Munoz - 2014).\n\nhttps://pypi.python.org/pypi/atd\n\n## VX Workshop Appliance Option\n\nThere is a fully operational Xubuntu 14.04 liveCD that includes:\n\n* robust - https://github.com/shadowbq/robust-atd\n* maltrieve - https://github.com/shadowbq/maltrieve\n* vxcage - https://github.com/shadowbq/vxcage\n\nIt also includes\n\n* hexeditors\n* static analysis tools\n* google chrome\n* vmtools\n* etc..\n\nxubuntu-14.04.4-desktop-x86_64-VX-Workshop-0.4.iso (~ 1.2 GB)\n\nAvailable to download with READMEs here: https://goo.gl/flcvew\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/shadowbq/robust-atd", "keywords": "atd mcafee ioc", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "robust-atd", "package_url": "https://pypi.org/project/robust-atd/", "platform": "", "project_url": "https://pypi.org/project/robust-atd/", "project_urls": { "Homepage": "http://github.com/shadowbq/robust-atd" }, "release_url": "https://pypi.org/project/robust-atd/0.5.2/", "requires_dist": [ "PyYAML", "argparse", "pathtools", "urllib3", "requests (==2.7.0)", "watchdog (==0.8.3)", "rednose; extra == 'dev'", "nose; extra == 'dev'", "nose-regression; extra == 'dev'", "nose-watch; extra == 'dev'", "coverage; extra == 'dev'", "flake8; extra == 'dev'", "pep8-naming; extra == 'dev'", "tox; extra == 'dev'", "invoke; extra == 'dev'", "HTTPretty; extra == 'dev'", "vcrpy; extra == 'dev'", "twine; extra == 'dev'", "Sphinx (==1.2.1); extra == 'docs'", "sphinxcontrib-napoleon (==0.2.4); extra == 'docs'", "nose (==1.3.0); extra == 'test'", "tox (==1.6.1); extra == 'test'" ], "requires_python": ">=2.6, !=3.*", "summary": "Manipulate McAfee ATD appliance", "version": "0.5.2" }, "last_serial": 3707570, "releases": { "0.4.1": [ { "comment_text": "", "digests": { "md5": "dcf0d08ee840ab0e401676daa4dd3c6f", "sha256": "aedfd10855ac6a10c3987a8292cfab017eb40e5017a030f7b7b850ae2bb73232" }, "downloads": -1, "filename": "robust-atd-0.4.1.tar.gz", "has_sig": false, "md5_digest": "dcf0d08ee840ab0e401676daa4dd3c6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19461, "upload_time": "2018-03-02T19:44:29", "url": "https://files.pythonhosted.org/packages/24/44/7fb0f652a5c22e6e120b10f157e0e75f515edadad0479d29d33ba4a5197b/robust-atd-0.4.1.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "8ca7ea569cbd36a4738c46f6be4f346a", "sha256": "5300454b4f9cf649f4e24ad2bd13591774335edfa85bf0f3bbde7b48bc425e2f" }, "downloads": -1, "filename": "robust_atd-0.5.1-py2-none-any.whl", "has_sig": false, "md5_digest": "8ca7ea569cbd36a4738c46f6be4f346a", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.*", "size": 31990, "upload_time": "2018-03-26T17:39:59", "url": "https://files.pythonhosted.org/packages/21/06/cdee235f07f2da7ee7076e59af8e8c2138d67763a83dc4d8eba5b9e21f93/robust_atd-0.5.1-py2-none-any.whl" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "c471c9b53663d8c6c4670d8ee5333c22", "sha256": "8a732716f82413ade5ebf0d44efc238d43c8eb4461346478cde178ebef10658e" }, "downloads": -1, "filename": "robust_atd-0.5.2-py2-none-any.whl", "has_sig": false, "md5_digest": "c471c9b53663d8c6c4670d8ee5333c22", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.*", "size": 31989, "upload_time": "2018-03-26T17:40:00", "url": "https://files.pythonhosted.org/packages/27/28/13974c3a496e1ec77a6aa3cb4134a4b5e6dc4d06f5e80bac15e161bb6d62/robust_atd-0.5.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1b5d217a4b6d3757f41cc03ac87d77af", "sha256": "7219e40f6225dfca7aa2569c00bb6d60390be78af952f5a5cf510580359c0986" }, "downloads": -1, "filename": "robust-atd-0.5.2.tar.gz", "has_sig": false, "md5_digest": "1b5d217a4b6d3757f41cc03ac87d77af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.*", "size": 26322, "upload_time": "2018-03-26T18:30:26", "url": "https://files.pythonhosted.org/packages/b1/31/8af4528951d2a95d308837eee66515dca52fb06b37ff0a34381037d69235/robust-atd-0.5.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c471c9b53663d8c6c4670d8ee5333c22", "sha256": "8a732716f82413ade5ebf0d44efc238d43c8eb4461346478cde178ebef10658e" }, "downloads": -1, "filename": "robust_atd-0.5.2-py2-none-any.whl", "has_sig": false, "md5_digest": "c471c9b53663d8c6c4670d8ee5333c22", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.*", "size": 31989, "upload_time": "2018-03-26T17:40:00", "url": "https://files.pythonhosted.org/packages/27/28/13974c3a496e1ec77a6aa3cb4134a4b5e6dc4d06f5e80bac15e161bb6d62/robust_atd-0.5.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1b5d217a4b6d3757f41cc03ac87d77af", "sha256": "7219e40f6225dfca7aa2569c00bb6d60390be78af952f5a5cf510580359c0986" }, "downloads": -1, "filename": "robust-atd-0.5.2.tar.gz", "has_sig": false, "md5_digest": "1b5d217a4b6d3757f41cc03ac87d77af", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.*", "size": 26322, "upload_time": "2018-03-26T18:30:26", "url": "https://files.pythonhosted.org/packages/b1/31/8af4528951d2a95d308837eee66515dca52fb06b37ff0a34381037d69235/robust-atd-0.5.2.tar.gz" } ] }