From f175ca30a0c692f5c28f8baa7cc397fac853f766 Mon Sep 17 00:00:00 2001 From: Vikraman Choudhury Date: Wed, 8 Jun 2011 03:34:06 +0530 Subject: update post handler --- .gitignore | 1 + server/helpers.py | 81 ++++++++++++++++++++++++++++++++++++++++ server/post.py | 110 +++++++++++++++++++++++++++++++----------------------- 3 files changed, 145 insertions(+), 47 deletions(-) create mode 100644 server/helpers.py diff --git a/.gitignore b/.gitignore index 551cb32..a253c69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.*~ *.pyc +*.swp diff --git a/server/helpers.py b/server/helpers.py new file mode 100644 index 0000000..571ffa6 --- /dev/null +++ b/server/helpers.py @@ -0,0 +1,81 @@ + +import re + +# split package name into cpv +# based on pkgsplit code +# in portage/versions.py + +def pkgsplit(pkgname): + cpv={} + pkgsplit = pkgname.split('/',1) + cpv['cat'] = pkgsplit[0] + pv_re =re.compile(r'(?x)^(?P[\w\+][\w\+-]*?(?P-(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*)(-r(\d+))?)?)-(?P(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*))(-r(?P\d+))?$') + m = pv_re.match(pkgsplit[1]) + cpv['pkg'] = m.group('pkg') + rev = m.group('rev') + if rev is None: + cpv['ver'] = m.group('ver') + else: + cpv['ver'] = m.group('ver') + '-r' + rev + return cpv + +# get functions for index keys +# lookup key and insert if not found + +def get_kwkey(db, keyword): + db_keyword = db.select('keywords', vars={'keyword':keyword}, where='keyword=$keyword') + if len(db_keyword): + kwkey = db_keyword[0].kwkey + else: + kwkey = db.insert('keywords', keyword=keyword) + return kwkey + +def get_lkey(db, lang): + db_lang = db.select('lang', vars={'lang':lang}, where='lang=$lang') + if len(db_lang): + lkey = db_lang[0].lkey + else: + lkey = db.insert('lang', lang=lang) + return lkey + +def get_fkey(db, feature): + db_feature = db.select('features', vars={'feature':feature}, where='feature=$feature') + if len(db_feature): + fkey = db_feature[0].fkey + else: + fkey = db.insert('features', feature=feature) + return fkey + +def get_mkey(db, mirror): + db_mirror = db.select('gentoo_mirrors', vars={'mirror':mirror}, where='mirror=$mirror') + if len(db_mirror): + mkey = db_mirror[0].mkey + else: + mkey = db.insert('gentoo_mirrors', mirror=mirror) + return mkey + +def get_ukey(db, useflag): + db_useflag = db.select('useflags', vars={'useflag':useflag}, where='useflag=$useflag') + if len(db_useflag): + ukey = db_useflag[0].ukey + else: + ukey = db.insert('useflags', useflag=useflag) + return ukey + +def get_pkey(db, package): + cpv = pkgsplit(package) + db_package = db.select('packages', vars=cpv, where='cat=$cat and pkg=$pkg and ver=$ver') + if len(db_package): + pkey = db_package[0].pkey + else: + pkey = db.insert('packages', cat=cpv['cat'], pkg=cpv['pkg'], ver=cpv['ver']) + return pkey + +def get_rkey(db, repo): + db_repo = db.select('repositories', vars={'repo':repo}, where='repo=$repo') + if len(db_repo): + rkey = db_repo[0].rkey + else: + rkey = db.insert('repositories', repo=repo) + return rkey + diff --git a/server/post.py b/server/post.py index 0aa1d98..1ca491d 100644 --- a/server/post.py +++ b/server/post.py @@ -1,23 +1,6 @@ #!/usr/bin/env python -import re - -def pkgsplit(pkgname): - #TODO: Improve this - cpv={} - pkgsplit = pkgname.split('/',1) - cpv['cat'] = pkgsplit[0] - - pv_re =re.compile(r'(?x)^(?P[\w\+][\w\+-]*?(?P-(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*)(-r(\d+))?)?)-(?P(cvs\.)?(\d+)((\.\d+)*)([a-z]?)((_(pre|p|beta|alpha|rc)\d*)*))(-r(?P\d+))?$') - m = pv_re.match(pkgsplit[1]) - cpv['pn'] = m.group('pn') - rev = m.group('rev') - if rev is None: - cpv['ver'] = m.group('ver') - else: - cpv['ver'] = m.group('ver') + '-r' + rev - - return cpv +from helpers import * def handler(uuid, data, db): #TODO: Handle exceptions @@ -27,35 +10,68 @@ def handler(uuid, data, db): if data['AUTH']['UUID'] != uuid: return 'Invalid uuid!' - host = db.select('hosts', vars={'uuid':uuid}, where='uuid=$uuid') - if len(host): - if data['AUTH']['PASSWD'] == host[0].passwd: - exists = True - else: - return 'Wrong password!' - else: - db.insert('hosts', uuid=uuid, passwd=data['AUTH']['PASSWD']) - exists = False - - if exists: - db.delete('env', vars={'uuid':uuid}, where='uuid=$uuid') - - for var in ['CFLAGS', 'CXXFLAGS', 'LDFLAGS', 'CHOST', 'FEATURES']: - db.insert('env', uuid=uuid, var=var, value=data[var]) + # Insert in hosts + db_host = db.select('hosts', vars={'uuid':uuid}, where='uuid=$uuid') + if len(db_host): + if data['AUTH']['PASSWD'] != db_host[0].passwd: + return 'Wrong password!' + # This should delete all host entries from all tables + db.delete('hosts', vars={'uuid':uuid}, where='uuid=$uuid') + db.insert('hosts', uuid=uuid, passwd=data['AUTH']['PASSWD']) - if exists: - db.delete('useflags', vars={'uuid':uuid}, where='uuid=$uuid') - - pkg = data['PACKAGES'] - for cpv in pkg.keys(): - t = pkgsplit(cpv) - s = db.select('packages', vars={'cat':t['cat'], 'pkg':t['pn'], 'ver':t['ver']}, - where='cat=$cat and pkg=$pkg and ver=$ver') - if len(s) == 0: - pkey = db.insert('packages', cat=t['cat'], pkg=t['pn'], ver=t['ver']) - else: - pkey = s[0].pkey - for use in pkg[cpv]: - db.insert('useflags', uuid=uuid, useflag=use, pkey=str(pkey)) + # Insert in env + for var in ['ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS','MAKEOPTS','SYNC','PLATFORM','PROFILE','LASTSYNC']: + db.insert('env', uuid=uuid, var=var, value=data[var]) + # Insert in global_keywords + for keyword in data['ACCEPT_KEYWORDS']: + kwkey = get_kwkey(db, keyword) + db.insert('global_keywords', uuid=uuid, kwkey=kwkey) + + # Insert in host_lang + for lang in data['LANG']: + lkey = get_lkey(db, lang) + db.insert('host_lang', uuid=uuid, lkey=lkey) + + # Insert in host_features + for feature in data['FEATURES']: + fkey = get_fkey(db, feature) + db.insert('host_features', uuid=uuid, fkey=fkey) + + # Insert in host_mirrors + for mirror in data['GENTOO_MIRRORS']: + mkey = get_mkey(db, mirror) + db.insert('host_mirrors', uuid=uuid, mkey=mkey) + + # Insert in global_useflags + for useflag in data['USE']: + ukey = get_ukey(db, useflag) + db.insert('global_useflags', uuid=uuid, ukey=ukey) + + # Handle packages + for package in data['PACKAGES'].keys(): + pkey = get_pkey(db, package) + data_pkg = data['PACKAGES'][package] + kwkey = get_kwkey(db, data_pkg['KEYWORD']) + rkey = get_rkey(db, data_pkg['REPO']) + + # Insert in installed_packages + ipkey = db.insert('installed_packages', uuid=uuid, pkey=pkey, build_time=data_pkg['BUILD_TIME'], + counter=data_pkg['COUNTER'], kwkey=kwkey, rkey=rkey, size=data_pkg['SIZE']) + + # Insert in plus_useflags + for useflag in data_pkg['USE']['PLUS']: + ukey = get_ukey(db, useflag) + db.insert('plus_useflags', ipkey=ipkey, ukey=ukey) + + # Insert in minus_useflags + for useflag in data_pkg['USE']['MINUS']: + ukey = get_ukey(db, useflag) + db.insert('minus_useflags', ipkey=ipkey, ukey=ukey) + + # Insert in unset_useflags + for useflag in data_pkg['USE']['UNSET']: + ukey = get_ukey(db, useflag) + db.insert('unset_useflags', ipkey=ipkey, ukey=ukey) + return 'POST for ' + uuid + ' successful' -- cgit v1.2.3-65-gdbad