src/depot.py
changeset 22 379f0f6809ff
parent 21 2dc7157f7323
child 23 51b8b48fea32
--- a/src/depot.py	Wed Apr 18 15:56:26 2007 -0700
+++ b/src/depot.py	Thu Apr 19 16:11:43 2007 -0700
@@ -19,12 +19,11 @@
 #
 # CDDL HEADER END
 #
-
-#
 # Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 #
 
+# pkg.depotd - package repository daemon
 
 import BaseHTTPServer
 import os
@@ -32,11 +31,20 @@
 import sha
 import shutil
 import time
+import urllib
 
-import pkg.version as version
-import pkg.fmri as fmri
 import pkg.catalog as catalog
 import pkg.config as config
+import pkg.content as content
+import pkg.dependency as dependency
+import pkg.fmri as fmri
+import pkg.image as image
+import pkg.package as package
+import pkg.transaction as trans
+import pkg.version as version
+
+# in_flight_trans needs to be rebuilt on restart
+in_flight_trans = {}
 
 def catalog(scfg, request):
         """The marshalled form of the catalog is
@@ -53,74 +61,55 @@
         request.wfile.write('''GET URI %s ; headers %s''' % (request.path, request.headers))
 
 def trans_open(scfg, request):
-        # mkdir repo_root + "/trans/" + trans_id
-        trans_root = "%s/trans" % scfg.repo_root
-        # XXX refine try/except
-        try:
-                os.makedirs(trans_root)
-        except OSError:
-                pass
-        opening_time = time.time()
-        m = re.match("^/open/(.*)", request.path)
-        pkg_name = m.group(1)
+        # XXX Authentication will be handled by virtue of possessing a signed
+        # certificate (or a more elaborate system).
+        t = trans.Transaction()
+
+        ret = t.open(scfg, request)
+        if ret == 200:
+                in_flight_trans[t.get_basename()] = t
 
-        # XXX opaquify using hash
-        trans_basename = "%d_%s" % (opening_time, pkg_name)
-        os.makedirs("%s/%s" % (trans_root, trans_basename))
+                request.send_response(200)
+                request.send_header('Content-type', 'text/plain')
+                request.send_header('Transaction-ID', t.get_basename())
+                request.end_headers()
+        elif ret == 400:
+                request.send_response(400)
+        else:
+                request.send_response(500)
 
-        # record transaction metadata:  opening_time, package, user
-        # lookup package by name
-        # if not found, create package
-        # set package state to TRANSACTING
-
-        request.send_response(200)
-        request.send_header('Content-type:', 'text/plain')
-        request.end_headers()
-        request.wfile.write('Transaction-ID: %s' % trans_basename)
 
 def trans_close(scfg, request):
         # Pull transaction ID from headers.
         m = re.match("^/close/(.*)", request.path)
         trans_id = m.group(1)
 
-        trans_root = "%s/trans" % scfg.repo_root
-        # XXX refine try/except
-        #
-        # set package state to SUBMITTED
-        # attempt to reconcile dependencies
-        # if reconciled, set state to PUBLISHED
-        #   call back to check incomplete list
-        # else set state to INCOMPLETE
-        try:
-                shutil.rmtree("%s/%s" % (trans_root, trans_id))
-                request.send_response(200)
-        except:
-                request.send_response(404)
+        # XXX KeyError?
+        t = in_flight_trans[trans_id]
+        t.close(request)
+        del in_flight_trans[trans_id]
+
+def trans_abandon(scfg, request):
+        # Pull transaction ID from headers.
+        m = re.match("^/abandon/(.*)", request.path)
+        trans_id = m.group(1)
+
+        t = in_flight_trans[trans_id]
+        t.abandon(request)
+        del in_flight_trans[trans_id]
 
 def trans_add(scfg, request):
         m = re.match("^/add/([^/]*)/(.*)", request.path)
         trans_id = m.group(1)
         type = m.group(2)
 
-        trans_root = "%s/trans" % scfg.repo_root
-        # XXX refine try/except
-        hdrs = request.headers
-        path = hdrs.getheader("Path")
-
-        data = request.rfile.read()
-        hash = sha.new(data)
-        fname = hash.hexdigest()
-
-        ofile = file("%s/%s/%s" % (trans_root, trans_id, fname), "wb")
-        ofile.write(data)
-
-        tfile = file("%s/%s/manifest" % (trans_root, trans_id), "a")
-        print >>tfile, "%s %s" % (path, fname)
+        t = in_flight_trans[trans_id]
+        t.add_content(request, type)
 
 if "PKG_REPO" in os.environ:
-	scfg = config.SvrConfig(os.environ["PKG_REPO"])
+        scfg = config.SvrConfig(os.environ["PKG_REPO"])
 else:
-	scfg = config.SvrConfig("/var/pkg/repo")
+        scfg = config.SvrConfig("/var/pkg/repo")
 
 class pkgHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
@@ -131,10 +120,21 @@
                         trans_open(scfg, self)
                 elif re.match("^/close/(.*)$", self.path):
                         trans_close(scfg, self)
+                elif re.match("^/abandon/(.*)$", self.path):
+                        trans_abandon(scfg, self)
                 elif re.match("^/add/(.*)$", self.path):
                         trans_add(scfg, self)
+                elif re.match("^/$", self.path) or re.match("^/index.html", self.path):
+                        self.send_response(200)
+                        self.send_header('Content-type', 'text/html')
+                        self.end_headers()
+                        self.wfile.write("""<html><body><h1><code>pkg</code> server ok</h1>\n""")
+                        self.wfile.write("""</body></html>""")
                 else:
                         self.send_response(404)
+                        self.send_header('Content-type', 'text/plain')
+                        self.end_headers()
+                        self.wfile.write('''404 GET URI %s ; headers %s''' % (self.path, self.headers))
 
 
         def do_PUT(self):
@@ -155,5 +155,7 @@
                 self.end_headers()
                 self.wfile.write('''URI %s ; headers %s''' % (self.path, self.headers))
 
-server = BaseHTTPServer.HTTPServer(('', 10000), pkgHandler)
-server.serve_forever()
+if __name__ == "__main__":
+        scfg.init_dirs()
+        server = BaseHTTPServer.HTTPServer(('', 10000), pkgHandler)
+        server.serve_forever()