def configure_template_for_endpoint(request): required_fields = set(["input_form_name", "group_id", "endpoint_id"]) if not required_fields.issubset(request.POST): return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_name = request.POST["input_form_name"] group_id = request.POST["group_id"] endpoint_id = request.POST["endpoint_id"] print endpoint_id provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) input_form = InputForm.objects.get(name=input_form_name) print input_form.json json_object = json.loads(input_form.json) config_template = input_form.script action_options = json.loads(config_template.action_provider_options) context = {"input_form": input_form, "json_object": json_object, "endpoint": endpoint, "group_id": group_id, 'action_options' : action_options } return render(request, "input_forms/configure_per_endpoint_template.html", context)
def search_ip(request): """ used for UI autocomplete searches. Will search all configured endpoint groups! Be careful with nmap based groups as this will take a long time! :param request: term :return: json list of dicts of type {'value': 'provider.id:endpoint.ip', 'label': 'group_name/endpoint_name'} """ logger.info("__ input_forms search_ip __") term = request.GET["term"] results = [] provider_list = EndpointGroup.objects.all().order_by("name") for provider in provider_list: provider_instance = endpoint_provider.get_provider_instance_from_group( provider.id) if "Ansible" in str(provider_instance): print("Ansible Instance, skipping") continue provider_instance.apply_filter("Name", term) endpoints_list = provider_instance.get_page(0, 128) for endpoint in endpoints_list: r = dict() print "ENDPOINT IS: " + str(endpoint) r["value"] = str(provider.id) + ":" + str( endpoint.get('ip', '0.0.0.0')) r["label"] = provider.name + "/" + endpoint.get('name', 'unknown') results.append(r) return HttpResponse(json.dumps(results), content_type="application/json")
def add_endpoints_to_queue(request): """ takes a list of selected endpoints and adds them to the user session under a key named "endpoint_queue". Also adds another list of "endpoint_queue_names" to avoid limitations with django template language stuff to show already selected items in the queue """ logger.info("__ endpoints add_endpoints_to_queue __") required_fields = set(["endpoints", "group_id"]) if not required_fields.issubset(request.POST): logger.error("not all required fields found in request") return render(request, "error.html", {"error": "Invalid Parameters in POST"}) group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint_queue = [] endpoint_queue_names = [] if "endpoint_queue" in request.session: endpoint_queue = request.session["endpoint_queue"] if "endpoint_queue_names" in request.session: endpoint_queue_names = request.session["endpoint_queue_names"] for e in request.POST.getlist("endpoints"): endpoint = provider_instance.get_endpoint_by_id(e) if endpoint not in endpoint_queue: endpoint_queue.append(endpoint) endpoint_queue_names.append(endpoint["name"]) request.session["endpoint_queue"] = endpoint_queue request.session["endpoint_queue_names"] = endpoint_queue_names return HttpResponseRedirect("/endpoints/list/%s" % group_id)
def add_endpoints_to_queue(request): """ takes a list of selected endpoints and adds them to the user session under a key named "endpoint_queue". Also adds another list of "endpoint_queue_names" to avoid limitations with django template language stuff to show already selected items in the queue """ required_fields = set(["endpoints", "group_id"]) if not required_fields.issubset(request.POST): return render(request, "error.html", {"error": "Invalid Parameters in POST"}) group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) endpoint_queue = [] endpoint_queue_names = [] if "endpoint_queue" in request.session: endpoint_queue = request.session["endpoint_queue"] if "endpoint_queue_names" in request.session: endpoint_queue_names = request.session["endpoint_queue_names"] for e in request.POST.getlist("endpoints"): endpoint = provider_instance.get_endpoint_by_id(e) if endpoint not in endpoint_queue: endpoint_queue.append(endpoint) endpoint_queue_names.append(endpoint["name"]) request.session["endpoint_queue"] = endpoint_queue request.session["endpoint_queue_names"] = endpoint_queue_names return HttpResponseRedirect("/endpoints/list/%s" % group_id)
def endpoint_details(request, group_id, endpoint_id): logger.info("__ endpoints endpoints_details __") # get the right provider instance provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) context = {"endpoint": endpoint, "group_id": group_id} return render(request, "endpoints/details.html", context)
def endpoint_details(request, group_id, endpoint_id): logger.info("__ endpoints endpoints_details __") # get the right provider instance provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) context = {"endpoint": endpoint, "group_id": group_id} return render(request, "endpoints/details.html", context)
def endpoint_list(request, group_id): logger.info("__ endpoints endpoint_list __") group = get_object_or_404(EndpointGroup, pk=group_id) provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) page_size = int(settings.DEVICE_LIST_PAGING_SIZE) offset = 0 prev = -1 next_offset = offset + page_size filter_name = "" argument = "" if "o" in request.GET: offset = int(request.GET["o"]) if offset > 0: prev = offset - page_size if "filter" in request.GET and "argument" in request.GET: filter_name = request.GET["filter"] argument = request.GET["argument"] provider_instance.apply_filter(filter_name, argument) endpoint_array = provider_instance.get_page(offset, page_size) if len(endpoint_array) < page_size: next_offset = -1 filters = provider_instance.available_filters() endpoint_queue = [] endpoint_queue_names = [] if "endpoint_queue" in request.session: endpoint_queue = request.session["endpoint_queue"] if "endpoint_queue_names" in request.session: endpoint_queue_names = request.session["endpoint_queue_names"] context = { "endpoint_list": endpoint_array, "endpoint_group": group, "provider": group.provider_class, "provider_instance": provider_instance, "prev": prev, "next": next_offset, "filters": filters, "filter": filter_name, "argument": argument, "endpoint_queue": endpoint_queue, "endpoint_queue_names": endpoint_queue_names } return render(request, "endpoints/list.html", context)
def endpoint_list(request, group_id): logger.info("__ endpoints endpoint_list __") group = get_object_or_404(EndpointGroup, pk=group_id) provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) page_size = int(settings.DEVICE_LIST_PAGING_SIZE) offset = 0 prev = -1 next_offset = offset + page_size filter_name = "" argument = "" if "o" in request.GET: offset = int(request.GET["o"]) if offset > 0: prev = offset - page_size if "filter" in request.GET and "argument" in request.GET: filter_name = request.GET["filter"] argument = request.GET["argument"] provider_instance.apply_filter(filter_name, argument) endpoint_array = provider_instance.get_page(offset, page_size) if len(endpoint_array) < page_size: next_offset = -1 filters = provider_instance.available_filters() endpoint_queue = [] endpoint_queue_names = [] if "endpoint_queue" in request.session: endpoint_queue = request.session["endpoint_queue"] if "endpoint_queue_names" in request.session: endpoint_queue_names = request.session["endpoint_queue_names"] context = {"endpoint_list": endpoint_array, "endpoint_group": group, "provider": group.provider_class, "provider_instance": provider_instance, "prev": prev, "next": next_offset, "filters": filters, "filter": filter_name, "argument": argument, "endpoint_queue": endpoint_queue, "endpoint_queue_names": endpoint_queue_names } return render(request, "endpoints/list.html", context)
def configure_template_for_endpoint(request): logger.info("__ input_forms confgure_template_for_endpoint __") required_fields = set(["input_form_name", "group_id", "endpoint_id"]) if not required_fields.issubset(request.POST): return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_name = request.POST["input_form_name"] group_id = request.POST["group_id"] endpoint_id = request.POST["endpoint_id"] logger.debug("Configuring template for endpoint: %s" % endpoint_id) provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) input_form = InputForm.objects.get(name=input_form_name) logger.debug(input_form.json) json_object = json.loads(input_form.json) for jo in json_object: if "widget" in jo: _configure_widget_options(jo) else: jo["widget"] = "text_input" config_template = input_form.script action_options = json.loads(config_template.action_provider_options) context = { "input_form": input_form, "json_object": json_object, "endpoint": endpoint, "group_id": group_id, 'action_options': action_options } return render(request, "input_forms/configure_per_endpoint_template.html", context)
def endpoint_list(request, group_id): logger.info("__ endpoints endpoint_list __") group = get_object_or_404(EndpointGroup, pk=group_id) provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) if group.provider_class == "AnsibleInventory": try: with file(provider_instance.inv_name) as f: inv = f.read() except IOError as e: inv = "Could not read inventory file!\n" + str(e) endpoint = provider_instance.get_endpoint_by_id(1) # dummy value context = { "endpoint_group": group, "endpoint": endpoint, "provider": group.provider_class, "provider_instance": provider_instance, "inventory": inv, } return render(request, "endpoints/list_ansible.html", context) page_size = int(settings.DEVICE_LIST_PAGING_SIZE) offset = 0 prev = -1 next_offset = offset + page_size filter_name = "" argument = "" if "o" in request.GET: offset = int(request.GET["o"]) if offset > 0: prev = offset - page_size if "filter" in request.GET and "argument" in request.GET: filter_name = request.GET["filter"] argument = request.GET["argument"] provider_instance.apply_filter(filter_name, argument) endpoint_array = provider_instance.get_page() if len(endpoint_array) < page_size: next_offset = -1 filters = provider_instance.available_filters() endpoint_queue = [] endpoint_queue_names = [] if "endpoint_queue" in request.session: endpoint_queue = request.session["endpoint_queue"] if "endpoint_queue_names" in request.session: endpoint_queue_names = request.session["endpoint_queue_names"] context = { "endpoint_list": endpoint_array, "endpoint_group": group, "provider": group.provider_class, "provider_instance": provider_instance, "prev": prev, "next": next_offset, "filters": filters, "filter": filter_name, "argument": argument, "endpoint_queue": endpoint_queue, "endpoint_queue_names": endpoint_queue_names } return render(request, "endpoints/list.html", context)
def apply_template(request): """ :param request: HTTPRequest from the input form :return: results of the template execution """ required_fields = set(["input_form_id", "endpoint_id", "group_id"]) if not required_fields.issubset(request.POST): return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_id = request.POST["input_form_id"] endpoint_id = request.POST["endpoint_id"] group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) if "username" not in endpoint or endpoint["username"] == "": if "global_username" in request.POST: endpoint["username"] = request.POST["global_username"] else: raise Exception("Authentication is required!") if "password" not in endpoint or endpoint["password"] == "": if "global_password" in request.POST: endpoint["password"] = request.POST["global_password"] else: raise Exception("Authentication is required!") input_form = InputForm.objects.get(pk=input_form_id) print input_form.json json_object = json.loads(input_form.json) context = Context() for j in json_object: if '.' in j["name"]: # this is a json capable variable name j_dict = aframe_utils.generate_dict(j["name"], str(request.POST[j["name"]])) context.update(j_dict) else: print "setting context %s" % j["name"] context[j["name"]] = str(request.POST[j["name"]]) context["af_endpoint_ip"] = endpoint["ip"] context["af_endpoint_username"] = endpoint["username"] context["af_endpoint_password"] = endpoint["password"] context["af_endpoint_type"] = endpoint["type"] print context config_template = input_form.script try: compiled_template = engines['django'].from_string(config_template.template) completed_template = str(compiled_template.render(context)) except TemplateSyntaxError as e: print "Caught a template syntax error!" return render(request, "error.html", {"error": "Invalid Template Syntax: %s" % str(e)}) print "TEMPLATE IS:" print completed_template action_name = config_template.action_provider action_options = json.loads(config_template.action_provider_options) print "action name is: " + action_name action = action_provider.get_provider_instance(action_name, action_options) action.set_endpoint(endpoint) results = action.execute_template(completed_template) context = {"results": results} return render(request, "input_forms/results.html", context)
def apply_template(request): """ :param request: HTTPRequest from the input form :return: results of the template execution """ print "APPLY TEMPLATE" required_fields = set(["input_form_id", "endpoint_id", "group_id"]) if not required_fields.issubset(request.POST): return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_id = request.POST["input_form_id"] endpoint_id = request.POST["endpoint_id"] group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) if "username" not in endpoint or endpoint["username"] == "": if "global_username" in request.POST: endpoint["username"] = request.POST["global_username"] else: raise Exception("Authentication is required!") if "password" not in endpoint or endpoint["password"] == "": if "global_password" in request.POST: endpoint["password"] = request.POST["global_password"] else: raise Exception("Authentication is required!") input_form = InputForm.objects.get(pk=input_form_id) print input_form.json json_object = json.loads(input_form.json) context = Context() for j in json_object: print "setting context %s" % j["name"] context[j["name"]] = str(request.POST[j["name"]]) context["af_endpoint_ip"] = endpoint["ip"] context["af_endpoint_username"] = endpoint["username"] context["af_endpoint_password"] = endpoint["password"] context["af_endpoint_type"] = endpoint["type"] print context config_template = input_form.script try: compiled_template = engines['django'].from_string(config_template.template) completed_template = str(compiled_template.render(context)) except TemplateSyntaxError as e: print "Caught a template syntax error!" return render(request, "error.html", {"error": "Invalid Template Syntax: %s" % str(e)}) print "TEMPLATE IS:" print completed_template action_name = config_template.action_provider action_options = json.loads(config_template.action_provider_options) print "action name is: " + action_name action = action_provider.get_provider_instance(action_name, action_options) action.set_endpoint(endpoint) results = action.execute_template(completed_template) context = {"results": results} return render(request, "input_forms/results.html", context)
def apply_per_endpoint_template(request): """ :param request: HTTPRequest from the input form :return: results of the template execution """ logger.info("__ input_forms apply_per_endpoint_template __") required_fields = set(["input_form_id", "endpoint_id", "group_id"]) if not required_fields.issubset(request.POST): logger.error("Did no find all required fields in request") return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_id = request.POST["input_form_id"] endpoint_id = request.POST["endpoint_id"] group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group( group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) if "username" not in endpoint or endpoint["username"] == "": if "global_username" in request.POST: endpoint["username"] = request.POST["global_username"] else: raise Exception("Authentication is required!") if "password" not in endpoint or endpoint["password"] == "": if "global_password" in request.POST: endpoint["password"] = request.POST["global_password"] else: raise Exception("Authentication is required!") input_form = InputForm.objects.get(pk=input_form_id) logger.debug(input_form.json) json_object = json.loads(input_form.json) context = dict() for j in json_object: if '.' in j["name"]: # this is a json capable variable name j_dict = aframe_utils.generate_dict( j["name"], str(request.POST.get(j["name"], ''))) context.update(j_dict) else: logger.debug("setting context %s" % j["name"]) # don't worry about null values here context[j["name"]] = str(request.POST.get(j['name'], '')) context["af_endpoint_ip"] = endpoint["ip"] context["af_endpoint_id"] = endpoint["id"] context["af_endpoint_name"] = endpoint["name"] context["af_endpoint_username"] = endpoint["username"] context["af_endpoint_password"] = endpoint["password"] context["af_endpoint_type"] = endpoint["type"] logger.debug(context) config_template = input_form.script try: compiled_template = engines['django'].from_string( config_template.template) completed_template = str(compiled_template.render(context)) except TemplateSyntaxError as e: logger.error("Caught a template syntax error!") return render(request, "error.html", {"error": "Invalid Template Syntax: %s" % str(e)}) logger.debug(completed_template) action_name = config_template.action_provider action_options = json.loads(config_template.action_provider_options) logger.debug(action_options) for ao in action_options: if "action_options_" + str(ao) in request.POST: logger.debug("Found a customized action option!") new_val = request.POST["action_options_" + str(ao)] current_value = action_options[ao]["value"] action_options[ao]["value"] = re.sub("{{.*}}", new_val, current_value) logger.debug(action_options[ao]["value"]) logger.debug("action name is: " + action_name) # let's load any secrets if necessary provider_options = action_provider.get_options_for_provider(action_name) for opt in provider_options: print opt if opt['type'] == 'secret': opt_name = opt['name'] pw_lookup_key = action_options[opt_name]['value'] pw_lookup_value = aframe_utils.lookup_secret(pw_lookup_key) action_options[opt_name]['value'] = pw_lookup_value action = action_provider.get_provider_instance(action_name, action_options) action.set_endpoint(endpoint) results = action.execute_template(completed_template) context = {"results": results} if "inline" in request.POST and request.POST["inline"] == 'yes_please': print "returning INLINE" context["input_form_name"] = input_form.name context["input_form_id"] = input_form_id return render(request, "overlay_results.html", context) return render(request, "input_forms/results.html", context)
def apply_template(request): """ :param request: HTTPRequest from the input form :return: results of the template execution """ logger.info("__ input_forms apply_template __") required_fields = set(["input_form_id", "endpoint_id", "group_id"]) if not required_fields.issubset(request.POST): logger.error("Did no find all required fields in request") return render(request, "error.html", {"error": "Invalid Parameters in POST"}) input_form_id = request.POST["input_form_id"] endpoint_id = request.POST["endpoint_id"] group_id = request.POST["group_id"] provider_instance = endpoint_provider.get_provider_instance_from_group(group_id) endpoint = provider_instance.get_endpoint_by_id(endpoint_id) if "username" not in endpoint or endpoint["username"] == "": if "global_username" in request.POST: endpoint["username"] = request.POST["global_username"] else: raise Exception("Authentication is required!") if "password" not in endpoint or endpoint["password"] == "": if "global_password" in request.POST: endpoint["password"] = request.POST["global_password"] else: raise Exception("Authentication is required!") input_form = InputForm.objects.get(pk=input_form_id) logger.debug(input_form.json) json_object = json.loads(input_form.json) context = Context() for j in json_object: if '.' in j["name"]: # this is a json capable variable name j_dict = aframe_utils.generate_dict(j["name"], str(request.POST[j["name"]])) context.update(j_dict) else: logger.debug("setting context %s" % j["name"]) context[j["name"]] = str(request.POST[j["name"]]) context["af_endpoint_ip"] = endpoint["ip"] context["af_endpoint_username"] = endpoint["username"] context["af_endpoint_password"] = endpoint["password"] context["af_endpoint_type"] = endpoint["type"] logger.debug(context) config_template = input_form.script try: compiled_template = engines['django'].from_string(config_template.template) completed_template = str(compiled_template.render(context)) except TemplateSyntaxError as e: logger.error("Caught a template syntax error!") return render(request, "error.html", {"error": "Invalid Template Syntax: %s" % str(e)}) logger.debug(completed_template) action_name = config_template.action_provider action_options = json.loads(config_template.action_provider_options) logger.debug(action_options) for ao in action_options: if "action_options_" + str(ao) in request.POST: logger.debug("Found a customized action option!") new_val = request.POST["action_options_" + str(ao)] current_value = action_options[ao]["value"] action_options[ao]["value"] = re.sub("{{ .* }}", new_val, current_value) logger.debug(action_options[ao]["value"]) logger.debug("action name is: " + action_name) action = action_provider.get_provider_instance(action_name, action_options) action.set_endpoint(endpoint) results = action.execute_template(completed_template) context = {"results": results} return render(request, "input_forms/results.html", context)