summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--combox/combox.py243
1 files changed, 0 insertions, 243 deletions
diff --git a/combox/combox.py b/combox/combox.py
deleted file mode 100644
index 3f15dd5..0000000
--- a/combox/combox.py
+++ /dev/null
@@ -1,243 +0,0 @@
-# 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/>.
-
-import base64
-import os
-import yaml
-import getpass
-import hashlib
-import sys
-import stat
-
-from Crypto.Cipher import AES
-from os import path
-from sys import exit
-from glob import glob
-
-
-#### Start of combox config function
-
-def config_cb():
- """
- Configure combox, if not already configured.
- """
- # First whether combox is already configured.
- config_dir = os.path.join(os.getenv('HOME'),'.combox/')
- if not os.path.exists(config_dir):
- # Create combox dir and configure.
- os.mkdir(config_dir, 0700)
- config_file_path = os.path.join(config_dir, 'config.yaml')
- config_info = {}
-
- config_info['combox_dir'] = raw_input('path to combox directory: ')
- config_info['topsecret'] = hashlib.sha224(getpass.getpass('passphrase: ')).hexdigest()
-
- no_nodes = int(raw_input('number of nodes: '))
-
- nodes = {}
- for i in range(no_nodes):
- node_name = raw_input('node %d name: ' % i)
- nodes[node_name] = {}
- nodes[node_name]['path'] = raw_input('node %d path: ' % i)
- nodes[node_name]['size'] = raw_input('node %d size (in mega bytes): ' % i)
- nodes[node_name]['available'] = nodes[node_name]['size']
-
- config_info['nodes_info'] = nodes
- config_file = open(config_file_path, 'w')
- yaml.dump(config_info, config_file, default_flow_style=False)
- os.chmod(config_file_path,stat.S_IRUSR|stat.S_IWUSR)
- else:
- # should put something here later
- pass
-
-#### End of combox config function
-
-
-
-
-#### Start of crypto functions.
-def pad(data):
- """Pad data such that its length is a multiple of BLOCK_SIZE.
- """
-
- padding = (BLOCK_SIZE - (len(data) % BLOCK_SIZE)) * PAD_CHAR
- data += padding
-
- return data
-
-
-def encrypt(data, secret):
- """Encrypt byestream and return cipher.
- """
- aes = AES.new(pad(secret))
- cipher = base64.b64encode(aes.encrypt(pad(data)))
-
- return cipher
-
-
-def decrypt(cipher, secret):
- """Decrypt cipher and return data.
- """
- aes = AES.new(pad(secret))
- data = aes.decrypt(base64.b64decode(cipher)).rstrip(PAD_CHAR)
-
- return data
-
-def encrypt_shards(shards, secret):
- """Encrypt the shards of data and return a list of ciphers.
-
- shards: list of shards (string, bytes).
- secret: top secret passphrase
- """
-
- ciphers = []
- for shard in shards:
- cipher = encrypt(shard, secret)
- ciphers.append(cipher)
-
- return ciphers
-
-
-def decrypt_shards(ciphers, secret):
- """Decrypt the ciphered shards and return a list of shards.
-
- shards: list of ciphered shards.
- secret: top secret passphrase
- """
-
- shards = []
- for cipher in ciphers:
- shard = decrypt(cipher, secret)
- shards.append(shard)
-
- return shards
-
-#### End of crypto functions.
-
-
-
-#### Start of File related functions
-
-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
-
-
-
-#### End of File related functions.