forked from alertmanager/alert_manager
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuser_settings.py
More file actions
149 lines (102 loc) · 5.16 KB
/
user_settings.py
File metadata and controls
149 lines (102 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import logging
import os
import sys
import json
import shutil
import cherrypy
import re
import time
import datetime
import urllib
#from splunk import AuthorizationFailed as AuthorizationFailed
import splunk.appserver.mrsparkle.controllers as controllers
import splunk.appserver.mrsparkle.lib.util as util
import splunk.bundle as bundle
import splunk.entity as entity
from splunk.entity import Entity
from splunk.appserver.mrsparkle.lib import jsonresponse
from splunk.appserver.mrsparkle.lib.util import make_splunkhome_path
import splunk.clilib.bundle_paths as bundle_paths
from splunk.util import normalizeBoolean as normBool
from splunk.appserver.mrsparkle.lib.decorators import expose_page
from splunk.appserver.mrsparkle.lib.routes import route
import splunk.rest as rest
dir = os.path.join(util.get_apps_dir(), __file__.split('.')[-2], 'bin')
if not dir in sys.path:
sys.path.append(dir)
#sys.stdout = open('/tmp/stdout', 'w')
#sys.stderr = open('/tmp/stderr', 'w')
def setup_logger(level):
"""
Setup a logger for the REST handler.
"""
logger = logging.getLogger('splunk.appserver.alert_manager.controllers.UserSettings')
logger.propagate = False # Prevent the log messages from being duplicated in the python.log file
logger.setLevel(level)
file_handler = logging.handlers.RotatingFileHandler(make_splunkhome_path(['var', 'log', 'splunk', 'alert_manager_settings_controller.log']), maxBytes=25000000, backupCount=5)
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
logger = setup_logger(logging.DEBUG)
from splunk.models.base import SplunkAppObjModel
from splunk.models.field import BoolField, Field
class UserSettings(controllers.BaseController):
@expose_page(must_login=True, methods=['POST'])
def set_user_directory(self, user_directory, **kwargs):
logger.info("Set active user directory to %s" % user_directory)
user = cherrypy.session['user']['name']
sessionKey = cherrypy.session.get('sessionKey')
config = entity.getEntities('configs/alert_manager', count=-1, sessionKey=sessionKey)
settings = dict(config['settings'])
if 'eai:acl' in settings:
del settings['eai:acl']
settings['user_directories'] = user_directory
logger.debug("settings: %s" % settings)
uri = '/servicesNS/nobody/alert_manager/admin/alert_manager/settings?%s' % urllib.urlencode(settings)
serverResponse, serverContent = rest.simpleRequest(uri, sessionKey=sessionKey, method='POST')
logger.debug("Active directory changed. Response: %s" % serverResponse)
return 'Ok'
@expose_page(must_login=True, methods=['POST'])
def delete(self, key, **kwargs):
logger.info("Removing user settings for %s..." % key)
user = cherrypy.session['user']['name']
sessionKey = cherrypy.session.get('sessionKey')
query = {}
query['_key'] = key
logger.debug("Query for user settings: %s" % urllib.quote(json.dumps(query)))
uri = '/servicesNS/nobody/alert_manager/storage/collections/data/alert_users?query=%s' % urllib.quote(json.dumps(query))
serverResponse, serverContent = rest.simpleRequest(uri, sessionKey=sessionKey, method='DELETE')
logger.debug("User removed. serverResponse was %s" % serverResponse)
return 'User settings have been removed for entry with _key=%s' % key
@expose_page(must_login=True, methods=['POST'])
def save(self, contents, **kwargs):
logger.info("Saving user settings contents...")
user = cherrypy.session['user']['name']
sessionKey = cherrypy.session.get('sessionKey')
# Parse the JSON
parsed_contents = json.loads(contents)
logger.debug("Contents: %s" % contents)
for entry in parsed_contents:
if '_key' in entry and entry['_key'] != None and entry['_key'] != 'n/a':
uri = '/servicesNS/nobody/alert_manager/storage/collections/data/alert_users/' + entry['_key']
logger.debug("uri is %s" % uri)
del entry['_key']
if 'type' in entry:
del entry['type']
entry = json.dumps(entry)
serverResponse, serverContent = rest.simpleRequest(uri, sessionKey=sessionKey, jsonargs=entry)
logger.debug("Updated entry. serverResponse was %s" % serverResponse)
else:
if '_key' in entry:
del entry['_key']
if 'type' in entry:
del entry['type']
['' if val is None else val for val in entry]
uri = '/servicesNS/nobody/alert_manager/storage/collections/data/alert_users/'
logger.debug("uri is %s" % uri)
entry = json.dumps(entry)
logger.debug("entry is %s" % entry)
serverResponse, serverContent = rest.simpleRequest(uri, sessionKey=sessionKey, jsonargs=entry)
logger.debug("Added entry. serverResponse was %s" % serverResponse)
return 'Data has been saved'