250 lines
7.8 KiB
Go
250 lines
7.8 KiB
Go
package wizard
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"os"
|
|
"sunhpc/pkg/database"
|
|
"sunhpc/pkg/logger"
|
|
"sunhpc/pkg/utils"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
// 配置项映射:定义每个配置项对应的表名、键名
|
|
type ConfigMapping struct {
|
|
Title string `toml:"title"`
|
|
Base struct {
|
|
ClusterName string `toml:"cluster_name"`
|
|
Country string `toml:"country"`
|
|
State string `toml:"state"`
|
|
City string `toml:"city"`
|
|
HomePage string `toml:"homepage"`
|
|
Contact string `toml:"contact"`
|
|
License string `toml:"license"`
|
|
BaseDir string `toml:"base_dir"`
|
|
WorkDir string `toml:"work_dir"`
|
|
DistroDir string `toml:"distro_dir"`
|
|
Partition string `toml:"partition"`
|
|
Distribution string `toml:"distribution"`
|
|
Timezone string `toml:"timezone"`
|
|
SafePort string `toml:"safe_port"`
|
|
SafeDirs string `toml:"safe_dirs"`
|
|
SafeSecurity string `toml:"safe_security"`
|
|
PluginDirs string `toml:"plugin_dirs"`
|
|
PluginPort string `toml:"plugin_port"`
|
|
GangliaAddr string `toml:"ganglia_addr"`
|
|
} `toml:"base"`
|
|
Pxelinux struct {
|
|
NextServer string `toml:"next_server"`
|
|
PxeFilename string `toml:"pxe_filename"`
|
|
PxeLinuxDir string `toml:"pxelinux_dir"`
|
|
BootArgs string `toml:"boot_args"`
|
|
} `toml:"pxelinux"`
|
|
Public struct {
|
|
PublicHostname string `toml:"public_hostname"`
|
|
PublicInterface string `toml:"public_interface"`
|
|
PublicAddress string `toml:"public_address"`
|
|
PublicNetmask string `toml:"public_netmask"`
|
|
PublicGateway string `toml:"public_gateway"`
|
|
PublicNetwork string `toml:"public_network"`
|
|
PublicDomain string `toml:"public_domain"`
|
|
PublicCIDR string `toml:"public_cidr"`
|
|
PublicDNS string `toml:"public_dns"`
|
|
PublicMac string `toml:"public_mac"`
|
|
PublicMTU string `toml:"public_mtu"`
|
|
PublicNTP string `toml:"public_ntp"`
|
|
} `toml:"public"`
|
|
Private struct {
|
|
PrivateHostname string `toml:"private_hostname"`
|
|
PrivateInterface string `toml:"private_interface"`
|
|
PrivateAddress string `toml:"private_address"`
|
|
PrivateNetmask string `toml:"private_netmask"`
|
|
PrivateNetwork string `toml:"private_network"`
|
|
PrivateDomain string `toml:"private_domain"`
|
|
PrivateCIDR string `toml:"private_cidr"`
|
|
PrivateMac string `toml:"private_mac"`
|
|
PrivateMTU string `toml:"private_mtu"`
|
|
} `toml:"private"`
|
|
}
|
|
|
|
func NewConfigWithDefault() *ConfigMapping {
|
|
return &ConfigMapping{
|
|
Title: "Cluster Configuration",
|
|
Base: struct {
|
|
ClusterName string `toml:"cluster_name"`
|
|
Country string `toml:"country"`
|
|
State string `toml:"state"`
|
|
City string `toml:"city"`
|
|
HomePage string `toml:"homepage"`
|
|
Contact string `toml:"contact"`
|
|
License string `toml:"license"`
|
|
BaseDir string `toml:"base_dir"`
|
|
WorkDir string `toml:"work_dir"`
|
|
DistroDir string `toml:"distro_dir"`
|
|
Partition string `toml:"partition"`
|
|
Distribution string `toml:"distribution"`
|
|
Timezone string `toml:"timezone"`
|
|
SafePort string `toml:"safe_port"`
|
|
SafeDirs string `toml:"safe_dirs"`
|
|
SafeSecurity string `toml:"safe_security"`
|
|
PluginDirs string `toml:"plugin_dirs"`
|
|
PluginPort string `toml:"plugin_port"`
|
|
GangliaAddr string `toml:"ganglia_addr"`
|
|
}{
|
|
ClusterName: "SunHPC_Cluster",
|
|
Country: "CN",
|
|
State: "Beijing",
|
|
City: "Beijing",
|
|
HomePage: "https://www.sunhpc.com",
|
|
Contact: "admin@sunhpc.com",
|
|
License: "MIT",
|
|
BaseDir: "install",
|
|
WorkDir: "/export",
|
|
DistroDir: "/export/sunhpc",
|
|
Partition: "default",
|
|
Distribution: "sunhpc-dist",
|
|
Timezone: "Asia/Shanghai",
|
|
SafePort: "372",
|
|
SafeDirs: "safe.d",
|
|
SafeSecurity: "safe-security",
|
|
PluginDirs: "/etc/sunhpc/plugin",
|
|
PluginPort: "12123",
|
|
GangliaAddr: "224.0.0.3",
|
|
},
|
|
Pxelinux: struct {
|
|
NextServer string `toml:"next_server"`
|
|
PxeFilename string `toml:"pxe_filename"`
|
|
PxeLinuxDir string `toml:"pxelinux_dir"`
|
|
BootArgs string `toml:"boot_args"`
|
|
}{
|
|
NextServer: "192.168.1.1",
|
|
PxeFilename: "pxelinux.0",
|
|
PxeLinuxDir: "/tftpboot/pxelinux",
|
|
BootArgs: "net.ifnames=0 biosdevname=0",
|
|
},
|
|
Public: struct {
|
|
PublicHostname string `toml:"public_hostname"`
|
|
PublicInterface string `toml:"public_interface"`
|
|
PublicAddress string `toml:"public_address"`
|
|
PublicNetmask string `toml:"public_netmask"`
|
|
PublicGateway string `toml:"public_gateway"`
|
|
PublicNetwork string `toml:"public_network"`
|
|
PublicDomain string `toml:"public_domain"`
|
|
PublicCIDR string `toml:"public_cidr"`
|
|
PublicDNS string `toml:"public_dns"`
|
|
PublicMac string `toml:"public_mac"`
|
|
PublicMTU string `toml:"public_mtu"`
|
|
PublicNTP string `toml:"public_ntp"`
|
|
}{
|
|
PublicHostname: "cluster.hpc.org",
|
|
PublicInterface: "eth0",
|
|
PublicAddress: "",
|
|
PublicNetmask: "",
|
|
PublicGateway: "",
|
|
PublicNetwork: "",
|
|
PublicDomain: "hpc.org",
|
|
PublicCIDR: "",
|
|
PublicDNS: "",
|
|
PublicMac: "00:11:22:33:44:55",
|
|
PublicMTU: "1500",
|
|
PublicNTP: "pool.ntp.org",
|
|
},
|
|
Private: struct {
|
|
PrivateHostname string `toml:"private_hostname"`
|
|
PrivateInterface string `toml:"private_interface"`
|
|
PrivateAddress string `toml:"private_address"`
|
|
PrivateNetmask string `toml:"private_netmask"`
|
|
PrivateNetwork string `toml:"private_network"`
|
|
PrivateDomain string `toml:"private_domain"`
|
|
PrivateCIDR string `toml:"private_cidr"`
|
|
PrivateMac string `toml:"private_mac"`
|
|
PrivateMTU string `toml:"private_mtu"`
|
|
}{
|
|
PrivateHostname: "sunhpc",
|
|
PrivateInterface: "eth1",
|
|
PrivateAddress: "172.16.9.254",
|
|
PrivateNetmask: "255.255.255.0",
|
|
PrivateNetwork: "172.16.9.0",
|
|
PrivateDomain: "example.com",
|
|
PrivateCIDR: "172.16.9.0/24",
|
|
PrivateMac: "00:11:22:33:44:66",
|
|
PrivateMTU: "1500",
|
|
},
|
|
}
|
|
}
|
|
|
|
func loadConfig() (*ConfigMapping, error) {
|
|
configs := NewConfigWithDefault()
|
|
cfgfile := "/etc/sunhpc/config.toml"
|
|
|
|
// 尝试解析配置文件
|
|
if _, err := toml.DecodeFile(cfgfile, configs); err != nil {
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
// 文件不存在,直接返回默认配置
|
|
logger.Infof("Config file %s not exist, use default config", cfgfile)
|
|
return configs, nil
|
|
}
|
|
// 其他错误,返回错误
|
|
logger.Debugf("[DEBUG] Parse config file %s failed: %v", cfgfile, err)
|
|
return nil, err
|
|
}
|
|
|
|
logger.Infof("Load config file %s success", cfgfile)
|
|
return configs, nil
|
|
}
|
|
|
|
// saveConfig 入口函数:保存所有配置到数据库
|
|
func (m *model) saveConfig() error {
|
|
|
|
conn, err := database.GetDB() // 假设database包已实现getDB()获取连接
|
|
if err != nil {
|
|
logger.Errorf("Database connection failed: %v", err)
|
|
return err
|
|
}
|
|
defer conn.Close()
|
|
|
|
m.force = false // 初始化全量覆盖标识
|
|
|
|
config, err := loadConfig()
|
|
if err != nil {
|
|
logger.Debugf("[DEBUG] Load config file failed: %v", err)
|
|
return err
|
|
}
|
|
|
|
t_value := m.config.PrivateIPAddress
|
|
c_value := config.Private.PrivateAddress
|
|
|
|
logger.Debugf("t_value: %s\n", t_value)
|
|
logger.Debugf("c_value: %s\n", c_value)
|
|
|
|
logger.Debugf("config.Base.ClusterName: %s\n", config.Base.ClusterName)
|
|
|
|
return nil
|
|
}
|
|
|
|
// 获取系统网络接口
|
|
func getNetworkInterfaces() []string {
|
|
// 实现获取系统网络接口的逻辑
|
|
// 例如:使用 net.Interface() 函数获取系统网络接口
|
|
// 返回一个字符串切片,包含系统网络接口的名称
|
|
interfaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return []string{utils.NoAvailableNetworkInterfaces}
|
|
}
|
|
|
|
var result []string
|
|
for _, iface := range interfaces {
|
|
// 跳过 loopback 接口
|
|
if iface.Flags&net.FlagLoopback != 0 {
|
|
continue
|
|
}
|
|
result = append(result, iface.Name)
|
|
}
|
|
|
|
if len(result) == 0 {
|
|
return []string{utils.NoAvailableNetworkInterfaces}
|
|
}
|
|
return result
|
|
}
|