{ "info": { "author": "Avi Rozen", "author_email": "avi.rozen@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: No Input/Output (Daemon)", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Topic :: System :: Archiving :: Backup", "Topic :: System :: Filesystems" ], "description": "========\nBaculaFS\n========\n\nBaculaFS_ - Exposes the Bacula_ [*]_ catalog and storage as a Filesystem in\nUSErspace (FUSE_).\n\n.. _BaculaFS: http://code.google.com/p/baculafs\n.. _Bacula: http://www.bacula.org\n.. _FUSE: http://fuse.sourceforge.net/\n\nCopyright |(C)| 2009, 2010 Avi Rozen \n\n.. contents:: \n\nIntroduction\n------------\n\n**BaculaFS** is a tool, developed independently of Bacula, that\nrepresents the Bacula catalog and backup storage media as a read-only\nfilesystem in userspace.\n\n**BaculaFS** is specifically designed to cater for the following\nuse-cases:\n\n- maintaining a remote snapshot of the files in the backup storage\n using `rsync`_ or `duplicity`_\n- auditing the contents of backup jobs, without resorting to SQL\n queries\n- comparing backup jobs (using several mount points)\n\nNote that **BaculaFS** is a maintenance tool - its operation may\ninterfere with the normal operation of a live Bacula setup (see the\nLimitations_ section below).\n\n\n.. _rsync: http://samba.anu.edu.au/rsync/\n.. _duplicity: http://www.nongnu.org/duplicity/\n\n\nRequirements\n------------\n\n**BaculaFS** has been tested with the following set of required\nsoftware packages:\n\n+ Bacula 5.0.2 with one of the following database backends:\n\n * SQLite_ 3.7.3\n * MySQL_ 5.1.49\n * PostgreSQL_ 8.4.5\n \n+ FUSE_ components:\n\n * Python FUSE 0.2.1\n * FUSE library 2.8.4\n * fusermount 2.8.4\n * FUSE kernel interface 7.12\n\n+ Python_ 2.6.6, with the following additional libraries:\n\n * MySQLdb_ 1.2.2\n * psycopg2_ 2.2.1\n * pexpect_ 2.3\n \n+ attr_ extended attributes utilities 2.4.44\n\n**BaculaFS** requires the following in order to function:\n\n+ access to the database that's used to store the Bacula catalog\n+ access to the Bacula storage device\n+ access to the Bacula ``bextract`` utility (bundled with the Bacula\n storage daemon installation)\n\n.. _SQLite: http://www.sqlite.org/\n.. _MySQL: http://www.mysql.com/\n.. _PostgreSQL: http://www.postgresql.org/\n.. _Python: http://www.python.org\n.. _FUSE: http://fuse.sourceforge.net/\n.. _psycopg2: http://initd.org/projects/psycopg\n.. _MySQLdb: http://mysql-python.sourceforge.net/\n.. _pexpect: http://www.noah.org/wiki/Pexpect\n.. _attr: http://savannah.nongnu.org/projects/attr\n\n\nInstallation\n------------\n\nExtract the source code archive to a temporary directory, ``cd`` to\nthis directory and run\n\n::\n\n python setup.py install\n\nUsage\n-----\n\n::\n\n baculafs [mountpoint] [options]\n \n Options:\n --version show program's version number and exit\n -h, --help show this help message and exit\n -o opt,[opt...] mount options\n -o driver=mysql|postgresql|sqlite3\n database driver [default: sqlite3]\n -o host=HOST database server address [default: localhost]\n -o port=PORT database server port\n -o database=PATH database name [default: bacula]\n -o username=USERNAME database user name [default: bacula]\n -o password=PASSWORD database password (use '-o password= ' to get a\n password prompt; if not provided, the password is\n read from the DATABASE_PASSWORD environment\n variable)\n -o conf=PATH storage daemon configuration file [default:\n /etc/bacula/bacula-sd.conf]\n -o client=CLIENT file daemon name\n -o fileset=FILESET backup fileset\n -o device=DEVICE storage device name [default: FileStorage]\n -o datetime='YYYY-MM-DD hh:mm:ss'\n snapshot date/time [default: now]\n -o recent_job select contents of most recent job only [default:\n False]\n -o joblist='JOBID1 JOBID2 ...'\n select contents of specified list of jobs\n -o cleanup clean cache directory upon umount [default: False]\n -o move_root make absolute path symlinks point to path under\n mount point [default: False]\n -o prefetch_attrs read and parse attributes for all files upon\n filesystem initialization [default: False]\n -o prefetch_symlinks extract all symbolic links upon filesystem\n initialization (implies prefetch_attrs) [default:\n False]\n -o prefetch_regex=REGEX\n extract all objects that match REGEX upon\n filesystem initialization (implies prefetch_attrs)\n -o prefetch_recent extract contents of most recent non-full job upon\n filesystem initialization (implies\n prefetch_symlinks) [default: False]\n -o prefetch_diff=PATH extract files that do not match files at PATH\n (hint: speeds up rsync; implies prefetch_symlinks)\n -o prefetch_difflist=DIFFLIST\n extract files that do not match files in DIFFLIST\n (list line format: 'Day Mon DD hh:mm:ss YYYY PATH';\n use '-' to read from standard input; hint: format\n matches output of 'duplicity list-current-files -v0\n target_url'; implies prefetch_symlinks)\n -o prefetch_list=LIST extract files that match files in LIST (list should\n contains one absolute file path per line; use '-'\n to read from standard input; implies\n prefetch_symlinks)\n -o prefetch_everything\n extract everything upon filesystem initialization\n (complete restore to cache) [default: False]\n -o batch_list list files to be prefetched and exit [default:\n False]\n -o batch_bsr dump contnets of bsr file for extracting prefetched\n files and exit [default: False]\n -o batch_extract extract prefetched files to mount point and exit\n [default: False]\n -o user_cache_path=PATH\n user specified cache path (hint: combine this with\n one of the prefetch options) [default: none]\n -o logging=debug|info|warning|critical|error\n logging level [default: info]\n -o syslog log to both syslog and console [default: False]\n \n FUSE options:\n -d -o debug enable debug output (implies -f)\n -f foreground operation\n -s disable multi-threaded operation\n \n -o allow_other allow access to other users\n -o allow_root allow access to root\n -o nonempty allow mounts over non-empty file/dir\n -o default_permissions enable permission checking by kernel\n -o fsname=NAME set filesystem name\n -o subtype=NAME set filesystem type\n -o large_read issue large read requests (2.4 only)\n -o max_read=N set maximum size of read requests\n \n -o hard_remove immediate removal (don't hide files)\n -o use_ino let filesystem set inode numbers\n -o readdir_ino try to fill in d_ino in readdir\n -o direct_io use direct I/O\n -o kernel_cache cache files in kernel\n -o [no]auto_cache enable caching based on modification times (off)\n -o umask=M set file permissions (octal)\n -o uid=N set file owner\n -o gid=N set file group\n -o entry_timeout=T cache timeout for names (1.0s)\n -o negative_timeout=T cache timeout for deleted names (0.0s)\n -o attr_timeout=T cache timeout for attributes (1.0s)\n -o ac_attr_timeout=T auto cache timeout for attributes (attr_timeout)\n -o intr allow requests to be interrupted\n -o intr_signal=NUM signal to send on interrupt (10)\n -o modules=M1[:M2...] names of modules to push onto filesystem stack\n \n -o max_write=N set maximum size of write requests\n -o max_readahead=N set maximum readahead\n -o async_read perform reads asynchronously (default)\n -o sync_read perform reads synchronously\n -o atomic_o_trunc enable atomic open+truncate support\n -o big_writes enable larger than 4kB writes\n -o no_remote_lock disable remote file locking\n \n Module options:\n \n [subdir]\n -o subdir=DIR\t prepend this directory to all paths (mandatory)\n -o [no]rellinks\t transform absolute symlinks to relative\n \n [iconv]\n -o from_code=CHARSET original encoding of file names (default: UTF-8)\n -o to_code=CHARSET\t new encoding of the file names (default: UTF-8)\n \n\nOperation\n---------\n\nInitialization\n~~~~~~~~~~~~~~\n\n**BaculaFS** starts by running several SQL queries against the Bacula\ncatalog. This is done to determine the list of files that belong to\nthe most recent backup for a given client and fileset.\n\n**BaculaFS** can also be told to represent a backup snapshot\ncorresponding to a specified date and time, or a list of backup job\nids.\n\nFollowing this, **BaculaFS** may run ``bextract`` *once* to prefetch\nand cache symbolic links and actual file contents, depending on user\nspecified command line options.\n\nAt this point the filesystem is ready.\n\nCache\n~~~~~\n\nOpening a file for reading causes **BaculaFS** to run ``bextract`` in\norder to extract the file from the storage device. If this operation\nsucceeds, the file is cached for subsequent read operations.\n\nBacula storage is not designed for random access file retrieval, so it\nis important to select a suitable cache prefetch strategy beforehand.\nRunning ``bextract`` once, during filesystem initialization, to\nextract several files, is much more efficient than running it several\ntimes to extract each individual file, when accessed at a later stage.\n\nFor example:\n\n- use ``-o prefetch_attrs`` for storage space usage analysis\n (e.g. with Baobab_)\n- use ``-o prefetch_symlinks`` for any manual filesystem traversal\n with command line or GUI tools (``find``, ``mc``, etc.)\n- use ``-o prefetch_diff`` with ``rsync``\n\n.. _Baobab: http://www.marzocca.net/linux/baobab/\n\nThe cache may be cleaned up automatically upon un-mounting the\nfilesystem, with ``-o cleanup``. It may also be reused between mount\noperations with ``-o user_cache_path``.\n\nBatch Mode\n~~~~~~~~~~\n\n**BaculaFS** may be used in *batch mode* with ``-o batch_extract`` in\norder to extract files from the Bacula storage device and then exit\nwithout mounting the filesystem. The mountpoint specified at the\ncommand line is then treated as the destination directory for\nextracted files.\n\nThe list of files, to be extracted in batch mode, is determined by the\nvarious cache prefetch options, and may be dumped with ``-o\nbatch_list``.\n\nThe bootstrap file that is generated, in order to extract the files,\ncan also be dumped to standard output with ``-o batch_bsr``.\n\n\nExtended Attributes\n~~~~~~~~~~~~~~~~~~~\n\n**BaculaFS** uses extended file attributes to expose Bacula specific\ninformation for each file in the filesystem. These extended attributes\nare all grouped in the ``user.baculafs`` namespace:\n\n::\n\n user.baculafs.FileIndex\n user.baculafs.JobId\n user.baculafs.LStat\n user.baculafs.MD5\n\nNote that ``user.baculafs.MD5`` shows whatever digest Bacula was\nconfigured to calculate for the file, be it MD5, SHA1, SHA256 or\nSHA512.\n\nThe root directory has several more attributes, that expose filesystem\ninstance-specific information:\n\n::\n\n user.baculafs.cache_prefix\n user.baculafs.client\n user.baculafs.datetime\n user.baculafs.fileset\n user.baculafs.joblist\n\nand several more attributes for monitoring the file extraction\nprocess:\n \n::\n\n user.baculafs.bextract.failures\n user.baculafs.bextract.path\n user.baculafs.bextract.pending\n user.baculafs.bextract.retries\n user.baculafs.bextract.state\n user.baculafs.bextract.volume\n\nMissing Volumes\n~~~~~~~~~~~~~~~\n\nIf the storage device is a tape drive then it's possible that\n**BaculaFS** will attempt to retrieve a file from a volume that's on\nan unmounted tape. **BaculaFS** will then set\n``user.baculafs.bextract.state`` to ``*user intervention required*``,\nand will wait for user intervention.\n\nThe user should then mount the tape containing the missing volume and\nset the state to ``run``, to make **BaculaFS** retry the operation:\n\n::\n\n attr -s baculafs.bextract.state -V run \n\nPlease note that this feature has undergone only rudimentary\ntesting. Expect breakage.\n\n\nExamples\n~~~~~~~~\n\nMount the most recent backup snapshot for Bacula client ``client-fd``\nand fileset ``client-fileset``; SQLite database backend (default):\n\n::\n\n baculafs -o client=client-fd,fileset=client-fileset /path/to/mount/point\n\nMount the contents of the specified list of backup jobs; MySQL database\nbackend; prompt for password and prefetch to cache all symbolic links:\n\n::\n\n baculafs -o joblist='1001 1003',client=client-fd,fileset=client-fileset \\\n -o driver=mysql,password=,prefetch_symlinks /path/to/mount/point\n\nMount the contents of the most recent backup job only:\n\n::\n\n baculafs -o recent_job,client=client-fd,fileset=client-fileset /path/to/mount/point\n\nMount the contents of the fileset snapshot before the specified\ndate/time:\n\n::\n\n baculafs -o datetime='2009-05-23 00:00:00' \\\n -o client=client-fd,fileset=client-fileset /path/to/mount/point\n \nAllow other users to access filesystem, set logging level to ``debug``\nand stay in foreground, so that ``bextract`` messages may be examined;\nassume a single Bacula fileset is defined for client ``client-fd``:\n\n::\n\n baculafs -f -o allow_other,client=client-fd,logging=debug /path/to/mount/point\n\nPrefetch to cache files that do not exist, or whose modification time\nor size differ from those at the specified directory (i.e. files that\nwould be sent to that directory using ``rsync``); and cleanup cache after\nun-mounting:\n\n::\n\n baculafs -o prefetch_diff=/path/to/rsync/target,cleanup \\\n -o client=client-fd /path/to/mount/point\n\nBatch update a snapshot of the current files in backup (the filesystem\nis *not* mounted):\n\n::\n\n baculafs -o batch_extract,prefetch_diff=/path/to/snapshot,cleanup \\\n -o client=client-fd /path/to/snapshot/\n\n(this is not as accurate as mounting the filesystem, like in the\nprevious example, and then updating the snapshot with ``rsync`` - but\nit is faster).\n\n \nLimitations\n-----------\n\nCommon Problems\n~~~~~~~~~~~~~~~\n\n**BaculaFS** will abort if no backup job was run for the\nclient/fileset combination selected by the user.\n\n**BaculaFS** will abort if the target mount point is in use. Note,\nhowever, that mount point availability is checked by FUSE only *after*\nthe (potentially lengthy) initialization of **BaculaFS**.\n\nBrowsing a **BaculaFS** mount point with a file manager like Nautilus_\nis liable to be very slow. This is because the file manager reads data\nfrom each file being listed, in order to determine its type, generate\na thumbnail etc. This, in turn, triggers **BaculaFS** to extract the\nfiles, one at a time, from the Bacula storage device to its cache\ndirectory. \n\n.. _Nautilus: http://live.gnome.org/Nautilus\n\nLocking\n~~~~~~~\n\nAccess to the storage device by different instances of **BaculaFS** is\nserialized by locking the storage daemon configuration file. This\nmeans that you can mount several views of the backup catalog\n(e.g. accessing backup snapshots of different clients or snapshots\nfrom the same client but from different dates).\n\nThere are at least two issues with this locking mechanism that you\nshould note:\n\n- the lock is *advisory*, meaning that it does not prevent the Bacula\n storage daemon itself from accessing the storage device while in use\n by **BaculaFS**\n- depending on your setup, the lock may not work if the storage daemon\n configuration file is accessed via NFS\n\n\nUnsupported Features\n~~~~~~~~~~~~~~~~~~~~\n\n**BaculaFS** depends on ``bextract`` and thus inherits its\nlimitations: \n\n- **BaculaFS** can be used with Windows filesets, but it does not\n reproduce any Windows specific file attributes\n- Encrypted backup files are not supported\n- **BaculaFS** must be started with enough permissions (typically as\n ``root``) in order to allow ``bextract`` to extract files from the\n Bacula storage\n\nChangelog\n---------\n**Version 0.1.7 (2010-12-30)**\n\n- fixed: compatibility issues with bacula v2.4.4 and FUSE 7.8\n- fixed: synthesize missing inode numbers with -o use_ino\n- modified: decode value of user.baculafs.MD5 extended file attribute\n- added: cache prefetch specified list of files\n- added: changelog to README\n- added: batch extract mode\n\n**Version 0.1.6 (2010-09-19)**\n\n- fixed cache prefetch by regex\n\n**Version 0.1.5 (2010-07-06)**\n\n- fixed: removed reference to obsolete db field Copy\n- fixed: recent_job option with MySQL\n- added: read database password from environment variable DATABASE_PASSWORD\n- added: usage examples to README\n\n**Version 0.1.4 (2010-02-07)**\n\n- added: cache prefetch based on duplicity file listing\n\n**Version 0.1.3 (2010-01-13)**\n\n- fixed: (again) prefetch restore of files split between volumes\n- fixed: missing import sys\n- fixed: spurious linebreaks in debug log\n\n**Version 0.1.2 (2010-01-13)**\n\n- fixed: prefetch_recent when joblist contains a single non full job\n- fixed: prefetch restore of files split between volumes\n- added: copyright, trademark and license blurbs\n\n**Version 0.1.1 (2010-01-07)**\n\n- workaround: subtle extraction bug (fix forthcoming)\n\n**Version 0.1.1 (2010-01-06)**\n\n- initial public release\n\nBugs\n----\n\nPlease report problems via the **BaculaFS** issue tracking system:\n``_\n\nCredits\n-------\n\n**BaculaFS** contains SQL queries that were adapted from Bacula,\nCopyright |(C)| 2000-2010 Free Software Foundation Europe e.V.\n\nLicense\n-------\n\n**BaculaFS** is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or (at\nyour option) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see\n``_.\n\n.. [*] Bacula is a registered trademark of Kern Sibbald.\n\n.. |(C)| unicode:: 0xA9 .. copyright sign", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://code.google.com/p/baculafs", "keywords": null, "license": "GPL", "maintainer": null, "maintainer_email": null, "name": "BaculaFS", "package_url": "https://pypi.org/project/BaculaFS/", "platform": "Linux", "project_url": "https://pypi.org/project/BaculaFS/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://code.google.com/p/baculafs" }, "release_url": "https://pypi.org/project/BaculaFS/0.1.7/", "requires_dist": null, "requires_python": null, "summary": "Bacula Filesystem in USErspace", "version": "0.1.7" }, "last_serial": 783825, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "08e4fef311e0c245fec51b32f0af4acb", "sha256": "119705916fb626d9a396a49658c977538c77f27ea5c63d4a7dbc7cbdbb4ca062" }, "downloads": -1, "filename": "BaculaFS-0.1.0.tar.gz", "has_sig": false, "md5_digest": "08e4fef311e0c245fec51b32f0af4acb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32012, "upload_time": "2010-01-06T21:27:36", "url": "https://files.pythonhosted.org/packages/bc/df/93bcc86b8f09f991db91c0b72e7dd6e6c45876aa725b70c6a943c47b7493/BaculaFS-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9fe426efef8d1cc77bbaf873a6ca2a3e", "sha256": "9588fd2547b3e23e87e82dc7db3be8f7fecc1cc76b6925bf0853d335a08035c7" }, "downloads": -1, "filename": "BaculaFS-0.1.1.tar.gz", "has_sig": false, "md5_digest": "9fe426efef8d1cc77bbaf873a6ca2a3e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31986, "upload_time": "2010-01-07T09:50:46", "url": "https://files.pythonhosted.org/packages/37/8b/d3c4c366ad1ead6467aac88dc9a5bb85bde3efb20b2ca743b62cd3d86cc5/BaculaFS-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "120b14d5d23a395513cde423d00b1d71", "sha256": "47a674bba1d31b21158ee63a0264723360e90ddefa03025ce69afd9a45ed7122" }, "downloads": -1, "filename": "BaculaFS-0.1.2.tar.gz", "has_sig": true, "md5_digest": "120b14d5d23a395513cde423d00b1d71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33241, "upload_time": "2010-01-09T22:27:15", "url": "https://files.pythonhosted.org/packages/9e/d8/dd7b3baed7155e739b717580437505cced7fea7c97d1755ecbda83ccd0be/BaculaFS-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "2e08f39a046becfed3edfec0fe261b6f", "sha256": "82d38f1cdcec8cd6548d319ff131e5b586433139e6e5374a4eab331e5d54910c" }, "downloads": -1, "filename": "BaculaFS-0.1.3.tar.gz", "has_sig": true, "md5_digest": "2e08f39a046becfed3edfec0fe261b6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33458, "upload_time": "2010-01-13T15:21:19", "url": "https://files.pythonhosted.org/packages/02/ba/3ec9cc5ad83592626a8b8d9d3716f2eb9895155373206edb79a1d7ccbbca/BaculaFS-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "21dd4819f547c25d9b26a5ced27ea5bc", "sha256": "e8ea58f2b73353018d897cfcc39f63886ef8ad8c2cb51d2d720df6a9065a45ea" }, "downloads": -1, "filename": "BaculaFS-0.1.4.tar.gz", "has_sig": true, "md5_digest": "21dd4819f547c25d9b26a5ced27ea5bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33921, "upload_time": "2010-02-09T13:04:28", "url": "https://files.pythonhosted.org/packages/86/f7/b9c429a4d06dc22f1f611b07bbce1225c64a39c6365138bc3d9390447b16/BaculaFS-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "4e0ad277a0de80b6f3ec2d252b38ed76", "sha256": "533cb8c3552477024b06829b73f06310b2ca1d895d933c35f5f996cb4ec239b5" }, "downloads": -1, "filename": "BaculaFS-0.1.5.tar.gz", "has_sig": true, "md5_digest": "4e0ad277a0de80b6f3ec2d252b38ed76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34940, "upload_time": "2010-07-06T16:55:20", "url": "https://files.pythonhosted.org/packages/8b/94/2eb7267add8ea3d3145c85b78010578ace88292a1fa98a36954e5419d422/BaculaFS-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "29ecb9f87037616e2bdcb4a85223b19e", "sha256": "a4331d8ec123d35f31b75496b2948a0da861026d6b1d6e62db55ee401898e81a" }, "downloads": -1, "filename": "BaculaFS-0.1.6.tar.gz", "has_sig": true, "md5_digest": "29ecb9f87037616e2bdcb4a85223b19e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34935, "upload_time": "2010-09-19T03:16:01", "url": "https://files.pythonhosted.org/packages/c3/76/556210cae1df9d7dd791652fa657a1f4f1d5b6f02ea56b38a8d43c76bdf1/BaculaFS-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "50dcca4d11eeaa98fe0382dfd58243db", "sha256": "a0f5ba2d96822043ade17867a9218dc1db0ccc4739419ac02b59a4d7ed750249" }, "downloads": -1, "filename": "BaculaFS-0.1.7.tar.gz", "has_sig": true, "md5_digest": "50dcca4d11eeaa98fe0382dfd58243db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38273, "upload_time": "2010-12-30T22:40:03", "url": "https://files.pythonhosted.org/packages/06/08/d0dcd43b5ef2bf90796c3bb79557bdf9fdab87feeb7c1b37a9fa5104513e/BaculaFS-0.1.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "50dcca4d11eeaa98fe0382dfd58243db", "sha256": "a0f5ba2d96822043ade17867a9218dc1db0ccc4739419ac02b59a4d7ed750249" }, "downloads": -1, "filename": "BaculaFS-0.1.7.tar.gz", "has_sig": true, "md5_digest": "50dcca4d11eeaa98fe0382dfd58243db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38273, "upload_time": "2010-12-30T22:40:03", "url": "https://files.pythonhosted.org/packages/06/08/d0dcd43b5ef2bf90796c3bb79557bdf9fdab87feeb7c1b37a9fa5104513e/BaculaFS-0.1.7.tar.gz" } ] }