You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@warble.apache.org by hu...@apache.org on 2018/06/29 20:44:23 UTC

[incubator-warble-server] 02/05: add task registry plugin for server

This is an automated email from the ASF dual-hosted git repository.

humbedooh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-warble-server.git

commit 59b6df2e8c47c1011052c6ec250b721583bfb533
Author: Daniel Gruno <hu...@apache.org>
AuthorDate: Fri Jun 29 15:43:02 2018 -0500

    add task registry plugin for server
---
 api/plugins/tasks.py | 241 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 241 insertions(+)

diff --git a/api/plugins/tasks.py b/api/plugins/tasks.py
new file mode 100644
index 0000000..52fbcd9
--- /dev/null
+++ b/api/plugins/tasks.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+########################################################################
+
+"""
+This is the node task registry class for Apache Warble
+"""
+
+import uuid
+import re
+import time
+import json
+
+""" Warble task class """
+class task(object):
+    
+    def __init__(self, session, taskid = None, taskrow = None):
+        """ Loads a task from the registry or inits a new one """
+        self._data = {}
+        self.session = session
+        self.conn = session.DB.sqlite.open('nodetasks.db')
+        
+        # task variables
+        self.id = None
+        self.type = None
+        self.category = 0
+        self.enabled = True
+        self.muted = False
+        self.payload = {}
+        self.name = None
+        
+        # Load a task by ID
+        if taskid:
+            doc = None
+            nc = self.conn.cursor()
+            # Load by Task ID?
+            if re.match(r"^[0-9]+$", str(taskid)):
+                self.id = int(taskid)
+                nc.execute("SELECT * FROM `tasks` WHERE `id` = ? LIMIT 1", (taskid,))
+                doc = nc.fetchone()
+                
+            if doc:
+                self.id = doc['id']
+                self.type = doc['type']
+                self.category = doc['category']
+                self.enabled = True if doc['enabled'] == 1 else False
+                self.muted = True if doc['muted'] == 1 else False
+                self.payload = json.loads(doc['payload'])
+                self.ipv6 = False # TODO!
+                self.name = doc['name']
+            else:
+                raise Exception("No such task found in registry")
+        
+        # Or load a task by data row?
+        elif taskrow:
+            doc = taskrow
+            self.id = doc['id']
+            self.type = doc['type']
+            self.category = doc['category']
+            self.enabled = True if doc['enabled'] == 1 else False
+            self.muted = True if doc['muted'] == 1 else False
+            self.payload = json.loads(doc['payload'])
+            self.ipv6 = False # TODO!
+            self.name = doc['name']
+        
+        
+    def save(self):
+        """ Saves or updates a task in the registry """
+        nc = self.conn.cursor()
+        # Save a new task?
+        if not self.id:
+            nc.execute("INSERT INTO `tasks` (`type`, `category`, `enabled`, `muted`, `payload`, `name`) VALUES (?, ?, ?, ?, ?, ?)",
+                    (self.type, self.category, 1 if self.enabled else 0, 1 if self.muted else 0, json.dumps(self.payload), self.name, )
+                )
+        # Update existing task?
+        else:
+            nc.execute("UPDATE `tasks` SET `type` = ?, `category` = ?, `enabled` = ?, `muted` = ?, `payload` = ?, `name` = ? WHERE `id` = ? LIMIT 1",
+                    (self.type, self.category, 1 if self.enabled else 0, 1 if self.muted else 0, json.dumps(self.payload), self.name, self.id, )
+                )
+        self.conn.commit()
+    
+    def remove(self):
+        """ Removes a task from the registry """
+        nc = self.conn.cursor()
+        if self.id:
+            nc.execute("DELETE FROM `tasks` WHERE `id` = ? LIMIT 1", (self.id, ))
+            self.conn.commit()
+            
+    def accesslevel(self, user):
+        """ Determines if a user can view/edit a task or not """
+        aclcon = session.DB.sqlite.open('nodeacl.db')
+        cur = aclcon.cursor()
+        cur.execute("SELECT * FROM `nodeacl` WHERE `catid` = ? AND `userid` = ? LIMIT 1", (self.category, user['userid'], ))
+        acl = cur.fetchone()
+        if acl:
+            return ['none', 'read', 'write', 'admin'][acl['access']]
+        else:
+            return 'none'
+        aclcon.close()
+        
+    def __del__(self):
+        # shut off sqlite connection
+        if self.conn:
+            self.conn.close()
+
+    def __enter__(self):
+        pass
+    def __exit__(self, exception_type, exception_value, traceback):
+        del self
+        
+        
+"""
+  id:           integer primary key   # ID of category
+    name:         text                  # Name of category
+    description:  text                  # Short description of category
+    settings:     text                  # Notification settings (JSON blob to allow for customizations)
+"""
+    
+""" Warble task category class """
+class category(object):
+    
+    def __init__(self, session, catid = None):
+        """ Loads a category from the registry or inits a new one """
+        self._data = {}
+        self.session = session
+        self.conn = session.DB.sqlite.open('nodecats.db')
+        
+        # category variables
+        self.id = None
+        self.name = None
+        self.description = None
+        self.settings = {}
+        self.tasks = []
+        
+        # Load existing category?
+        if catid:
+            doc = None
+            nc = self.conn.cursor()
+            # Load by Cat ID?
+            if re.match(r"^[0-9]+$", str(catid)):
+                self.id = int(catid)
+                nc.execute("SELECT * FROM `nodecats` WHERE `id` = ? LIMIT 1", (catid,))
+                doc = nc.fetchone()
+            if doc:
+                self.id = doc['id']
+                self.name = doc['name']
+                self.description = doc['description']
+                self.settings = json.loads(doc['settings'])
+                
+                # Load tasks in category
+                taskcon = session.DB.sqlite.open('nodetasks.db')
+                cur = taskcon.cursor()
+                cur.execute("SELECT * FROM `nodetasks` WHERE `category` = ?", (self.id, ))
+                for row in cur.fetchall():
+                    t = task(session, taskrow = row)
+                    self.tasks.append(t)
+                taskcon.close()
+            else:
+                raise Exception("No such category found in registry")
+        
+        
+    def save(self):
+        """ Saves or updates a category in the registry """
+        nc = self.conn.cursor()
+        # Save a new category?
+        if not self.id:
+            nc.execute("INSERT INTO `nodecats` (`name`, `description`, `settings`) VALUES (?, ?, ?)",
+                    (self.name, self.description, json.dumps(self.settings), )
+                )
+        # Update existing category?
+        else:
+            nc.execute("UPDATE `nodecats` SET `name` = ?, `description` = ?, `settings` = ? WHERE `id` = ? LIMIT 1",
+                    (self.name, self.description, json.dumps(self.settings), self.id, )
+                )
+        self.conn.commit()
+    
+    def remove(self):
+        """ Removes a category from the registry """
+        nc = self.conn.cursor()
+        if self.id:
+            nc.execute("DELETE FROM `nodecats` WHERE `id` = ? LIMIT 1", (self.id, ))
+            self.conn.commit()
+            
+    def accesslevel(self, user):
+        """ Determines if a user can view/edit a category or not """
+        aclcon = session.DB.sqlite.open('nodeacl.db')
+        cur = aclcon.cursor()
+        cur.execute("SELECT * FROM `nodeacl` WHERE `catid` = ? AND `userid` = ? LIMIT 1", (self.id, user['userid'], ))
+        acl = cur.fetchone()
+        if acl:
+            return ['none', 'read', 'write', 'admin'][acl['access']]
+        else:
+            return 'none'
+        aclcon.close()
+        
+    def __del__(self):
+        # shut off sqlite connection
+        if self.conn:
+            self.conn.close()
+
+    def __enter__(self):
+        pass
+    def __exit__(self, exception_type, exception_value, traceback):
+        del self
+    
+# Wrapper for getting all tasks:
+def all(session):
+    tlist = []
+    taskcon = session.DB.sqlite.open('nodetasks.db')
+    cur = taskcon.cursor()
+    cur.execute("SELECT * FROM `nodetasks` WHERE 1")
+    for row in cur.fetchall():
+        t = task(session, taskrow = row)
+        tlist.append(t)
+    taskcon.close()
+    return tlist
+
+# Wrapper for getting ACL for a user
+def cataccess(session):
+    aclcon = session.DB.sqlite.open('nodeacl.db')
+    cur = aclcon.cursor()
+    cur.execute("SELECT * FROM `nodeacl` WHERE `userid` = ? LIMIT 1", (session.user['userid'], ))
+    acl = {}
+    for row in cur.fetchall():
+        acl[row['catid']] = ['none', 'read', 'write', 'admin'][row['access']]
+    aclcon.close()
+    return acl


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@warble.apache.org
For additional commands, e-mail: commits-help@warble.apache.org