Files
techsuppgetinfo/DCIManager6/dci6-support/platform_info_fromDB.go
2026-04-04 00:09:02 +08:00

580 lines
19 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}