190 lines
9.5 KiB
Go
190 lines
9.5 KiB
Go
package main
|
||
|
||
const (
|
||
// Database settings
|
||
// Рекомендуется задавать через .env файл или переменные окружения
|
||
DefaultDBUser = "" // Задать через DB_USER в .env
|
||
DefaultDBPassword = "" // Задать через DB_PASSWORD в .env
|
||
DefaultDBName = "waf_info"
|
||
DefaultDBPort = 5432
|
||
DefaultPrimaryDBHost = "10.100.10.8"
|
||
DefaultSecondaryDBHost = "10.100.13.5"
|
||
|
||
// Git repository settings
|
||
DefaultTemplatesRepo = "https://svc-git.cirex.ru/cloudstack/grafana_gen_template.git"
|
||
DefaultTemplatesBranch = "master"
|
||
DefaultTemplatesPath = "/etc/grafana_gen/templates" // Системный путь
|
||
DefaultStateFile = "/var/lib/grafana_gen/state.json" // Системный путь для state
|
||
|
||
// DefaultGitToken - Gitea access token для доступа к репозиторию
|
||
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
|
||
//
|
||
// Как создать токен в Gitea:
|
||
// 1. Gitea → Settings → Applications → Generate New Token
|
||
// 2. Выбрать scope: repository (read)
|
||
//
|
||
// Варианты использования (в порядке приоритета):
|
||
// 1. Флаг командной строки: -git-token "your-gitea-token"
|
||
// 2. Переменная окружения: export GIT_TOKEN="your-gitea-token"
|
||
// 3. Файл .env: GIT_TOKEN=your-gitea-token
|
||
// 4. Hardcode здесь (не рекомендуется): DefaultGitToken = "your-gitea-token"
|
||
//
|
||
// Оставьте пустым для использования только флага/env/.env файла
|
||
DefaultGitToken = ""
|
||
|
||
// DefaultGrafanaAPIKey - Grafana API ключ для создания дашбордов
|
||
// ВАЖНО: Рекомендуется задавать через .env файл или переменную окружения!
|
||
//
|
||
// Варианты использования (в порядке приоритета):
|
||
// 1. Флаг командной строки: -grafana-api-key "glsa-xxxxxxxxxxxx"
|
||
// 2. Переменная окружения: export GRAFANA_API_KEY="glsa-xxxxxxxxxxxx"
|
||
// 3. Файл .env: GRAFANA_API_KEY=glsa_xxxxxxxxxxxx
|
||
// 4. Hardcode здесь (не рекомендуется): DefaultGrafanaAPIKey = "glsa-xxxxxxxxxxxx"
|
||
//
|
||
// Оставьте пустым для использования только флага/env/.env файла
|
||
DefaultGrafanaAPIKey = ""
|
||
|
||
// DefaultGrafanaURL - URL Grafana сервера
|
||
// Можно захардкодить для быстрого запуска
|
||
DefaultGrafanaURL = ""
|
||
|
||
// Пример:
|
||
// DefaultGrafanaURL = "https://grafana.cirex.ru"
|
||
|
||
// DefaultGrafanaFolder - папка в Grafana куда будут созданы дашборды
|
||
// Пример: "WAF - PTAF" создаст путь: Home -> Dashboards -> WAF - PTAF -> [Dashboard]
|
||
// Оставьте пустым для создания в General папке (корень)
|
||
DefaultGrafanaFolder = "WAF - Auto Generated"
|
||
|
||
// Можно переопределить под ваши нужды:
|
||
// DefaultGrafanaFolder = "WAF - PTAF"
|
||
|
||
// Alerts settings
|
||
DefaultAlertsFolder = "WAF - PTAF"
|
||
DefaultAlertsReceiver = "Telegram PTAF Grafana"
|
||
DefaultAlertsGroup = "PTAF Grafana"
|
||
DefaultAlertsDatasource = "af84zsvlp9blsa" // UID datasource OpenSearch
|
||
|
||
// VictoriaLogs second dashboard
|
||
DefaultVLDatasourceUID = "efewdonokxybkf"
|
||
DefaultVLDashboardTitle = "PT AF Requests (VictoriaLogs)" // Название второго дашборда
|
||
DefaultVLGrafanaFolder = "" // Пустая = та же папка что и основная
|
||
DefaultVLDatasourceType = "victoriametrics-logs-datasource-ptaf-sw" // Тип VL datasource плагина
|
||
DefaultVLDashboardUID = "pt-af-requests-auto-vl" // UID второго дашборда
|
||
|
||
// DefaultDashboardTitle - название единого дашборда со всеми клиентами
|
||
// Пример результата: Home -> Dashboards -> WAF - PTAF -> PT AF Nodes
|
||
DefaultDashboardTitle = "PT AF Requests"
|
||
|
||
// Другие примеры названий:
|
||
// DefaultDashboardTitle = "WAF Monitoring"
|
||
// DefaultDashboardTitle = "All Clients"
|
||
// DefaultDashboardTitle = "PTAF Overview"
|
||
)
|
||
|
||
type Config struct {
|
||
DBHost string
|
||
DBPort int
|
||
DBUser string
|
||
DBPassword string
|
||
DBName string
|
||
GrafanaURL string
|
||
GrafanaAPIKey string
|
||
GrafanaFolder string // Папка в Grafana для дашбордов
|
||
DashboardTitle string // Название единого дашборда
|
||
DryRun bool
|
||
TemplatesRepo string
|
||
TemplatesBranch string
|
||
TemplatesPath string
|
||
SkipGitPull bool
|
||
StateFile string
|
||
ForceRun bool
|
||
GitToken string // GitLab token для приватного репозитория
|
||
AlertsFolder string // Папка в Grafana для алертов
|
||
AlertsReceiver string // Receiver (канал уведомлений) для алертов
|
||
AlertsGroup string // Имя группы алертов в Grafana
|
||
AlertsDatasourceUID string // UID datasource для алертов OpenSearch
|
||
|
||
// VictoriaLogs второй дашборд
|
||
VLDatasourceUID string // UID VictoriaLogs datasource
|
||
VLDashboardTitle string // Название второго дашборда (пустая строка = не генерировать)
|
||
VLGrafanaFolder string // Папка для VL дашборда (пустая = та же что и основная)
|
||
VLDashboardUID string // UID второго дашборда в Grafana
|
||
}
|
||
|
||
type ClientData struct {
|
||
ClientTitle string
|
||
Domains []DomainInfo
|
||
RPSLimit int // 0 = алерт не создавать (NULL или не задан в БД)
|
||
RPSCommercialLimit int // коммерческий лимит, при NULL берётся 100
|
||
Limit4xx int // порог 4xx ответов в % (0 = алерт не создавать)
|
||
Limit5xx int // порог 5xx ответов в % (0 = алерт не создавать)
|
||
}
|
||
|
||
type DomainInfo struct {
|
||
SID string
|
||
DomainName string
|
||
Aliases string
|
||
}
|
||
|
||
type DashboardTemplate struct {
|
||
Version string `json:"version"`
|
||
Description string `json:"description"`
|
||
Datasource map[string]interface{} `json:"datasource"`
|
||
DashboardMeta map[string]interface{} `json:"dashboard_meta"` // uid, tags, version — больше не хардкод в Go
|
||
Dashboard map[string]interface{} `json:"dashboard"`
|
||
Layout LayoutConfig `json:"layout"`
|
||
Conditions map[string]ConditionDefinition `json:"conditions"`
|
||
PanelTemplates map[string]interface{} `json:"panel_templates"`
|
||
QueryTemplates map[string]interface{} `json:"query_templates"`
|
||
Panels map[string]interface{} `json:"panels"`
|
||
Queries map[string]interface{} `json:"queries"`
|
||
Templating map[string]interface{} `json:"templating"` // Переменные дашборда Grafana
|
||
}
|
||
|
||
type LayoutConfig struct {
|
||
TenantPanels []PanelLayout `json:"tenant_panels"`
|
||
PreDomainPanels []PanelLayout `json:"pre_domain_panels"` // Панели один раз перед всеми доменными
|
||
DomainPanels []PanelLayout `json:"domain_panels"`
|
||
InterDomainPanels []PanelLayout `json:"inter_domain_panels"` // Панели один раз между группами доменных
|
||
TrafficDomainPanels []PanelLayout `json:"traffic_domain_panels"` // Панели трафика per-domain после inter_domain
|
||
UseCollapsedRows bool `json:"use_collapsed_rows"`
|
||
OverviewPanels []PanelLayout `json:"overview_panels"` // Панели обзора перед клиентскими строками
|
||
OverviewRowTitle string `json:"overview_row_title"` // Заголовок collapsed row обзора
|
||
ErrorPanels []PanelLayout `json:"error_panels"` // Панели ошибок (только VL)
|
||
ErrorRowTitle string `json:"error_row_title"` // Заголовок collapsed row ошибок
|
||
}
|
||
|
||
type PanelLayout struct {
|
||
PanelKey string `json:"panel_key"`
|
||
PanelTemplate string `json:"panel_template,omitempty"`
|
||
Scope string `json:"scope,omitempty"`
|
||
TitleFormat string `json:"title_format,omitempty"`
|
||
TitleSuffix string `json:"title_suffix,omitempty"`
|
||
Field string `json:"field,omitempty"`
|
||
Width int `json:"width"`
|
||
XOffset int `json:"x_offset"`
|
||
YOffset int `json:"y_offset,omitempty"`
|
||
CollapsedRow bool `json:"collapsed_row,omitempty"`
|
||
QueryConfig *QueryConfig `json:"query_config,omitempty"`
|
||
Condition *PanelCondition `json:"condition"`
|
||
}
|
||
|
||
type QueryConfig struct {
|
||
BaseQuery string `json:"base_query"`
|
||
Filters []string `json:"filters"`
|
||
Metric string `json:"metric"`
|
||
Interval string `json:"interval"`
|
||
Field string `json:"field,omitempty"`
|
||
Extra map[string]interface{} `json:"extra,omitempty"`
|
||
}
|
||
|
||
type PanelCondition struct {
|
||
Type string `json:"type"`
|
||
Value interface{} `json:"value"`
|
||
}
|
||
|
||
type ConditionDefinition struct {
|
||
Description string `json:"description"`
|
||
Evaluator string `json:"evaluator"`
|
||
}
|