api/pages/node/modify.py (50 lines of code) (raw):

#!/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. ######################################################################## # OPENAPI-URI: /api/node/modify ######################################################################## # post: # requestBody: # content: # application/json: # schema: # $ref: '#/components/schemas/NodeDetails' # description: Node details to modify # required: true # responses: # '200': # content: # application/json: # schema: # $ref: '#/components/schemas/ActionCompleted' # description: Node successfully modified on server # default: # content: # application/json: # schema: # $ref: '#/components/schemas/Error' # description: unexpected error # summary: Modifies base data of a node in the registry # delete: # requestBody: # content: # application/json: # schema: # $ref: '#/components/schemas/NodeDetails' # description: Node to remove # required: true # responses: # '200': # content: # application/json: # schema: # $ref: '#/components/schemas/ActionCompleted' # description: Node successfully removed from registry # default: # content: # application/json: # schema: # $ref: '#/components/schemas/Error' # description: unexpected error # summary: Deletes a registered node from the server # ######################################################################## """ This is the node modification handler for Apache Warble """ import json import re import time import plugins.crypto import plugins.registry import base64 def run(API, environ, indata, session): method = environ['REQUEST_METHOD'] # Modifying a node? if method == "POST": # Super users only! if not session.user or session.user['userlevel'] != 'superuser': raise API.exception(403, "You need to be logged in as super user to perform this action") # Try finding the node in the registry nodeid = indata['id'] node = None try: node = plugins.registry.node(session, nodeid) except: raise API.exception(404, "Could not find a node by this ID to modify.") # Save any changes we get if 'verified' in indata: node.verified = indata['verified'] if 'enabled' in indata: node.enabled = indata['enabled'] if 'hostname' in indata and indata['hostname']: node.hostname = indata['hostname'] if 'pubkey' in indata and indata['pubkey']: # Verify that PEM works: try: plugins.crypto.loads(indata['pubkey']) except: raise API.exception(400, "Could not save changes: Bad PEM payload passed!") node.pubkey = indata['pubkey'] if 'description' in indata and indata['description']: node.description = indata['description'] if 'location' in indata and indata['location']: node.location = indata['location'] # All done, save node and exit node.save() del node # just to be sure yield json.dumps({"okay": True, "message": "Changes saved"}, indent = 2) return # Deleting a node? if method == "DELETE": # Super users only! if not session.user or session.user['userlevel'] != 'superuser': raise API.exception(403, "You need to be logged in as super user to perform this action") # Try finding the node in the registry nodeid = indata['id'] node = None try: node = plugins.registry.node(session, nodeid) except: raise API.exception(404, "Could not find a node by this ID to modify.") # Remove node, say cheese! node.remove() yield json.dumps({"okay": True, "message": "Node removed from registry"}, indent = 2) return # Finally, if we hit a method we don't know, balk! yield API.exception(400, "I don't know this request method!!")