combox

split and encrypted files between online file storage providers
git clone git://git.ricketyspace.net/combox.git
Log | Files | Refs

commit 92633ad0d4cd4c7ff7a811460b9691842af15276
parent 666b0e5fcfd6157ca8606bf2a429e50004773fdc
Author: Siddharth Ravikumar <sravik@bgsu.edu>
Date:   Mon, 12 Jan 2015 17:31:54 -0500

added back combox/file.py

Diffstat:
combox/file.py | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 127 insertions(+), 0 deletions(-)

diff --git a/combox/file.py b/combox/file.py @@ -0,0 +1,127 @@ +# Copyright (C) 2014 Combox author(s). See AUTHORS. +# +# This file is part of Combox. +# +# Combox is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Combox is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Combox (see COPYING). If not, see +# <http://www.gnu.org/licenses/>. + +from os import path +from sys import exit +from glob import glob + + +def split_data(data, n): + """Split data into `n' parts and return them as an array. + + data: Stream of bytes or string + n: Number of parts the file has to be split. + """ + + d_parts = [] + # File size in bytes. + data_size = len(data) + # No. of bytes for each data part. + part_size = data_size / n + # Take note of remaining bytes; this is non-zero when data_size is + # not divisible by `n'. + rem_bytes = data_size % n + + start = 0 + end = part_size + while end <= data_size: + d_parts.append(data[start:end]) + start = end + end = end + part_size + + # read the remaining bytes into the last data part. + end += start + rem_bytes + d_parts[n-1] += data[start:end] + + return d_parts + + +def glue_data(d_parts): + """Glue different parts of the data to one. + + d_parts: Array containing different parts of the data. Each part + is a sequence of bytes. + """ + + data = '' + for part in d_parts: + data += part + + return data + + +def read_file(filename): + """Read file and return it as a string. + + filename: Absolute pathname of the file. + """ + file_ = None + try: + file_ = open(filename, 'rb') + except IOError: + print "ERROR: opening %s" % (filename) + exit(1) + + return file_.read() + + +def write_file(filename, filecontent): + """Write `filecontent' to `filename'. + + filename: Absolute pathname of the file. + filecontent: String/bytstream to write to filename. + """ + file_ = None + try: + file_ = open(filename, 'wb') + file_.write(filecontent) + except IOError: + print "ERROR: creating and writing content to %s" % (filename) + exit(1) + +def write_shards(shards, directory, shard_basename): + """Write shards to respective files respective files. + + shard: list of strings (ciphers or data). + directory: absolute path of directory to which it shards must be written to. + shard_basename: base name of the shard. + """ + + # partial filename of the shard + p_filename = path.join(directory, shard_basename) + shard_no = 0 + for shard in shards: + shard_name = "%s.shard%s" % (p_filename, shard_no) + write_file(shard_name, shard) + shard_no += 1 + +def read_shards(directory, shard_basename): + """Read the shards from directory and return it as a list. + + directory: absolute path of directory from which to read the shards. + shard_basename: base name of the shard. + """ + + shards = [] + # partial filename of the shard + p_filename = "%s.shard*" % path.join(directory, shard_basename) + for shard_file in sorted(glob(p_filename)): + shard_content = read_file(shard_file) + shards.append(shard_content) + + return shards