]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/scripts/tahoe_put.py
tahoe_put.py: require node-url to be provided
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / scripts / tahoe_put.py
1 #!/usr/bin/env python
2
3 import re, socket, sys
4
5 SERVERURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?")
6
7 def put(nodeurl, vdrive, vdrive_fname, local_fname, verbosity):
8     """
9     @param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose
10
11     @return: a Deferred which eventually fires with the exit code
12     """
13     if not isinstance(nodeurl, basestring):
14         raise ValueError("nodeurl is required to be a string and look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (nodeurl,))
15
16     mo = SERVERURL_RE.match(nodeurl)
17     if not mo:
18         raise ValueError("nodeurl is required to look like \"http://HOSTNAMEORADDR:PORT\", not: %r" % (nodeurl,))
19     host = mo.group(1)
20     port = int(mo.group(3))
21
22     url = "/vdrive/" + vdrive + "/"
23     if vdrive_fname:
24         url += vdrive_fname
25
26     if local_fname is None or local_fname == "-":
27         infileobj = sys.stdin
28     else:
29         infileobj = open(local_fname, "rb")
30
31     so = socket.socket()
32     so.connect((host, port,))
33
34     CHUNKSIZE=2**16
35     data = "PUT %s HTTP/1.1\r\nConnection: close\r\nHostname: %s\r\n\r\n" % (url, host,)
36     while data:
37         try:
38             sent = so.send(data)
39         except Exception, le:
40             print "got socket error: %s" % (le,)
41             return -1
42
43         if sent == len(data):
44             data = infileobj.read(CHUNKSIZE)
45         else:
46             data = data[sent:]
47
48     respbuf = []
49     data = so.recv(CHUNKSIZE)
50     while data:
51         # print "debuggery 1 okay now we've got some more data: %r" % (data,)
52         respbuf.append(data)
53         data = so.recv(CHUNKSIZE)
54
55     so.shutdown(socket.SHUT_WR)
56
57     data = so.recv(CHUNKSIZE)
58     while data:
59         # print "debuggery 2 okay now we've got some more data: %r" % (data,)
60         respbuf.append(data)
61         data = so.recv(CHUNKSIZE)
62
63     respstr = ''.join(respbuf)
64
65     RESP_RE=re.compile("^HTTP/[0-9]\.[0-9] ([0-9]*) *([A-Za-z_]*)")  # This regex is soooo ad hoc...  --Zooko 2007-08-16
66     mo = RESP_RE.match(respstr)
67     if mo:
68         code = int(mo.group(1))
69         word = mo.group(2)
70
71         if code in (200, 201,):
72             print "%s %s" % (code, word,)
73             return 0
74     
75     print respstr
76     return 1
77
78 def main():
79     import optparse
80     parser = optparse.OptionParser()
81     parser.add_option("-d", "--vdrive", dest="vdrive", default="global")
82     parser.add_option("-s", "--server", dest="server", default="http://tahoebs1.allmydata.com:8011")
83
84     (options, args) = parser.parse_args()
85
86     local_file = args[0]
87     vdrive_file = None
88     if len(args) > 1:
89         vdrive_file = args[1]
90
91     return put(options.server, options.vdrive, vdrive_file, local_file)
92
93 if __name__ == '__main__':
94     main()