public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Vikraman Choudhury" <vikraman.choudhury@gmail.com>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/gentoostats:master commit in: server/, server/templates/
Date: Tue, 14 Jun 2011 17:43:54 +0000 (UTC)	[thread overview]
Message-ID: <f54a02be8f73be30e0607c8ca5c887a12f426c53.vikraman@gentoo> (raw)

commit:     f54a02be8f73be30e0607c8ca5c887a12f426c53
Author:     Vikraman Choudhury <vikraman.choudhury <AT> gmail <DOT> com>
AuthorDate: Tue Jun 14 17:43:08 2011 +0000
Commit:     Vikraman Choudhury <vikraman.choudhury <AT> gmail <DOT> com>
CommitDate: Tue Jun 14 17:43:08 2011 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/gentoostats.git;a=commit;h=f54a02be

updated server code, added host page

---
 server/config.py            |   14 ++++
 server/helpers.py           |   49 ++++++++-------
 server/host.py              |  138 +++++++++++++++++++++++++++++++++++++++++++
 server/index.py             |    8 +++
 server/main.py              |   44 ++------------
 server/post.py              |   81 -------------------------
 server/templates/host.html  |   56 +++++++++++++++++
 server/templates/index.html |    9 +--
 server/templates/stats.html |    9 ---
 9 files changed, 253 insertions(+), 155 deletions(-)

diff --git a/server/config.py b/server/config.py
index 5ef7087..f4e74cd 100644
--- a/server/config.py
+++ b/server/config.py
@@ -1,4 +1,18 @@
+
 import web
 
+db = web.database(
+	dbn='mysql',
+	user='gentoo',
+	pw='gentoo',
+	db='gentoostats'
+	)
+
 render = web.template.render('templates/', base='layout')
 
+def notfound():
+  return web.notfound(render.error_404())
+
+def internalerror():
+  return web.internalerror(render.error_500())
+

diff --git a/server/helpers.py b/server/helpers.py
index ad70e31..ebd53a3 100644
--- a/server/helpers.py
+++ b/server/helpers.py
@@ -2,6 +2,12 @@
 import uuid
 import re
 
+# check valid uuid
+
+def is_uuid(uuid):
+  regex = re.compile(r'^(\w{8})-(\w{4})-(\w{4})-(\w{4})-(\w{12})$')
+  return regex.search(uuid)
+
 # convert uuid string to raw bytes
 
 def uuidbin(string):
@@ -31,59 +37,58 @@ def pkgsplit(pkgname):
 # lookup key and insert if not found
 
 def get_kwkey(db, keyword):
-  db_keyword = db.select('keywords', vars={'keyword':keyword}, where='keyword=$keyword')
+  db_keyword = db.select('KEYWORDS', vars={'keyword':keyword}, where='KEYWORD=$keyword')
   if len(db_keyword):
-	kwkey = db_keyword[0].kwkey
+	kwkey = db_keyword[0]['KWKEY']
   else:
-	kwkey = db.insert('keywords', keyword=keyword)
+	kwkey = db.insert('KEYWORDS', KEYWORD=keyword)
   return kwkey
 
 def get_lkey(db, lang):
-  db_lang = db.select('lang', vars={'lang':lang}, where='lang=$lang')
+  db_lang = db.select('LANG', vars={'lang':lang}, where='LANG=$lang')
   if len(db_lang):
-	lkey = db_lang[0].lkey
+	lkey = db_lang[0]['LKEY']
   else:
-	lkey = db.insert('lang', lang=lang)
+	lkey = db.insert('LANG', LANG=lang)
   return lkey
 
 def get_fkey(db, feature):
-  db_feature = db.select('features', vars={'feature':feature}, where='feature=$feature')
+  db_feature = db.select('FEATURES', vars={'feature':feature}, where='FEATURE=$feature')
   if len(db_feature):
-	fkey = db_feature[0].fkey
+	fkey = db_feature[0]['FKEY']
   else:
-	fkey = db.insert('features', feature=feature)
+	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')
+  db_mirror = db.select('GENTOO_MIRRORS', vars={'mirror':mirror}, where='MIRROR=$mirror')
   if len(db_mirror):
-	mkey = db_mirror[0].mkey
+	mkey = db_mirror[0]['MKEY']
   else:
-	mkey = db.insert('gentoo_mirrors', mirror=mirror)
+	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')
+  db_useflag = db.select('USEFLAGS', vars={'useflag':useflag}, where='USEFLAG=$useflag')
   if len(db_useflag):
-	ukey = db_useflag[0].ukey
+	ukey = db_useflag[0]['UKEY']
   else:
-	ukey = db.insert('useflags', useflag=useflag)
+	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')
+  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
+	pkey = db_package[0]['PKEY']
   else:
-	pkey = db.insert('packages', cat=cpv['cat'], pkg=cpv['pkg'], ver=cpv['ver'])
+	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')
+  db_repo = db.select('REPOSITORIES', vars={'repo':repo}, where='REPO=$repo')
   if len(db_repo):
-	rkey = db_repo[0].rkey
+	rkey = db_repo[0]['RKEY']
   else:
-	rkey = db.insert('repositories', repo=repo)
+	rkey = db.insert('REPOSITORIES', REPO=repo)
   return rkey
-

diff --git a/server/host.py b/server/host.py
new file mode 100644
index 0000000..50df581
--- /dev/null
+++ b/server/host.py
@@ -0,0 +1,138 @@
+
+import web
+import json
+import helpers
+import config
+from config import render, db
+
+class Host(object):
+
+  def GET(self, str_uuid):
+	if not helpers.is_uuid(str_uuid):
+	  return config.notfound()
+
+	uuid = helpers.uuidbin(str_uuid)
+	hosts = db.select('HOSTS', vars={'uuid':uuid}, where='UUID=$uuid', what='UUID')
+	if len(hosts) == 0:
+	  return config.notfound()
+
+	get_data = dict()
+	get_data['UUID'] = str_uuid
+
+	env = db.select('ENV', vars={'uuid':uuid}, where="UUID=$uuid")
+	e = env[0]
+	for var in ['PLATFORM','LASTSYNC','PROFILE','ARCH','CHOST','CFLAGS','CXXFLAGS','FFLAGS','LDFLAGS','MAKEOPTS','SYNC']:
+	  get_data[var] = e[var]
+	
+	get_data['FEATURES'] = list()
+	features = db.query('SELECT FEATURE FROM HOST_FEATURES NATURAL JOIN FEATURES WHERE UUID=$uuid', vars={'uuid':uuid})
+	for f in features:
+	  get_data['FEATURES'].append(f['FEATURE'])
+
+	get_data['ACCEPT_KEYWORDS'] = list()
+	keywords = db.query('SELECT KEYWORD FROM GLOBAL_KEYWORDS NATURAL JOIN KEYWORDS WHERE UUID=$uuid', vars={'uuid':uuid})
+	for k in keywords:
+	  get_data['ACCEPT_KEYWORDS'].append(k['KEYWORD'])
+	
+	get_data['USE'] = list()
+	useflags = db.query('SELECT USEFLAG FROM GLOBAL_USEFLAGS NATURAL JOIN USEFLAGS WHERE UUID=$uuid', vars={'uuid':uuid})
+	for u in useflags:
+	  get_data['USE'].append(u['USEFLAG'])
+
+	get_data['LANG'] = list()
+	lang = db.query('SELECT LANG FROM HOST_LANG NATURAL JOIN LANG WHERE UUID=$uuid', vars={'uuid':uuid})
+	for l in lang:
+	  get_data['LANG'].append(l['LANG'])
+
+	get_data['GENTOO_MIRRORS'] = list()
+	mirrors = db.query('SELECT MIRROR FROM HOST_MIRRORS NATURAL JOIN GENTOO_MIRRORS WHERE UUID=$uuid', vars={'uuid':uuid})
+	for m in mirrors:
+	  get_data['GENTOO_MIRRORS'].append(m['MIRROR'])
+
+	get_data['PACKAGES'] = dict()
+	packages = db.query('SELECT CAT, PKG, VER FROM INSTALLED_PACKAGES NATURAL JOIN PACKAGES WHERE UUID=$uuid ORDER BY CAT, PKG, VER', vars={'uuid':uuid})
+	for p in packages:
+	  cpv = p['CAT'] + '/' + p['PKG'] + '-' + p['VER']
+	  get_data['PACKAGES'][cpv] = dict()
+
+	return render.host(get_data)
+
+  def POST(self, str_uuid):
+	post_data = json.JSONDecoder().decode(web.data())
+
+	#TODO: Handle exceptions
+	if post_data['PROTOCOL'] != 1:
+	  return 'Unsupported protocol!'
+
+	if post_data['AUTH']['UUID'] != str_uuid:
+	  return 'Invalid uuid!'
+
+	uuid = helpers.uuidbin(str_uuid)
+
+	# Insert in hosts
+	db_host = db.select('HOSTS', vars={'uuid':uuid}, where='UUID=$uuid')
+	if len(db_host):
+	  if post_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=post_data['AUTH']['PASSWD'])
+
+	# Insert in env
+	db.insert('ENV', UUID=uuid, ARCH=post_data['ARCH'], CHOST=post_data['CHOST'], CFLAGS=post_data['CFLAGS'],
+		CXXFLAGS=post_data['CXXFLAGS'], FFLAGS=post_data['FFLAGS'], LDFLAGS=post_data['LDFLAGS'],
+		MAKEOPTS=post_data['MAKEOPTS'], SYNC=post_data['SYNC'], PLATFORM=post_data['PLATFORM'],
+		PROFILE=post_data['PROFILE'], LASTSYNC=post_data['LASTSYNC'])
+
+	# Insert in GLOBAL_KEYWORDS
+	for keyword in post_data['ACCEPT_KEYWORDS']:
+	  kwkey = helpers.get_kwkey(db, keyword)
+	  db.insert('GLOBAL_KEYWORDS', UUID=uuid, KWKEY=kwkey)
+
+	# Insert in HOST_LANG
+	for lang in post_data['LANG']:
+	  lkey = helpers.get_lkey(db, lang)
+	  db.insert('HOST_LANG', UUID=uuid, LKEY=lkey)
+
+	# Insert in HOST_FEATURES
+	for feature in post_data['FEATURES']:
+	  fkey = helpers.get_fkey(db, feature)
+	  db.insert('HOST_FEATURES', UUID=uuid, FKEY=fkey)
+
+	# Insert in HOST_MIRRORS
+	for mirror in post_data['GENTOO_MIRRORS']:
+	  mkey = helpers.get_mkey(db, mirror)
+	  db.insert('HOST_MIRRORS', UUID=uuid, MKEY=mkey)
+
+	# Insert in GLOBAL_USEFLAGS
+	for useflag in post_data['USE']:
+	  ukey = helpers.get_ukey(db, useflag)
+	  db.insert('GLOBAL_USEFLAGS', UUID=uuid, UKEY=ukey)
+
+	# Handle PACKAGES
+	for package in post_data['PACKAGES'].keys():
+	  pkey = helpers.get_pkey(db, package)
+	  post_data_pkg = post_data['PACKAGES'][package]
+	  kwkey = helpers.get_kwkey(db, post_data_pkg['KEYWORD'])
+	  rkey  = helpers.get_rkey(db, post_data_pkg['REPO'])
+
+	  # Insert in INSTALLED_PACKAGES
+	  ipkey = db.insert('INSTALLED_PACKAGES', UUID=uuid, PKEY=pkey, BUILD_TIME=post_data_pkg['BUILD_TIME'],
+	  	  COUNTER=post_data_pkg['COUNTER'], KWKEY=kwkey, RKEY=rkey, SIZE=post_data_pkg['SIZE'])
+
+	  # Insert in PLUS_USEFLAGS
+	  for useflag in post_data_pkg['USE']['PLUS']:
+		ukey = helpers.get_ukey(db, useflag)
+		db.insert('PLUS_USEFLAGS', IPKEY=ipkey, UKEY=ukey)
+
+	  # Insert in MINUS_USEFLAGS
+	  for useflag in post_data_pkg['USE']['MINUS']:
+		ukey = helpers.get_ukey(db, useflag)
+		db.insert('MINUS_USEFLAGS', IPKEY=ipkey, UKEY=ukey)
+
+	  # Insert in UNSET_USEFLAGS
+	  for useflag in post_data_pkg['USE']['UNSET']:
+	  	ukey = helpers.get_ukey(db, useflag)
+		db.insert('UNSET_USEFLAGS', IPKEY=ipkey, UKEY=ukey)
+
+	return 'POST for ' + str_uuid + ' successful'

diff --git a/server/index.py b/server/index.py
new file mode 100644
index 0000000..038ae51
--- /dev/null
+++ b/server/index.py
@@ -0,0 +1,8 @@
+
+from config import render, db
+
+class Index(object):
+  def GET(self):
+  	hosts = db.select('hosts', what='count(uuid) as count')
+	count = hosts[0].count
+	return render.index(count)

diff --git a/server/main.py b/server/main.py
index 08b8509..9eb74fa 100755
--- a/server/main.py
+++ b/server/main.py
@@ -2,49 +2,19 @@
 
 import web
 import config
-import json
 from config import render
-from post import handler
+from index import Index
+from host import Host
 
 urls = (
-  r'/', 'index',
-  r'/(.+)', 'stats'
-)
-
-db = web.database(
-    dbn='mysql',
-    user='gentoo',
-    pw='gentoo',
-    db='gentoostats'
-    )
-
-class index:
-  def GET(self):
-    hosts = db.select('hosts')
-    return render.index(hosts)
-
-class stats:
-  def GET(self, uuid):
-    if uuid == 'favicon.ico':
-      return notfound()
-    hosts = db.select('hosts', vars={'uuid':uuid}, where="uuid=$uuid")
-    env = db.select('env', vars={'uuid':uuid}, where="uuid=$uuid")
-    return render.stats(uuid, hosts, env)
-
-  def POST(self, uuid):
-    post_data = json.JSONDecoder().decode(web.data())
-    return handler(uuid, post_data, db)
-
-def notfound():
-  return web.notfound(render.error_404())
-
-def internalerror():
-  return web.internalerror(render.error_500())
+	r'/', 'Index',
+	r'/host/(.+)', 'Host'
+	)
 
 app = web.application(urls, globals())
 
-app.notfound = notfound
-app.internalerror = internalerror
+app.notfound = config.notfound
+app.internalerror = config.internalerror
 
 if __name__ == "__main__":
   app.run()

diff --git a/server/post.py b/server/post.py
deleted file mode 100644
index b9f4deb..0000000
--- a/server/post.py
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/usr/bin/env python
-
-from helpers import *
-
-def handler(uuid_str, data, db):
-  #TODO: Handle exceptions
-  if data['PROTOCOL'] != 1:
-    return 'Unsupported protocol!'
-
-  if data['AUTH']['UUID'] != uuid_str:
-    return 'Invalid uuid!'
-
-  uuid = uuidbin(uuid_str)
-
-  # 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'])
-
-  # Insert in env
-  db.insert('env', uuid=uuid, arch=data['ARCH'], chost=data['CHOST'], cflags=data['CFLAGS'],
-	  cxxflags=data['CXXFLAGS'], fflags=data['FFLAGS'], ldflags=data['LDFLAGS'],
-	  makeopts=data['MAKEOPTS'], sync=data['SYNC'], platform=data['PLATFORM'],
-	  profile=data['PROFILE'], lastsync=data['LASTSYNC'])
-
-  # 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_str + ' successful'

diff --git a/server/templates/host.html b/server/templates/host.html
new file mode 100644
index 0000000..04b1bff
--- /dev/null
+++ b/server/templates/host.html
@@ -0,0 +1,56 @@
+$def with (data)
+$var title: Host
+
+Stats for host $data['UUID'] : <br/> <br/>
+<ul>
+<li>Platform : $data['PLATFORM']</li>
+<li>Profile : $data['PROFILE']</li>
+<li>Timestamp of tree : $data['LASTSYNC']</li>
+<li>ARCH : $data['ARCH']</li>
+<li>CHOST : $data['CHOST']</li>
+<li>CFLAGS : $data['CFLAGS']</li>
+<li>CXXFLAGS : $data['CXXFLAGS']</li>
+<li>FFLAGS : $data['FFLAGS']</li>
+<li>LDLAGS : $data['LDFLAGS']</li>
+<li>MAKEOPTS : $data['MAKEOPTS']</li>
+<li>SYNC : $data['SYNC']</li>
+<li>FEATURES :
+<ul>
+$for f in data['FEATURES']:
+  <li>$f</li>
+</ul>
+</li>
+<li>ACCEPT_KEYWORDS :
+<ul>
+$for k in data['ACCEPT_KEYWORDS']:
+  <li>$k</li>
+</ul>
+</li>
+<li>USE :
+<ul>
+$for u in data['USE']:
+  <li>$u</li>
+</ul>
+</li>
+<li>LANG :
+<ul>
+$for l in data['LANG']:
+  <li>$l</li>
+</ul>
+</li>
+<li>GENTOO_MIRRORS :
+<ul>
+$for m in data['GENTOO_MIRRORS']:
+  <li>$m</li>
+</ul>
+</li>
+<li>Installed packages :
+<ul>
+$code:
+  packages = data['PACKAGES'].keys()
+  packages.sort()
+$for p in packages:
+  <li>$p</li>
+</ul>
+</li>
+</ul>

diff --git a/server/templates/index.html b/server/templates/index.html
index 76c16e5..86960c0 100644
--- a/server/templates/index.html
+++ b/server/templates/index.html
@@ -1,9 +1,6 @@
-$def with (hosts)
+$def with (count)
 $var title: Gentoostats
 
 Welcome to the gentoostats webapp <br/>
-
-List of hosts: <br/>
-
-$for host in hosts:
-  <li><a href=$host.uuid>$host.uuid</li>
+<br/>
+Number of hosts: $count<br/>

diff --git a/server/templates/stats.html b/server/templates/stats.html
deleted file mode 100644
index 7081b02..0000000
--- a/server/templates/stats.html
+++ /dev/null
@@ -1,9 +0,0 @@
-$def with (uuid, hosts, env)
-$var title: Stats
-
-$if len(hosts):
-  Stats for host $uuid : <br/>
-  $for e in env:
-    <li>$e.var = "$e.value"</li>
-$else:
-  Host does not exist in records!



             reply	other threads:[~2011-06-14 17:44 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-06-14 17:43 Vikraman Choudhury [this message]
  -- strict thread matches above, loose matches on Subject: below --
2011-08-11 20:41 [gentoo-commits] proj/gentoostats:master commit in: server/, server/templates/ Vikraman Choudhury
2011-08-03 23:45 Vikraman Choudhury
2011-08-03 21:52 Vikraman Choudhury
2011-07-17 21:51 Vikraman Choudhury
2011-07-09 17:09 Vikraman Choudhury
2011-07-07 19:40 Vikraman Choudhury
2011-07-07 16:02 Vikraman Choudhury
2011-07-03 18:04 Vikraman Choudhury
2011-05-06 14:42 Vikraman Choudhury

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f54a02be8f73be30e0607c8ca5c887a12f426c53.vikraman@gentoo \
    --to=vikraman.choudhury@gmail.com \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox