I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit 75febe4b authored by aum's avatar aum Committed by zzz
Browse files

Relocated from i2p/apps/sam/python

Stasher is a Kademlia-based distributed file store (aka 'DHT')
for I2P. Written in python, it can be accessed as:
 - low level python classes, or
 - via a client socket, with simple text-based protocol, or
 - via command-line client prog (called 'stasher', unsurprisingly)

Release status is pre-alpha

Developed by aum, August 2004
parent f6d8d93a
No related branches found
No related tags found
No related merge requests found
STASHER README
-----------------------
INSTALLING STASHER
To install stasher, just make sure you've got the latest cvs, then type
python setup.py install
This installs the stasher engine, plus a wrapper client script called
'stasher', which setup.py will install into your execution path.
Test your installation by typing 'stasher -h' - this should display
a help message.
------------------------
DOZE USERS PLEASE NOTE
You'll need to watch and see where the stasher.py
wrapper script gets installed. On my box, it ends up on d:\python23\scripts,
but on your box it'll likely go into c:\python23\scripts.
You may either update your system PATH environment variable to include your
python scripts directory, OR, you can copy stasher.py to anywhere that's
on your path.
In the explanations below, note that wherever I say to type 'stasher', you'll
need to type 'stasher.py' instead.
------------------------
WARNING
This is a very early pre-alpha test version of stasher.
It is only capable of storing or retrieving files of
less than 29k in size.
Also, files are totally insecure - anyone can overwrite any keys you
insert, and vice versa.
I'll be adding support for CHK-like and SSK-like keys in due course.
------------------------
USING STASHER
To see stasher's options, type:
stasher -h
This should dump out a verbose help message.
To start a stasher node, type:
stasher start
To shut down a stasher node, type:
stasher stop
To insert a file into stasher, type:
stasher put mykey myfile
Note, if you don't supply a filename, stasher can read
the file from standard input.
To retrieve a file from stasher, type:
stasher get mykey
Yg1FeoQi9GEsby~t~IClgWYc8AQoxBcvuXR9HY~cwc21y5-NVeAnhrfOiF6HWGhHUywh4eCINE52Zh28Jgn2wMVPqbr-r48ikU3oSXQO8BoPyGLz43x~UqR3Vw4mR9jtTq-9TQ70LxuYPNKPvpkM3C~d8wx7VX42KaiNlQlBzvC34MwivrP0esHst6RfNf11lTRrdQbQYMXqLzjdVs6Kl5jeniTwFodqb5yG1O4~hjXasVtIFoepzL6y3x1TyKQonzTGftkd3r4Weh3jh9w6yyRabTAPFMjeXKjMfjpKDHl6C0C62MdjxKvNos5JYYzXZG6BeSoeZP-8c6wndfzuYV3QRR~M61fgXcQq~EVuy8fDpdhfuv8ZRXeOZIp07hQkpMxSNP43Rk1afPRv7QLzuS2UCDQe2WGhp3DQB0dSOmxImdNRmNCbeF8r~bKpgM~okOUC0xwzXfJFxWvqB0IsmNp8KVeoTGjSJOZHDdGDKaBwxHxxYg4PQWo7FuXQ5FihAAAA
\ No newline at end of file
#! /usr/bin/env python
# wrapper script to run stasher node
import stasher
stasher.main()
# wrapper script to run stasher node
import stasher
stasher.main()
#! /usr/bin/env python
#@+leo-ver=4
#@+node:@file setup-stasher.py
#@@first
"""
This is the installation script for Stasher, a distributed
file storage framework for I2P.
"""
import sys, os
from distutils.core import setup
oldcwd = os.getcwd()
os.chdir("src")
if sys.platform == 'win32':
stasherScript = "..\\scripts\\stasher.py"
else:
stasherScript = "../scripts/stasher"
try:
import i2p
import i2p.socket
import i2p.select
except:
print "Sorry, but you don't seem to have the core I2P"
print "python library modules installed."
print "If you're installing from cvs, please go to"
print "i2p/apps/sam/python, become root, and type:"
print " python setup.py install"
print "Then, retry this installation."
sys.exit(1)
setup(name="Stasher",
version="0.0",
description="Kademlia-based P2P distributed file storage app for I2P",
author="aum",
author_email="aum_i2p@hotmail.com",
url="http://stasher.i2p",
py_modules = ['stasher', 'bencode'],
scripts = [stasherScript],
)
#@nonl
#@-node:@file setup-stasher.py
#@-leo
# Written by Petru Paler
# see LICENSE.txt for license information
from types import IntType, LongType, StringType, ListType, TupleType, DictType
import re
from cStringIO import StringIO
int_filter = re.compile('(0|-?[1-9][0-9]*)e')
def decode_int(x, f):
m = int_filter.match(x, f)
if m is None:
raise ValueError
return (long(m.group(1)), m.end())
string_filter = re.compile('(0|[1-9][0-9]*):')
def decode_string(x, f):
m = string_filter.match(x, f)
if m is None:
raise ValueError
l = int(m.group(1))
s = m.end()
return (x[s:s+l], s + l)
def decode_list(x, f):
r = []
while x[f] != 'e':
v, f = bdecode_rec(x, f)
r.append(v)
return (r, f + 1)
def decode_dict(x, f):
r = {}
lastkey = None
while x[f] != 'e':
k, f = decode_string(x, f)
if lastkey is not None and lastkey >= k:
raise ValueError
lastkey = k
v, f = bdecode_rec(x, f)
r[k] = v
return (r, f + 1)
def bdecode_rec(x, f):
t = x[f]
if t == 'i':
return decode_int(x, f + 1)
elif t == 'l':
return decode_list(x, f + 1)
elif t == 'd':
return decode_dict(x, f + 1)
else:
return decode_string(x, f)
def bdecode(x):
try:
r, l = bdecode_rec(x, 0)
except IndexError:
raise ValueError
if l != len(x):
raise ValueError
return r
def test_bdecode():
try:
bdecode('0:0:')
assert 0
except ValueError:
pass
try:
bdecode('ie')
assert 0
except ValueError:
pass
try:
bdecode('i341foo382e')
assert 0
except ValueError:
pass
assert bdecode('i4e') == 4L
assert bdecode('i0e') == 0L
assert bdecode('i123456789e') == 123456789L
assert bdecode('i-10e') == -10L
try:
bdecode('i-0e')
assert 0
except ValueError:
pass
try:
bdecode('i123')
assert 0
except ValueError:
pass
try:
bdecode('')
assert 0
except ValueError:
pass
try:
bdecode('i6easd')
assert 0
except ValueError:
pass
try:
bdecode('35208734823ljdahflajhdf')
assert 0
except ValueError:
pass
try:
bdecode('2:abfdjslhfld')
assert 0
except ValueError:
pass
assert bdecode('0:') == ''
assert bdecode('3:abc') == 'abc'
assert bdecode('10:1234567890') == '1234567890'
try:
bdecode('02:xy')
assert 0
except ValueError:
pass
try:
bdecode('l')
assert 0
except ValueError:
pass
assert bdecode('le') == []
try:
bdecode('leanfdldjfh')
assert 0
except ValueError:
pass
assert bdecode('l0:0:0:e') == ['', '', '']
try:
bdecode('relwjhrlewjh')
assert 0
except ValueError:
pass
assert bdecode('li1ei2ei3ee') == [1, 2, 3]
assert bdecode('l3:asd2:xye') == ['asd', 'xy']
assert bdecode('ll5:Alice3:Bobeli2ei3eee') == [['Alice', 'Bob'], [2, 3]]
try:
bdecode('d')
assert 0
except ValueError:
pass
try:
bdecode('defoobar')
assert 0
except ValueError:
pass
assert bdecode('de') == {}
assert bdecode('d3:agei25e4:eyes4:bluee') == {'age': 25, 'eyes': 'blue'}
assert bdecode('d8:spam.mp3d6:author5:Alice6:lengthi100000eee') == {'spam.mp3': {'author': 'Alice', 'length': 100000}}
try:
bdecode('d3:fooe')
assert 0
except ValueError:
pass
try:
bdecode('di1e0:e')
assert 0
except ValueError:
pass
try:
bdecode('d1:b0:1:a0:e')
assert 0
except ValueError:
pass
try:
bdecode('d1:a0:1:a0:e')
assert 0
except ValueError:
pass
try:
bdecode('i03e')
assert 0
except ValueError:
pass
try:
bdecode('l01:ae')
assert 0
except ValueError:
pass
try:
bdecode('9999:x')
assert 0
except ValueError:
pass
try:
bdecode('l0:')
assert 0
except ValueError:
pass
try:
bdecode('d0:0:')
assert 0
except ValueError:
pass
try:
bdecode('d0:')
assert 0
except ValueError:
pass
def bencode_rec(x, b):
t = type(x)
if t in (IntType, LongType):
b.write('i%de' % x)
elif t is StringType:
b.write('%d:%s' % (len(x), x))
elif t in (ListType, TupleType):
b.write('l')
for e in x:
bencode_rec(e, b)
b.write('e')
elif t is DictType:
b.write('d')
keylist = x.keys()
keylist.sort()
for k in keylist:
assert type(k) is StringType
bencode_rec(k, b)
bencode_rec(x[k], b)
b.write('e')
else:
assert 0
def bencode(x):
b = StringIO()
bencode_rec(x, b)
return b.getvalue()
def test_bencode():
assert bencode(4) == 'i4e'
assert bencode(0) == 'i0e'
assert bencode(-10) == 'i-10e'
assert bencode(12345678901234567890L) == 'i12345678901234567890e'
assert bencode('') == '0:'
assert bencode('abc') == '3:abc'
assert bencode('1234567890') == '10:1234567890'
assert bencode([]) == 'le'
assert bencode([1, 2, 3]) == 'li1ei2ei3ee'
assert bencode([['Alice', 'Bob'], [2, 3]]) == 'll5:Alice3:Bobeli2ei3eee'
assert bencode({}) == 'de'
assert bencode({'age': 25, 'eyes': 'blue'}) == 'd3:agei25e4:eyes4:bluee'
assert bencode({'spam.mp3': {'author': 'Alice', 'length': 100000}}) == 'd8:spam.mp3d6:author5:Alice6:lengthi100000eee'
try:
bencode({1: 'foo'})
assert 0
except AssertionError:
pass
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment