blob: ec0372e4820bac5312aeed6122c40498429993d4 (
plain) (
tree)
|
|
# 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
|