From 3dddc535d57ba5e4e08378737499877e32891d4d Mon Sep 17 00:00:00 2001
From: enricobacis <enrico.bacis@gmail.com>
Date: Thu, 10 Sep 2015 01:16:55 +0200
Subject: [PATCH] Implement the __rolevars method

---
 doraemon.py | 35 ++++++++++++++++++-----------------
 1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/doraemon.py b/doraemon.py
index 70baccf..2ea53b4 100644
--- a/doraemon.py
+++ b/doraemon.py
@@ -5,6 +5,7 @@
 __author__ = 'BgLUG'
 __email__ = 'info@bglug.it'
 
+from collections import namedtuple
 from contextlib import contextmanager, closing
 from subprocess import Popen, PIPE
 from sqlite3 import connect
@@ -14,9 +15,13 @@ from ConfigParser import ConfigParser
 from Crypto.Hash import MD5
 from Crypto.Cipher import AES
 import base64
+import json
+import sys
 import re
 import os
-import sys
+
+# namedtuple used by Nethserver's Network Package Manager
+Package = namedtuple('Package', ['name', 'role', 'rule', 'description'])
 
 class MyApp:
   def __init__(self, configfile = '/etc/mac2hostname.ini'):
@@ -103,23 +108,19 @@ class MyApp:
       (role,) = cursor.execute("SELECT role FROM client WHERE hostname = '%s' AND mac = '%s'" % (hostname, macaddress)).fetchone()
     return role
 
-  # Mocks up variables to be returned.
-  # When will be ready Enrico's work on the interface, this should be simpler
-  # to implement.
+  # Parse a json pkg retrieved by Nethserver's Network Package Manager into a Package namedtuple
+  def parse_package(pkg):
+    return Package(pkg['name'], pkg['props']['Role'], pkg['props']['Rule'], pkg['props']['Description'])
+
+  # Variables returned to the client
   def __rolevars(self, role=None):
-    retval = {}
-    if role == 'client':
-      retval = {
-        'role': role,
-        'addpkg': [ 'gimp' ],
-        'delpkg': []
-      }
-    elif role == 'docenti':
-      retval = {
-        'role': role,
-        'addpkg': [],
-        'delpkg': []
-      }
+    retval = {'role': role, 'addpkg': [], 'delpkg': []}
+    try:
+      db = Popen(['db', 'packages', 'getjson'], stdout=PIPE).communicate()[0]
+      for pkg in map(parse_package, json.loads(db)):
+        if pkg.role == role:
+          result['addpkg' if pkg.rule == 'add' else 'delpkg'].append(str(pkg.name))
+    except: pass
     return retval
 
   # Instance methods AKA routes