depot.py revision 14
1516N/A#!/usr/bin/python
290N/A
290N/Aimport BaseHTTPServer
290N/Aimport os
290N/Aimport re
290N/Aimport sha
290N/Aimport shutil
290N/Aimport time
290N/A
290N/Aimport pkg.version as version
290N/Aimport pkg.fmri as fmri
290N/Aimport pkg.catalog as catalog
290N/Aimport pkg.config as config
290N/A
290N/Adef catalog(scfg, request):
290N/A """The marshalled form of the catalog is
290N/A
290N/A pkg_name (release (branch (sequence ...) ...) ...)
290N/A
290N/A since we know that the server is only to report packages for which it
290N/A can offer a record.
2639N/A """
395N/A
290N/A request.send_response(200)
883N/A request.send_header('Content-type:', 'text/plain')
454N/A request.end_headers()
290N/A request.wfile.write('''GET URI %s ; headers %s''' % (request.path, request.headers))
448N/A
290N/Adef trans_open(scfg, request):
290N/A # mkdir repo_root + "/trans/" + trans_id
290N/A trans_root = "%s/trans" % scfg.repo_root
383N/A # XXX refine try/except
290N/A try:
395N/A os.makedirs(trans_root)
290N/A except OSError:
395N/A pass
849N/A opening_time = time.time()
1516N/A m = re.match("^/open/(.*)", request.path)
2508N/A pkg_name = m.group(1)
290N/A
2535N/A # XXX opaquify using hash
2698N/A trans_basename = "%d_%s" % (opening_time, pkg_name)
290N/A os.makedirs("%s/%s" % (trans_root, trans_basename))
290N/A
2535N/A # record transaction metadata: opening_time, package, user
2561N/A # lookup package by name
290N/A # if not found, create package
2508N/A # set package state to TRANSACTING
383N/A
290N/A request.send_response(200)
290N/A request.send_header('Content-type:', 'text/plain')
2339N/A request.end_headers()
2535N/A request.wfile.write('Transaction-ID: %s' % trans_basename)
290N/A
290N/Adef trans_close(scfg, request):
2535N/A # Pull transaction ID from headers.
2535N/A m = re.match("^/close/(.*)", request.path)
290N/A trans_id = m.group(1)
290N/A
2508N/A trans_root = "%s/trans" % scfg.repo_root
2508N/A # XXX refine try/except
290N/A #
1660N/A # set package state to SUBMITTED
1660N/A # attempt to reconcile dependencies
1660N/A # if reconciled, set state to PUBLISHED
1660N/A # call back to check incomplete list
1660N/A # else set state to INCOMPLETE
1660N/A try:
1660N/A shutil.rmtree("%s/%s" % (trans_root, trans_id))
1660N/A request.send_response(200)
1660N/A except:
1660N/A request.send_response(404)
1660N/A
1660N/Adef trans_add(scfg, request):
1660N/A m = re.match("^/add/([^/]*)/(.*)", request.path)
1660N/A trans_id = m.group(1)
1660N/A type = m.group(2)
1660N/A
1660N/A trans_root = "%s/trans" % scfg.repo_root
1660N/A # XXX refine try/except
448N/A hdrs = request.headers
448N/A path = hdrs.getheader("Path")
534N/A
534N/A data = request.rfile.read()
534N/A hash = sha.new(data)
534N/A fname = hash.hexdigest()
534N/A
534N/A ofile = file("%s/%s/%s" % (trans_root, trans_id, fname), "wb")
534N/A ofile.write(data)
290N/A
290N/A tfile = file("%s/%s/manifest" % (trans_root, trans_id), "a")
954N/A print >>tfile, "%s %s" % (path, fname)
954N/A
954N/Ascfg = SvrConfig("/home/sch/play/pkg/repo")
954N/A
534N/Aclass pkgHandler(BaseHTTPServer.BaseHTTPRequestHandler):
1099N/A
290N/A def do_GET(self):
1516N/A if re.match("^/catalog$", self.path):
290N/A catalog(scfg, self)
290N/A elif re.match("^/open/(.*)$", self.path):
290N/A trans_open(scfg, self)
661N/A elif re.match("^/close/(.*)$", self.path):
290N/A trans_close(scfg, self)
2494N/A elif re.match("^/add/(.*)$", self.path):
2494N/A trans_add(scfg, self)
2494N/A else:
2516N/A self.send_response(404)
2516N/A
2516N/A
2516N/A def do_PUT(self):
2516N/A self.send_response(200)
2516N/A self.send_header('Content-type:', 'text/plain')
2516N/A self.end_headers()
290N/A self.wfile.write('''PUT URI %s ; headers %s''' % (self.path, self.headers))
2523N/A
2390N/A def do_POST(self):
1498N/A if re.match("^/add/(.*)$", self.path):
1498N/A trans_add(scfg, self)
2310N/A else:
2310N/A self.send_response(404)
2310N/A
2535N/A def do_DELETE(self):
2535N/A self.send_response(200)
2535N/A self.send_header('Content-type:', 'text/plain')
2535N/A self.end_headers()
2535N/A self.wfile.write('''URI %s ; headers %s''' % (self.path, self.headers))
2535N/A
2535N/Aserver = BaseHTTPServer.HTTPServer(('', 10000), pkgHandler)
2535N/Aserver.serve_forever()
2535N/A