{ "info": { "author": "Fernando Fernandez Galindo", "author_email": "ffernandezgalindo@triumf.ca", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3" ], "description": "# dynafed_storagestats\n\nModule to interact with UGR's configuration files in order to obtain\nstorage status information from various types of endpoints and upload the\ninformation to memcache. It leverage's UGR's connection check that it uploads\nto memcache to skip any endpoints it has detected as being \"Offline\". (If\nthis information is not found, it is ignored and all endpoints are contacted)\n\nSo far it supports has been tested with:\n- Azure Storage Blob\n- AWS S3\n- Ceph S3\n- Minio S3\n- DPM via WebDAV\n- dCache via WebDAV\n\n## Installation\n\nLinux:\n\n```sh\npip3 install dynafed-storagestats\n```\nThis will install all necessary dependencies and create the executable\n'/usr/bin/dynafed-storage'\n\n### CentOS / SL 6\n\nPython 3.4 is available from EPEL repository.\n\nIn order to install the above modules in python 3, pip3 needs to be setup. Since\nit is not in the repos, run the following command:\n\n```bash\nsudo python3 /usr/lib/python3.4/site-packages/easy_install.py pip\n```\n## Known issues\n-\n\n## Usage\nMake sure the user that runs it is able to read UGR's configuration files.\n\n```bash\ndynafed-storage -h\nusage: dynafed-storage [-h] {reports,stats} ...\n\npositional arguments:\n {reports,stats}\n reports In development\n stats Obtain and output storage stats.\n\noptional arguments:\n -h, --help show this help message and exit\n\n```\n#### Sub-commands\n##### Checksums\nThis sub-command is intended to be called by Dynafed's external scripts as\nspecified in the option 'checksumcalc' to obtain and add checksum information\nfiles or objects checksum information, specially for cloud based storage\nendpoints that do not support the usual grid tool requests.\n\nThe checksums sub-command has two sub-commands itself:\n\n###### *get*\n**Currently only S3 endpoints are supported.**\n\nA client gives the URL of the object (not the Dynafed URL, but the actual SE\nURL) and the type of checksum hash to obtain. If this information is\nfound, it will be printed out to stdout, if not, 'None' will be printed out.\n\nIn its simplest form it is called with all three required arguments:\n\n```bash\ndynafed-storage checksums get -e [ENDPOINT_ID] -u [URL] -t [HASH_TYPE]\n```\n\nA more complex example specifying configuration file path, logging file and level,\nand verbosity:\n\n```bash\ndynafed-storage checksums get -v -c /etc/ugr/conf.d --loglevel=WARNING --logfile='/var/log/dynafed_storagestats/dynafed_storagestats.log' -e [Endpoint ID] -u [URL] -t [HASH_TYPE]\n```\n\nHelp:\n\n```bash\ndynafed-storage checksums get -h\nusage: dynafed-storage checksums get [-h] [-c [CONFIG_PATH [CONFIG_PATH ...]]]\n [-f] [-v] [-e ENDPOINT] [-t HASH_TYPE]\n [-u URL] [--logfile LOGFILE]\n [--loglevel {DEBUG,INFO,WARNING,ERROR}]\n [--stdout]\n\noptional arguments:\n -h, --help show this help message and exit\n -c [CONFIG_PATH [CONFIG_PATH ...]], --config [CONFIG_PATH [CONFIG_PATH ...]]\n Path to UGRs endpoint .conf files or directories.\n Accepts any number of arguments. Default:\n '/etc/ugr/conf.d'.\n -f, --force Force command execution.\n -v, --verbose Show on stderr events according to loglevel.\n\nChecksum options. Required!:\n -e ENDPOINT, --endpoint ENDPOINT\n Choose endpoint containing desired object. Required.\n -t HASH_TYPE, --hash_type HASH_TYPE\n Type of checksum hash. ['adler32', md5] Required.\n -u URL, --url URL URL of object/file to request checksum of. Required.\n\nLogging options:\n --logfile LOGFILE Set logfile path. Default:\n /tmp/dynafed_storagestats.log\n --loglevel {DEBUG,INFO,WARNING,ERROR}\n Set log output level. Default: WARNING.\n\nOutput options:\n --stdout Set to output stats on stdout.\n```\n\n###### *put*\n**Currently only S3 endpoints are supported.**\n\nA client gives the URL of the object (not the Dynafed URL, but the actual SE\nURL), the checksum, and the type of checksum hash to add this information\nto the object. Nothing is returned unless the process encounters errors.\n\nIn its simplest form it is called with all four required arguments:\n\n```bash\ndynafed-storage checksums put -e [ENDPOINT_ID] -u [URL] -t [HASH_TYPE] --checksum [CHECKSUM]\n```\n\nA more complex example specifying configuration file path, logging file and level,\nand verbosity:\n\n```bash\ndynafed-storage checksums put -v -c /etc/ugr/conf.d --loglevel=WARNING --logfile='/var/log/dynafed_storagestats/dynafed_storagestats.log' -e [ENDPOINT_ID] -u [URL] -t [HASH_TYPE] --checksum [CHECKSUM]\n```\n\nHelp:\n\n```bash\ndynafed-storage checksums put -h\nusage: dynafed-storage checksums put [-h] [-c [CONFIG_PATH [CONFIG_PATH ...]]]\n [-f] [-v] [--checksum CHECKSUM]\n [-e ENDPOINT] [-t HASH_TYPE] [-u URL]\n [--logfile LOGFILE]\n [--loglevel {DEBUG,INFO,WARNING,ERROR}]\n [--stdout]\n\noptional arguments:\n -h, --help show this help message and exit\n -c [CONFIG_PATH [CONFIG_PATH ...]], --config [CONFIG_PATH [CONFIG_PATH ...]]\n Path to UGRs endpoint .conf files or directories.\n Accepts any number of arguments. Default:\n '/etc/ugr/conf.d'.\n -f, --force Force command execution.\n -v, --verbose Show on stderr events according to loglevel.\n\nChecksum options. Required!:\n --checksum CHECKSUM String with checksum to set. ['adler32', md5] Required\n -e ENDPOINT, --endpoint ENDPOINT\n Choose endpoint containing desired object. Required.\n -t HASH_TYPE, --hash_type HASH_TYPE\n Type of checksum hash. ['adler32', md5] Required.\n -u URL, --url URL URL of object/file to request checksum of. Required.\n\nLogging options:\n --logfile LOGFILE Set logfiles path. Default:\n /tmp/dynafed_storagestats.log\n --loglevel {DEBUG,INFO,WARNING,ERROR}\n Set log output level. Default: WARNING.\n\nOutput options:\n --stdout Set to output stats on stdout.\nfernando@ffgalindo:/tmp/dd\u00bb \n```\n\n---\n\n##### Reports\n\nThe reports sub-command has two sub-commands itself:\n\n###### *filelist*\n**Note: Only works with Azure and S3 endpoints**\n\nThis sub-command is intended to be used to obtain file reports from the storage\nendpoints. At this time, what is being developed is to be able to create\nfile dumps with the intention of using the for Rucio's integrity checks for\ncloud based storage such as S3 and Azure since other grid storage solutions like\ndCache and DPM have their own tools.\n\nFor more information on this file dumps: [DDMDarkDataAndLostFiles](https://twiki.cern.ch/twiki/bin/view/AtlasComputing/DDMDarkDataAndLostFiles)\n\nUsage example:\nThis will create a file at /tmp/ containing a list of files under the 'rucio'\nprefix that are a day older from endpoints 'entpoint1' and 'endpoint2'. The\nfilename is the endpoint's ID name in the endpoints.conf file.\n\n```bash\ndynafed-storage reports filelist -c /etc/ugr/conf.d -o /tmp --rucio -e endpoint1 endpoint2\n```\n\n**reports filelist help:**\n```bash\ndynafed-storage reports filelist -h\nusage: dynafed-storage reports filelist [-h]\n [-c [CONFIG_PATH [CONFIG_PATH ...]]]\n [-f] [-v]\n [-e [ENDPOINT [ENDPOINT ...]]]\n [--logfile LOGFILE]\n [--loglevel {DEBUG,INFO,WARNING,ERROR}]\n [--delta DELTA] [--rucio]\n [-o OUTPUT_PATH] [-p PREFIX]\n\noptional arguments:\n -h, --help show this help message and exit\n -c [CONFIG_PATH [CONFIG_PATH ...]], --config [CONFIG_PATH [CONFIG_PATH ...]]\n Path to UGRs endpoint .conf files or directories.\n Accepts any number of arguments. Default:\n '/etc/ugr/conf.d'.\n -f, --force Force command execution.\n -v, --verbose Show on stderr events according to loglevel.\n -e [ENDPOINT [ENDPOINT ...]], --endpoint [ENDPOINT [ENDPOINT ...]]\n Choose endpoint(s) to check. Accepts any number of\n arguments. If not present, all endpoints will be\n checked.\n\nLogging options:\n --logfile LOGFILE Set logfiles path. Default:\n /tmp/dynafed_storagestats.log\n --loglevel {DEBUG,INFO,WARNING,ERROR}\n Set log output level. Default: WARNING.\n\nReports options:\n --delta DELTA Mask for Last Modified Date of files. Integer in days.\n Default: 1\n --rucio Use to create rucio file dumps for consitency checks.\n Same as: --delta 1 --prefix rucio\n\nOutput options:\n -o OUTPUT_PATH, --output-dir OUTPUT_PATH\n Set output directory. Default: '.'\n -p PREFIX, --path PREFIX, --prefix PREFIX\n Set the prefix/path from where to start the recursive\n list. The prefix is excluded from the resulting paths.\n Default: ''\n\n\n```\n**Important Note: DEBUG level might print an enormous amount of data as it will\nlog the contents obtained from requests. In the case of the generic methods this\nwill print all the stats for each file being parsed. It is recommended to use\nthis level with only the endpoint one wants to troubleshoot.**\n\n###### *storage*\n\nThe purpose of this sub-command is to create storage accounting reports according\nto different formats that experiments might require.\n\nAt the moment only WLCG's JSON storage accounting file is available.\n\nIn order to create it, the user will have to create a 'site-schema' YAML file\ncontaining the site information. Please check in the 'samples' folder for\nexamples on how to create these file. The '-s/--schema' flag is required and\nshould point to this site-schema file.\n\nUsage example:\nThis will create file '/tmp/space-usage.json'\n\n```bash\ndynafed-storage reports storage --wlcg -c /etc/ugr/conf.d -s wlcg-schema.yml -o /tmp\n```\n\n**reports storage help:**\n```bash\ndynafed-storage reports storage -h\nusage: dynafed-storage reports storage [-h]\n [-c [CONFIG_PATH [CONFIG_PATH ...]]]\n [-f] [-v]\n [-e [ENDPOINT [ENDPOINT ...]]]\n [--logfile LOGFILE]\n [--loglevel {DEBUG,INFO,WARNING,ERROR}]\n [-s SCHEMA] [--wlcg] [-o OUTPUT_PATH]\n\noptional arguments:\n -h, --help show this help message and exit\n -c [CONFIG_PATH [CONFIG_PATH ...]], --config [CONFIG_PATH [CONFIG_PATH ...]]\n Path to UGRs endpoint .conf files or directories.\n Accepts any number of arguments. Default:\n '/etc/ugr/conf.d'.\n -f, --force Force command execution.\n -v, --verbose Show on stderr events according to loglevel.\n -e [ENDPOINT [ENDPOINT ...]], --endpoint [ENDPOINT [ENDPOINT ...]]\n Choose endpoint(s) to check. Accepts any number of\n arguments. If not present, all endpoints will be\n checked.\n\nLogging options:\n --logfile LOGFILE Set logfiles path. Default:\n /tmp/dynafed_storagestats.log\n --loglevel {DEBUG,INFO,WARNING,ERROR}\n Set log output level. Default: WARNING.\n\nReports options:\n -s SCHEMA, --schema SCHEMA\n YAML file containing site schema. Required.\n --wlcg Produces WLCG JSON output file. Requires setup file.\n\nOutput options:\n -o OUTPUT_PATH, --output-dir OUTPUT_PATH\n Set output directory. Default: '.'\n```\n\n---\n\n##### stats\n\nThis sub-command is intended to be run periodically as a cron job in order to\nupload the stats into memcached so that Dynafed can use it to be aware of the\nstorage capacity of the storage endpoints.\n\nIt contacts each storage endpoint, obtains available stats and outputs them\naccording settings.\n\nFirst run with the following flags:\n\n```bash\ndynafed-storage stats -v -c /etc/ugr/conf.d --stdout -m\n```\n\nThis will printout any warnings and errors as they are encountered as well as\nthe information obtained from each of the endpoints. If you need more information\nabout the errors consider adding the \"--debug\" flag which will print more\ninformation at the end of each endpoint's stats. If you still need more,\nchange the --loglevel to INFO or DEBUG, just be warned DEBUG might print a lot\nof information.\n\nIt is recommended to create a directory for the logfile, such as\n\"/var/log/dynafed_storagestats/dynafed_storagestats.log\", as the default is\n\"/tmp/dynafed_storagestats.log\".\n\nWhen everything looks to be setup as desired, setup cron to run the following\n(add any other options that make sense to your site).\n\n```bash\ndynafed-storage stats -c /etc/ugr/conf.d -m --loglevel=WARNING --logfile='/var/log/dynafed_storagestats/dynafed_storagestats.log'\n```\n\nIf instead of checking all configured endpoints, specific endpoint ID's can be\nspecified with the \"-e\" flag:\n\n```bash\ndynafed-storage stats -c /etc/ugr/conf.d -m -e endpoint1 endpoint2\n```\n\n**stats help:**\n```bash\ndynafed-storage stats -h\nusage: dynafed-storage stats [-h] [-c [CONFIG_PATH [CONFIG_PATH ...]]] [-f]\n [-v] [-e [ENDPOINT [ENDPOINT ...]]]\n [--logfile LOGFILE]\n [--loglevel {DEBUG,INFO,WARNING,ERROR}]\n [--memhost MEMCACHED_IP]\n [--memport MEMCACHED_PORT] [--debug] [-m]\n [-j [TO_JSON]] [-o OUTPUT_PATH]\n [-p [TO_PLAINTEXT]] [--stdout]\n\noptional arguments:\n -h, --help show this help message and exit\n -c [CONFIG_PATH [CONFIG_PATH ...]], --config [CONFIG_PATH [CONFIG_PATH ...]]\n Path to UGR's endpoint .conf files or directories.\n Accepts any number of arguments. Default:\n '/etc/ugr/conf.d'.\n -f, --force Force command execution.\n -v, --verbose Show on stderr events according to loglevel.\n -e [ENDPOINT [ENDPOINT ...]], --endpoint [ENDPOINT [ENDPOINT ...]]\n Choose endpoint(s) to check. Accepts any number of\n arguments. If not present, all endpoints will be\n checked.\n\nLogging options:\n --logfile LOGFILE Set logfile's path. Default:\n /tmp/dynafed_storagestats.log\n --loglevel {DEBUG,INFO,WARNING,ERROR}\n Set log output level. Default: WARNING.\n\nMemcached Options:\n --memhost MEMCACHED_IP\n IP or hostname of memcached instance.Default:\n 127.0.0.1\n --memport MEMCACHED_PORT\n Port of memcached instance. Default: 11211\n\nOutput options:\n --debug Declare to enable debug output on stdout.\n -m, --memcached Declare to enable uploading storage stats to\n memcached.\n -j [TO_JSON], --json [TO_JSON]\n Set to output stats to json file. Add argument to set\n filename.Default: dynafed_storagestats.json!!In\n development!!\n -o OUTPUT_PATH, --output-dir OUTPUT_PATH\n Set output directory for flags -j, -x and -p. Default:\n '.'\n -p [TO_PLAINTEXT], --plain [TO_PLAINTEXT]\n Set to output stats to plain txt file. Add argument to\n set filename.Default: dynafed_storagestats.txt\n --stdout Set to output stats on stdout.\n\n```\n\n## Endpoints Configuration\n\nIn order to use the correct methods for each storage type some settings should\nbe added to the endpoints.conf configuration file.\n\n### General\n\n```\nlocplugin..storagestats.quota: [api, 1b|mb|gb|tb|pb|mib|gib|tib|pib]\n```\n\nIf this setting is missing, the script will try to get the quota from the endpoint\nusing the relevant API. Failing this, a default quota of 1TB will used.\n\n##### api\nWill try to obtain the quota from the storage endpoint. If that fails a default\nof 1TB will be used.\n\n##### (bytes)\nThe quota can be specify in bytes, megabytes, mebibytes, etc. Lower or uppercase.\n\n```\nlocplugin..storagestats.frequency: [ 600 ]\n```\n\nThis setting tells the script the number of seconds to wait before checking the endpoint again according to the timestamp of the last check stored in memcache. The default is 10 minutes (600 seconds).\n\n### Azure\n\n```\nlocplugin..storagestats.api: [list-blobs]\n```\n\n##### list-blobs (deprecated: generic)\n\nThis setting will list all objects in a blob container and add the individual\nsizes.\nEach GET request obtains 5,000 objects. Therefore 10,005 objects cost 3 GET's.\n\n### DAV/HTTP\n\n```\nlocplugin..storagestats.api: [list-files, rfc4331]\n```\n\n##### list-files (deprecated: generic)\n\nThis setting will list all objects behind the endpoint and add the individual\nsizes. For this method to recursively get all objects, the DAV server needs\nto header \"Depth\" with attribute \"infinity\". This is not recommended as\nit is an expensive method, can use a lot of memory and is susceptible to\ndenial of service. Therefore this setting should be avoided if possible in\nfavour of rfc4331\n\n##### rfc4331\n\nThis setting will query the DAV server according to [RFC4331](https://tools.ietf.org/html/rfc4331).\n\n### S3\n\n```\nlocplugin..storagestats.api: [list-objects, ceph-admin, cloudwatch]\n```\n\n##### list-objects (deprecated: generic)\n\nThis setting will list all objects behind the bucket and add the individual\nsizes.\nEach GET request obtains 1,000 objects. Therefore 2,005 objects cost 3 GET's.\n\n##### ceph-admin\n\nUse this setting if Ceph's Admin API is to be used. The credentials of the\nconfigured user should have the \"bucket read\" caps enabled.\n\n##### cloudwatch\n\nFor AWS. Configure the cloudwatch metrics BucketSizeBytes and NumberOfObjects.\nThis setting will poll these two. These metrics are updated daily at 00:00 UTC.\nRead AWS's documentation for more information about Cloudwatch.\n\n```\nlocplugin..s3.signature_ver: [s3, s3v4]\n```\nMost S3 endpoints should use the s3v4 signature auth version, and is used as\ndefault, but use s3 in case is needed.\n\n##### minio_prometheus\n\nMinio endpoints can expose metrics with a Prometheus client. The URL's path\nis assumed to be \"/minio/prometheus/metrics\". This replaces any existing path\nin the endpoint's configuration URL.\n\nThese are the metrics extracted:\n - minio_disk_storage_available_bytes\n - minio_disk_storage_total_bytes\n - minio_disk_storage_used_bytes\n\nThe quota/total_bytes can be overridden in the configuration file.\n\n## How it works\n\n[Simple Flowchart](doc/diagrams/dynafed_storagestats_flowchart.pdf)\n\nWhen run the main function will read every configuration file in the directory\ngiven by the user (which defaults to /etc/ugr/conf.d), and will identify all the\ndifferent endpoints with their respective settings and authorization credentials.\n\nA python object belonging to a subclass of StorageStats, depending on the protocol\nto be used, is created for each endpoint containing all the settings and\nmethods necessary to request and process storage stats and quota information.\n\nMemcache is contacted to look for UGR's endpoint connection stats. Any endpoints\nflagged as \"Offline\" here will be skipped and flagged this will be informed in\nthe output. For those that are \"Online\", or if they could not be found to have\ninformation will be contacted to obtain the storage stats. The information is\nthen stored a dictionary attribute \"stats\" in each object.\n\nThe stats can then be output either to a memcache instance or the STDOUT,\ndepending on the options chosen when invoking this script.\n\n## Warning/Error Codes\n\nKeyword/Setting | Status Code\n--------------- | -----------\nUnknown General Warning/Error | 000\nUnknown/Invalid setting error | 001\nNo Config Files / ID Mismatch | 002\n**General Settings/DAV Plugin** |\ncli_certificate | 003\ncli_private_key | 004\nconn_timeout | 005\nssl_check | 006\nInvalid URL Schema | 008\nUnsupported Plugin | 009\n**Azure Plugin** |\nazure.key | 010\n**S3 Plugin** |\ns3.alternate | 020\ns3.priv_key | 021\ns3.pub_key | 022\ns3.region | 023\ns3.signature_ver | 024\n**Storage Stats Scripts Settings** |\nstoragestats.api | 070\nstoragestats.quota | 071\nstoragestats.frequency | 072\n**Memcached Warning/Errors** |\nUnknown | 080\nMemcached Connection | 081\nMemcached Index | 082\n**StorageStats Connection Warning/Errors** |\nUnknown | 090\nClient Certificate Path | 091\nServer SSL Validation | 092\nBoto Param Validation Error | 095\nRFC4331 DAV Quota Method Not Supported | 096\nNo Quota Given by Endpoint | 098\nCeph S3 Bucket Quota Disabled | 099\nConnection Error | 400\nElement/Bucket/Blob not found | 404\nEndpoint Offline | 503\n\n## Development setup\n\nTo install in \"edit\" mode, add the \"-e\" flag to pip3. This installs the package\nas a symlink to the source code, so any changes made are reflected automatically\nwhen running the executable.\n\n```bash\npip3 install -e .\n```\n\n## Meta\n\nFernando Fernandez \u2013 ffernandezgalindo@triumf.ca\n\nDistributed under the Apache license. See [``LICENSE``](LICENSE) for more information.\n\n[https://github.com/hep-gc/dynafed_storagestats](https://github.com/hep-gc/dynafed_storagestats)\n\n## Contributing\n\n\n[wiki]: https://github.com/hep-gc/dynafed_storagestats/wiki\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/hep-gc/dynafed_storagestats", "keywords": "", "license": "Apache", "maintainer": "", "maintainer_email": "", "name": "dynafed-storagestats", "package_url": "https://pypi.org/project/dynafed-storagestats/", "platform": "", "project_url": "https://pypi.org/project/dynafed-storagestats/", "project_urls": { "Homepage": "https://github.com/hep-gc/dynafed_storagestats" }, "release_url": "https://pypi.org/project/dynafed-storagestats/1.0.28/", "requires_dist": [ "azure-storage", "boto3", "lxml", "prometheus-client", "python-memcached", "PyYAML", "requests", "requests-aws4auth" ], "requires_python": "~=3.4", "summary": "Dynafed Storage Stats Module", "version": "1.0.28" }, "last_serial": 5943736, "releases": { "1.0.12": [ { "comment_text": "", "digests": { "md5": "c334f2afa5c673ddbfabf90ff9abaf85", "sha256": "835dfe2042ce380924793cad3aec1bdbf6c422e9b8d00d4a068e10e02c7a94b9" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.12-py3-none-any.whl", "has_sig": false, "md5_digest": "c334f2afa5c673ddbfabf90ff9abaf85", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 46655, "upload_time": "2019-06-17T23:10:30", "url": "https://files.pythonhosted.org/packages/92/f2/627695402959ec26bc93984a46e06ace0855ef1c7afe76f77bac094ce08a/dynafed_storagestats-1.0.12-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7bd9bff6244c04faa4d245e5e3c3f9b5", "sha256": "2613628141c22581712039d32a7b5c29976ae53e9ffaa3b72bd174b74751286a" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.12.tar.gz", "has_sig": false, "md5_digest": "7bd9bff6244c04faa4d245e5e3c3f9b5", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 39003, "upload_time": "2019-06-17T23:10:32", "url": "https://files.pythonhosted.org/packages/4e/fd/8eb3c98a9c37978cc6354beabfa7b397b78308596d24d004f9a5265385a7/dynafed_storagestats-1.0.12.tar.gz" } ], "1.0.15": [ { "comment_text": "", "digests": { "md5": "7f225f1ef4c389d027a5d6e91e83b87a", "sha256": "38c89b8c2c4cfd8e64c0e2425c0496adc361e3cd6424b0754b23632ef6048bb0" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.15-py3-none-any.whl", "has_sig": false, "md5_digest": "7f225f1ef4c389d027a5d6e91e83b87a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 48148, "upload_time": "2019-08-23T23:03:59", "url": "https://files.pythonhosted.org/packages/6b/3e/da86106106e67166d0455e703e341e6fc176405f73af57f805599b5bc6c5/dynafed_storagestats-1.0.15-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c76ea3ea0fba94c3e77cd904275d5d96", "sha256": "249d31efe0637bc2a9fab2555f9dff4948991e438332dca96745fca453ed97fb" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.15.tar.gz", "has_sig": false, "md5_digest": "c76ea3ea0fba94c3e77cd904275d5d96", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 40427, "upload_time": "2019-08-23T23:04:01", "url": "https://files.pythonhosted.org/packages/7b/47/d558406fc4d3413f0e01b585712103aebc69bfcae6d1b14a4afa826aff89/dynafed_storagestats-1.0.15.tar.gz" } ], "1.0.17": [ { "comment_text": "", "digests": { "md5": "b94938e438d85b2ba3da533e790f9966", "sha256": "74b6f6798e71d5e5e881fa30c43dd60df31005be347d924db75a088fff0129bf" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.17-py3-none-any.whl", "has_sig": false, "md5_digest": "b94938e438d85b2ba3da533e790f9966", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 48559, "upload_time": "2019-08-26T22:39:11", "url": "https://files.pythonhosted.org/packages/73/cc/9873c7fd8bd7cff3ba716970333363999f7a2423fbd314586b818f06fdb0/dynafed_storagestats-1.0.17-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "58017467986fb94cf2758e0a1a428f22", "sha256": "027d05ef94d8d0200895cca4b8869d6a156d13f308b22052a716c24384cc6430" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.17.tar.gz", "has_sig": false, "md5_digest": "58017467986fb94cf2758e0a1a428f22", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 40775, "upload_time": "2019-08-26T22:39:14", "url": "https://files.pythonhosted.org/packages/62/34/9bc9943ba5a039e6fdfecd29988ed2599b7bd2ccb498d037c155e5bb8fcb/dynafed_storagestats-1.0.17.tar.gz" } ], "1.0.18": [ { "comment_text": "", "digests": { "md5": "b67d432d9a101c4ab1c87af3cd27bc5e", "sha256": "35eab4cd034ef349eee25a9b0d6bf8953335ea35c4380e4cb3d6bb58e107dcb1" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.18-py3-none-any.whl", "has_sig": false, "md5_digest": "b67d432d9a101c4ab1c87af3cd27bc5e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 51708, "upload_time": "2019-09-06T21:16:22", "url": "https://files.pythonhosted.org/packages/8d/05/c4114e492466586a8a2441c298ab7470730cc97d628da4777b15e9414c6a/dynafed_storagestats-1.0.18-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a67b740517afab809f092f9963b7d27e", "sha256": "c48c5ab0baa03ed6cb41d24c7693e3053f8f11767d3e0b7107eeeac35ec62768" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.18.tar.gz", "has_sig": false, "md5_digest": "a67b740517afab809f092f9963b7d27e", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 44845, "upload_time": "2019-09-06T21:16:24", "url": "https://files.pythonhosted.org/packages/55/e2/3d4d77a117b59291874c44b81ccb0ebd19e0d8610ad8fd62983d8c731b3b/dynafed_storagestats-1.0.18.tar.gz" } ], "1.0.19": [ { "comment_text": "", "digests": { "md5": "6461c43f7184eb16cb5bcdb1a57a4591", "sha256": "dbe9180275c8aaac1a1934e34731b0e3f90a3ad78671b2169e8e41d999af1e19" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.19-py3-none-any.whl", "has_sig": false, "md5_digest": "6461c43f7184eb16cb5bcdb1a57a4591", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 51943, "upload_time": "2019-09-11T22:23:24", "url": "https://files.pythonhosted.org/packages/36/e8/3dc65f2fadd30967cec86318de30be41b87ece184c9d951950927574e4a4/dynafed_storagestats-1.0.19-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8dd9dbd1ad7cdb24f282c2584ea1eca3", "sha256": "259c5841d0abc448ba50e99ff658a5b4d95474296ecd7de4f3489b98a10f4b40" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.19.tar.gz", "has_sig": false, "md5_digest": "8dd9dbd1ad7cdb24f282c2584ea1eca3", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 45061, "upload_time": "2019-09-11T22:23:26", "url": "https://files.pythonhosted.org/packages/e5/3f/93c749e567a45a5cfaa99698498fcff5fb7285da67eaa82738c537b61e09/dynafed_storagestats-1.0.19.tar.gz" } ], "1.0.20": [ { "comment_text": "", "digests": { "md5": "4225ccc089346d020246939533616727", "sha256": "f8371111f7df87e9973afba400782c46d0949386688573b099f75eb6e0286279" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.20-py3-none-any.whl", "has_sig": false, "md5_digest": "4225ccc089346d020246939533616727", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 52495, "upload_time": "2019-09-12T20:24:12", "url": "https://files.pythonhosted.org/packages/ed/a1/5e8d12642fca50e53fa4381f1dd6d62cce7843f2732f93ab1561c6370614/dynafed_storagestats-1.0.20-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "853674c36c37528317938da1dbfec1c9", "sha256": "1ce2aee466bc47f8b34f0bdd839046d250b3c4668954eb459242cfbff8e256fc" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.20.tar.gz", "has_sig": false, "md5_digest": "853674c36c37528317938da1dbfec1c9", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 45751, "upload_time": "2019-09-12T20:24:19", "url": "https://files.pythonhosted.org/packages/48/e3/31726cd9877371a342512ef32992574dd3ca544cd465ee1fc8ce5714fbf1/dynafed_storagestats-1.0.20.tar.gz" } ], "1.0.21": [ { "comment_text": "", "digests": { "md5": "30a61bb1573849e373c1d775a24077a1", "sha256": "e18e0e1125661bed4dca6eb2ffe1536dffead035b5ab7622df53615f80b0d4a4" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.21-py3-none-any.whl", "has_sig": false, "md5_digest": "30a61bb1573849e373c1d775a24077a1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 52500, "upload_time": "2019-09-12T20:41:13", "url": "https://files.pythonhosted.org/packages/39/ab/94e44c1bf9054aa7c3c1e58cd23b48ebb8e245b82fadcc1b004f745678a6/dynafed_storagestats-1.0.21-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ef7250f30189985e1cd2eaa1ddfb069", "sha256": "cbadf2681bef4058677006cb97efb834fff5bd3e01befe462abcc05b8ef464f2" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.21.tar.gz", "has_sig": false, "md5_digest": "6ef7250f30189985e1cd2eaa1ddfb069", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 45758, "upload_time": "2019-09-12T20:41:15", "url": "https://files.pythonhosted.org/packages/c3/05/5ad6f21ab65d1ad21c694eed1bd6d3537469fe1e954236def72b052e4957/dynafed_storagestats-1.0.21.tar.gz" } ], "1.0.22": [ { "comment_text": "", "digests": { "md5": "17c2e90a74c49a98bb1bf9abd2fb65df", "sha256": "5826e12109d93bd973ead2e3a48517640fdfc6a333bc0940b3c4e3e23d5ff836" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.22-py3-none-any.whl", "has_sig": false, "md5_digest": "17c2e90a74c49a98bb1bf9abd2fb65df", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 52800, "upload_time": "2019-09-13T22:48:21", "url": "https://files.pythonhosted.org/packages/30/ab/cf967b3b113b861e895d13cc812be5bdadca27757b78733fe63e29e29071/dynafed_storagestats-1.0.22-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "344c0e4bfe51a8f8979cabfe6239a4a8", "sha256": "d0b3bd2599caa13da80d88a7b4f7d94002c8e0f0c85f707f34f9b37e58097f3f" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.22.tar.gz", "has_sig": false, "md5_digest": "344c0e4bfe51a8f8979cabfe6239a4a8", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 46033, "upload_time": "2019-09-13T22:48:22", "url": "https://files.pythonhosted.org/packages/8e/0d/54ed72d1d98711d1dca285746e041db2042cafdc49f9055baef3e11658b6/dynafed_storagestats-1.0.22.tar.gz" } ], "1.0.23": [ { "comment_text": "", "digests": { "md5": "ffda0e88f599e515bdf50a7db186a1fd", "sha256": "9dfb6e4bd3c9f66fc9dc0552a7acc52f3647373e8638b06935ea91e86ba1926d" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.23-py3-none-any.whl", "has_sig": false, "md5_digest": "ffda0e88f599e515bdf50a7db186a1fd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 53206, "upload_time": "2019-09-17T21:28:16", "url": "https://files.pythonhosted.org/packages/67/69/67571256c9a11a98b640c425e060c5a6c3f50804bccf45121475a431fcfe/dynafed_storagestats-1.0.23-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5919bc661c4befef0f5b645f000181d1", "sha256": "dc089284f894c5485d0fb154b218ee60199adf06d9530b7156d4670b476dc680" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.23.tar.gz", "has_sig": false, "md5_digest": "5919bc661c4befef0f5b645f000181d1", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 46372, "upload_time": "2019-09-17T21:28:19", "url": "https://files.pythonhosted.org/packages/1f/47/878281d14ad88f4f699f3deddcc6d9d7561fc800164ee885167b657fcd86/dynafed_storagestats-1.0.23.tar.gz" } ], "1.0.24": [ { "comment_text": "", "digests": { "md5": "686dc3bcd371f8ce25f2a37a3732c8d8", "sha256": "4a26a1875ff4018d21c274f99cf7524532ec2788bf2dded78285c851aeb33567" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.24-py3-none-any.whl", "has_sig": false, "md5_digest": "686dc3bcd371f8ce25f2a37a3732c8d8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55747, "upload_time": "2019-09-20T21:37:19", "url": "https://files.pythonhosted.org/packages/72/62/03f91a6e1f4fcaadd3e71481d8fa6ca8b64f0e22c312523e3cedcec37f3f/dynafed_storagestats-1.0.24-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b56d420b9a4cb8a74efd51920f00db2d", "sha256": "707b947661cd1304d550c4f8cda0d65aba9ffaf0e9d7916bcaf4888aea46f0a5" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.24.tar.gz", "has_sig": false, "md5_digest": "b56d420b9a4cb8a74efd51920f00db2d", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 49171, "upload_time": "2019-09-20T21:37:21", "url": "https://files.pythonhosted.org/packages/65/16/96c3b9659ec0b3794647aea372153659c6c6b78f7e7721ff9f27a45f67f5/dynafed_storagestats-1.0.24.tar.gz" } ], "1.0.25": [ { "comment_text": "", "digests": { "md5": "b327175a360f263de7250df55eafd6ec", "sha256": "daa8d9ee6631d23a99a3e59766a169861fca84c222326971f90c88bdaa0e9d31" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.25-py3-none-any.whl", "has_sig": false, "md5_digest": "b327175a360f263de7250df55eafd6ec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55751, "upload_time": "2019-09-20T21:56:26", "url": "https://files.pythonhosted.org/packages/b1/de/1c11e9cd82ca2a7c0e9333765e56bedd2102ee39a4aa2bd8b86a9086042f/dynafed_storagestats-1.0.25-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d56e214aaec8baca1615184d2c5b2d6c", "sha256": "0c8d82e0cab73aaf51234f82e45f44e0b9b955657b0dda07eeb6ed6c067fe167" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.25.tar.gz", "has_sig": false, "md5_digest": "d56e214aaec8baca1615184d2c5b2d6c", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 49191, "upload_time": "2019-09-20T21:56:27", "url": "https://files.pythonhosted.org/packages/b1/97/c15386721f9a8c49cb7cfcded9779c22f68c85df552c06525ca20d144173/dynafed_storagestats-1.0.25.tar.gz" } ], "1.0.26": [ { "comment_text": "", "digests": { "md5": "97d3df3b28dd05f180bdd5ac99ee7dba", "sha256": "61e80345776d960c4cd1ac7b0366be2a9f2c241ffd50c856aa33bc173b486814" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.26-py3-none-any.whl", "has_sig": false, "md5_digest": "97d3df3b28dd05f180bdd5ac99ee7dba", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55767, "upload_time": "2019-09-20T23:19:24", "url": "https://files.pythonhosted.org/packages/65/34/10ac0deb3ac6a7e8555ca57583ba54476ea5c752d698c4b1c67c03620da2/dynafed_storagestats-1.0.26-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68db48db6075e4997631fef029b37929", "sha256": "065041354e43e5253db826c58f10228693dcf168b7e330f27064c6b4eb00a80e" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.26.tar.gz", "has_sig": false, "md5_digest": "68db48db6075e4997631fef029b37929", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 49212, "upload_time": "2019-09-20T23:19:25", "url": "https://files.pythonhosted.org/packages/3b/d1/3bd35e4dbc13535507d49c4a1d12fff9d7d5a7599e47a162d4579504ec74/dynafed_storagestats-1.0.26.tar.gz" } ], "1.0.27": [ { "comment_text": "", "digests": { "md5": "01fb718ba6f49e2b19dfb4f8bb04ab62", "sha256": "3a90b6921db1d7d3c5450bc657a363304bc1c1fdaaee75440fb86f7293c354b4" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.27-py3-none-any.whl", "has_sig": false, "md5_digest": "01fb718ba6f49e2b19dfb4f8bb04ab62", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55835, "upload_time": "2019-10-01T09:27:48", "url": "https://files.pythonhosted.org/packages/fa/a7/9577443af4367cfa5bbb77f74313bdd45c1979e56215ed0bfaee801e11fb/dynafed_storagestats-1.0.27-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df2f4057e57c23455b41911345474256", "sha256": "1182de89bcc4e3ad61971da2e45b0696e05366dc92c5937c962deae56888bd68" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.27.tar.gz", "has_sig": false, "md5_digest": "df2f4057e57c23455b41911345474256", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 49328, "upload_time": "2019-10-01T09:27:50", "url": "https://files.pythonhosted.org/packages/b4/09/c56d85cdf6152d260f432161c4996acc2efb64ed1cd7cf98eeaad3ded833/dynafed_storagestats-1.0.27.tar.gz" } ], "1.0.28": [ { "comment_text": "", "digests": { "md5": "08987a3d00d223192fb618d77e171cc2", "sha256": "f3769d110df4cd0224c2622390b17470de75a501a0d7816d2e42c78c3ff7efc0" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.28-py3-none-any.whl", "has_sig": false, "md5_digest": "08987a3d00d223192fb618d77e171cc2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55485, "upload_time": "2019-10-08T09:02:36", "url": "https://files.pythonhosted.org/packages/9f/2b/88f5b4cb1de075b114b55b093db2d21deec0e9f33453cee3b172a8bf3c78/dynafed_storagestats-1.0.28-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "255e3a985c1d07219d37fbb24ae940d5", "sha256": "9e1d01925f1d158544b51c33a13ba819d61f311cdb86081b85519a04aa8996b7" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.28.tar.gz", "has_sig": false, "md5_digest": "255e3a985c1d07219d37fbb24ae940d5", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 48986, "upload_time": "2019-10-08T09:02:38", "url": "https://files.pythonhosted.org/packages/3d/7a/37f678ccd72d2a18c0c21e2b6b2fc62ba98d8028bee527f6e9e73a421a04/dynafed_storagestats-1.0.28.tar.gz" } ], "1.0.6": [ { "comment_text": "", "digests": { "md5": "012382145c3e2543c70b95db52492bb4", "sha256": "4633ce0e2694d3b20a41acdb0a66f4eeaf33b895d2182685144fb10170d802cd" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "012382145c3e2543c70b95db52492bb4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 42391, "upload_time": "2018-12-20T21:29:16", "url": "https://files.pythonhosted.org/packages/df/04/6783572e866987bc1ca2a52f6725e6bf757012b9d8fcbea4b17ad27ed958/dynafed_storagestats-1.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a2bf4912bf6d6dd78bd4ccf9a3311ae0", "sha256": "2e48bed72c35bd88a42af719864d31d8ab3c8806b33a6628081bcbb9c1860702" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.6.tar.gz", "has_sig": false, "md5_digest": "a2bf4912bf6d6dd78bd4ccf9a3311ae0", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 34211, "upload_time": "2018-12-20T21:29:18", "url": "https://files.pythonhosted.org/packages/55/8a/14bf51414dd665528f77604d8c720833bc7d9de82c6d15f52b7207ac2860/dynafed_storagestats-1.0.6.tar.gz" } ], "1.0.7": [ { "comment_text": "", "digests": { "md5": "d48ecf079b6937a978cd48f3061d6936", "sha256": "63858b62daff6972d610701ff22a0284a98631fec08df072504aee20bce03922" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "d48ecf079b6937a978cd48f3061d6936", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 42847, "upload_time": "2019-02-06T23:47:58", "url": "https://files.pythonhosted.org/packages/c7/d0/d38b3cd70176e0fdfb0ab3d146d62c4b9757065830027d5af32f83e79287/dynafed_storagestats-1.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "350317e65278d64917a06c34095aa343", "sha256": "7e6f884e62e20080c4a82eade3d370c1e2c6898d69f0b98c485eae7c0f3d0b2b" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.7.tar.gz", "has_sig": false, "md5_digest": "350317e65278d64917a06c34095aa343", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 34723, "upload_time": "2019-02-06T23:48:01", "url": "https://files.pythonhosted.org/packages/f1/f5/6a1c9d51b8584c44f44348e712fc89475d7098188d62a8eb6d592bd6ff4d/dynafed_storagestats-1.0.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "08987a3d00d223192fb618d77e171cc2", "sha256": "f3769d110df4cd0224c2622390b17470de75a501a0d7816d2e42c78c3ff7efc0" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.28-py3-none-any.whl", "has_sig": false, "md5_digest": "08987a3d00d223192fb618d77e171cc2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": "~=3.4", "size": 55485, "upload_time": "2019-10-08T09:02:36", "url": "https://files.pythonhosted.org/packages/9f/2b/88f5b4cb1de075b114b55b093db2d21deec0e9f33453cee3b172a8bf3c78/dynafed_storagestats-1.0.28-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "255e3a985c1d07219d37fbb24ae940d5", "sha256": "9e1d01925f1d158544b51c33a13ba819d61f311cdb86081b85519a04aa8996b7" }, "downloads": -1, "filename": "dynafed_storagestats-1.0.28.tar.gz", "has_sig": false, "md5_digest": "255e3a985c1d07219d37fbb24ae940d5", "packagetype": "sdist", "python_version": "source", "requires_python": "~=3.4", "size": 48986, "upload_time": "2019-10-08T09:02:38", "url": "https://files.pythonhosted.org/packages/3d/7a/37f678ccd72d2a18c0c21e2b6b2fc62ba98d8028bee527f6e9e73a421a04/dynafed_storagestats-1.0.28.tar.gz" } ] }