{ "info": { "author": "Yelp Security", "author_email": "opensource@yelp.com", "bugtrack_url": null, "classifiers": [], "description": "# OSXCollector Output Filters [![Build Status: master](https://travis-ci.org/Yelp/osxcollector_output_filters.svg?branch=master)](https://travis-ci.org/Yelp/osxcollector_output_filters) [![PyPI](https://img.shields.io/pypi/v/osxcollector_output_filters.svg)](https://pypi.python.org/pypi/osxcollector_output_filters)\nThe `osxcollector.output_filters` package contains filters that process and transform the output of [OSXCollector](https://github.com/Yelp/osxcollector). The goal of filters is to make it easy to analyze OSXCollector output.\n\nEach filter has a single purpose. They do one thing and they do it right.\n\n## Running Filters in a VirtualEnv\nUnlike `osxcollector.py` filters have dependencies that aren't already installed on a new Mac. The best solution for ensure dependencies can be found is to use virtualenv.\n\nTo setup a virtualenv for the first time use:\n```shell\n$ sudo pip install tox virtualenv\n$ make venv\n$ source virtualenv_run/bin/activate # Not necessary if you use aactivator\n```\n\n## Filter Configuration\nMany filters require configuration, like API keys or details on a blacklist. The configuration for filters is done in a YAML file. The file is named `osxcollector.yaml`. The filter will look for the configuration file in:\n- The current directory.\n- The user's home directory.\n- The path pointed to by the environment variable `OSXCOLLECTOR_CONF`.\n\nA sample config is included. Make a copy and then modify if for yourself:\n```shell\n$ cp osxcollector.yaml.example osxcollector.yaml\n$ emacs osxcollector.yaml\n```\n\n## Basic Filters\nUsing combinations of these basic filters, an analyst can figure out a lot of what happened without expensive tools, without threat feeds or fancy APIs.\n\n### FindDomainsFilter\n`osxcollector.output_filters.find_domains.FindDomainsFilter` attempts to find domain names in OSXCollector output. The domains are added to the line with the key `osxcollector_domains`.\n\nFindDomainsFilter isn't too useful on it's own but it's super powerful when chained with filters like `FindBlacklistedFilter` and or `osxcollector.output_filters.virustotal.lookup_domains.LookupDomainsFilter`.\n\nTo run and see lines where domains have been added try:\n```shell\n$ python -m osxcollector.output_filters.find_domains -i RomeoCredible.json | \\\n jq 'select(has(\"osxcollector_domains\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.find_domains -h\nusage: find_domains.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### FindBlacklistedFilter\n`osxcollector.output_filters.find_blacklisted.FindBlacklistedFilter` reads a set of blacklists from the `osxcollector.yaml` and marks any lines with values on the blacklist. The BlacklistFilter is flexible and allows you to compare the OSXCollector output against multiple blacklists.\n\nYou _really should_ create blacklists for domains, file hashes, file names, and any known hinky stuff.\n\nConfiguration Keys:\n* `blacklist_name`: [REQUIRED] the name of the blacklist.\n* `blacklist_keys`: [REQUIRED] get the value of these keys and compare against the blacklist. These can be of the form `a.b` to look at `b` in `{\"a\": {\"b\": \"foo\"}}`\n* `blacklist_file_path`: [REQUIRED] path to a file with the actual values to blacklist\n* `blacklist_is_regex`: [REQUIRED] should the values in the blacklist file be treated as regex\n* `blacklist_is_domains`: [OPTIONAL] interpret values as domains and do some smart regex and subdomain stuff with them.\n\nIf you want to find blacklisted domains, you will have to use the find_domains filter to pull the domains out first. To see lines matching a specific blacklist named `domains` try:\n```shell\n$ python -m osxcollector.output_filters.find_domains -i RiddlerBelize.json | \\\n python -m osxcollector.output_filters.find_blacklisted | \\\n jq 'select(has(\"osxcollector_blacklist\")) | \\\n select(.osxcollector_blacklist | keys[] | contains(\"domains\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.find_blacklisted -h\nusage: find_blacklisted.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### RelatedFilesFilter\n`osxcollector.output_filters.related_files.RelatedFilesFilter` takes an initial set of file paths, names, or terms. It breaks this input into individual file and directory names and then searches for these terms across the entire OSXCollector output. The filter is smart and ignores common terms like `bin` or `Library` as well as ignoring user names.\n\nThis filter is great for figuring out how `evil_invoice.pdf` landed up on a machine. It'll find browser history, quarantines, email messages, etc. related to a file.\n\nTo run and see related lines try:\n```shell\n$ python -m osxcollector.output_filters.related_files -i CanisAsp.json -f '/foo/bar/baz' -f 'dingle' | \\\n jq 'select(has(\"osxcollector_related\")) | \\\n select(.osxcollector_related | keys[] | contains(\"files\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.related_files -h\nusage: related_files.py [-h] [-f FILE_TERMS] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n\nRelatedFilesFilter:\n -f FILE_TERMS, --file-term FILE_TERMS\n [OPTIONAL] Suspicious terms to use in pivoting through\n file names. May be specified more than once.\n```\n\n### ChromeHistoryFilter\n`osxcollector.output_filters.chrome.sort_history.SortHistoryFilter` builds a really nice Chrome browser history sorted in descending time order. This output is comparable to looking at the history tab in the browser but actually contains _more_ info. The `core_transition` and `page_transition` keys explain whether the user got to the page by clicking a link, through a redirect, a hidden iframe, etc.\n\nTo run and see Chrome browser history:\n```shell\n$ python -m osxcollector.output_filters.chrome.sort_history -i SirCray.json | \\\n jq 'select(.osxcollector_browser_history==\"chrome\")'\n```\n\nThis is great mixed with a grep in a certain time window, like maybe the 5 minutes before that hinky download happened.\n```shell\n$ python -m osxcollector.output_filters.chrome.sort_history -i SirCray.json | \\\n jq -c 'select(.osxcollector_browser_history==\"chrome\")' | \\\n egrep '2015-02-02 20:3[2-6]'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.chrome.sort_history -h\nusage: sort_history.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### FirefoxHistoryFilter\n`osxcollector.output_filters.firefox.sort_history.SortHistoryFilter` builds a really nice Firefox browser history sorted in descending time order. It's a lot like the `ChromeHistoryFilter`.\n\nTo run and see Firefox browser history:\n```shell\n$ python -m osxcollector.output_filters.firefox.sort_history -i CousingLobe.json | \\\n jq 'select(.osxcollector_browser_history==\"firefox\")'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.firefox.sort_history -h\nusage: sort_history.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### ChromeExtensionsFilter\n`osxcollector.output_filters.chrome.find_extensions.FindExtensionsFilter` looks for extensions in the Chrome JSON files.\n\nTo run and see Chrome extensions:\n```shell\n$ python -m osxcollector.output_filters.chrome.find_extensions -i MotherlyWolf.json | \\\n jq 'select(.osxcollector_section==\"chrome\" and\n .osxcollector_subsection==\"extensions\")'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.chrome.find_extensions -h\nusage: find_extensions.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### FirefoxExtensionsFilter\n`osxcollector.output_filters.firefox.find_extensions.FindExtensionsFilter` looks for extensions in the Firefox JSON files.\n\nTo run and see Firefox extensions:\n```shell\n$ python -m osxcollector.output_filters.firefox.find_extensions -i FlawlessPelican.json | \\\n jq 'select(.osxcollector_section==\"firefox\" and\n .osxcollector_subsection==\"extensions\")'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.firefox.find_extensions -h\nusage: find_extensions.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n## Threat API Filters\nBy taking the output of OSXCollector and looking up further info with OpenDNS and VirusTotal APIs, Yelp enhances the output with useful info. Some of these APIs aren't free but they are useful.\n\nUsing these filters as examples, it would be possible to integrate with additional free or premium threat APIs. `osxcollector.output_filters.base_filters.threat_feed.ThreatFeedFilter` has most of the plumbing for hooking up to arbitrary APIs.\n\n### OpenDNS RelatedDomainsFilter\n`osxcollector.output_filters.opendns.related_domains.RelatedDomainsFilter` takes an initial set of domains and IPs and then looks up domains related to them with the OpenDNS Umbrella API.\n\nOften an initial alert contains a domain or IP your analysts don't know anything about. However, by gathering the 2nd generation related domains, familiar _friends_ might appear. When you're lucky, those related domains land up being the download source for some downloads you might have overlooked.\n\nThe filter will ignore domains if they are in the blacklist named `domain_whitelist`. This helps to reduce churn and false positives.\n\nRun it as and see what it found:\n```shell\n$ python -m osxcollector.output_filters.find_domains -i NotchCherry.json | \\\n python -m osxcollector.output_filters.opendns.related_domains \\\n -d dismalhedgehog.com -d fantasticrabbit.org \\\n -i 128.128.128.28 | \\\n jq 'select(has(\"osxcollector_related\")) |\n select(.osxcollector_related | keys[] | contains(\"domains\"))'\n```\n\nThe results will look something like:\n```\n{\n 'osxcollector_related': {\n 'domains': {\n 'domain_in_line.com': ['dismalhedgehog.com'],\n 'another.com': ['128.128.128.28']\n }\n }\n}\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.opendns.related_domains -h\nusage: related_domains.py [-h] [-d INITIAL_DOMAINS] [-i INITIAL_IPS]\n [--related-domains-generations GENERATIONS]\n [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n\nopendns.RelatedDomainsFilter:\n -d INITIAL_DOMAINS, --domain INITIAL_DOMAINS\n [OPTIONAL] Suspicious domains to use in pivoting. May\n be specified more than once.\n -i INITIAL_IPS, --ip INITIAL_IPS\n [OPTIONAL] Suspicious IP to use in pivoting. May be\n specified more than once.\n --related-domains-generations GENERATIONS\n [OPTIONAL] How many generations of related domains to\n lookup with OpenDNS\n```\n\n### OpenDNS LookupDomainsFilter\n`osxcollector.output_filters.opendns.lookup_domains.LookupDomainsFilter` lookups domain reputation and threat information with the OpenDNS Umbrella API. It adds information about _suspicious_ domains to the output lines.\n\nThe filter uses a heuristic to determine what is _suspicious_. It can create false positives but usually a download from a domain marked as _suspicious_ is a good lead.\n\nRun it and see what was found:\n```shell\n$ python -m osxcollector.output_filters.find_domains -i GladElegant.json | \\\n python -m osxcollector.output_filters.opendns.lookup_domains | \\\n jq 'select(has(\"osxcollector_opendns\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.opendns.lookup_domains -h\nusage: lookup_domains.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### VirusTotal LookupDomainsFilter\n`osxcollector.output_filters.virustotal.lookup_domains.LookupDomainsFilter` lookups domain reputation and threat information with the VirusTotal API. It adds information about _suspicious_ domains to the output lines. It's a lot like the OpenDNS filter of the same name.\n\nThe filter uses a heuristic to determine what is _suspicious_. It can create a lot of false positives but also provides good leads.\n\nRun it and see what was found:\n```shell\n$ python -m osxcollector.output_filters.find_domains -i PippinNightstar.json | \\\n python -m osxcollector.output_filters.virustotal.lookup_domains | \\\n jq 'select(has(\"osxcollector_vtdomain\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.virustotal.lookup_domains -h\nusage: lookup_domains.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### VirusTotal LookupHashesFilter\n`osxcollector.output_filters.virustotal.lookup_hashes.LookupHashesFilter` lookups hashes with the VirusTotal API. This basically finds anything VirusTotal knows about which is a huge time saver. There's pretty much no false positives here, but there's also no chance of detecting unknown stuff.\n\nRun it and see what was found:\n```shell\n$ python -m osxcollector.output_filters.virustotal.lookup_hashes -i FungalBuritto.json | \\\n jq 'select(has(\"osxcollector_vthash\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.virustotal.lookup_hashes -h\nusage: lookup_hashes.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n### VirusTotal LookupURLsFilter\n`osxcollector.output_filters.virustotal.lookup_hashes.LookupURLsFilter` lookups URLs with the VirusTotal API. As this only looks up the reports, it may not find the reports for some unknown URLs.\n\nRun it and see what was found:\n```shell\n$ python -m osxcollector.output_filters.virustotal.lookup_urls -i WutheringLows.json | \\\n jq 'select(has(\"osxcollector_vturl\"))'\n```\n\nUsage\n```shell\n$ python -m osxcollector.output_filters.virustotal.lookup_urls -h\nusage: lookup_urls.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n#### Maximum resources per request\nBoth VirusTotal LookupHashesFilter and LookupURLsFilter can save time by including in a single API request the reports for the multiple resources (hashes or URLs).\nAs the number of the maximum resources in a request depends on whether you are using a Public or Private API key it is configurable in `osxcollector.yaml` file in `virustotal` section:\n```yaml\nresources_per_req: 4\n```\n\n### ShadowServer LookupHashesFilter\n`osxcollector.output_filters.shadowserver.lookup_hashes.LookupHashesFilter`\nlookups hashes with the ShadowServer bin-test API. This is sort of the opposite of a VirusTotal lookup and returns results when it sees the hashes of known good files. This helps raise confidence that a file is not malicious.\n\nRun it and see what was found:\n```shell\n$ python -m osxcollector.output_filters.shadowserver.lookup_hashes -i ArkashKobiashi.json | \\\n jq 'select(has(\"osxcollector_shadowserver\"))'\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.shadowserver.lookup_hashes -h\nusage: lookup_hashes.py [-h] [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n```\n\n## AnalyzeFilter - The One Filter to Rule Them All\n`osxcollector.output_filters.analyze.AnalyzeFilter` is Yelp's _one filter to rule them all_. It chains all the previous filters into one monster analysis. The results, enhanced with blacklist info, threat APIs, related files and domains, and even pretty browser history is written to a new output file.\n\nThen _Very Readable Output Bot_ takes over and prints out an easy-to-digest, human-readable, nearly-English summary of what it found. It's basically equivalent to running:\n```shell\n$ python -m osxcollector.output_filters.chrome.find_extensions.FindExtensionsFilter -i SlickApocalypse.json | \\\n python -m osxcollector.output_filters.firefox.find_extensions.FindExtensionsFilter | \\\n python -m osxcollector.output_filters.find_domains | \\\n python -m osxcollector.output_filters.shadowserver.lookup_hashes | \\\n python -m osxcollector.output_filters.virustotal.lookup_hashes | \\\n python -m osxcollector.output_filters.find_blacklisted | \\\n python -m osxcollector.output_filters.related_files | \\\n python -m osxcollector.output_filters.opendns.related_domains | \\\n python -m osxcollector.output_filters.opendns.lookup_domains | \\\n python -m osxcollector.output_filters.virustotal.lookup_domains | \\\n python -m osxcollector.output_filters.chrome_history | \\\n python -m osxcollector.output_filters.firefox_history | \\\n tee analyze_SlickApocalypse.json | \\\n jq 'select(false == has(\"osxcollector_shadowserver\")) |\n select(has(\"osxcollector_vthash\") or\n has(\"osxcollector_vtdomain\") or\n has(\"osxcollector_opendns\") or\n has(\"osxcollector_blacklist\") or\n has(\"osxcollector_related\"))'\n```\nand then letting a wise-cracking analyst explain the results to you. The _Very Readable Output Bot_ even suggests hashes and domains to add to blacklists.\n\nThis thing is the real deal and our analysts don't even look at OSXCollector output until after they've run the `AnalyzeFilter`.\n\nRun it as:\n```shell\n$ python -m osxcollector.output_filters.analyze -i FullMonty.json\n```\n\nUsage:\n```shell\n$ python -m osxcollector.output_filters.analyze -h\nusage: analyze.py [-f FILE_TERMS] [-d INITIAL_DOMAINS] [-i INITIAL_IPS]\n [--related-domains-generations GENERATIONS] [-h] [--readout]\n [--no-opendns] [--no-virustotal] [--no-shadowserver] [-M]\n [--show-signature-chain] [--show-browser-ext]\n [--input-file INPUT_FILE]\n\noptional arguments:\n -h, --help show this help message and exit\n --input-file INPUT_FILE\n [OPTIONAL] Path to OSXCollector output to read.\n Defaults to stdin otherwise.\n\nRelatedFilesFilter:\n -f FILE_TERMS, --file-term FILE_TERMS\n [OPTIONAL] Suspicious terms to use in pivoting through\n file names. May be specified more than once.\n\nopendns.RelatedDomainsFilter:\n -d INITIAL_DOMAINS, --domain INITIAL_DOMAINS\n [OPTIONAL] Suspicious domains to use in pivoting. May\n be specified more than once.\n -i INITIAL_IPS, --ip INITIAL_IPS\n [OPTIONAL] Suspicious IP to use in pivoting. May be\n specified more than once.\n --related-domains-generations GENERATIONS\n [OPTIONAL] How many generations of related domains to\n lookup with OpenDNS\n\nAnalyzeFilter:\n --readout [OPTIONAL] Skip the analysis and just output really\n readable analysis\n --no-opendns [OPTIONAL] Don't run OpenDNS filters\n --no-virustotal [OPTIONAL] Don't run VirusTotal filters\n --no-shadowserver [OPTIONAL] Don't run ShadowServer filters\n -M, --monochrome [OPTIONAL] Output monochrome analysis\n --show-signature-chain\n [OPTIONAL] Output unsigned startup items and kexts.\n --show-browser-ext [OPTIONAL] Output the list of installed browser\n extensions.\n```\n\n## Contributing to OSXCollector Output Filters\nWe encourage you to extend the functionality of OSXCollector to suit your needs.\n\n### Testing OSXCollector Output Filters\nA collection of tests for OSXCollector Output Filters is provided under the `tests` directory. In order to run these tests you must install [tox](https://pypi.python.org/pypi/tox):\n```shell\n$ sudo pip install tox\n```\n\nTo run this suit of tests, `cd` into `osxcollector` and enter:\n```shell\n$ make test\n```\n\n### Development Tips\nEnsure that all of the OSXCollector Output Filters tests pass before editing the source code. You can run the tests using: `make test`\n\nAfter making changes to the source code, run `make test` again to verify that your changes did not break any of the tests.\n\n## License\nThis work is licensed under the GNU General Public License.\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/Yelp/osxcollector_output_filters", "keywords": "", "license": "GNU General Public License", "maintainer": "", "maintainer_email": "", "name": "osxcollector-output-filters", "package_url": "https://pypi.org/project/osxcollector-output-filters/", "platform": "", "project_url": "https://pypi.org/project/osxcollector-output-filters/", "project_urls": { "Homepage": "https://github.com/Yelp/osxcollector_output_filters" }, "release_url": "https://pypi.org/project/osxcollector-output-filters/1.1.1/", "requires_dist": [ "PyYAML (>=5.0)", "threat-intel", "tldextract", "simplejson", "six" ], "requires_python": "", "summary": "Filters that process and transform the output of OSXCollector", "version": "1.1.1" }, "last_serial": 5420766, "releases": { "1.0.12": [ { "comment_text": "", "digests": { "md5": "30f07759f847b72be1f0f072894b8dc8", "sha256": "d922ef6cffd1f372ad04307e67e9b7852996a292d72b837c7b7add4659be3d04" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.12.tar.gz", "has_sig": false, "md5_digest": "30f07759f847b72be1f0f072894b8dc8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35187, "upload_time": "2016-07-13T07:24:20", "url": "https://files.pythonhosted.org/packages/3e/7b/3d0e89e13a4a7705f70fe5a96e49a71c42776a28c64466b73e1effb1e022/osxcollector_output_filters-1.0.12.tar.gz" } ], "1.0.13": [ { "comment_text": "", "digests": { "md5": "ed67d034e86c343143afe68dfee86e42", "sha256": "63494224404ee9c46a3778fad0bd4f167ab25881900d3b20954fcac9b6aaeed9" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.13.tar.gz", "has_sig": false, "md5_digest": "ed67d034e86c343143afe68dfee86e42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35162, "upload_time": "2016-07-28T21:02:54", "url": "https://files.pythonhosted.org/packages/06/63/2cb1e404e287f80eca08d93bac1de7f98e9e8875e26740b982290880b7f4/osxcollector_output_filters-1.0.13.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "e3ec17e8dce65b187de2b96bfe96717b", "sha256": "95037e79454bf64139b316e692e5cf189b8f8941a1fd9cd6706a9c96b97b52f8" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.15.tar.gz", "has_sig": false, "md5_digest": "e3ec17e8dce65b187de2b96bfe96717b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35265, "upload_time": "2017-02-01T02:38:23", "url": "https://files.pythonhosted.org/packages/07/73/b015bd1c4f5c2a65d222dc8569f93dc069a3e668ad8e9aa864c1a0df5d61/osxcollector_output_filters-1.0.15.tar.gz" } ], "1.0.16": [ { "comment_text": "", "digests": { "md5": "f1c1cff44aea3542e46a3e1e8a6a51f4", "sha256": "a1acb71ab5333747418ab113554572c78cf9d38ab253d85f32cfd4253dab51a7" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.16.tar.gz", "has_sig": false, "md5_digest": "f1c1cff44aea3542e46a3e1e8a6a51f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35531, "upload_time": "2017-04-24T21:20:22", "url": "https://files.pythonhosted.org/packages/d3/d7/cea03988e142b7ed34c91fd94c19582c0a25078265e038d8471193b5fc0f/osxcollector_output_filters-1.0.16.tar.gz" } ], "1.0.17": [ { "comment_text": "", "digests": { "md5": "3c0fff8727d332e25f48c0fd748161a8", "sha256": "c25d0d5d1faa9a44bf1258eec4e7f5f4f40042bf329bc92738c1b27860b921d9" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.17.tar.gz", "has_sig": false, "md5_digest": "3c0fff8727d332e25f48c0fd748161a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35569, "upload_time": "2017-05-15T18:08:45", "url": "https://files.pythonhosted.org/packages/a2/8a/932f5358fbbb90881b9383c8dd52ec6dd5f8af0fb1ae53410b522cfee95a/osxcollector_output_filters-1.0.17.tar.gz" } ], "1.0.18": [ { "comment_text": "", "digests": { "md5": "0c69e506d83ac338040177dadcb8009e", "sha256": "651e60a5024ff76b97395aaa619d3642a256df7631b9a3f926c274bad3514c4f" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.18.tar.gz", "has_sig": false, "md5_digest": "0c69e506d83ac338040177dadcb8009e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35441, "upload_time": "2017-07-10T23:40:16", "url": "https://files.pythonhosted.org/packages/21/8e/0fa174db8e81618f38647b305427891236bcf5aa3b015915b85fa276c1ab/osxcollector_output_filters-1.0.18.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "8ca40bfbb779deee074f3797ea30c01a", "sha256": "3a48a182288be32528d25d3f54d2b6acd7d4fca2859077d21b97d9add06c5e31" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.2.tar.gz", "has_sig": false, "md5_digest": "8ca40bfbb779deee074f3797ea30c01a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32598, "upload_time": "2016-01-12T22:35:48", "url": "https://files.pythonhosted.org/packages/f4/05/925a1a9cf5579cf002d091aaff9d0ecc26e23c32282adb405a53295eb691/osxcollector_output_filters-1.0.2.tar.gz" } ], "1.0.20": [ { "comment_text": "", "digests": { "md5": "0cf8c2b25a998b2b65c921348112aea5", "sha256": "44d2581f6262be6d2ed8e8fbc24ca0c58704744c79fa65675a35a1773fdc7ed6" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.20.tar.gz", "has_sig": false, "md5_digest": "0cf8c2b25a998b2b65c921348112aea5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43063, "upload_time": "2018-07-24T20:38:48", "url": "https://files.pythonhosted.org/packages/17/c1/c6c8a3e121eb83df09bc99158961fc94ee9c44efb1ff020b1f0ff8f8c41f/osxcollector_output_filters-1.0.20.tar.gz" } ], "1.0.21": [ { "comment_text": "", "digests": { "md5": "62eba4e414576b87297f6c012bf1e0f5", "sha256": "93f2ddd268e5e35cbef99a236fbef69709cba721b0206f93532bd40c78330b6c" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.21.tar.gz", "has_sig": false, "md5_digest": "62eba4e414576b87297f6c012bf1e0f5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50067, "upload_time": "2018-07-31T18:31:26", "url": "https://files.pythonhosted.org/packages/0d/b4/f1e00c37c09b8ccdd384e7b7ec4e6458171e0b7c9c28c1a648f7801d5c8e/osxcollector_output_filters-1.0.21.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "1b09f8ac213c5e29856c16085dfab6a0", "sha256": "0a1b724c60389bc41c414fc1bf1577a34db1f6130f168fa45cd3ee2c44c27767" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.3.tar.gz", "has_sig": false, "md5_digest": "1b09f8ac213c5e29856c16085dfab6a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32622, "upload_time": "2016-02-03T20:03:34", "url": "https://files.pythonhosted.org/packages/48/79/91294151c16298a444ddd7fcb33ef538141e7de40a7cf043f856e3d38718/osxcollector_output_filters-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "5a4ca1b3d3a9364da55ac51fe43a58a2", "sha256": "fd9c8be25fbe43164d84c06f7d80e0b01155bf4fd649081ef3f2c5f3e29465ee" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.4.tar.gz", "has_sig": false, "md5_digest": "5a4ca1b3d3a9364da55ac51fe43a58a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32627, "upload_time": "2016-02-29T19:22:16", "url": "https://files.pythonhosted.org/packages/2f/77/0d191c2bec083e4f2e9b214ce398fab5967125754e02a7a522eb6912f399/osxcollector_output_filters-1.0.4.tar.gz" } ], "1.0.5": [ { "comment_text": "", "digests": { "md5": "0c540bad05b57281bfb96d6a44d6250d", "sha256": "4008c7bec8d969fce5ec9ef329617d4dd587ee5bc31f689c9a3f48315d9f4d41" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.5.tar.gz", "has_sig": false, "md5_digest": "0c540bad05b57281bfb96d6a44d6250d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32533, "upload_time": "2016-03-04T22:36:31", "url": "https://files.pythonhosted.org/packages/87/7c/7c7a69eb1937e635d962a4672dbc3ec12b59691b495127f773039a508165/osxcollector_output_filters-1.0.5.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "1400f06df11ded4bb196b20d1aa5573c", "sha256": "0ed1ffc91c6291dab885607584e4088b0398c03843eba5c1e075c7a824a715c2" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.6.tar.gz", "has_sig": false, "md5_digest": "1400f06df11ded4bb196b20d1aa5573c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32749, "upload_time": "2016-04-01T00:00:29", "url": "https://files.pythonhosted.org/packages/05/af/c24ac7e15e4055f5065b04a0d7ddacd07ca4723397f288c07b14d4af2e9e/osxcollector_output_filters-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "f622e8c73193d6fdb389ad86cac433f4", "sha256": "3356d72e085422463043bad086a5e51df9c615eb20183d91267bb1c529e29ff7" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.7.tar.gz", "has_sig": false, "md5_digest": "f622e8c73193d6fdb389ad86cac433f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32753, "upload_time": "2016-04-11T18:53:18", "url": "https://files.pythonhosted.org/packages/7d/af/3cb6b62e60217f6a0c43235de02febd1ded6cdb5b515bb0d7a2fbebf6764/osxcollector_output_filters-1.0.7.tar.gz" } ], "1.0.8": [ { "comment_text": "", "digests": { "md5": "3c12e3c48772a17c7e49e14a0afdd66f", "sha256": "a8d3257e2fa469eab7f965a870d80c7444bef103920e000836a68baa38c4e6dd" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.8.tar.gz", "has_sig": false, "md5_digest": "3c12e3c48772a17c7e49e14a0afdd66f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33058, "upload_time": "2016-04-14T22:55:34", "url": "https://files.pythonhosted.org/packages/9c/7f/4a14e92036b0aceb04364591f059c7f2a02a21bd330a3fddaf403b248513/osxcollector_output_filters-1.0.8.tar.gz" } ], "1.0.9": [ { "comment_text": "", "digests": { "md5": "8e4adb89bd1a418cba803e3fe8f32868", "sha256": "690af86daaf28ecda2c855be3cdb32790e90d3893f35e3539a6c96db00b7a64e" }, "downloads": -1, "filename": "osxcollector_output_filters-1.0.9.tar.gz", "has_sig": false, "md5_digest": "8e4adb89bd1a418cba803e3fe8f32868", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34981, "upload_time": "2016-06-24T22:39:35", "url": "https://files.pythonhosted.org/packages/b1/22/1559e0c10d10245ed98669603297a37cf2db5a99c8fbccddecf3f7e3b1e1/osxcollector_output_filters-1.0.9.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "d8a55a246ba9700129aa78fcd67ad295", "sha256": "5c4366717b955fe9ec1a04448162ab4ff01c140f1243200382e3d7c9d618fb73" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "d8a55a246ba9700129aa78fcd67ad295", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 70218, "upload_time": "2019-04-05T11:04:55", "url": "https://files.pythonhosted.org/packages/ad/71/019f9bc33a27c63e2f87851941e27e2907a3329f415c1cd3611c948d9f46/osxcollector_output_filters-1.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c64e57014b555f18d8436ab9a1666d0f", "sha256": "291cd4732d460a367019375297eb57041d2d57d212bc565aada8271a951440e8" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c64e57014b555f18d8436ab9a1666d0f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70219, "upload_time": "2019-04-05T11:05:20", "url": "https://files.pythonhosted.org/packages/cc/63/cfff0bcd273b327d4102fc11ef72b00432c95003a0b6f0f94cb0ef5ca591/osxcollector_output_filters-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "930b043009eacfd91d4160adc5f300cf", "sha256": "c96be8d71f015015b35c2906fd9e55ac475d1783b31ffc30ec75935e4823a9ae" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.0.tar.gz", "has_sig": false, "md5_digest": "930b043009eacfd91d4160adc5f300cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50072, "upload_time": "2019-04-05T11:04:56", "url": "https://files.pythonhosted.org/packages/51/6f/01307c29ee29fd17db79bb9f14b5d16019bd91b3572218827558e2caeb51/osxcollector_output_filters-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "a8f29fa6f81a2d14c38092ba4a2eeb5c", "sha256": "e6ecb880a37bea6523b2403afa7487a7081e94410fd7103d0baae181369820db" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "a8f29fa6f81a2d14c38092ba4a2eeb5c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 70576, "upload_time": "2019-06-19T15:09:53", "url": "https://files.pythonhosted.org/packages/0b/af/6ed5e67a809612ca1887ec2b57339dd3a04d71e2bac4f935975a089682be/osxcollector_output_filters-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e9261542af6175c245fb641a83c7409", "sha256": "f8d3be4e4bcc6dc6348d9b1cfb1dd5d6905a38adbb5190bded4d919dba590def" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1e9261542af6175c245fb641a83c7409", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70576, "upload_time": "2019-06-19T15:10:21", "url": "https://files.pythonhosted.org/packages/6b/4e/7254c4e6b4ff6900af9225715b14b5bf4635737666e58a32b3744990e393/osxcollector_output_filters-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a346cf3d31854cf90deafddd90d61401", "sha256": "1aa647a7a0a4d79929c51bec50dab692f6606fb373187d61443b9cd2cf67cde6" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1.tar.gz", "has_sig": false, "md5_digest": "a346cf3d31854cf90deafddd90d61401", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50346, "upload_time": "2019-06-19T15:09:55", "url": "https://files.pythonhosted.org/packages/3b/d4/d96cbde8df89d6d7a89c5fe7fdc7c6bedcba74df8def76f21ac960873f69/osxcollector_output_filters-1.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a8f29fa6f81a2d14c38092ba4a2eeb5c", "sha256": "e6ecb880a37bea6523b2403afa7487a7081e94410fd7103d0baae181369820db" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "a8f29fa6f81a2d14c38092ba4a2eeb5c", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 70576, "upload_time": "2019-06-19T15:09:53", "url": "https://files.pythonhosted.org/packages/0b/af/6ed5e67a809612ca1887ec2b57339dd3a04d71e2bac4f935975a089682be/osxcollector_output_filters-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e9261542af6175c245fb641a83c7409", "sha256": "f8d3be4e4bcc6dc6348d9b1cfb1dd5d6905a38adbb5190bded4d919dba590def" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "1e9261542af6175c245fb641a83c7409", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 70576, "upload_time": "2019-06-19T15:10:21", "url": "https://files.pythonhosted.org/packages/6b/4e/7254c4e6b4ff6900af9225715b14b5bf4635737666e58a32b3744990e393/osxcollector_output_filters-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a346cf3d31854cf90deafddd90d61401", "sha256": "1aa647a7a0a4d79929c51bec50dab692f6606fb373187d61443b9cd2cf67cde6" }, "downloads": -1, "filename": "osxcollector_output_filters-1.1.1.tar.gz", "has_sig": false, "md5_digest": "a346cf3d31854cf90deafddd90d61401", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 50346, "upload_time": "2019-06-19T15:09:55", "url": "https://files.pythonhosted.org/packages/3b/d4/d96cbde8df89d6d7a89c5fe7fdc7c6bedcba74df8def76f21ac960873f69/osxcollector_output_filters-1.1.1.tar.gz" } ] }