| =gettext("Certificate Depth"); ?> |
From f538c080653112fd7071ac5e16683f7c91480bd1 Mon Sep 17 00:00:00 2001
From: Ad Schellevis
Date: Tue, 6 Apr 2021 11:22:08 +0200
Subject: [PATCH 08/13] unbound / blacklists: cleanse domain input. change
regex in https://github.com/opnsense/core/issues/4898 per suggestion
@kulikov-a
---
src/opnsense/scripts/unbound/download_blacklists.py | 2 +-
.../service/templates/OPNsense/Unbound/core/blacklists.conf | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/opnsense/scripts/unbound/download_blacklists.py b/src/opnsense/scripts/unbound/download_blacklists.py
index 929c0da1f..9b2549449 100755
--- a/src/opnsense/scripts/unbound/download_blacklists.py
+++ b/src/opnsense/scripts/unbound/download_blacklists.py
@@ -82,7 +82,7 @@ if __name__ == '__main__':
sys.exit(99)
domain_pattern = re.compile(
- r'(([\da-zA-Z])([_\w-]{,62})\.){,127}(([\da-zA-Z])[_\w-]{,61})'
+ r'(([\da-zA-Z_])([_\w-]{,62})\.){,127}(([\da-zA-Z])[_\w-]{,61})'
r'?([\da-zA-Z]\.((xn\-\-[a-zA-Z\d]+)|([a-zA-Z\d]{2,})))'
)
diff --git a/src/opnsense/service/templates/OPNsense/Unbound/core/blacklists.conf b/src/opnsense/service/templates/OPNsense/Unbound/core/blacklists.conf
index 19a258e04..b065d939d 100644
--- a/src/opnsense/service/templates/OPNsense/Unbound/core/blacklists.conf
+++ b/src/opnsense/service/templates/OPNsense/Unbound/core/blacklists.conf
@@ -55,7 +55,7 @@ custom_{{loop.index}}={{uri}}
# exclude localhost entries
default_pattern_1=.*localhost$
# exclude non domain entries
-default_pattern_2=^(?![a-zA-Z\d]).*
+default_pattern_2=^(?![a-zA-Z_\d]).*
{% if not helpers.empty('OPNsense.unboundplus.dnsbl.whitelists')%}
# user defined
{% for pattern in OPNsense.unboundplus.dnsbl.whitelists.split(',') %}
From aa56b3e45af3603513e8107f5cbdc00bc393d29c Mon Sep 17 00:00:00 2001
From: Franco Fichtner
Date: Wed, 7 Apr 2021 12:06:34 +0200
Subject: [PATCH 09/13] system: reorder settings to let tunables override all
---
src/etc/inc/system.inc | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc
index 7a202de72..08b7f3357 100644
--- a/src/etc/inc/system.inc
+++ b/src/etc/inc/system.inc
@@ -1144,12 +1144,6 @@ function system_login_configure($verbose = false)
/* copy settings already there */
$new_loader_conf = @file_get_contents('/boot/loader.conf');
- $new_loader_conf .= "# dynamically generated tunables settings follow\n";
- foreach (system_sysctl_get() as $param => $value) {
- $new_loader_conf .= "{$param}=\"{$value}\"\n";
- }
- $new_loader_conf .= "\n";
-
$new_loader_conf .= "# dynamically generated console settings follow\n";
foreach ($new_boot_config as $param => $value) {
if (!empty($value)) {
@@ -1158,6 +1152,13 @@ function system_login_configure($verbose = false)
$new_loader_conf .= "#${param}\n";
}
}
+ $new_loader_conf .= "\n";
+
+ $new_loader_conf .= "# dynamically generated tunables settings follow\n";
+ foreach (system_sysctl_get() as $param => $value) {
+ $new_loader_conf .= "{$param}=\"{$value}\"\n";
+ }
+
/* write merged file back to target location */
@file_put_contents('/boot/loader.conf', $new_loader_conf);
From bdb32652fb5a011b7c5fb6d996196643e0ed3180 Mon Sep 17 00:00:00 2001
From: Franco Fichtner
Date: Tue, 6 Apr 2021 14:15:26 +0200
Subject: [PATCH 10/13] firmwre: make this clearer
Ideally, opnsense-update -M should replace this except
that -M is used to gain mirror access from other scripts
as well. Need to think about it.
---
src/opnsense/scripts/firmware/product.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/opnsense/scripts/firmware/product.php b/src/opnsense/scripts/firmware/product.php
index d758febf5..02023de58 100755
--- a/src/opnsense/scripts/firmware/product.php
+++ b/src/opnsense/scripts/firmware/product.php
@@ -32,7 +32,7 @@ $metafile = '/usr/local/opnsense/version/core';
$ret = json_decode(@file_get_contents($metafile), true);
if ($ret != null) {
$ret['product_crypto'] = trim(shell_exec('opnsense-version -f'));
- $ret['product_mirror'] = preg_replace('/\/[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}\//i', '/subscription-key/', trim(shell_exec('opnsense-update -M')));
+ $ret['product_mirror'] = preg_replace('/\/[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}\//i', '/${SUBSCRIPTION}/', trim(shell_exec('opnsense-update -M')));
$ret['product_time'] = date('D M j H:i:s T Y', filemtime('/usr/local/opnsense/www/index.php'));
$repos = explode("\n", trim(shell_exec('opnsense-verify -l')));
sort($repos);
From 26c9ca7d08a6412ef0c51d80716611ad61774581 Mon Sep 17 00:00:00 2001
From: Franco Fichtner
Date: Wed, 7 Apr 2021 14:48:15 +0200
Subject: [PATCH 11/13] rc: reverse list on stop action
Suggested by: David Mora
PR: https://github.com/opnsense/core/pull/4891
---
src/etc/rc.freebsd | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/etc/rc.freebsd b/src/etc/rc.freebsd
index 805654afb..f7b011392 100755
--- a/src/etc/rc.freebsd
+++ b/src/etc/rc.freebsd
@@ -1,7 +1,7 @@
#!/bin/sh
# Copyright (c) 2015-2017 Ad Schellevis
-# Copyright (c) 2015-2020 Franco Fichtner
+# Copyright (c) 2015-2021 Franco Fichtner
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
@@ -81,6 +81,7 @@ rc_enabled()
rc_filenames="$(${RCORDER} /etc/rc.d/[a-z]* /usr/local/etc/rc.d/[a-z]* 2> /dev/null)"
rc_filenames_defer=
+rc_filenames_reverse=
rc_filenames_skip=
for rc_filename in ${rc_filenames}; do
@@ -102,8 +103,10 @@ if [ -z "${1}" ]; then
exit 1
fi
+rc_filenames="${rc_filenames} ${rc_filenames_defer}"
+
# run our bootstrap command on startup
-if [ "${1}" == "start" ]; then
+if [ "${1}" = "start" ]; then
for rc_filename in ${rc_filenames}; do
eval "$(grep "^name[[:blank:]]*=" ${rc_filename})"
@@ -115,10 +118,15 @@ if [ "${1}" == "start" ]; then
eval "pre_run_cmd=\$${pre_run_var}"
${pre_run_cmd}
done
+elif [ "${1}" = "stop" ]; then
+ for rc_filename in ${rc_filenames}; do
+ rc_filenames_reverse="${rc_filename} ${rc_filenames_reverse}"
+ done
+ rc_filenames=${rc_filenames_reverse}
fi
# pass all commands to script now
-for rc_filename in ${rc_filenames} ${rc_filenames_defer}; do
+for rc_filename in ${rc_filenames}; do
eval "$(grep "^name[[:blank:]]*=" ${rc_filename})"
if ! rc_enabled ${rc_filename} ${name}; then
From 6658b92911441bdb0362b5093f5eec5f40777cf8 Mon Sep 17 00:00:00 2001
From: Franco Fichtner
Date: Thu, 8 Apr 2021 12:24:01 +0200
Subject: [PATCH 12/13] system: sort system_sysctl_get() output; closes #4907
---
src/etc/inc/system.inc | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc
index 08b7f3357..50ce99cea 100644
--- a/src/etc/inc/system.inc
+++ b/src/etc/inc/system.inc
@@ -153,6 +153,8 @@ function system_sysctl_get()
}
}
+ ksort($sysctls);
+
return $sysctls;
}
@@ -1159,7 +1161,6 @@ function system_login_configure($verbose = false)
$new_loader_conf .= "{$param}=\"{$value}\"\n";
}
-
/* write merged file back to target location */
@file_put_contents('/boot/loader.conf', $new_loader_conf);
From a785f717555e19417a7e999e283565d09799f8b8 Mon Sep 17 00:00:00 2001
From: Ad Schellevis
Date: Thu, 8 Apr 2021 17:13:55 +0200
Subject: [PATCH 13/13] Firewall / Log Files / Live - refactor
https://github.com/opnsense/core/pull/4902 a bit
---
...ontroller.php => LvtemplateController.php} | 13 +-
.../Diagnostics/LvtemplatesController.php | 50 ----
.../Diagnostics/forms/dialogTemplate.xml | 20 --
.../{Lvtemplates.php => Lvtemplate.php} | 2 +-
.../{Lvtemplates.xml => Lvtemplate.xml} | 2 +-
.../views/OPNsense/Diagnostics/fw_log.volt | 278 +++++++++---------
6 files changed, 147 insertions(+), 218 deletions(-)
rename src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/{LvtemplatesController.php => LvtemplateController.php} (87%)
delete mode 100644 src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/LvtemplatesController.php
delete mode 100644 src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/forms/dialogTemplate.xml
rename src/opnsense/mvc/app/models/OPNsense/Diagnostics/{Lvtemplates.php => Lvtemplate.php} (97%)
rename src/opnsense/mvc/app/models/OPNsense/Diagnostics/{Lvtemplates.xml => Lvtemplate.xml} (93%)
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplatesController.php b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplateController.php
similarity index 87%
rename from src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplatesController.php
rename to src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplateController.php
index cfb29dbb2..b19958bd9 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplatesController.php
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/Api/LvtemplateController.php
@@ -35,14 +35,17 @@ use OPNsense\Base\UserException;
use OPNsense\Core\Backend;
use OPNsense\Core\Config;
-class LvtemplatesController extends ApiMutableModelControllerBase
+class LvtemplateController extends ApiMutableModelControllerBase
{
- protected static $internalModelName = 'lvtemplates';
- protected static $internalModelClass = 'OPNsense\Diagnostics\Lvtemplates';
+ protected static $internalModelName = 'lvtemplate';
+ protected static $internalModelClass = 'OPNsense\Diagnostics\Lvtemplate';
public function searchItemAction()
{
- return $this->searchBase("templates.template", array('name', 'filters', 'or'), "name", null, SORT_NATURAL|SORT_FLAG_CASE);
+ return $this->searchBase(
+ "templates.template",
+ array('name', 'filters', 'or'), "name", null, SORT_NATURAL|SORT_FLAG_CASE
+ );
}
public function setItemAction($uuid)
@@ -64,5 +67,5 @@ class LvtemplatesController extends ApiMutableModelControllerBase
{
return $this->delBase("templates.template", $uuid);
}
-
+
}
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/LvtemplatesController.php b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/LvtemplatesController.php
deleted file mode 100644
index b95766ec3..000000000
--- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/LvtemplatesController.php
+++ /dev/null
@@ -1,50 +0,0 @@
-view->pick('OPNsense/Diagnostics/lvtemplates');
- $this->view->formDialogTemplate = $this->getForm("dialogTemplate");
- }
-
-}
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/forms/dialogTemplate.xml b/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/forms/dialogTemplate.xml
deleted file mode 100644
index 51ca8b626..000000000
--- a/src/opnsense/mvc/app/controllers/OPNsense/Diagnostics/forms/dialogTemplate.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
diff --git a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.php b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.php
similarity index 97%
rename from src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.php
rename to src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.php
index 467a86f7c..40262ed97 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.php
+++ b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.php
@@ -31,6 +31,6 @@ namespace OPNsense\Diagnostics;
use OPNsense\Base\BaseModel;
-class Lvtemplates extends BaseModel
+class Lvtemplate extends BaseModel
{
}
diff --git a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.xml b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.xml
similarity index 93%
rename from src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.xml
rename to src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.xml
index 54a0da9fe..1ab01d8f0 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplates.xml
+++ b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Lvtemplate.xml
@@ -1,5 +1,5 @@
- //OPNsense/Diagnostics/Lvtemplates
+ //OPNsense/Firewall/Lvtemplate
0.0.1
Firewall Live View filter templates
diff --git a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_log.volt b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_log.volt
index 7c5fa9d36..06b60b69d 100644
--- a/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_log.volt
+++ b/src/opnsense/mvc/app/views/OPNsense/Diagnostics/fw_log.volt
@@ -74,6 +74,139 @@
}
}
+ /**
+ * set new selection
+ * @param items list of lexical expressions
+ * @param operator enable or disable global OR operator
+ */
+ function set_selection(items, operator)
+ {
+ // remove old selection
+ $("#filters > span.badge").click();
+ // collect valid condition types
+ let conditions = [];
+ $("#filter_condition > option").each(function(){
+ conditions.push($(this).val());
+ });
+ items.forEach(function(value) {
+ let parts = value.split(new RegExp("("+conditions.join("|")+")(.+)$"));
+ if (parts.length >= 3 && $("#filter_tag").val(parts[0]).val() === parts[0] ) {
+ $("#filter_tag").val(parts[0]);
+ $("#filter_condition").val(parts[1]);
+ $("#filter_value").val(parts[2]);
+ $("#add_filter_condition").click();
+ } else if (value.toLowerCase() == "or=1") {
+ operator = "1";
+ }
+ });
+ $("#filter_or_type").prop('checked', operator === "1" ? true : false);
+ $(".selectpicker").selectpicker('refresh');
+ $("#filter_tag").change();
+ }
+
+ /**
+ * add new filters template
+ * @param t_data template's parameters
+ */
+ function addTemplate(t_data) {
+ ajaxCall('/api/diagnostics/lvtemplate/addItem/', t_data, function(data, status) {
+ if (data.result == "saved") {
+ fetchTemplates(data.uuid);
+ } else {
+ BootstrapDialog.show({
+ type: BootstrapDialog.TYPE_DANGER,
+ title: "{{ lang._('Add filters template') }}",
+ message: "{{ lang._('Template save failed. Message: ') }}" + data.result,
+ buttons: [{
+ label: "{{ lang._('Close') }}",
+ action: function (dialogRef) {
+ dialogRef.close();
+ }
+ }]
+ });
+ fetchTemplates("00000");
+ }
+ })
+ }
+
+ /**
+ * set template new values
+ * @param t_id template uuid
+ * @param t_data template's parameters
+ */
+ function editTemplate(t_id, t_data) {
+ ajaxCall('/api/diagnostics/lvtemplate/setItem/' + t_id, t_data, function(data, status) {
+ if (data.result == "saved") {
+ fetchTemplates(t_id);
+ } else {
+ BootstrapDialog.show({
+ type: BootstrapDialog.TYPE_DANGER,
+ title: "{{ lang._('Filters template edit') }}",
+ message: "{{ lang._('Template edit failed. Message: ') }}" + data.result,
+ buttons: [{
+ label: "{{ lang._('Close') }}",
+ action: function (dialogRef) {
+ dialogRef.close();
+ }
+ }]
+ });
+ fetchTemplates(t_id);
+ }
+ })
+ }
+
+ /**
+ * delete filters template
+ * @param t_id template uuid
+ */
+ function delTemplate(t_id) {
+ ajaxCall('/api/diagnostics/lvtemplate/delItem/' + t_id, {}, function(data, status) {
+ if (data.result == "deleted") {
+ //don't reset current filters so template can be restored right after delete
+ $("#templates option[value=" + t_id + "]").remove();
+ $("#templates").val("").selectpicker('refresh');
+ } else {
+ BootstrapDialog.show({
+ type: BootstrapDialog.TYPE_DANGER,
+ title: "{{ lang._('Filters template delete') }}",
+ message: "{{ lang._('Template delete failed. Result: ') }}" + data.result,
+ buttons: [{
+ label: "{{ lang._('Close') }}",
+ action: function (dialogRef) {
+ dialogRef.close();
+ }
+ }]
+ });
+ }
+ })
+ }
+
+ /**
+ * fetch templates from config
+ * @param opt select value to make :selected and apply
+ */
+ function fetchTemplates(opt) {
+ opt = opt || "00000";
+ //apply = apply || true;
+ $('#templ_name').val("");
+ $('#templates').empty();
+ $('#templates').append($('', {value: "00000", text: "None"}).data('template', {'filters': "0", 'or': "0"}).addClass("disp_none_opt templates"));
+ $('#templates').append($('', {value: "00001", text: "New"}).data('template', {'filters': "0", 'or': "0"}).data('icon','glyphicon-file').addClass("add_new_opt templ_save"));
+ $('#templates').selectpicker('refresh');
+ $('.templates').show();
+ $('.templ_save').hide();
+ ajaxGet('/api/diagnostics/lvtemplate/searchItem/', {}, function(data, status) {
+ let templates = data.rows;
+ $.each(templates, function(i, template) {
+ $('#templates').append(template.uuid == opt ? $('', {value:template.uuid, text:template.name, selected: "selected" }).data('template', template) : $('', {value:template.uuid, text:template.name }).data('template', template));
+ });
+ $('#templates').selectpicker('refresh');
+ $('.badge').click();
+ $("#templates").change();
+ });
+ }
+
+
function fetch_log() {
var record_spec = [];
// read heading, contains field specs
@@ -478,154 +611,17 @@
filter_value.show();
}
}).change();
- fetchTemplates("00000", true);
+ fetchTemplates("00000");
}
});
});
+ // get and apply url params. ie11 compat
+ set_selection(window.location.search.substring(1).split("&"), "0");
+
// startup poller
poller();
-
-
- /**
- * set new selection
- * @param items list of lexical expressions
- * @param operator enable or disable global OR operator
- */
- function set_selection(items, operator)
- {
- // remove old selection
- $("#filters > span.badge").click();
- // operator default value
- operator = operator || "0";
- // collect valid condition types
- let conditions = [];
- $("#filter_condition > option").each(function(){
- conditions.push($(this).val());
- });
- items.forEach(function(value) {
- let parts = value.split(new RegExp("("+conditions.join("|")+")(.+)$"));
- if (parts.length >= 3 && $("#filter_tag").val(parts[0]).val() === parts[0] ) {
- $("#filter_tag").val(parts[0]);
- $("#filter_condition").val(parts[1]);
- $("#filter_value").val(parts[2]);
- $("#add_filter_condition").click();
- } else if (value.toLowerCase() == "or=1") {
- operator = "1";
- }
- });
- $("#filter_or_type").prop('checked', operator === "1" ? true : false);
- $(".selectpicker").selectpicker('refresh');
- $("#filter_tag").change();
- }
-
- /**
- * add new filters template
- * @param t_data template's parameters
- */
- function addTemplate(t_data) {
- ajaxCall('/api/diagnostics/lvtemplates/addItem/', t_data, function(data, status) {
- if ((status == "success") && (data.result == "saved")) {
- fetchTemplates(data.uuid);
- } else {
- BootstrapDialog.show({
- type: BootstrapDialog.TYPE_DANGER,
- title: "{{ lang._('Add filters template') }}",
- message: "{{ lang._('Template save failed. Message: ') }}" + data.result,
- buttons: [{
- label: "{{ lang._('Close') }}",
- action: function (dialogRef) {
- dialogRef.close();
- }
- }]
- });
- fetchTemplates("00000");
- }
- })
- }
-
- /**
- * set template new values
- * @param t_id template uuid
- * @param t_data template's parameters
- */
- function editTemplate(t_id, t_data) {
- ajaxCall('/api/diagnostics/lvtemplates/setItem/' + t_id, t_data, function(data, status) {
- if ((status == "success") && (data.result == "saved")) {
- fetchTemplates(t_id);
- } else {
- BootstrapDialog.show({
- type: BootstrapDialog.TYPE_DANGER,
- title: "{{ lang._('Filters template edit') }}",
- message: "{{ lang._('Template edit failed. Message: ') }}" + data.result,
- buttons: [{
- label: "{{ lang._('Close') }}",
- action: function (dialogRef) {
- dialogRef.close();
- }
- }]
- });
- fetchTemplates(t_id);
- }
- })
- }
-
- /**
- * delete filters template
- * @param t_id template uuid
- */
- function delTemplate(t_id) {
- ajaxCall('/api/diagnostics/lvtemplates/delItem/' + t_id, {}, function(data, status) {
- if ((status == "success") && (data.result == "deleted")) {
- //don't reset current filters so template can be restored right after delete
- $("#templates option[value=" + t_id + "]").remove();
- $("#templates").val("").selectpicker('refresh');
- } else {
- BootstrapDialog.show({
- type: BootstrapDialog.TYPE_DANGER,
- title: "{{ lang._('Filters template delete') }}",
- message: "{{ lang._('Template delete failed. Result: ') }}" + data.result,
- buttons: [{
- label: "{{ lang._('Close') }}",
- action: function (dialogRef) {
- dialogRef.close();
- }
- }]
- });
- }
- })
- }
-
- /**
- * fetch templates from config
- * @param opt select value to make :selected and apply
- * @param parse_url flag to parse and apply url params on page load
- */
- function fetchTemplates(opt, parse_url) {
- opt = opt || "00000";
- //apply = apply || true;
- $('#templ_name').val("");
- $('#templates').empty();
- $('#templates').append($('', {value: "00000", text: "None"}).data('template', {'filters': "0", 'or': "0"}).addClass("disp_none_opt templates"));
- $('#templates').append($('', {value: "00001", text: "New"}).data('template', {'filters': "0", 'or': "0"}).data('icon','glyphicon-file').addClass("add_new_opt templ_save"));
- $('#templates').selectpicker('refresh');
- $('.templates').show();
- $('.templ_save').hide();
- ajaxGet('/api/diagnostics/lvtemplates/searchItem/', {}, function(data, status) {
- let templates = data.rows;
- $.each(templates, function(i, template) {
- $('#templates').append(template.uuid == opt ? $('', {value:template.uuid, text:template.name, selected: "selected" }).data('template', template) : $('', {value:template.uuid, text:template.name }).data('template', template));
- });
- $('#templates').selectpicker('refresh');
- $('.badge').click();
- $("#templates").change();
- if (parse_url) {
- // get and apply url params. ie11 compat
- set_selection(window.location.search.substring(1).split("&"));
- }
- });
- }
});
|