import logging
import threading
import glob
-from daklib.dbconn import DBConn, get_dbchange
+import apt_pkg
+from daklib.dbconn import DBConn, get_dbchange, get_policy_queue, session_wrapper, ChangePendingFile, get_location, check_poolfile
from daklib.config import Config
+from daklib.queue import Upload
+from daklib.utils import poolify
# where in dak.conf all of our configuration will be stowed
options_prefix = "NewFiles"
"""
sys.exit(exit_code)
-class ImportKnownChanges(object):
+class ImportNewFiles(object):
@session_wrapper
def __init__(self, session=None):
+ cnf = Config()
try:
newq = get_policy_queue('new', session)
for changes_fn in glob.glob(newq.path + "/*.changes"):
- changes_bn = os.path.basename(fn)
- chg = session.query(DBChange).filter_by(changesname=changes_bn).one()
+ changes_bn = os.path.basename(changes_fn)
+ chg = get_dbchange(changes_bn, session)
u = Upload()
- u.changes_file = changes_fn
- u.load_changes(changes_fn)
+ success = u.load_changes(changes_fn)
+ u.pkg.changes_file = changes_bn
+ u.check_hashes()
- for chg_fn in u.pkg.files.keys():
- cpf = ChangePendingFile()
- cpf.filename = chg_fn
- cpf.size = self.files[chg_fn]['size']
- cpf.md5sum = self.files[chg_fn]['md5sum']
+ if not chg:
+ chg = u.pkg.add_known_changes(newq.path, newq.policy_queue_id, session)
+ session.add(chg)
+
+ if not success:
+ log.critical("failed to load %s" % changes_fn)
+ sys.exit(1)
+ else:
+ log.critical("ACCLAIM: %s" % changes_fn)
- session.add(cpf)
- chg.files.append(cpf)
+ files=[]
+ for chg_fn in u.pkg.files.keys():
+ try:
+ f = open(os.path.join(newq.path, chg_fn))
+ cpf = ChangePendingFile()
+ cpf.filename = chg_fn
+ cpf.size = u.pkg.files[chg_fn]['size']
+ cpf.md5sum = u.pkg.files[chg_fn]['md5sum']
+
+ if u.pkg.files[chg_fn].has_key('sha1sum'):
+ cpf.sha1sum = u.pkg.files[chg_fn]['sha1sum']
+ else:
+ log.warning("Having to generate sha1sum for %s" % chg_fn)
+ f.seek(0)
+ cpf.sha1sum = apt_pkg.sha1sum(f)
+
+ if u.pkg.files[chg_fn].has_key('sha256sum'):
+ cpf.sha256sum = u.pkg.files[chg_fn]['sha256sum']
+ else:
+ log.warning("Having to generate sha256sum for %s" % chg_fn)
+ f.seek(0)
+ cpf.sha256sum = apt_pkg.sha256sum(f)
+
+ session.add(cpf)
+ files.append(cpf)
+ f.close()
+ except IOError:
+ # Can't find the file, try to look it up in the pool
+ poolname = poolify(u.pkg.changes["source"], u.pkg.files[chg_fn]["component"])
+ l = get_location(cnf["Dir::Pool"], u.pkg.files[chg_fn]["component"], session=session)
+ if not l:
+ log.critical("ERROR: Can't find location for %s (component %s)" % (chg_fn, u.pkg.files[chg_fn]["component"]))
+
+ found, poolfile = check_poolfile(os.path.join(poolname, chg_fn),
+ u.pkg.files[chg_fn]['size'],
+ u.pkg.files[chg_fn]["md5sum"],
+ l.location_id,
+ session=session)
+
+ if found is None:
+ log.critical("ERROR: Found multiple files for %s in pool" % chg_fn)
+ sys.exit(1)
+ elif found is False and poolfile is not None:
+ log.critical("ERROR: md5sum / size mismatch for %s in pool" % chg_fn)
+ sys.exit(1)
+ else:
+ if poolfile is None:
+ log.critical("ERROR: Could not find %s in pool" % chg_fn)
+ sys.exit(1)
+ else:
+ chg.poolfiles.append(poolfile)
+
+
+ chg.files = files
session.commit()
-
+
except KeyboardInterrupt:
print("Caught C-c; terminating.")
utils.warn("Caught C-c; terminating.")