blob: 52fbcd955f57b073a2d33dab55e556095b84e893 [file] [log] [blame]
#!/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