2 # Copyright (C) 2008, Thomas Leonard
3 # See the README file for details, or visit http://0install.net.
5 from optparse
import OptionParser
6 from logging
import info
, debug
9 from zeroinstall
.zerostore
import Stores
, BadDigest
, NotStored
14 parser
= OptionParser(usage
="usage: %prog\n"
15 "usage: %prog --fetch DIGEST...")
17 parser
.add_option("-f", "--fetch", help="act as a client", action
='store_true')
18 parser
.add_option("-q", "--quiet", help="less verbose output", action
='store_true')
19 parser
.add_option("-v", "--verbose", help="more verbose output", action
='store_true')
20 parser
.add_option("-V", "--version", help="display version information", action
='store_true')
22 (options
, args
) = parser
.parse_args()
25 print "0share (zero-install) " + version
26 print "Copyright (C) 2008 Thomas Leonard"
27 print "This program comes with ABSOLUTELY NO WARRANTY,"
28 print "to the extent permitted by law."
29 print "You may redistribute copies of this program"
30 print "under the terms of the GNU General Public License."
31 print "For more information about these matters, see the file named COPYING."
35 logger
= logging
.getLogger()
37 logger
.setLevel(logging
.DEBUG
)
38 elif not options
.quiet
:
39 logger
.setLevel(logging
.INFO
)
53 ss
= socket
.socket(socket
.AF_INET
, socket
.SOCK_DGRAM
, 0)
54 ss
.setsockopt(socket
.SOL_SOCKET
, socket
.SO_BROADCAST
, 1)
55 #ss.bind(('<broadcast>', 308339))
58 info("0share started and listening for requests...")
60 data
, addr
= ss
.recvfrom(128)
61 info("Request from %s: %s", addr
, repr(data
))
62 if not data
.startswith('0share\n'):
63 info("Not our format. Ignoring.")
65 digests
= data
.split('\n')[1:]
69 if not d
: raise BadDigest("Empty digest!")
72 info("Yes, we have %s", d
)
75 info("No, we don't have %s", d
)
77 info("Bad request: %s", str(ex
))
80 info("Sending reply...")
81 ss
.sendto('0share-reply\n' + '\n'.join(got
), addr
)