This commit is contained in:
2026-04-04 00:09:02 +08:00
commit 38e896363e
117 changed files with 119311 additions and 0 deletions

View File

@@ -0,0 +1,579 @@
package main
import (
"fmt"
"log"
"strconv"
"strings"
)
func getDciLocationDB(ispDbName string, runningSql runningSqlServer) ([]dciLocation, []error) {
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
query := "SELECT id, status, COALESCE(status_info, 'null') as status_info, name, ssh_address, ssh_port, ssh_user, COALESCE(setup_info, 'null') as setup_info, COALESCE(params_dhcp, 'null') as params_dhcp, COALESCE(params_redis, 'null') as params_redis, COALESCE(params_nginx, 'null') as params_nginx, COALESCE(params_netflow, 'null') as params_netflow, COALESCE(settings, 'null') as settings, CASE WHEN is_main THEN 1 ELSE 0 END as is_main, COALESCE(proxy_params, '') as proxy_params, COALESCE(userspace, 0) as userspace, COALESCE(patch, 'null') as patch FROM dci_location;"
var errs []error
var dl []dciLocation
if runningSql.Type == "mysql" {
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.dci_location : %s", dbName, err.Error())
errs = append(errs, err)
return dl, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var dciLoc dciLocation
err = rows.Scan(&dciLoc.Id, &dciLoc.Status, &dciLoc.StatusInfo, &dciLoc.Name, &dciLoc.SshAddress, &dciLoc.SshPort, &dciLoc.SshUser, &dciLoc.SetupInfo, &dciLoc.ParamsDhcp, &dciLoc.ParamsRedis, &dciLoc.ParamsNginx, &dciLoc.ParamsNetflow, &dciLoc.Settings, &dciLoc.IsMain, &dciLoc.ProxyParams, &dciLoc.Userspace, &dciLoc.Patch)
if err != nil {
err = fmt.Errorf("Ошибка сканирования результатов запроса в структуру dciLocation : %s", err.Error())
errs = append(errs, err)
continue
}
dl = append(dl, dciLoc)
}
} else if runningSql.Type == "pgsql" {
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
// dbName dci_1
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.dci_location : %s", dbName, err.Error())
errs = append(errs, err)
return dl, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var dciLoc dciLocation
err = rows.Scan(&dciLoc.Id, &dciLoc.Status, &dciLoc.StatusInfo, &dciLoc.Name, &dciLoc.SshAddress, &dciLoc.SshPort, &dciLoc.SshUser, &dciLoc.SetupInfo, &dciLoc.ParamsDhcp, &dciLoc.ParamsRedis, &dciLoc.ParamsNginx, &dciLoc.ParamsNetflow, &dciLoc.Settings, &dciLoc.IsMain, &dciLoc.ProxyParams, &dciLoc.Userspace, &dciLoc.Patch)
if err != nil {
err = fmt.Errorf("Ошибка сканирования результатов запроса в структуру dciLocation : %s", err.Error())
errs = append(errs, err)
continue
}
dl = append(dl, dciLoc)
}
}
return dl, errs
}
func getDciLocationComposeDB(ispDbName string, runningSql runningSqlServer) ([]dciLocationDockerCompose, []error) {
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
var errs []error
var dlc []dciLocationDockerCompose
query := "SELECT id,name,docker_compose FROM dci_location;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.dci_location : %s", dbName, err.Error())
errs = append(errs, err)
return dlc, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var dciLocCompose dciLocationDockerCompose
err = rows.Scan(&dciLocCompose.Id, &dciLocCompose.Name, &dciLocCompose.DockerCompose)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру dciLocationDockerCompose : %s", err.Error())
}
dlc = append(dlc, dciLocCompose)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.dci_location : %s", dbName, err.Error())
errs = append(errs, err)
return dlc, errs
}
defer rows.Close()
defer pool.Close()
for rows.Next() {
var dciLocCompose dciLocationDockerCompose
err = rows.Scan(&dciLocCompose.Id, &dciLocCompose.Name, &dciLocCompose.DockerCompose)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру dciLocationDockerCompose : %s", err.Error())
}
dlc = append(dlc, dciLocCompose)
}
}
return dlc, errs
}
func getDciTaskMonthErrorsDB(ispDbName string, runningSql runningSqlServer) ([]taskManagerTask, []error) {
var tm []taskManagerTask
var errs []error
dbName := "auth"
if ispDbName == "isp" {
dbName = ispDbName
}
switch runningSql.Type {
case "mysql":
query := "SELECT id,name,registration_time,request_info,output,status FROM taskmgr_task WHERE status != 'complete' AND registration_time >= NOW() - INTERVAL 1 MONTH;"
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.taskmgr_task : %s", dbName, err.Error())
errs = append(errs, err)
return tm, errs
}
defer rows.Close()
defer db.Close()
for rows.Next() {
var taskManagerFailed taskManagerTask
err = rows.Scan(&taskManagerFailed.Id, &taskManagerFailed.Name, &taskManagerFailed.RegistrationTime, &taskManagerFailed.RequestInfo, &taskManagerFailed.Output, &taskManagerFailed.Status)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру taskManagerFailed : %s", err.Error())
}
tm = append(tm, taskManagerFailed)
}
case "pgsql":
query := "SELECT id,name,registration_time,request_info,output,status FROM taskmgr_task WHERE status != 'complete' AND registration_time >= NOW() - INTERVAL '1 MONTH';"
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.taskmgr_task : %s", dbName, err.Error())
errs = append(errs, err)
return tm, errs
}
defer rows.Close()
defer pool.Close()
for rows.Next() {
var taskManagerFailed taskManagerTask
err = rows.Scan(&taskManagerFailed.Id, &taskManagerFailed.Name, &taskManagerFailed.RegistrationTime, &taskManagerFailed.RequestInfo, &taskManagerFailed.Output, &taskManagerFailed.Status)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру taskManagerFailed : %s", err.Error())
}
log.Println(taskManagerFailed.Id)
tm = append(tm, taskManagerFailed)
}
}
return tm, errs
}
func getDciLocationHWCountDB(ispDbName string, runningSql runningSqlServer, platformStruct outputPlatformStruct) ([]hwByLocation, []error) {
var hw []hwByLocation
var errs []error
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
// dbName dci_1
for _, loc := range platformStruct.DciLocations {
locId := strconv.Itoa(loc.Id)
query := "select (SELECT COUNT(id) FROM dci_server WHERE location = " + locId + ") AS server, (SELECT COUNT(id) FROM dci_switch WHERE location = " + locId + ") AS switch, (SELECT count(id) FROM dci_pdu WHERE location = " + locId + ") AS pdu, (SELECT COUNT(id) FROM dci_ups WHERE location = " + locId + ") AS ups;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблицам с оборудованиям : %s", err.Error())
errs = append(errs, err)
return hw, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var hwByLocation hwByLocation
err = rows.Scan(&hwByLocation.Server, &hwByLocation.Switch, &hwByLocation.Pdu, &hwByLocation.Ups)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру hwByLocation: %s", err.Error())
}
hwByLocation.Location = loc.Id
hw = append(hw, hwByLocation)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблицам с оборудованием : %s", err.Error())
errs = append(errs, err)
return hw, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var hwByLocation hwByLocation
err = rows.Scan(&hwByLocation.Server, &hwByLocation.Switch, &hwByLocation.Pdu, &hwByLocation.Ups)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру hwByLocation: %s", err.Error())
}
hwByLocation.Location = loc.Id
hw = append(hw, hwByLocation)
}
}
}
return hw, errs
}
func getDciPluginsDB(ispDbName string, runningSql runningSqlServer) ([]installedPlugin, []error) {
var ip []installedPlugin
var errs []error
dbName := "auth"
if ispDbName == "isp" {
dbName = ispDbName
}
query := "SELECT COALESCE(name, 'null'), COALESCE(status, 'null'), COALESCE(version, 'null'), COALESCE(current_version, 'null') from ps_plugin;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.ps_plugin : %s", dbName, err.Error())
errs = append(errs, err)
return ip, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var instPlug installedPlugin
err = rows.Scan(&instPlug.Name, &instPlug.Status, &instPlug.Version, &instPlug.CurrentVersion)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру installedPlugin : %s", err.Error())
errs = append(errs, err)
}
ip = append(ip, instPlug)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.ps_plugin : %s", dbName, err.Error())
errs = append(errs, err)
return ip, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var instPlug installedPlugin
err = rows.Scan(&instPlug.Name, &instPlug.Status, &instPlug.Version, &instPlug.CurrentVersion)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру installedPlugin : %s", err.Error())
errs = append(errs, err)
}
ip = append(ip, instPlug)
}
}
return ip, errs
}
func getDciUsersCountDB(ispDbName string, runningSql runningSqlServer) (users, error) {
var u users
var err error
dbName := "auth"
if ispDbName == "isp" {
dbName = ispDbName
}
query := "SELECT COUNT(id) FROM auth_user;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.auth_user : %s", dbName, err.Error())
return u, err
}
defer db.Close()
defer rows.Close()
for rows.Next() {
err = rows.Scan(&u.Count)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру users")
if rows != nil {
rows.Close()
}
return u, err
}
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к таблице %s.auth_user : %s", dbName, err.Error())
return u, err
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
err = rows.Scan(&u.Count)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру users")
if rows != nil {
rows.Close()
}
return u, err
}
}
}
return u, err
}
func getDciLdapDB(ispDbName string, runningSql runningSqlServer) ([]ldap, []error) {
var ldaps []ldap
var errs []error
dbName := "auth"
if ispDbName == "isp" {
dbName = ispDbName
}
query := "SELECT id,name,last_sync FROM auth_ldap;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка при выполнении запроса к %s.auth_ldap : %s", dbName, err.Error())
errs = append(errs, err)
return ldaps, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var ldap ldap
err = rows.Scan(&ldap.Id, &ldap.Name, &ldap.LastSync)
if err != nil {
err = fmt.Errorf("Ошибка при записи структуры ldap : %s", err.Error())
errs = append(errs, err)
}
ldaps = append(ldaps, ldap)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка при выполнении запроса к %s.auth_ldap : %s", dbName, err.Error())
errs = append(errs, err)
return ldaps, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var ldap ldap
err = rows.Scan(&ldap.Id, &ldap.Name, &ldap.LastSync)
if err != nil {
err = fmt.Errorf("Ошибка при записи структуры ldap : %s", err.Error())
errs = append(errs, err)
}
ldaps = append(ldaps, ldap)
}
}
return ldaps, errs
}
func getDciRepoDB(ispDbName string, runningSql runningSqlServer) ([]repo, []error) {
var repos []repo
var errs []error
query := "SELECT id,name,url FROM dci_repo"
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к %s.dci_repo : %s", dbName, err.Error())
errs = append(errs, err)
return repos, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var repo repo
err = rows.Scan(&repo.Id, &repo.Name, &repo.Url)
if err != nil {
err = fmt.Errorf("Ошибка запписи в структуру repo : %s", err.Error())
errs = append(errs, err)
}
repos = append(repos, repo)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка выполнения запроса к %s.dci_repo : %s", dbName, err.Error())
errs = append(errs, err)
return repos, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var repo repo
err = rows.Scan(&repo.Id, &repo.Name, &repo.Url)
if err != nil {
err = fmt.Errorf("Ошибка запписи в структуру repo : %s", err.Error())
errs = append(errs, err)
}
repos = append(repos, repo)
}
}
return repos, errs
}
func getDciOsTemplatesDB(ispDbName string, runningSql runningSqlServer, platformStruct outputPlatformStruct) ([]osTemplate, []error) {
var ispRepSlice []string
for _, r := range platformStruct.Repos {
if strings.Contains(r.Url, "download.ispsystem.com") {
ispRepSlice = append(ispRepSlice, strconv.Itoa(r.Id))
}
}
ispRep := strings.Join(ispRepSlice, ",")
var osTemplates []osTemplate
var errs []error
query := "SELECT id,name,filename,macro,metainfo,directory_name,repository,size from dci_os_template where repository not in (" + ispRep + ");"
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка при выполнении запроса к %s.dci_os_template : %s", dbName, err.Error())
errs = append(errs, err)
return osTemplates, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var ostempl osTemplate
err = rows.Scan(&ostempl.Id, &ostempl.Name, &ostempl.Filename, &ostempl.Macro, &ostempl.Metainfo, &ostempl.DirectoryName, &ostempl.Repository, &ostempl.Size)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру osTemplate : %s", err.Error())
errs = append(errs, err)
}
osTemplates = append(osTemplates, ostempl)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка при выполнении запроса к %s.dci_os_template : %s", dbName, err.Error())
errs = append(errs, err)
return osTemplates, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var ostempl osTemplate
err = rows.Scan(&ostempl.Id, &ostempl.Name, &ostempl.Filename, &ostempl.Macro, &ostempl.Metainfo, &ostempl.DirectoryName, &ostempl.Repository, &ostempl.Size)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру osTemplate : %s", err.Error())
errs = append(errs, err)
}
osTemplates = append(osTemplates, ostempl)
}
}
return osTemplates, errs
}
func getDciRealIpDB(ispDbName string, runningSql runningSqlServer) (realIP, error) {
dbName := "dci_1"
if ispDbName == "isp" {
dbName = ispDbName
}
var ri realIP
var err error
query := "SELECT name, value FROM isp_settings WHERE name = 'trusted_servers';"
switch runningSql.Type {
case "mysql":
// TODO Тут важно проверить, что это хранится в таблице isp_settings в базе dci_1, а не auth Эта таблица есть в обеих базах и там разные настройки
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка запроса к %s.isp_settings : %s", dbName, err.Error())
return ri, err
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var ri realIP
err = rows.Scan(&ri.Name, &ri.Value)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру realIP : %s", err.Error())
}
}
case "pgsql":
// TODO Тут важно проверить, что это хранится в таблице isp_settings в базе dci_1, а не auth Эта таблица есть в обеих базах и там разные настройки
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка запроса к %s.isp_settings : %s", dbName, err.Error())
return ri, err
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var ri realIP
err = rows.Scan(&ri.Name, &ri.Value)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру realIP : %s", err.Error())
}
}
}
return ri, err
}
func getDciBackupTask(ispDbName string, runningSql runningSqlServer) ([]backupTask, []error) {
var bts []backupTask
var errs []error
dbName := "auth"
if ispDbName == "isp" {
dbName = ispDbName
}
query := "SELECT id,enabled,cron_expression,limit_count,limit_size_mib FROM backup_task;"
switch runningSql.Type {
case "mysql":
rows, db, err := mysqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка запроса к %s.backup_task : %s", dbName, err)
errs = append(errs, err)
return bts, errs
}
defer db.Close()
defer rows.Close()
for rows.Next() {
var bt backupTask
err = rows.Scan(&bt.Id, &bt.Enabled, &bt.CronExpression, &bt.LimitCount, &bt.LimitSizeMib)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру backupTask : %s", err.Error())
}
bts = append(bts, bt)
}
case "pgsql":
rows, pool, err := pgsqlQuery(query, dbName, runningSql)
if err != nil {
err = fmt.Errorf("Ошибка запроса к %s.backup_task : %s", dbName, err)
errs = append(errs, err)
return bts, errs
}
defer pool.Close()
defer rows.Close()
for rows.Next() {
var bt backupTask
err = rows.Scan(&bt.Id, &bt.Enabled, &bt.CronExpression, &bt.LimitCount, &bt.LimitSizeMib)
if err != nil {
err = fmt.Errorf("Ошибка записи в структуру backupTask : %s", err.Error())
}
bts = append(bts, bt)
}
}
return bts, errs
}