From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1Qg1eP-0007Kz-Uq for garchives@archives.gentoo.org; Sun, 10 Jul 2011 21:34:57 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id B731721C0D6; Sun, 10 Jul 2011 21:34:46 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 3D95121C0D6 for ; Sun, 10 Jul 2011 21:34:46 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 823CB2AC155 for ; Sun, 10 Jul 2011 21:34:45 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id 9A8D58003D for ; Sun, 10 Jul 2011 21:34:44 +0000 (UTC) From: "Vikraman Choudhury" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Vikraman Choudhury" Message-ID: <1cb6b9cc00ad839c47453ba3b554df1fb8508508.vikraman@gentoo> Subject: [gentoo-commits] proj/gentoostats:master commit in: client/gentoostats/, /, server/, server/tests/, client/, server/templates/ X-VCS-Repository: proj/gentoostats X-VCS-Files: TODO client/gentoostats-send client/gentoostats/environment.py client/gentoostats/metadata.py client/gentoostats/packages.py client/gentoostats/payload.py client/setup.py server/app.py server/arch.py server/config.py server/feature.py server/helpers.py server/host.py server/index.py server/kwd.py server/lang.py server/mirror.py server/package.py server/profile.py server/repo.py server/runtests.py server/templates/arch.html server/templates/error_404.html server/templates/feature.html server/templates/host.html server/templates/keyword.html server/templates/lang.html server/templates/layout.html server/templates/mirror.html server/templates/package.html server/templates/package_c.html server/templates/package_cp.html server/templates/profile.html server/templates/repo.html server/tests/test_host.py server/tests/test_index.py server/use.py X-VCS-Directories: client/gentoostats/ / server/ server/tests/ client/ server/templates/ X-VCS-Committer: vikraman X-VCS-Committer-Name: Vikraman Choudhury X-VCS-Revision: 1cb6b9cc00ad839c47453ba3b554df1fb8508508 Date: Sun, 10 Jul 2011 21:34:44 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: X-Archives-Hash: 11c720365eac8438be38d2b1d4801c98 commit: 1cb6b9cc00ad839c47453ba3b554df1fb8508508 Author: Vikraman Choudhury gmail com> AuthorDate: Sun Jul 10 21:28:35 2011 +0000 Commit: Vikraman Choudhury gmail com> CommitDate: Sun Jul 10 21:28:35 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/gentoostats.g= it;a=3Dcommit;h=3D1cb6b9cc fix tabs --- TODO | 7 +- client/gentoostats-send | 86 ++++++------ client/gentoostats/environment.py | 86 ++++++------ client/gentoostats/metadata.py | 54 ++++---- client/gentoostats/packages.py | 20 ++-- client/gentoostats/payload.py | 92 +++++++------- client/setup.py | 20 ++-- server/app.py | 32 +++--- server/arch.py | 12 +- server/config.py | 15 +- server/feature.py | 12 +- server/helpers.py | 150 +++++++++++----------- server/host.py | 260 ++++++++++++++++++-------------= ----- server/index.py | 8 +- server/kwd.py | 12 +- server/lang.py | 12 +- server/mirror.py | 12 +- server/package.py | 254 ++++++++++++++++++-------------= ----- server/profile.py | 12 +- server/repo.py | 12 +- server/runtests.py | 6 +- server/templates/arch.html | 12 +- server/templates/error_404.html | 1 - server/templates/feature.html | 12 +- server/templates/host.html | 16 +- server/templates/keyword.html | 14 +- server/templates/lang.html | 12 +- server/templates/layout.html | 1 - server/templates/mirror.html | 12 +- server/templates/package.html | 12 +- server/templates/package_c.html | 14 +- server/templates/package_cp.html | 16 +- server/templates/profile.html | 12 +- server/templates/repo.html | 14 +- server/tests/test_host.py | 138 ++++++++++---------- server/tests/test_index.py | 34 +++--- server/use.py | 76 ++++++------ 37 files changed, 782 insertions(+), 788 deletions(-) diff --git a/TODO b/TODO index 0821f7b..d7a8801 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,2 @@ -./server/post.py: #TODO: Improve this -./server/post.py: #TODO: Handle exceptions -./client/bin/client: #TODO: Return public uuid and md5sum of password -./client/bin/client: #TODO: Handle exceptions -./client/useflags.py:#TODO: Remove gentoolkit dependency +./server/host.py: #TODO: Handle exceptions +./server/helpers.py: #TODO: string is not a valid uuid diff --git a/client/gentoostats-send b/client/gentoostats-send index 73d53a2..f2b7246 100755 --- a/client/gentoostats-send +++ b/client/gentoostats-send @@ -8,59 +8,59 @@ import urllib, httplib from gentoostats.payload import Payload =20 def getAuthInfo(auth): - config =3D ConfigParser.ConfigParser() - if len(config.read(auth)) =3D=3D 0: - sys.stderr.write('Cannot read ' + auth) - sys.exit(1) + config =3D ConfigParser.ConfigParser() + if len(config.read(auth)) =3D=3D 0: + sys.stderr.write('Cannot read ' + auth) + sys.exit(1) =20 - try: - uuid =3D config.get('AUTH', 'UUID') - passwd =3D config.get('AUTH', 'PASSWD') - auth_info =3D {'UUID' : uuid, 'PASSWD' : passwd} - return auth_info - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): - sys.stderr.write('Malformed auth config') - sys.exit(1) + try: + uuid =3D config.get('AUTH', 'UUID') + passwd =3D config.get('AUTH', 'PASSWD') + auth_info =3D {'UUID' : uuid, 'PASSWD' : passwd} + return auth_info + except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): + sys.stderr.write('Malformed auth config') + sys.exit(1) =20 def serialize(object, human=3DFalse): - if human: - indent =3D 2 - sort_keys =3D True - else: - indent =3D None - sort_keys =3D False - return json.JSONEncoder(indent=3Dindent, sort_keys=3Dsort_keys).encode= (object) + if human: + indent =3D 2 + sort_keys =3D True + else: + indent =3D None + sort_keys =3D False + return json.JSONEncoder(indent=3Dindent, sort_keys=3Dsort_keys).enco= de(object) =20 def main(): - parser =3D argparse.ArgumentParser(description=3D'Gentoostats client') - parser.add_argument('-s', '--server', default=3D'soc.dev.gentoo.org') - parser.add_argument('-p', '--port', type =3D int, default=3D443) - parser.add_argument('-u', '--url', default=3D'/gentoostats') - parser.add_argument('-a', '--auth', default=3D'/etc/gentoostats/auth.c= fg') - parser.add_argument('-c', '--config', default=3D'/etc/gentoostats/payl= oad.cfg') - args =3D vars(parser.parse_args()) + parser =3D argparse.ArgumentParser(description=3D'Gentoostats client= ') + parser.add_argument('-s', '--server', default=3D'soc.dev.gentoo.org'= ) + parser.add_argument('-p', '--port', type =3D int, default=3D443) + parser.add_argument('-u', '--url', default=3D'/gentoostats') + parser.add_argument('-a', '--auth', default=3D'/etc/gentoostats/auth= .cfg') + parser.add_argument('-c', '--config', default=3D'/etc/gentoostats/pa= yload.cfg') + args =3D vars(parser.parse_args()) =20 - pl =3D Payload(configfile=3Dargs['config']) - pl.dump(human=3DTrue) + pl =3D Payload(configfile=3Dargs['config']) + pl.dump(human=3DTrue) =20 - post_data =3D pl.get() - post_data['AUTH'] =3D getAuthInfo(auth=3Dargs['auth']) + post_data =3D pl.get() + post_data['AUTH'] =3D getAuthInfo(auth=3Dargs['auth']) =20 - post_url =3D args['url'].strip('/') - if not len(post_url) =3D=3D 0: - post_url =3D '/' + post_url - post_url =3D post_url + '/host/' + post_data['AUTH']['UUID'] + post_url =3D args['url'].strip('/') + if not len(post_url) =3D=3D 0: + post_url =3D '/' + post_url + post_url =3D post_url + '/host/' + post_data['AUTH']['UUID'] =20 - post_body =3D serialize(post_data,human=3DTrue) - post_headers =3D {'Content-type':'application/json'} + post_body =3D serialize(post_data,human=3DTrue) + post_headers =3D {'Content-type':'application/json'} =20 - conn =3D httplib.HTTPSConnection(args['server'] + ':' + str(args['port= '])) - conn.request('POST', url=3Dpost_url, headers=3Dpost_headers, body=3Dpo= st_body) + conn =3D httplib.HTTPSConnection(args['server'] + ':' + str(args['po= rt'])) + conn.request('POST', url=3Dpost_url, headers=3Dpost_headers, body=3D= post_body) =20 - #TODO: Handle exceptions - response =3D conn.getresponse() - print response.status, response.reason - print 'Server response: ' + response.read() + #TODO: Handle exceptions + response =3D conn.getresponse() + print response.status, response.reason + print 'Server response: ' + response.read() =20 if __name__ =3D=3D "__main__": - main() + main() diff --git a/client/gentoostats/environment.py b/client/gentoostats/envir= onment.py index f03a76c..2e92ca3 100644 --- a/client/gentoostats/environment.py +++ b/client/gentoostats/environment.py @@ -7,46 +7,46 @@ from _emerge.actions import relative_profile_path =20 class Environment(object): =20 - def __init__(self): - self.portdir =3D portage.settings['PORTDIR'] - - def getVar(self, myvar): - return portage.settings[myvar] - - def getPlatform(self): - return platform.platform(aliased=3D1) - - def getLastSync(self): - lastsync =3D None - try: - lastsync =3D portage.grabfile(os.path.join(self.portdir, 'metadata= ', 'timestamp.chk')) - except portage.exception.PortageException: - pass - if lastsync is None: - return 'Unknown' - return lastsync[0] - =20 - def getProfile(self): - profilever =3D None - profile =3D portage.settings.profile_path - if profile: - profilever =3D relative_profile_path(self.portdir, profile) - if profilever is None: - try: - for parent in portage.grabfile(os.path.join(profile, 'parent')): - profilever =3D relative_profile_path(self.portdir,os.path.join(prof= ile, parent)) - if profilever is not None: - break - except portage.exception.PortageException: - pass - - if profilever is None: - try: - profilever =3D '!' + os.readlink(profile) - except (OSError): - pass - - if profilever is None: - profilever =3D 'Unknown' - - return profilever + def __init__(self): + self.portdir =3D portage.settings['PORTDIR'] + + def getVar(self, myvar): + return portage.settings[myvar] + + def getPlatform(self): + return platform.platform(aliased=3D1) + + def getLastSync(self): + lastsync =3D None + try: + lastsync =3D portage.grabfile(os.path.join(self.portdir, 'me= tadata', 'timestamp.chk')) + except portage.exception.PortageException: + pass + if lastsync is None: + return 'Unknown' + return lastsync[0] + + def getProfile(self): + profilever =3D None + profile =3D portage.settings.profile_path + if profile: + profilever =3D relative_profile_path(self.portdir, profile) + if profilever is None: + try: + for parent in portage.grabfile(os.path.join(profile,= 'parent')): + profilever =3D relative_profile_path(self.portdi= r,os.path.join(profile, parent)) + if profilever is not None: + break + except portage.exception.PortageException: + pass + + if profilever is None: + try: + profilever =3D '!' + os.readlink(profile) + except (OSError): + pass + + if profilever is None: + profilever =3D 'Unknown' + + return profilever diff --git a/client/gentoostats/metadata.py b/client/gentoostats/metadata= .py index 224fbfd..fb36a12 100644 --- a/client/gentoostats/metadata.py +++ b/client/gentoostats/metadata.py @@ -6,40 +6,40 @@ from gentoolkit.enalyze.lib import KeywordAnalyser =20 class Metadata(object): =20 - def __init__(self, cpv): - self.repo, self.counter, self.build_time, self.size =3D VARDB.aux_ge= t(cpv,['repository','COUNTER','BUILD_TIME','SIZE']) + def __init__(self, cpv): + self.repo, self.counter, self.build_time, self.size =3D VARDB.au= x_get(cpv,['repository','COUNTER','BUILD_TIME','SIZE']) =20 - system_use =3D portage.settings['USE'].split() - fa =3D FlagAnalyzer(system=3Dsystem_use) - self.flags =3D fa.analyse_cpv(cpv) + system_use =3D portage.settings['USE'].split() + fa =3D FlagAnalyzer(system=3Dsystem_use) + self.flags =3D fa.analyse_cpv(cpv) =20 - arch =3D portage.settings['ARCH'] - accept_keywords =3D portage.settings['ACCEPT_KEYWORDS'].split() - ka =3D KeywordAnalyser(arch=3Darch,accept_keywords=3Daccept_keywords= ) - self.keyword =3D ka.get_inst_keyword_cpv(cpv) + arch =3D portage.settings['ARCH'] + accept_keywords =3D portage.settings['ACCEPT_KEYWORDS'].split() + ka =3D KeywordAnalyser(arch=3Darch,accept_keywords=3Daccept_keyw= ords) + self.keyword =3D ka.get_inst_keyword_cpv(cpv) =20 - def getPlusFlags(self): - return list(self.flags[0]) + def getPlusFlags(self): + return list(self.flags[0]) =20 - def getMinusFlags(self): - return list(self.flags[1]) + def getMinusFlags(self): + return list(self.flags[1]) =20 - def getUnsetFlags(self): - return list(self.flags[2]) + def getUnsetFlags(self): + return list(self.flags[2]) =20 - def getKeyword(self): - return self.keyword + def getKeyword(self): + return self.keyword =20 - def getRepoName(self): - if self.repo: - return self.repo - return 'Unknown' + def getRepoName(self): + if self.repo: + return self.repo + return 'Unknown' =20 - def getCounter(self): - return self.counter + def getCounter(self): + return self.counter =20 - def getBuildTime(self): - return self.build_time + def getBuildTime(self): + return self.build_time =20 - def getSize(self): - return self.size + def getSize(self): + return self.size diff --git a/client/gentoostats/packages.py b/client/gentoostats/packages= .py index 2c9f48d..2d8d677 100644 --- a/client/gentoostats/packages.py +++ b/client/gentoostats/packages.py @@ -5,14 +5,14 @@ from gentoostats.dbapi import VARDB =20 class Packages(object): =20 - def getInstalledCPs(self, sort=3DFalse): - installed_cps =3D VARDB.cp_all() - if sort: - return sorted(installed_cps) - return installed_cps + def getInstalledCPs(self, sort=3DFalse): + installed_cps =3D VARDB.cp_all() + if sort: + return sorted(installed_cps) + return installed_cps =20 - def getInstalledCPVs(self,sort=3DFalse): - installed_cpvs =3D VARDB.cpv_all() - if sort: - return installed_cpvs - return installed_cpvs + def getInstalledCPVs(self,sort=3DFalse): + installed_cpvs =3D VARDB.cpv_all() + if sort: + return installed_cpvs + return installed_cpvs diff --git a/client/gentoostats/payload.py b/client/gentoostats/payload.p= y index 22f736e..40532c5 100644 --- a/client/gentoostats/payload.py +++ b/client/gentoostats/payload.py @@ -8,57 +8,57 @@ from gentoostats.metadata import Metadata =20 class Payload(object): =20 - def __init__(self, configfile): - self.config =3D ConfigParser.ConfigParser() - if len(self.config.read(configfile)) =3D=3D 0: - sys.stderr.write('Cannot read ' + configfile) - sys.exit(1) + def __init__(self, configfile): + self.config =3D ConfigParser.ConfigParser() + if len(self.config.read(configfile)) =3D=3D 0: + sys.stderr.write('Cannot read ' + configfile) + sys.exit(1) =20 - self.payload =3D dict() - self.payload['PROTOCOL'] =3D 1 - self.update() + self.payload =3D dict() + self.payload['PROTOCOL'] =3D 1 + self.update() =20 - def __masked(self, section, item): - try: - return not self.config.getboolean(section, item) - except ConfigParser.NoOptionError: - return False - except (ConfigParser.NoSectionError, ValueError): - sys.stderr.write('Malformed payload config') - sys.exit(1) + def __masked(self, section, item): + try: + return not self.config.getboolean(section, item) + except ConfigParser.NoOptionError: + return False + except (ConfigParser.NoSectionError, ValueError): + sys.stderr.write('Malformed payload config') + sys.exit(1) =20 - def update(self): - env =3D Environment() - self.payload['PLATFORM'] =3D 'Unknown' if self.__masked('ENV','PLATFORM= ') else env.getPlatform() - self.payload['LASTSYNC'] =3D 'Unknown' if self.__masked('ENV','LASTSYNC= ') else env.getLastSync() - self.payload['PROFILE'] =3D 'Unknown' if self.__masked('ENV','PROFILE')= else env.getProfile() + def update(self): + env =3D Environment() + self.payload['PLATFORM'] =3D 'Unknown' if self.__masked('ENV','P= LATFORM') else env.getPlatform() + self.payload['LASTSYNC'] =3D 'Unknown' if self.__masked('ENV','L= ASTSYNC') else env.getLastSync() + self.payload['PROFILE'] =3D 'Unknown' if self.__masked('ENV','PR= OFILE') else env.getProfile() =20 - for var in ['ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS','MAKE= OPTS','SYNC']: - self.payload[var] =3D None if self.__masked('ENV',var) else env.getVa= r(var) + for var in ['ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS= ','MAKEOPTS','SYNC']: + self.payload[var] =3D None if self.__masked('ENV',var) else = env.getVar(var) =20 - for var in ['ACCEPT_KEYWORDS','LANG','GENTOO_MIRRORS','FEATURES','USE']= : - self.payload[var] =3D [] if self.__masked('ENV',var) else env.getVar(= var).split() + for var in ['ACCEPT_KEYWORDS','LANG','GENTOO_MIRRORS','FEATURES'= ,'USE']: + self.payload[var] =3D [] if self.__masked('ENV',var) else en= v.getVar(var).split() =20 - self.payload['PACKAGES'] =3D dict() - for cpv in Packages().getInstalledCPVs(): - m =3D Metadata(cpv) - p =3D dict() - p['REPO'] =3D None if self.__masked('PACKAGES','REPO') else m.getRepo= Name() - p['KEYWORD'] =3D None if self.__masked('PACKAGES','KEYWORD') else m.g= etKeyword() - p['USE'] =3D dict() - p['USE']['PLUS'] =3D [] if self.__masked('PACKAGES','USE_PLUS') else = m.getPlusFlags() - p['USE']['MINUS'] =3D [] if self.__masked('PACKAGES','USE_MINUS') els= e m.getMinusFlags() - p['USE']['UNSET'] =3D [] if self.__masked('PACKAGES','USE_UNSET') els= e m.getUnsetFlags() - p['COUNTER'] =3D None if self.__masked('PACKAGES','COUNTER') else m.g= etCounter() - p['SIZE'] =3D None if self.__masked('PACKAGES','SIZE') else m.getSize= () - p['BUILD_TIME'] =3D None if self.__masked('PACKAGES','BUILD_TIME') el= se m.getBuildTime() - self.payload['PACKAGES'][cpv] =3D p + self.payload['PACKAGES'] =3D dict() + for cpv in Packages().getInstalledCPVs(): + m =3D Metadata(cpv) + p =3D dict() + p['REPO'] =3D None if self.__masked('PACKAGES','REPO') else = m.getRepoName() + p['KEYWORD'] =3D None if self.__masked('PACKAGES','KEYWORD')= else m.getKeyword() + p['USE'] =3D dict() + p['USE']['PLUS'] =3D [] if self.__masked('PACKAGES','USE_PLU= S') else m.getPlusFlags() + p['USE']['MINUS'] =3D [] if self.__masked('PACKAGES','USE_MI= NUS') else m.getMinusFlags() + p['USE']['UNSET'] =3D [] if self.__masked('PACKAGES','USE_UN= SET') else m.getUnsetFlags() + p['COUNTER'] =3D None if self.__masked('PACKAGES','COUNTER')= else m.getCounter() + p['SIZE'] =3D None if self.__masked('PACKAGES','SIZE') else = m.getSize() + p['BUILD_TIME'] =3D None if self.__masked('PACKAGES','BUILD_= TIME') else m.getBuildTime() + self.payload['PACKAGES'][cpv] =3D p =20 - def get(self): - return self.payload + def get(self): + return self.payload =20 - def dump(self,human=3DFalse): - if human: - pprint.pprint(self.payload) - else: - print self.payload + def dump(self,human=3DFalse): + if human: + pprint.pprint(self.payload) + else: + print self.payload diff --git a/client/setup.py b/client/setup.py index 133274c..c018ccc 100644 --- a/client/setup.py +++ b/client/setup.py @@ -2,13 +2,13 @@ from setuptools import setup =20 setup( - name =3D "gentoostats", - version =3D "9999", - author =3D "Vikraman Choudhury", - author_email =3D "vikraman.choudhury@gmail.com", - description =3D "Package statistics client", - license =3D "GPLv3", - url =3D "http://soc.dev.gentoo/org/gentoostats", - packages =3D ['gentoostats'], - scripts =3D ['gentoostats-send'] - ) + name =3D "gentoostats", + version =3D "9999", + author =3D "Vikraman Choudhury", + author_email =3D "vikraman.choudhury@gmail.com", + description =3D "Package statistics client", + license =3D "GPLv3", + url =3D "http://soc.dev.gentoo/org/gentoostats", + packages =3D ['gentoostats'], + scripts =3D ['gentoostats-send'] + ) diff --git a/server/app.py b/server/app.py index fa5d6a4..f2948e8 100755 --- a/server/app.py +++ b/server/app.py @@ -16,21 +16,21 @@ from package import Package from host import Host =20 urls =3D ( - r'/', 'Index', - r'/arch', 'Arch', - r'/profile', 'Profile', - r'/mirror', 'Mirror', - r'/feature', 'Feature', - r'/keyword', 'Keyword', - r'/repo', 'Repo', - r'/lang', 'Lang', - r'/package/(.+)/(.+)', 'Package', - r'/package/(.+)', 'Package', - r'/package', 'Package', - r'/use/(.+)', 'Use', - r'/use', 'Use', - r'/host/(.+)', 'Host' - ) + r'/', 'Index', + r'/arch', 'Arch', + r'/profile', 'Profile', + r'/mirror', 'Mirror', + r'/feature', 'Feature', + r'/keyword', 'Keyword', + r'/repo', 'Repo', + r'/lang', 'Lang', + r'/package/(.+)/(.+)', 'Package', + r'/package/(.+)', 'Package', + r'/package', 'Package', + r'/use/(.+)', 'Use', + r'/use', 'Use', + r'/host/(.+)', 'Host' + ) =20 app =3D web.application(urls, globals()) =20 @@ -38,4 +38,4 @@ app.notfound =3D config.notfound app.internalerror =3D config.internalerror =20 if __name__ =3D=3D "__main__": - app.run() + app.run() diff --git a/server/arch.py b/server/arch.py index a389b8f..8b9ef99 100644 --- a/server/arch.py +++ b/server/arch.py @@ -2,9 +2,9 @@ from config import render, db =20 class Arch(object): - def GET(self): - arch_count =3D db.select('ENV', what=3D'ARCH, COUNT(UUID) AS HOSTS', gr= oup=3D'ARCH') - arch_data =3D dict() - for t in arch_count: - arch_data[t['ARCH']] =3D {'HOSTS':t['HOSTS']} - return render.arch(arch_data) + def GET(self): + arch_count =3D db.select('ENV', what=3D'ARCH, COUNT(UUID) AS HOS= TS', group=3D'ARCH') + arch_data =3D dict() + for t in arch_count: + arch_data[t['ARCH']] =3D {'HOSTS':t['HOSTS']} + return render.arch(arch_data) diff --git a/server/config.py b/server/config.py index ae73fc4..6cb9ec3 100644 --- a/server/config.py +++ b/server/config.py @@ -4,18 +4,17 @@ import sys import web =20 db =3D web.database( - dbn=3D'mysql', - user=3D'gentoo', - pw=3D'gentoo', - db=3D'gentoostats' - ) + dbn=3D'mysql', + user=3D'gentoo', + pw=3D'gentoo', + db=3D'gentoostats' + ) =20 rootdir =3D os.path.abspath(os.path.dirname(__file__)) + '/' render =3D web.template.render(rootdir + 'templates/', base=3D'layout') =20 def notfound(): - return web.notfound(render.error_404()) + return web.notfound(render.error_404()) =20 def internalerror(): - return web.internalerror(render.error_500()) - + return web.internalerror(render.error_500()) diff --git a/server/feature.py b/server/feature.py index 4b79da5..d7674f7 100644 --- a/server/feature.py +++ b/server/feature.py @@ -2,9 +2,9 @@ from config import render, db =20 class Feature(object): - def GET(self): - feature_count =3D db.query('SELECT FEATURE,COUNT(UUID) AS HOSTS FROM HO= ST_FEATURES NATURAL JOIN FEATURES GROUP BY FEATURE') - feature_data =3D dict() - for t in feature_count: - feature_data[t['FEATURE']] =3D {'HOSTS':t['HOSTS']} - return render.feature(feature_data) + def GET(self): + feature_count =3D db.query('SELECT FEATURE,COUNT(UUID) AS HOSTS = FROM HOST_FEATURES NATURAL JOIN FEATURES GROUP BY FEATURE') + feature_data =3D dict() + for t in feature_count: + feature_data[t['FEATURE']] =3D {'HOSTS':t['HOSTS']} + return render.feature(feature_data) diff --git a/server/helpers.py b/server/helpers.py index 10ac31f..28d15a2 100644 --- a/server/helpers.py +++ b/server/helpers.py @@ -6,103 +6,103 @@ from portage.versions import catpkgsplit # check valid uuid =20 def is_uuid(uuid): - regex =3D re.compile(r'^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$') - return regex.search(uuid) + regex =3D re.compile(r'^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$') + return regex.search(uuid) =20 # convert uuid string to raw bytes =20 def uuidbin(string): - #TODO: string is not a valid uuid - u =3D uuid.UUID(string) - return u.bytes + #TODO: string is not a valid uuid + u =3D uuid.UUID(string) + return u.bytes =20 # custom pkgsplit =20 def pkgsplit(pkgname): - cpv=3D{'cat':'','pkg':'','ver':''} - cpvr =3D catpkgsplit(pkgname) - if cpvr is None: - pkgsplit =3D pkgname.split('/') - cpv['cat'] =3D pkgsplit[0] - cpv['pkg'] =3D pkgsplit[1] - else: - cpv['cat'] =3D cpvr[0] - cpv['pkg'] =3D cpvr[1] - cpv['ver'] =3D cpvr[2] - if cpvr[3] !=3D 'r0': - cpv['ver'] =3D cpv['ver'] + '-' + cpvr[3] - return cpv + cpv=3D{'cat':'','pkg':'','ver':''} + cpvr =3D catpkgsplit(pkgname) + if cpvr is None: + pkgsplit =3D pkgname.split('/') + cpv['cat'] =3D pkgsplit[0] + cpv['pkg'] =3D pkgsplit[1] + else: + cpv['cat'] =3D cpvr[0] + cpv['pkg'] =3D cpvr[1] + cpv['ver'] =3D cpvr[2] + if cpvr[3] !=3D 'r0': + cpv['ver'] =3D cpv['ver'] + '-' + cpvr[3] + return cpv =20 # get functions for index keys # lookup key and insert if not found =20 def get_kwkey(db, keyword): - if keyword is None: - return None - db_keyword =3D db.select('KEYWORDS', vars=3D{'keyword':keyword}, where= =3D'KEYWORD=3D$keyword') - if len(db_keyword): - kwkey =3D db_keyword[0]['KWKEY'] - else: - kwkey =3D db.insert('KEYWORDS', KEYWORD=3Dkeyword) - return kwkey + if keyword is None: + return None + db_keyword =3D db.select('KEYWORDS', vars=3D{'keyword':keyword}, whe= re=3D'KEYWORD=3D$keyword') + if len(db_keyword): + kwkey =3D db_keyword[0]['KWKEY'] + else: + kwkey =3D db.insert('KEYWORDS', KEYWORD=3Dkeyword) + return kwkey =20 def get_lkey(db, lang): - if lang is None: - return None - db_lang =3D db.select('LANG', vars=3D{'lang':lang}, where=3D'LANG=3D$l= ang') - if len(db_lang): - lkey =3D db_lang[0]['LKEY'] - else: - lkey =3D db.insert('LANG', LANG=3Dlang) - return lkey + if lang is None: + return None + db_lang =3D db.select('LANG', vars=3D{'lang':lang}, where=3D'LANG=3D= $lang') + if len(db_lang): + lkey =3D db_lang[0]['LKEY'] + else: + lkey =3D db.insert('LANG', LANG=3Dlang) + return lkey =20 def get_fkey(db, feature): - if feature is None: - return None - db_feature =3D db.select('FEATURES', vars=3D{'feature':feature}, where= =3D'FEATURE=3D$feature') - if len(db_feature): - fkey =3D db_feature[0]['FKEY'] - else: - fkey =3D db.insert('FEATURES', FEATURE=3Dfeature) - return fkey + if feature is None: + return None + db_feature =3D db.select('FEATURES', vars=3D{'feature':feature}, whe= re=3D'FEATURE=3D$feature') + if len(db_feature): + fkey =3D db_feature[0]['FKEY'] + else: + fkey =3D db.insert('FEATURES', FEATURE=3Dfeature) + return fkey =20 def get_mkey(db, mirror): - if mirror is None: - return None - db_mirror =3D db.select('GENTOO_MIRRORS', vars=3D{'mirror':mirror}, wh= ere=3D'MIRROR=3D$mirror') - if len(db_mirror): - mkey =3D db_mirror[0]['MKEY'] - else: - mkey =3D db.insert('GENTOO_MIRRORS', MIRROR=3Dmirror) - return mkey + if mirror is None: + return None + db_mirror =3D db.select('GENTOO_MIRRORS', vars=3D{'mirror':mirror}, = where=3D'MIRROR=3D$mirror') + if len(db_mirror): + mkey =3D db_mirror[0]['MKEY'] + else: + mkey =3D db.insert('GENTOO_MIRRORS', MIRROR=3Dmirror) + return mkey =20 def get_ukey(db, useflag): - if useflag is None: - return None - db_useflag =3D db.select('USEFLAGS', vars=3D{'useflag':useflag}, where= =3D'USEFLAG=3D$useflag') - if len(db_useflag): - ukey =3D db_useflag[0]['UKEY'] - else: - ukey =3D db.insert('USEFLAGS', USEFLAG=3Duseflag) - return ukey + if useflag is None: + return None + db_useflag =3D db.select('USEFLAGS', vars=3D{'useflag':useflag}, whe= re=3D'USEFLAG=3D$useflag') + if len(db_useflag): + ukey =3D db_useflag[0]['UKEY'] + else: + ukey =3D db.insert('USEFLAGS', USEFLAG=3Duseflag) + return ukey =20 def get_pkey(db, package): - if package is None: - return None - cpv =3D pkgsplit(package) - db_package =3D db.select('PACKAGES', vars=3Dcpv, where=3D'CAT=3D$cat a= nd PKG=3D$pkg and VER=3D$ver') - if len(db_package): - pkey =3D db_package[0]['PKEY'] - else: - pkey =3D db.insert('PACKAGES', CAT=3Dcpv['cat'], PKG=3Dcpv['pkg'], VER=3D= cpv['ver']) - return pkey + if package is None: + return None + cpv =3D pkgsplit(package) + db_package =3D db.select('PACKAGES', vars=3Dcpv, where=3D'CAT=3D$cat= and PKG=3D$pkg and VER=3D$ver') + if len(db_package): + pkey =3D db_package[0]['PKEY'] + else: + pkey =3D db.insert('PACKAGES', CAT=3Dcpv['cat'], PKG=3Dcpv['pkg'= ], VER=3Dcpv['ver']) + return pkey =20 def get_rkey(db, repo): - if repo is None: - return None - db_repo =3D db.select('REPOSITORIES', vars=3D{'repo':repo}, where=3D'R= EPO=3D$repo') - if len(db_repo): - rkey =3D db_repo[0]['RKEY'] - else: - rkey =3D db.insert('REPOSITORIES', REPO=3Drepo) - return rkey + if repo is None: + return None + db_repo =3D db.select('REPOSITORIES', vars=3D{'repo':repo}, where=3D= 'REPO=3D$repo') + if len(db_repo): + rkey =3D db_repo[0]['RKEY'] + else: + rkey =3D db.insert('REPOSITORIES', REPO=3Drepo) + return rkey diff --git a/server/host.py b/server/host.py index c9a5d03..03bc2ba 100644 --- a/server/host.py +++ b/server/host.py @@ -7,133 +7,133 @@ from config import render, db =20 class Host(object): =20 - def GET(self, str_uuid): - if not helpers.is_uuid(str_uuid): - return config.notfound() - - uuid =3D helpers.uuidbin(str_uuid) - hosts =3D db.select('HOSTS', vars=3D{'uuid':uuid}, where=3D'UUID=3D$uui= d', what=3D'UUID') - if len(hosts) =3D=3D 0: - return config.notfound() - - host_data =3D dict() - host_data['UUID'] =3D str_uuid - - env =3D db.select('ENV', vars=3D{'uuid':uuid}, where=3D"UUID=3D$uuid") - e =3D env[0] - for var in ['PLATFORM','LASTSYNC','PROFILE','ARCH','CHOST','CFLAGS','CX= XFLAGS','FFLAGS','LDFLAGS','MAKEOPTS','SYNC']: - host_data[var] =3D e[var] -=09 - host_data['FEATURES'] =3D list() - features =3D db.query('SELECT FEATURE FROM HOST_FEATURES NATURAL JOIN F= EATURES WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) - for f in features: - host_data['FEATURES'].append(f['FEATURE']) - - host_data['ACCEPT_KEYWORDS'] =3D list() - keywords =3D db.query('SELECT KEYWORD FROM GLOBAL_KEYWORDS NATURAL JOIN= KEYWORDS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) - for k in keywords: - host_data['ACCEPT_KEYWORDS'].append(k['KEYWORD']) -=09 - host_data['USE'] =3D list() - useflags =3D db.query('SELECT USEFLAG FROM GLOBAL_USEFLAGS NATURAL JOIN= USEFLAGS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) - for u in useflags: - host_data['USE'].append(u['USEFLAG']) - - host_data['LANG'] =3D list() - lang =3D db.query('SELECT LANG FROM HOST_LANG NATURAL JOIN LANG WHERE U= UID=3D$uuid', vars=3D{'uuid':uuid}) - for l in lang: - host_data['LANG'].append(l['LANG']) - - host_data['GENTOO_MIRRORS'] =3D list() - mirrors =3D db.query('SELECT MIRROR FROM HOST_MIRRORS NATURAL JOIN GENT= OO_MIRRORS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) - for m in mirrors: - host_data['GENTOO_MIRRORS'].append(m['MIRROR']) - - host_data['PACKAGES'] =3D dict() - packages =3D db.query('SELECT CAT, PKG, VER FROM INSTALLED_PACKAGES NAT= URAL JOIN PACKAGES WHERE UUID=3D$uuid ORDER BY CAT, PKG, VER', vars=3D{'u= uid':uuid}) - for p in packages: - cpv =3D p['CAT'] + '/' + p['PKG'] + '-' + p['VER'] - host_data['PACKAGES'][cpv] =3D dict() - - return render.host(host_data) - - def POST(self, str_uuid): - post_data =3D json.JSONDecoder().decode(web.data()) - - #TODO: Handle exceptions - if post_data['PROTOCOL'] !=3D 1: - return 'Unsupported protocol!' - - if post_data['AUTH']['UUID'] !=3D str_uuid: - return 'Invalid uuid!' - - uuid =3D helpers.uuidbin(str_uuid) - - # Insert in hosts - db_host =3D db.select('HOSTS', vars=3D{'uuid':uuid}, where=3D'UUID=3D$u= uid') - if len(db_host): - if post_data['AUTH']['PASSWD'] !=3D db_host[0]['PASSWD']: - return 'Wrong password!' - # This should delete all host entries from all tables - db.delete('HOSTS', vars=3D{'uuid':uuid}, where=3D'UUID=3D$uuid') - db.insert('HOSTS', UUID=3Duuid, PASSWD=3Dpost_data['AUTH']['PASSWD']) - - # Insert in env - db.insert('ENV', UUID=3Duuid, ARCH=3Dpost_data['ARCH'], CHOST=3Dpost_da= ta['CHOST'], CFLAGS=3Dpost_data['CFLAGS'], - CXXFLAGS=3Dpost_data['CXXFLAGS'], FFLAGS=3Dpost_data['FFLAGS'], LDFLAG= S=3Dpost_data['LDFLAGS'], - MAKEOPTS=3Dpost_data['MAKEOPTS'], SYNC=3Dpost_data['SYNC'], PLATFORM=3D= post_data['PLATFORM'], - PROFILE=3Dpost_data['PROFILE'], LASTSYNC=3Dpost_data['LASTSYNC']) - - # Insert in GLOBAL_KEYWORDS - for keyword in post_data['ACCEPT_KEYWORDS']: - kwkey =3D helpers.get_kwkey(db, keyword) - db.insert('GLOBAL_KEYWORDS', UUID=3Duuid, KWKEY=3Dkwkey) - - # Insert in HOST_LANG - for lang in post_data['LANG']: - lkey =3D helpers.get_lkey(db, lang) - db.insert('HOST_LANG', UUID=3Duuid, LKEY=3Dlkey) - - # Insert in HOST_FEATURES - for feature in post_data['FEATURES']: - fkey =3D helpers.get_fkey(db, feature) - db.insert('HOST_FEATURES', UUID=3Duuid, FKEY=3Dfkey) - - # Insert in HOST_MIRRORS - for mirror in post_data['GENTOO_MIRRORS']: - mkey =3D helpers.get_mkey(db, mirror) - db.insert('HOST_MIRRORS', UUID=3Duuid, MKEY=3Dmkey) - - # Insert in GLOBAL_USEFLAGS - for useflag in post_data['USE']: - ukey =3D helpers.get_ukey(db, useflag) - db.insert('GLOBAL_USEFLAGS', UUID=3Duuid, UKEY=3Dukey) - - # Handle PACKAGES - for package in post_data['PACKAGES'].keys(): - pkey =3D helpers.get_pkey(db, package) - post_data_pkg =3D post_data['PACKAGES'][package] - kwkey =3D helpers.get_kwkey(db, post_data_pkg['KEYWORD']) - rkey =3D helpers.get_rkey(db, post_data_pkg['REPO']) - build_time =3D int(post_data_pkg['BUILD_TIME']) if post_data_pkg['BUI= LD_TIME'] else None - - # Insert in INSTALLED_PACKAGES - ipkey =3D db.insert('INSTALLED_PACKAGES', UUID=3Duuid, PKEY=3Dpkey, B= UILD_TIME=3Dbuild_time, - COUNTER=3Dpost_data_pkg['COUNTER'], KWKEY=3Dkwkey, RKEY=3Drkey, SI= ZE=3Dpost_data_pkg['SIZE']) - - # Insert in PLUS_USEFLAGS - for useflag in post_data_pkg['USE']['PLUS']: - ukey =3D helpers.get_ukey(db, useflag) - db.insert('PLUS_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) - - # Insert in MINUS_USEFLAGS - for useflag in post_data_pkg['USE']['MINUS']: - ukey =3D helpers.get_ukey(db, useflag) - db.insert('MINUS_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) - - # Insert in UNSET_USEFLAGS - for useflag in post_data_pkg['USE']['UNSET']: - ukey =3D helpers.get_ukey(db, useflag) - db.insert('UNSET_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) - - return 'POST for ' + str_uuid + ' successful' + def GET(self, str_uuid): + if not helpers.is_uuid(str_uuid): + return config.notfound() + + uuid =3D helpers.uuidbin(str_uuid) + hosts =3D db.select('HOSTS', vars=3D{'uuid':uuid}, where=3D'UUID= =3D$uuid', what=3D'UUID') + if len(hosts) =3D=3D 0: + return config.notfound() + + host_data =3D dict() + host_data['UUID'] =3D str_uuid + + env =3D db.select('ENV', vars=3D{'uuid':uuid}, where=3D"UUID=3D$= uuid") + e =3D env[0] + for var in ['PLATFORM','LASTSYNC','PROFILE','ARCH','CHOST','CFLA= GS','CXXFLAGS','FFLAGS','LDFLAGS','MAKEOPTS','SYNC']: + host_data[var] =3D e[var] + + host_data['FEATURES'] =3D list() + features =3D db.query('SELECT FEATURE FROM HOST_FEATURES NATURAL= JOIN FEATURES WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) + for f in features: + host_data['FEATURES'].append(f['FEATURE']) + + host_data['ACCEPT_KEYWORDS'] =3D list() + keywords =3D db.query('SELECT KEYWORD FROM GLOBAL_KEYWORDS NATUR= AL JOIN KEYWORDS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) + for k in keywords: + host_data['ACCEPT_KEYWORDS'].append(k['KEYWORD']) + + host_data['USE'] =3D list() + useflags =3D db.query('SELECT USEFLAG FROM GLOBAL_USEFLAGS NATUR= AL JOIN USEFLAGS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) + for u in useflags: + host_data['USE'].append(u['USEFLAG']) + + host_data['LANG'] =3D list() + lang =3D db.query('SELECT LANG FROM HOST_LANG NATURAL JOIN LANG = WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) + for l in lang: + host_data['LANG'].append(l['LANG']) + + host_data['GENTOO_MIRRORS'] =3D list() + mirrors =3D db.query('SELECT MIRROR FROM HOST_MIRRORS NATURAL JO= IN GENTOO_MIRRORS WHERE UUID=3D$uuid', vars=3D{'uuid':uuid}) + for m in mirrors: + host_data['GENTOO_MIRRORS'].append(m['MIRROR']) + + host_data['PACKAGES'] =3D dict() + packages =3D db.query('SELECT CAT, PKG, VER FROM INSTALLED_PACKA= GES NATURAL JOIN PACKAGES WHERE UUID=3D$uuid ORDER BY CAT, PKG, VER', var= s=3D{'uuid':uuid}) + for p in packages: + cpv =3D p['CAT'] + '/' + p['PKG'] + '-' + p['VER'] + host_data['PACKAGES'][cpv] =3D dict() + + return render.host(host_data) + + def POST(self, str_uuid): + post_data =3D json.JSONDecoder().decode(web.data()) + + #TODO: Handle exceptions + if post_data['PROTOCOL'] !=3D 1: + return 'Unsupported protocol!' + + if post_data['AUTH']['UUID'] !=3D str_uuid: + return 'Invalid uuid!' + + uuid =3D helpers.uuidbin(str_uuid) + + # Insert in hosts + db_host =3D db.select('HOSTS', vars=3D{'uuid':uuid}, where=3D'UU= ID=3D$uuid') + if len(db_host): + if post_data['AUTH']['PASSWD'] !=3D db_host[0]['PASSWD']: + return 'Wrong password!' + # This should delete all host entries from all tables + db.delete('HOSTS', vars=3D{'uuid':uuid}, where=3D'UUID=3D$uu= id') + db.insert('HOSTS', UUID=3Duuid, PASSWD=3Dpost_data['AUTH']['PASS= WD']) + + # Insert in env + db.insert('ENV', UUID=3Duuid, ARCH=3Dpost_data['ARCH'], CHOST=3D= post_data['CHOST'], CFLAGS=3Dpost_data['CFLAGS'], + CXXFLAGS=3Dpost_data['CXXFLAGS'], FFLAGS=3Dpost_data['FF= LAGS'], LDFLAGS=3Dpost_data['LDFLAGS'], + MAKEOPTS=3Dpost_data['MAKEOPTS'], SYNC=3Dpost_data['SYNC= '], PLATFORM=3Dpost_data['PLATFORM'], + PROFILE=3Dpost_data['PROFILE'], LASTSYNC=3Dpost_data['LA= STSYNC']) + + # Insert in GLOBAL_KEYWORDS + for keyword in post_data['ACCEPT_KEYWORDS']: + kwkey =3D helpers.get_kwkey(db, keyword) + db.insert('GLOBAL_KEYWORDS', UUID=3Duuid, KWKEY=3Dkwkey) + + # Insert in HOST_LANG + for lang in post_data['LANG']: + lkey =3D helpers.get_lkey(db, lang) + db.insert('HOST_LANG', UUID=3Duuid, LKEY=3Dlkey) + + # Insert in HOST_FEATURES + for feature in post_data['FEATURES']: + fkey =3D helpers.get_fkey(db, feature) + db.insert('HOST_FEATURES', UUID=3Duuid, FKEY=3Dfkey) + + # Insert in HOST_MIRRORS + for mirror in post_data['GENTOO_MIRRORS']: + mkey =3D helpers.get_mkey(db, mirror) + db.insert('HOST_MIRRORS', UUID=3Duuid, MKEY=3Dmkey) + + # Insert in GLOBAL_USEFLAGS + for useflag in post_data['USE']: + ukey =3D helpers.get_ukey(db, useflag) + db.insert('GLOBAL_USEFLAGS', UUID=3Duuid, UKEY=3Dukey) + + # Handle PACKAGES + for package in post_data['PACKAGES'].keys(): + pkey =3D helpers.get_pkey(db, package) + post_data_pkg =3D post_data['PACKAGES'][package] + kwkey =3D helpers.get_kwkey(db, post_data_pkg['KEYWORD']) + rkey =3D helpers.get_rkey(db, post_data_pkg['REPO']) + build_time =3D int(post_data_pkg['BUILD_TIME']) if post_data= _pkg['BUILD_TIME'] else None + + # Insert in INSTALLED_PACKAGES + ipkey =3D db.insert('INSTALLED_PACKAGES', UUID=3Duuid, PKEY=3D= pkey, BUILD_TIME=3Dbuild_time, + COUNTER=3Dpost_data_pkg['COUNTER'], KWKEY=3Dkwkey, R= KEY=3Drkey, SIZE=3Dpost_data_pkg['SIZE']) + + # Insert in PLUS_USEFLAGS + for useflag in post_data_pkg['USE']['PLUS']: + ukey =3D helpers.get_ukey(db, useflag) + db.insert('PLUS_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) + + # Insert in MINUS_USEFLAGS + for useflag in post_data_pkg['USE']['MINUS']: + ukey =3D helpers.get_ukey(db, useflag) + db.insert('MINUS_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) + + # Insert in UNSET_USEFLAGS + for useflag in post_data_pkg['USE']['UNSET']: + ukey =3D helpers.get_ukey(db, useflag) + db.insert('UNSET_USEFLAGS', IPKEY=3Dipkey, UKEY=3Dukey) + + return 'POST for ' + str_uuid + ' successful' diff --git a/server/index.py b/server/index.py index e5866a2..e6a63f5 100644 --- a/server/index.py +++ b/server/index.py @@ -2,7 +2,7 @@ from config import render, db =20 class Index(object): - def GET(self): - hosts =3D db.select('HOSTS', what=3D'COUNT(UUID) as COUNT') - count =3D hosts[0]['COUNT'] - return render.index(count) + def GET(self): + hosts =3D db.select('HOSTS', what=3D'COUNT(UUID) as COUNT') + count =3D hosts[0]['COUNT'] + return render.index(count) diff --git a/server/kwd.py b/server/kwd.py index 88fc799..c5f3403 100644 --- a/server/kwd.py +++ b/server/kwd.py @@ -2,9 +2,9 @@ from config import render, db =20 class Keyword(object): - def GET(self): - keyword_count =3D db.query('SELECT KEYWORD, COUNT(DISTINCT IPKEY) AS PA= CKAGES, COUNT(DISTINCT UUID) AS HOSTS FROM GLOBAL_KEYWORDS NATURAL JOIN K= EYWORDS NATURAL JOIN INSTALLED_PACKAGES GROUP BY KEYWORD') - keyword_data =3D dict() - for t in keyword_count: - keyword_data[t['KEYWORD']] =3D {'HOSTS':t['HOSTS'],'PACKAGES':t['PACK= AGES']} - return render.keyword(keyword_data) + def GET(self): + keyword_count =3D db.query('SELECT KEYWORD, COUNT(DISTINCT IPKEY= ) AS PACKAGES, COUNT(DISTINCT UUID) AS HOSTS FROM GLOBAL_KEYWORDS NATURAL= JOIN KEYWORDS NATURAL JOIN INSTALLED_PACKAGES GROUP BY KEYWORD') + keyword_data =3D dict() + for t in keyword_count: + keyword_data[t['KEYWORD']] =3D {'HOSTS':t['HOSTS'],'PACKAGES= ':t['PACKAGES']} + return render.keyword(keyword_data) diff --git a/server/lang.py b/server/lang.py index 3f4ebfb..e8c2d90 100644 --- a/server/lang.py +++ b/server/lang.py @@ -2,9 +2,9 @@ from config import render, db =20 class Lang(object): - def GET(self): - lang_count =3D db.query('SELECT LANG,COUNT(UUID) AS HOSTS FROM HOST_LAN= G NATURAL JOIN LANG GROUP BY LANG') - lang_data =3D dict() - for t in lang_count: - lang_data[t['LANG']] =3D {'HOSTS':t['HOSTS']} - return render.lang(lang_data) + def GET(self): + lang_count =3D db.query('SELECT LANG,COUNT(UUID) AS HOSTS FROM H= OST_LANG NATURAL JOIN LANG GROUP BY LANG') + lang_data =3D dict() + for t in lang_count: + lang_data[t['LANG']] =3D {'HOSTS':t['HOSTS']} + return render.lang(lang_data) diff --git a/server/mirror.py b/server/mirror.py index 7084831..c8b44c2 100644 --- a/server/mirror.py +++ b/server/mirror.py @@ -2,9 +2,9 @@ from config import render, db =20 class Mirror(object): - def GET(self): - mirror_count =3D db.query('SELECT MIRROR,COUNT(UUID) AS HOSTS FROM HOST= _MIRRORS NATURAL JOIN GENTOO_MIRRORS GROUP BY MIRROR') - mirror_data =3D dict() - for t in mirror_count: - mirror_data[t['MIRROR']] =3D {'HOSTS':t['HOSTS']} - return render.mirror(mirror_data) + def GET(self): + mirror_count =3D db.query('SELECT MIRROR,COUNT(UUID) AS HOSTS FR= OM HOST_MIRRORS NATURAL JOIN GENTOO_MIRRORS GROUP BY MIRROR') + mirror_data =3D dict() + for t in mirror_count: + mirror_data[t['MIRROR']] =3D {'HOSTS':t['HOSTS']} + return render.mirror(mirror_data) diff --git a/server/package.py b/server/package.py index 4ac7aa2..58e3066 100644 --- a/server/package.py +++ b/server/package.py @@ -4,138 +4,138 @@ import helpers from config import render, db =20 class Package(object): - def GET(self, *args): - try: - top =3D int(web.input(top=3D"5").top) - except ValueError: - top =3D 5 - l =3D len(args) - if l =3D=3D 0: - return self.__GET(top) - elif l =3D=3D 1: - return self.__GET_C(top, args[0]) - elif l =3D=3D 2: - cpv =3D helpers.pkgsplit(args[0] + '/' + args[1]) - if cpv['ver'] =3D=3D '': - return self.__GET_CP(top, cpv['cat'], cpv['pkg']) - else: - return self.__GET_CPV(cpv['cat'], cpv['pkg'], cpv['ver']) - else: - return config.internalerror() + def GET(self, *args): + try: + top =3D int(web.input(top=3D"5").top) + except ValueError: + top =3D 5 + l =3D len(args) + if l =3D=3D 0: + return self.__GET(top) + elif l =3D=3D 1: + return self.__GET_C(top, args[0]) + elif l =3D=3D 2: + cpv =3D helpers.pkgsplit(args[0] + '/' + args[1]) + if cpv['ver'] =3D=3D '': + return self.__GET_CP(top, cpv['cat'], cpv['pkg']) + else: + return self.__GET_CPV(cpv['cat'], cpv['pkg'], cpv['ver']= ) + else: + return config.internalerror() =20 - def __GET(self, top): - p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,\ - COUNT(DISTINCT CAT) AS C_COUNT,\ - COUNT(DISTINCT CAT,PKG) AS CP_COUNT,\ - COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY') - p_tuple =3D p_query[0] - p_data =3D { - 'HOST_COUNT':p_tuple['HOST_COUNT'], - 'C_COUNT':p_tuple['C_COUNT'], - 'CP_COUNT':p_tuple['CP_COUNT'], - 'CPV_COUNT':p_tuple['CPV_COUNT'], - 'TOP_C':self.__top(top) - } - return render.package(p_data) + def __GET(self, top): + p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,= \ + COUNT(DISTINCT CAT) AS C_COUNT,\ + COUNT(DISTINCT CAT,PKG) AS CP_COUNT,\ + COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY') + p_tuple =3D p_query[0] + p_data =3D { + 'HOST_COUNT':p_tuple['HOST_COUNT'], + 'C_COUNT':p_tuple['C_COUNT'], + 'CP_COUNT':p_tuple['CP_COUNT'], + 'CPV_COUNT':p_tuple['CPV_COUNT'], + 'TOP_C':self.__top(top) + } + return render.package(p_data) =20 - def __GET_C(self, top, cat): - p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,\ - COUNT(DISTINCT CAT,PKG) AS CP_COUNT,\ - COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - WHERE CAT=3D$cat', vars=3D{'cat':cat}) - p_tuple =3D p_query[0] - p_data =3D { - 'HOST_COUNT':p_tuple['HOST_COUNT'], - 'CP_COUNT':p_tuple['CP_COUNT'], - 'CPV_COUNT':p_tuple['CPV_COUNT'], - 'TOP_CP':self.__top(top, cat) - } - return render.package_c(cat, p_data) + def __GET_C(self, top, cat): + p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,= \ + COUNT(DISTINCT CAT,PKG) AS CP_COUNT,\ + COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + WHERE CAT=3D$cat', vars=3D{'cat':cat}) + p_tuple =3D p_query[0] + p_data =3D { + 'HOST_COUNT':p_tuple['HOST_COUNT'], + 'CP_COUNT':p_tuple['CP_COUNT'], + 'CPV_COUNT':p_tuple['CPV_COUNT'], + 'TOP_CP':self.__top(top, cat) + } + return render.package_c(cat, p_data) =20 - def __GET_CP(self, top, cat, pkg): - p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,\ - COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - WHERE CAT=3D$cat AND PKG=3D$pkg', vars=3D{'cat':cat,'pkg':pkg}) - p_tuple =3D p_query[0] - p_data =3D { - 'HOST_COUNT':p_tuple['HOST_COUNT'], - 'CPV_COUNT':p_tuple['CPV_COUNT'], - 'TOP_CPV':self.__top(top, cat, pkg) - } - return render.package_cp(cat, pkg, p_data) + def __GET_CP(self, top, cat, pkg): + p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT,= \ + COUNT(DISTINCT CAT,PKG,VER) AS CPV_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + WHERE CAT=3D$cat AND PKG=3D$pkg', vars=3D{'cat':cat,'pkg= ':pkg}) + p_tuple =3D p_query[0] + p_data =3D { + 'HOST_COUNT':p_tuple['HOST_COUNT'], + 'CPV_COUNT':p_tuple['CPV_COUNT'], + 'TOP_CPV':self.__top(top, cat, pkg) + } + return render.package_cp(cat, pkg, p_data) =20 - def __GET_CPV(self, cat, pkg, ver): - p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - WHERE CAT=3D$cat AND PKG=3D$pkg AND VER=3D$ver', vars=3D{'cat':cat,'pk= g':pkg,'ver':ver}) - p_tuple =3D p_query[0] - p_data =3D { - 'HOST_COUNT':p_tuple['HOST_COUNT'], - } - return render.package_cpv(cat, pkg, ver, p_data) + def __GET_CPV(self, cat, pkg, ver): + p_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS HOST_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + WHERE CAT=3D$cat AND PKG=3D$pkg AND VER=3D$ver', vars=3D= {'cat':cat,'pkg':pkg,'ver':ver}) + p_tuple =3D p_query[0] + p_data =3D { + 'HOST_COUNT':p_tuple['HOST_COUNT'], + } + return render.package_cpv(cat, pkg, ver, p_data) =20 - def __top(self, count, *args): - t_list =3D list() - if len(args) =3D=3D 0: - tc_query =3D db.query('SELECT CAT,COUNT(DISTINCT UUID) AS HOST_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - GROUP BY CAT\ - ORDER BY HOST_COUNT DESC,CAT') - for idx in range(0,count): - try: - tc_tuple =3D tc_query[idx] - t_list.append({ - 'CAT':tc_tuple['CAT'], - 'HOST_COUNT':tc_tuple['HOST_COUNT'] - }) - except IndexError: - break + def __top(self, count, *args): + t_list =3D list() + if len(args) =3D=3D 0: + tc_query =3D db.query('SELECT CAT,COUNT(DISTINCT UUID) AS HO= ST_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + GROUP BY CAT\ + ORDER BY HOST_COUNT DESC,CAT') + for idx in range(0,count): + try: + tc_tuple =3D tc_query[idx] + t_list.append({ + 'CAT':tc_tuple['CAT'], + 'HOST_COUNT':tc_tuple['HOST_COUNT'] + }) + except IndexError: + break =20 - elif len(args) =3D=3D 1: - tcp_query =3D db.query('SELECT CAT,PKG,COUNT(DISTINCT UUID) AS HOST_C= OUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - WHERE CAT=3D$cat\ - GROUP BY CAT,PKG\ - ORDER BY HOST_COUNT DESC,CAT,PKG', - vars=3D{'cat':args[0]}) - for idx in range(0,count): - try: - tcp_tuple =3D tcp_query[idx] - t_list.append({ - 'CAT':tcp_tuple['CAT'], - 'PKG':tcp_tuple['PKG'], - 'HOST_COUNT':tcp_tuple['HOST_COUNT'] - }) - except IndexError: - break + elif len(args) =3D=3D 1: + tcp_query =3D db.query('SELECT CAT,PKG,COUNT(DISTINCT UUID) = AS HOST_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + WHERE CAT=3D$cat\ + GROUP BY CAT,PKG\ + ORDER BY HOST_COUNT DESC,CAT,PKG', + vars=3D{'cat':args[0]}) + for idx in range(0,count): + try: + tcp_tuple =3D tcp_query[idx] + t_list.append({ + 'CAT':tcp_tuple['CAT'], + 'PKG':tcp_tuple['PKG'], + 'HOST_COUNT':tcp_tuple['HOST_COUNT'] + }) + except IndexError: + break =20 - elif len(args) =3D=3D 2: - tcpv_query =3D db.query('SELECT CAT,PKG,VER,COUNT(DISTINCT UUID) AS= HOST_COUNT\ - FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ - ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ - WHERE CAT=3D$cat AND PKG=3D$pkg\ - GROUP BY CAT,PKG,VER\ - ORDER BY HOST_COUNT DESC,CAT,PKG,VER', - vars=3D{'cat':args[0],'pkg':args[1]}) - for idx in range(0,count): - try: - tcpv_tuple =3D tcpv_query[idx] - t_list.append({ - 'CAT':tcpv_tuple['CAT'], - 'PKG':tcpv_tuple['PKG'], - 'VER':tcpv_tuple['VER'], - 'HOST_COUNT':tcpv_tuple['HOST_COUNT'] - }) - except IndexError: - break + elif len(args) =3D=3D 2: + tcpv_query =3D db.query('SELECT CAT,PKG,VER,COUNT(DISTINCT U= UID) AS HOST_COUNT\ + FROM INSTALLED_PACKAGES RIGHT OUTER JOIN PACKAGES\ + ON INSTALLED_PACKAGES.PKEY =3D PACKAGES.PKEY\ + WHERE CAT=3D$cat AND PKG=3D$pkg\ + GROUP BY CAT,PKG,VER\ + ORDER BY HOST_COUNT DESC,CAT,PKG,VER', + vars=3D{'cat':args[0],'pkg':args[1]}) + for idx in range(0,count): + try: + tcpv_tuple =3D tcpv_query[idx] + t_list.append({ + 'CAT':tcpv_tuple['CAT'], + 'PKG':tcpv_tuple['PKG'], + 'VER':tcpv_tuple['VER'], + 'HOST_COUNT':tcpv_tuple['HOST_COUNT'] + }) + except IndexError: + break =20 - return t_list + return t_list diff --git a/server/profile.py b/server/profile.py index 211963c..c0a0fc5 100644 --- a/server/profile.py +++ b/server/profile.py @@ -2,9 +2,9 @@ from config import render, db =20 class Profile(object): - def GET(self): - profile_count =3D db.select('ENV', what=3D'PROFILE, COUNT(UUID) AS HOST= S', group=3D'PROFILE') - profile_data =3D dict() - for t in profile_count: - profile_data[t['PROFILE']] =3D {'HOSTS':t['HOSTS']} - return render.profile(profile_data) + def GET(self): + profile_count =3D db.select('ENV', what=3D'PROFILE, COUNT(UUID) = AS HOSTS', group=3D'PROFILE') + profile_data =3D dict() + for t in profile_count: + profile_data[t['PROFILE']] =3D {'HOSTS':t['HOSTS']} + return render.profile(profile_data) diff --git a/server/repo.py b/server/repo.py index 4348248..5db221a 100644 --- a/server/repo.py +++ b/server/repo.py @@ -2,9 +2,9 @@ from config import render, db =20 class Repo(object): - def GET(self): - repo_count =3D db.query('select REPO,COUNT(DISTINCT IPKEY) AS PACKAGES,= COUNT(DISTINCT UUID) AS HOSTS from INSTALLED_PACKAGES natural join REPOSI= TORIES group by REPO') - repo_data =3D dict() - for t in repo_count: - repo_data[t['REPO']] =3D {'HOSTS':t['HOSTS'], 'PACKAGES':t['PACKAGES'= ]} - return render.repo(repo_data) + def GET(self): + repo_count =3D db.query('select REPO,COUNT(DISTINCT IPKEY) AS PA= CKAGES,COUNT(DISTINCT UUID) AS HOSTS from INSTALLED_PACKAGES natural join= REPOSITORIES group by REPO') + repo_data =3D dict() + for t in repo_count: + repo_data[t['REPO']] =3D {'HOSTS':t['HOSTS'], 'PACKAGES':t['= PACKAGES']} + return render.repo(repo_data) diff --git a/server/runtests.py b/server/runtests.py index 8c0cbb0..51d0208 100755 --- a/server/runtests.py +++ b/server/runtests.py @@ -8,6 +8,6 @@ from tests.test_host import TestHost testCases =3D [TestIndex, TestHost] =20 if __name__ =3D=3D '__main__': - suites =3D [ unittest.TestLoader().loadTestsFromTestCase(testCase) for= testCase in testCases] - for suite in suites: - unittest.TextTestRunner(verbosity=3D2).run(suite) + suites =3D [ unittest.TestLoader().loadTestsFromTestCase(testCase) f= or testCase in testCases] + for suite in suites: + unittest.TextTestRunner(verbosity=3D2).run(suite) diff --git a/server/templates/arch.html b/server/templates/arch.html index 535399c..04ddcf6 100644 --- a/server/templates/arch.html +++ b/server/templates/arch.html @@ -2,10 +2,10 @@ $def with (arch_data) $var title: Arch =20 - - - - - $for arch in arch_data.keys(): - + + + + + $for arch in arch_data.keys(): +
ArchHosts
$arch$arch_data[arch]['HOSTS']
ArchHosts
$arch$arch_data[arch]['HOSTS']
diff --git a/server/templates/error_404.html b/server/templates/error_404= .html index d310a86..1d701eb 100644 --- a/server/templates/error_404.html +++ b/server/templates/error_404.html @@ -3,4 +3,3 @@ $var title: Page not found

The requested page was not found.

=20

Developer note: Because Google and Microsoft think i= ts OK to violate web standards for their own benefit, you must ensure tha= t your error pages are larger than 512 bytes if you wish them to be displ= ayed instead of the "friendly" error pages the browsers show. Which is wh= y this message is here. To make the page longer. Bah.

- diff --git a/server/templates/feature.html b/server/templates/feature.htm= l index 03c4bbd..e4529ae 100644 --- a/server/templates/feature.html +++ b/server/templates/feature.html @@ -2,10 +2,10 @@ $def with (feature_data) $var title: Feature =20 - - - - - $for feature in feature_data.keys(): - + + + + + $for feature in feature_data.keys(): +
FeatureHosts
$feature$feature_data[feature]['HOSTS']
FeatureHosts
$feature$feature_data[feature]['HOSTS']
diff --git a/server/templates/host.html b/server/templates/host.html index 04b1bff..b252bff 100644 --- a/server/templates/host.html +++ b/server/templates/host.html @@ -17,40 +17,40 @@ Stats for host $data['UUID'] :

  • FEATURES :
      $for f in data['FEATURES']: -
    • $f
    • +
    • $f
  • ACCEPT_KEYWORDS :
      $for k in data['ACCEPT_KEYWORDS']: -
    • $k
    • +
    • $k
  • USE :
      $for u in data['USE']: -
    • $u
    • +
    • $u
  • LANG :
      $for l in data['LANG']: -
    • $l
    • +
    • $l
  • GENTOO_MIRRORS :
      $for m in data['GENTOO_MIRRORS']: -
    • $m
    • +
    • $m
  • Installed packages :
      $code: - packages =3D data['PACKAGES'].keys() - packages.sort() + packages =3D data['PACKAGES'].keys() + packages.sort() $for p in packages: -
    • $p
    • +
    • $p
  • diff --git a/server/templates/keyword.html b/server/templates/keyword.htm= l index 4855040..2dee5ea 100644 --- a/server/templates/keyword.html +++ b/server/templates/keyword.html @@ -2,11 +2,11 @@ $def with (keyword_data) $var title: Keyword =20 - - - - - - $for keyword in keyword_data.keys(): - + + + + + + $for keyword in keyword_data.keys(): + $keyword_data[keyword]['PACKAGES']
    KeywordHostsPackages
    $keyword$keyword_data[keyword]['HOSTS']$ke= yword_data[keyword]['PACKAGES']
    KeywordHostsPackages
    $keyword$keyword_data[keyword]['HOSTS']
    diff --git a/server/templates/lang.html b/server/templates/lang.html index cfda84a..bd4b2ba 100644 --- a/server/templates/lang.html +++ b/server/templates/lang.html @@ -2,10 +2,10 @@ $def with (lang_data) $var title: Lang =20 - - - - - $for lang in lang_data.keys(): - + + + + + $for lang in lang_data.keys(): +
    LangHosts
    $lang$lang_data[lang]['HOSTS']
    LangHosts
    $lang$lang_data[lang]['HOSTS']
    diff --git a/server/templates/layout.html b/server/templates/layout.html index 48140d6..b144b29 100644 --- a/server/templates/layout.html +++ b/server/templates/layout.html @@ -9,4 +9,3 @@ $def with (content) $:content - diff --git a/server/templates/mirror.html b/server/templates/mirror.html index a6189bc..311f8fa 100644 --- a/server/templates/mirror.html +++ b/server/templates/mirror.html @@ -2,10 +2,10 @@ $def with (mirror_data) $var title: Mirror =20 - - - - - $for mirror in mirror_data.keys(): - + + + + + $for mirror in mirror_data.keys(): +
    MirrorHosts
    $mirror$mirror_data[mirror]['HOSTS']
    MirrorHosts
    $mirror$mirror_data[mirror]['HOSTS']
    diff --git a/server/templates/package.html b/server/templates/package.htm= l index f1a4e5c..6b1f7da 100644 --- a/server/templates/package.html +++ b/server/templates/package.html @@ -7,10 +7,10 @@ No. of category-packages: $pdata['CP_COUNT']
    No. of category-package-versions: $pdata['CPV_COUNT']
    Top Categories:
    - - - - - $for p in pdata['TOP_C']: - + + + + + $for p in pdata['TOP_C']: +
    CategoryHosts
    $p['CAT']$p['HOST_COUNT']
    CategoryHosts
    $p['CAT']$p['HOST_COUNT']
    diff --git a/server/templates/package_c.html b/server/templates/package_c= .html index 8247173..4971ca7 100644 --- a/server/templates/package_c.html +++ b/server/templates/package_c.html @@ -6,11 +6,11 @@ No. of category-packages: $pdata['CP_COUNT']
    No. of category-package-versions: $pdata['CPV_COUNT']
    Top CPs:
    - - - - - - $for p in pdata['TOP_CP']: - + + + + + + $for p in pdata['TOP_CP']: +
    CategoryPackageHosts
    $p['CAT']$p['PKG']$p['HOST_COUNT']
    CategoryPackageHosts
    $p['CAT']$p['PKG']$p['HOST_COUNT']
    diff --git a/server/templates/package_cp.html b/server/templates/package_= cp.html index 30fdb25..ac39835 100644 --- a/server/templates/package_cp.html +++ b/server/templates/package_cp.html @@ -5,12 +5,12 @@ No. of hosts: $pdata['HOST_COUNT']
    No. of category-package-versions: $pdata['CPV_COUNT']
    Top CPVs:
    - - - - - - - $for p in pdata['TOP_CPV']: - + + + + + + + $for p in pdata['TOP_CPV']: +
    CategoryPackageVersionHosts
    $p['CAT']$p['PKG']$p['VER']$p['HO= ST_COUNT']
    CategoryPackageVersionHosts
    $p['CAT']$p['PKG']$p['VER']$p= ['HOST_COUNT']
    diff --git a/server/templates/profile.html b/server/templates/profile.htm= l index 702b03b..b6feb4d 100644 --- a/server/templates/profile.html +++ b/server/templates/profile.html @@ -2,10 +2,10 @@ $def with (profile_data) $var title: Profile =20 - - - - $for profile in profile_data.keys(): - + + + + $for profile in profile_data.keys(): +
    Profile/th> - Hosts
    $profile$profile_data[profile]['HOSTS']
    Profile/th> + Hosts
    $profile$profile_data[profile]['HOSTS']
    diff --git a/server/templates/repo.html b/server/templates/repo.html index 63371bb..98d94f6 100644 --- a/server/templates/repo.html +++ b/server/templates/repo.html @@ -2,11 +2,11 @@ $def with (repo_data) $var title: Repository =20 - - - - - - $for repo in repo_data.keys(): - + + + + + + $for repo in repo_data.keys(): +
    RepositoryHostsPackages
    $repo$repo_data[repo]['HOSTS']$repo_data[r= epo]['PACKAGES']
    RepositoryHostsPackages
    $repo$repo_data[repo]['HOSTS']$repo_da= ta[repo]['PACKAGES']
    diff --git a/server/tests/test_host.py b/server/tests/test_host.py index 68a6732..a5e723b 100644 --- a/server/tests/test_host.py +++ b/server/tests/test_host.py @@ -6,76 +6,76 @@ from app import app =20 class TestHost(unittest.TestCase): =20 - def setUp(self): - self.b =3D app.browser() + def setUp(self): + self.b =3D app.browser() =20 - def test_basic(self): - self.b.open('/host') - self.assertEqual(self.b.path, '/host') - self.assertEqual(self.b.status, 404) - =20 - def test_get(self): - uri =3D '/host/' + str(uuid.uuid4()) - self.b.open(uri) - self.assertEqual(self.b.path, uri) + def test_basic(self): + self.b.open('/host') + self.assertEqual(self.b.path, '/host') + self.assertEqual(self.b.status, 404) =20 - # This has a probability of failing of - # 1 - exp(-((n+1)**2)/2**123) - # where n is the no. of uuids already in the db - self.assertEqual(self.b.status, 404) + def test_get(self): + uri =3D '/host/' + str(uuid.uuid4()) + self.b.open(uri) + self.assertEqual(self.b.path, uri) =20 - def test_post_empty(self): - str_uuid =3D str(uuid.uuid4()) - uri =3D '/host/' + str_uuid - # post with empty string - self.b.open(uri, '') - self.assertEqual(self.b.path, uri) - self.assertEqual(self.b.status, 500) - # post with empty json string - data =3D json.JSONEncoder().encode('') - self.b.open(uri, data) - self.assertEqual(self.b.path, uri) - self.assertEqual(self.b.status, 500) - # post with empty payload - payload =3D { - 'AUTH':{'UUID':str_uuid,'PASSWD':'test'}, - 'PROTOCOL':1 - } - data =3D json.JSONEncoder().encode(payload) - self.b.open(uri, data) - self.assertEqual(self.b.path, uri) - self.assertEqual(self.b.status, 500) - =20 - def test_post_bad(self): - str_uuid =3D str(uuid.uuid4()) - uri =3D '/host/' + str_uuid - # different uuid in payload - payload =3D { - 'AUTH':{'UUID':str(uuid.uuid4()),'PASSWD':'test'}, - 'PROTOCOL':1 - } - data =3D json.JSONEncoder().encode(payload) - self.b.open(uri,data) - self.assertEqual(self.b.path, uri) - self.assertEqual(self.b.status, 200) - self.assertTrue('Invalid uuid' in self.b.data) + # This has a probability of failing of + # 1 - exp(-((n+1)**2)/2**123) + # where n is the no. of uuids already in the db + self.assertEqual(self.b.status, 404) =20 - def test_post_get(self): - str_uuid =3D str(uuid.uuid4()) - uri =3D '/host/' + str_uuid - payload =3D { - 'AUTH':{'UUID':str_uuid,'PASSWD':'test'}, - 'PROTOCOL':1 - } - for var in ['PLATFORM','PROFILE','LASTSYNC']: - payload[var] =3D 'Unknown' - for var in ['ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS','MAKE= OPTS','SYNC']: - payload[var] =3D None - for var in ['ACCEPT_KEYWORDS','LANG','GENTOO_MIRRORS','FEATURES','USE']= : - payload[var] =3D [] - payload['PACKAGES'] =3D {} - data =3D json.JSONEncoder().encode(payload) - self.b.open(uri,data) - self.assertEqual(self.b.path, uri) - self.assertEqual(self.b.status, 200) - self.assertTrue('POST for ' + str_uuid + ' successful' in self.b.data) + def test_post_empty(self): + str_uuid =3D str(uuid.uuid4()) + uri =3D '/host/' + str_uuid + # post with empty string + self.b.open(uri, '') + self.assertEqual(self.b.path, uri) + self.assertEqual(self.b.status, 500) + # post with empty json string + data =3D json.JSONEncoder().encode('') + self.b.open(uri, data) + self.assertEqual(self.b.path, uri) + self.assertEqual(self.b.status, 500) + # post with empty payload + payload =3D { + 'AUTH':{'UUID':str_uuid,'PASSWD':'test'}, + 'PROTOCOL':1 + } + data =3D json.JSONEncoder().encode(payload) + self.b.open(uri, data) + self.assertEqual(self.b.path, uri) + self.assertEqual(self.b.status, 500) + + def test_post_bad(self): + str_uuid =3D str(uuid.uuid4()) + uri =3D '/host/' + str_uuid + # different uuid in payload + payload =3D { + 'AUTH':{'UUID':str(uuid.uuid4()),'PASSWD':'test'}, + 'PROTOCOL':1 + } + data =3D json.JSONEncoder().encode(payload) + self.b.open(uri,data) + self.assertEqual(self.b.path, uri) + self.assertEqual(self.b.status, 200) + self.assertTrue('Invalid uuid' in self.b.data) + + def test_post_get(self): + str_uuid =3D str(uuid.uuid4()) + uri =3D '/host/' + str_uuid + payload =3D { + 'AUTH':{'UUID':str_uuid,'PASSWD':'test'}, + 'PROTOCOL':1 + } + for var in ['PLATFORM','PROFILE','LASTSYNC']: + payload[var] =3D 'Unknown' + for var in ['ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS= ','MAKEOPTS','SYNC']: + payload[var] =3D None + for var in ['ACCEPT_KEYWORDS','LANG','GENTOO_MIRRORS','FEATURES'= ,'USE']: + payload[var] =3D [] + payload['PACKAGES'] =3D {} + data =3D json.JSONEncoder().encode(payload) + self.b.open(uri,data) + self.assertEqual(self.b.path, uri) + self.assertEqual(self.b.status, 200) + self.assertTrue('POST for ' + str_uuid + ' successful' in self.b= .data) diff --git a/server/tests/test_index.py b/server/tests/test_index.py index 45de92b..2796c1d 100644 --- a/server/tests/test_index.py +++ b/server/tests/test_index.py @@ -4,23 +4,23 @@ from app import app =20 class TestIndex(unittest.TestCase): =20 - def setUp(self): - self.b =3D app.browser() - self.b.open('/') + def setUp(self): + self.b =3D app.browser() + self.b.open('/') =20 - def test_basic(self): - self.assertEqual(self.b.path, '/') - self.assertEqual(self.b.status, 200) + def test_basic(self): + self.assertEqual(self.b.path, '/') + self.assertEqual(self.b.status, 200) =20 - def test_content(self): - self.assertTrue('Welcome to the gentoostats webapp' in self.b.data) + def test_content(self): + self.assertTrue('Welcome to the gentoostats webapp' in self.b.da= ta) =20 - def test_hosts(self): - self.assertTrue('Number of hosts' in self.b.data) - lines =3D self.b.data.split('\n') - for line in lines: - if line.startswith('Number of hosts'): - words =3D line.split() - count =3D int(words[-1].strip('
    ')) - self.assertGreaterEqual(count,0) - break + def test_hosts(self): + self.assertTrue('Number of hosts' in self.b.data) + lines =3D self.b.data.split('\n') + for line in lines: + if line.startswith('Number of hosts'): + words =3D line.split() + count =3D int(words[-1].strip('
    ')) + self.assertGreaterEqual(count,0) + break diff --git a/server/use.py b/server/use.py index 5b7a54d..13068ec 100644 --- a/server/use.py +++ b/server/use.py @@ -2,45 +2,45 @@ from config import render, db =20 class Use(object): - def GET(self, *args): - l =3D len(args) - if l =3D=3D 0: - use_query =3D db.query('SELECT COUNT(DISTINCT UKEY) AS USE_COUNT FROM= USEFLAGS') - use_tuple =3D use_query[0] - use_data =3D {'USE_COUNT':use_tuple['USE_COUNT']} - return render.use(use_data) + def GET(self, *args): + l =3D len(args) + if l =3D=3D 0: + use_query =3D db.query('SELECT COUNT(DISTINCT UKEY) AS USE_C= OUNT FROM USEFLAGS') + use_tuple =3D use_query[0] + use_data =3D {'USE_COUNT':use_tuple['USE_COUNT']} + return render.use(use_data) =20 - elif l =3D=3D 1: - global_use_query =3D db.query('SELECT COUNT(DISTINCT UUID) AS GLOBAL_= COUNT\ - FROM GLOBAL_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ - ON GLOBAL_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ - WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]}) - plus_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) AS PLUS_COU= NT\ - FROM PLUS_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ - ON PLUS_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ - WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]}) - minus_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) AS MINUS_C= OUNT\ - FROM MINUS_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ - ON MINUS_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ - WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]}) - unset_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) AS UNSET_C= OUNT\ - FROM UNSET_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ - ON UNSET_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ - WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]}) - =20 - global_use_tuple =3D global_use_query[0] - plus_use_tuple =3D plus_use_query[0] - minus_use_tuple =3D minus_use_query[0] - unset_use_tuple =3D unset_use_query[0] + elif l =3D=3D 1: + global_use_query =3D db.query('SELECT COUNT(DISTINCT UUID) A= S GLOBAL_COUNT\ + FROM GLOBAL_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ + ON GLOBAL_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ + WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]= }) + plus_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) AS= PLUS_COUNT\ + FROM PLUS_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ + ON PLUS_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ + WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]= }) + minus_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) A= S MINUS_COUNT\ + FROM MINUS_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ + ON MINUS_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ + WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]= }) + unset_use_query =3D db.query('SELECT COUNT(DISTINCT IPKEY) A= S UNSET_COUNT\ + FROM UNSET_USEFLAGS RIGHT OUTER JOIN USEFLAGS\ + ON UNSET_USEFLAGS.UKEY =3D USEFLAGS.UKEY\ + WHERE USEFLAG=3D$useflag', vars=3D{'useflag':args[0]= }) =20 - use_data =3D { - 'GLOBAL_COUNT':global_use_tuple['GLOBAL_COUNT'], - 'PLUS_COUNT':plus_use_tuple['PLUS_COUNT'], - 'MINUS_COUNT':minus_use_tuple['MINUS_COUNT'], - 'UNSET_COUNT':unset_use_tuple['UNSET_COUNT'] - } + global_use_tuple =3D global_use_query[0] + plus_use_tuple =3D plus_use_query[0] + minus_use_tuple =3D minus_use_query[0] + unset_use_tuple =3D unset_use_query[0] =20 - return render.use_useflag(args[0], use_data) + use_data =3D { + 'GLOBAL_COUNT':global_use_tuple['GLOBAL_COUNT'], + 'PLUS_COUNT':plus_use_tuple['PLUS_COUNT'], + 'MINUS_COUNT':minus_use_tuple['MINUS_COUNT'], + 'UNSET_COUNT':unset_use_tuple['UNSET_COUNT'] + } =20 - else: - return config.internalerror() + return render.use_useflag(args[0], use_data) + + else: + return config.internalerror()