diff --git a/internal/scans/cidr_parse.go b/internal/scans/cidr_parse.go index 9f0f36f..8ab6f87 100644 --- a/internal/scans/cidr_parse.go +++ b/internal/scans/cidr_parse.go @@ -14,7 +14,7 @@ const maxCIDRSExpanded = 16384 var cidrRangeRE = regexp.MustCompile(`^\s*(?P.+?/\d+)\s*-\s*(?P.+?/\d+)\s*$`) -// expandCIDRSFromRequest раскрывает каждую строку: один CIDR или диапазон "start/end mask - end/end mask". +// expandCIDRSFromRequest раскрывает каждую строку: перечисление через запятую, один CIDR или диапазон a/b - c/d. func expandCIDRSFromRequest(inputs []string) ([]string, error) { var all []string for _, raw := range inputs { @@ -22,11 +22,17 @@ func expandCIDRSFromRequest(inputs []string) ([]string, error) { if raw == "" { continue } - part, err := expandCIDREntry(raw) - if err != nil { - return nil, err + for _, piece := range strings.Split(raw, ",") { + piece = strings.TrimSpace(piece) + if piece == "" { + continue + } + part, err := expandCIDREntry(piece) + if err != nil { + return nil, err + } + all = append(all, part...) } - all = append(all, part...) } if len(all) == 0 { return nil, errors.New("cidrs must not be empty") diff --git a/internal/scans/cidr_parse_test.go b/internal/scans/cidr_parse_test.go index 2c341f5..750708e 100644 --- a/internal/scans/cidr_parse_test.go +++ b/internal/scans/cidr_parse_test.go @@ -53,3 +53,23 @@ func TestExpandCIDRSFromRequestDedup(t *testing.T) { t.Fatalf("дедуп: %v", out) } } + +func TestExpandCIDRSFromRequestCommaList(t *testing.T) { + out, err := expandCIDRSFromRequest([]string{"172.16.0.0/24, 192.168.160.0/24 ,192.168.170.0/24"}) + if err != nil { + t.Fatal(err) + } + if len(out) != 3 { + t.Fatalf("ожидали 3 подсети, получили %d: %v", len(out), out) + } +} + +func TestExpandCIDRSFromRequestCommaAndRange(t *testing.T) { + out, err := expandCIDRSFromRequest([]string{"10.0.0.0/30,192.168.1.0/24-192.168.2.0/24"}) + if err != nil { + t.Fatal(err) + } + if len(out) != 1+2 { + t.Fatalf("ожидали /30 + 2×/24, получили %d: %v", len(out), out) + } +} diff --git a/internal/webui/index.html b/internal/webui/index.html index 2b53efd..c285345 100644 --- a/internal/webui/index.html +++ b/internal/webui/index.html @@ -35,7 +35,7 @@ Один scan = один полный проход по сети. Для каждого IP из CIDR (с исключениями): ping → для ответивших — проверка TCP-портов → если включён SNMP — опрос системы (sysName и др.) и сразу обход LLDP-MIB (соседи по портам). Отдельной кнопки «только LLDP» нет: соседи попадают в этот же цикл. Кнопка «Создать scan» ставит задачу и сама ждёт завершения, показывая прогресс в строке статуса ниже.
- +
@@ -793,7 +793,7 @@ async function createScan() { const cidr = cidrInput.value.trim(); if (!cidr) { - setStatus("Введите CIDR или диапазон подсетей (IPv4), например 192.168.1.0/24 или 192.168.160.0/24 - 192.168.190.0/24."); + setStatus("Введите CIDR(ы): один адрес, несколько через запятую или диапазон IPv4 (192.168.160.0/24 - 192.168.190.0/24)."); return; } setStatus("Отправка запроса на сервер: создание задачи scan…");