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