]> git.pld-linux.org Git - projects/pld-builder.new.git/commitdiff
- work in progress
authorMichal Moskal <michal@moskal.me>
Sun, 8 Jun 2003 13:33:13 +0000 (13:33 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    PLD_Builder/gpg.py -> 1.2
    PLD_Builder/request.py -> 1.2
    PLD_Builder/squeue.py -> 1.1
    go.py -> 1.3

PLD_Builder/gpg.py
PLD_Builder/request.py
PLD_Builder/squeue.py [new file with mode: 0644]
go.py

index d370371ae14b6409b33ccdd72b18516a0f59c751..4b442e3f08a3e0de89487c2db0608a3a96b7ec33 100644 (file)
@@ -1,21 +1,40 @@
 import popen2
 import re
+import xreadlines
+import StringIO
 
-def verify_sig(email):
+def verify_sig(buf):
   """Check signature.
   
-  Given email as list of strings, return (signer-emails, signed-body).
-  where both are lists of strings.
+  Given email as file-like object, return (signer-emails, signed-body).
+  where signer-emails is lists of strings, and signed-body is StringIO
+  object.
   """
   (gpg_out, gpg_in, gpg_err) = popen2.popen3("LC_ALL=C gpg --decrypt")
-  for l in email:
-    gpg_in.write(l)
+  gpg_in.write(buf.read())
   gpg_in.close()
-  body = gpg_out.readlines()
+  body = StringIO.StringIO()
+  for l in gpg_out.xreadlines():
+    body.write(l)
   rx = re.compile("^gpg: Good signature from .*<([^>]+)>")
   emails = []
-  for l in gpg_err.readlines():
+  for l in gpg_err.xreadlines():
     m = rx.match(l)
     if m:
       emails.append(m.group(1))
+  body.seek(0)
+  gpg_out.close()
+  gpg_err.close()
   return (emails, body)
+
+def sign(buf):
+  (gpg_out, gpg_in, gpg_err) = popen2.popen3("LC_ALL=C gpg --clearsign --default-key builder")
+  gpg_in.write(buf.read())
+  gpg_in.close()
+  body = StringIO.StringIO()
+  for l in gpg_out.xreadlines():
+    body.write(l)
+  body.seek(0)
+  gpg_out.close()
+  gpg_err.close()
+  return body
index f6b9741e495319214c4fb209c64f43c264ff7015..e76edce5b77ecef7dc5f75aae5cd62bd9ddcc20b 100644 (file)
@@ -1,6 +1,9 @@
 from xml.dom.minidom import *
 import string
+import time
 
+__all__ = ['parse_request', 'parse_requests']
+  
 def text(e):
   if len(e.childNodes) == 0:
     return ""
@@ -13,8 +16,7 @@ def text(e):
     raise "xml: text expected: <%s>" % e.nodeName
 
 def attr(e, a):
-  return e.attributes[a]
-  #.getNamedItem(a)
+  return e.attributes[a].value
 
 def is_blank(e):
   return e.nodeType == Element.TEXT_NODE and string.strip(e.nodeValue) == ""
@@ -25,6 +27,7 @@ class Group:
     self.is_group = 1
     self.id = attr(e, "id")
     self.priority = 2
+    self.time = time.time()
     for c in e.childNodes:
       if is_blank(c): continue
       if c.nodeType != Element.ELEMENT_NODE:
@@ -35,12 +38,15 @@ class Group:
         self.requester = text(c)
       elif c.nodeName == "priority":
         self.priority = int(text(c))
+      elif c.nodeName == "time":
+        self.time = int(text(c))
       else:
         raise "xml: evil group child (%s)" % c.nodeName
 
   def dump(self):
    print "group: %s @%d" % (self.id, self.priority)
-   print "  from: %s" % (self.requester)
+   print "  from: %s" % self.requester
+   print "  time: %s" % time.asctime(time.localtime(self.time))
    for b in self.batches:
      b.dump()
 
@@ -86,7 +92,13 @@ def build_request(e):
   else:
     raise "xml: evil request <%s>" % e.nodeName
 
-def parse(str):
-  d = parseString(str)
+def parse_request(f):
+  d = parse(f)
   return build_request(d.documentElement)
   
+def parse_requests(f):
+  d = parse(f)
+  res = []
+  for r in d.documentElement.childNodes:
+    res.append(build_request(r))
+  return res
diff --git a/PLD_Builder/squeue.py b/PLD_Builder/squeue.py
new file mode 100644 (file)
index 0000000..17e5b09
--- /dev/null
@@ -0,0 +1,53 @@
+# Queue on src-builder
+
+import re
+import gzip
+import time
+import StringIO
+
+# PLD_Builder:
+import gpg
+import request
+
+class Src_Queue:
+  def __init__(self, filename):
+    self.name = filename
+    self.requests = []
+    self.is_gzip = 0
+    
+  def read(self):
+    if re.search(r"\.gz$", self.name):
+      f = gzip.open(self.name)
+      self.is_gzip = 1
+    else:
+      f = open(self.name)
+      self.is_gzip = 0
+    (signers, body) = gpg.verify_sig(f)
+    # maybe check signers here?
+    self.requests = request.parse_requests(body)
+
+  def write(self):
+    sio = StringIO.StringIO()
+    sio.write("<queue>\n")
+    for r in self.requests:
+      r.write_to(sio)
+    sio.write("</queue>\n")
+    sio.seek(0)
+    sio = gpg.sign(sio)
+    if self.is_gzip:
+      f = gzip.open(self.name, "w", 6)
+    else:
+      f = open(self.name, "w")
+    f.write(sio.read())
+    f.close()
+
+  def remove_old(self):
+    now = time.time()
+    def is_old(r): return now - r.time > 30 * 24 * 3600
+    self.requests = filter(is_old, self.requests)
+
+  def add(self, req):
+    self.requests.append(req)
+
+  def value():
+    return self.requests
diff --git a/go.py b/go.py
index e81e0b01f7326cab61a6098c6edf94a668b7b043..4f6152400f0726ede500cb0b2b5429cb806cfcba 100755 (executable)
--- a/go.py
+++ b/go.py
@@ -1,40 +1,15 @@
 #!/usr/bin/python
 
 import sys
+from PLD_Builder.squeue import *
 from PLD_Builder.request import *
+from PLD_Builder.gpg import *
 
-xml = """
-<group id="d30eb8ae-3c54-4103-9188-69b1114d6ac7">
-  <priority>2</priority>
-  <requester>malekith</requester>
-  <batch>
-    <src-rpm>foo-1.2-3.src.rpm</src-rpm>
-    <spec>foo.spec</spec>
+q = Src_Queue("src-queue")
+#q.read()
+(em, b) = gpg.verify_sig(open("req.txt"))
+q.add(parse_request(b))
+q.write()
 
-    <info>foo.spec -r DEVEL blah,blah</info>
-    
-    <with>foo</with>
-    <without>bar</without>
-    
-    <builder>i386</builder>
-    <builder>i586</builder>
-    <builder>i686</builder>
-    <builder>ppc</builder>
-  </batch>
-  <batch>
-    <src-rpm>bar-1.2-1.src.rpm</src-rpm>
-    <spec>bar.spec</spec>
-
-    <info>bar.spec -r HEAD blah,blah</info>
-    
-    <with>foo</with>
-    <without>bar</without>
-    
-    <builder>i386-security</builder>
-    <builder>i586-security</builder>
-    <builder>i686-security</builder>
-  </batch>
-</group>
-"""
-
-parse(xml).dump()
+for r in q.value():
+  r.dump()
This page took 0.165164 seconds and 4 git commands to generate.