CasaOS/service/ddns.go
2021-12-03 16:48:07 +08:00

118 lines
3.2 KiB
Go

package service
import (
"os/exec"
ip_helper2 "github.com/IceWhaleTech/CasaOS/pkg/utils/ip_helper"
loger2 "github.com/IceWhaleTech/CasaOS/pkg/utils/loger"
"github.com/IceWhaleTech/CasaOS/service/ddns"
"github.com/IceWhaleTech/CasaOS/service/model"
"gorm.io/gorm"
)
type ddnsStruct struct {
db *gorm.DB
log loger2.OLog
}
type DDNSService interface {
IsExis(t int, domain string, host string) bool
GetExternalIP() (string, string)
GetConfigList() *[]model.DDNSList
DeleteConfig(id uint) bool
GetType(name string) (uint, string)
SaveConfig(model model.DDNSUpdateDBModel) error
}
//判断当前添加的是否存在
func (d *ddnsStruct) IsExis(t int, domain string, host string) bool {
var count int64
d.db.Table(model.DDNSLISTTABLENAME).Where("type=? AND domain=? AND host=?", t, domain, host).Count(&count)
return count > 0
}
//前台获取已配置的ddns列表
func (d *ddnsStruct) GetConfigList() *[]model.DDNSList {
var s []model.DDNSList
d.db.Table(model.DDNSLISTTABLENAME).Select("o_ddns_type.name as name,o_ddns.id,host,domain,created_at,updated_at,message,state").Joins("left join o_ddns_type on o_ddns.type=o_ddns_type.id").Scan(&s)
return &s
}
func (d *ddnsStruct) DeleteConfig(id uint) bool {
d.db.Delete(&model.DDNSUpdateDBModel{Id: id})
return true
}
func (d *ddnsStruct) GetExternalIP() (string, string) {
ipv4 := make(chan string)
ipv6 := make(chan string)
go func() { ipv4 <- ip_helper2.GetExternalIPV4() }()
go func() { ipv6 <- ip_helper2.GetExternalIPV6() }()
return <-ipv4, <-ipv6
}
func NewDDNSService(db *gorm.DB, log loger2.OLog) DDNSService {
return &ddnsStruct{db, log}
}
//根据名称获取类型
func (d *ddnsStruct) GetType(name string) (uint, string) {
var result model.DDNSTypeDBModel
d.db.Model(&model.DDNSTypeDBModel{}).Where("name = ?", name).First(&result)
return result.Id, result.Name
}
//保存配置到数据库
func (d *ddnsStruct) GetDockerRootDir(model model.DDNSUpdateDBModel) error {
return d.db.Create(&model).Error
}
//保存配置到数据库
func (d *ddnsStruct) SaveConfig(model model.DDNSUpdateDBModel) error {
return d.db.Create(&model).Error
}
//更新数据库ping状态
func chackPing(b chan bool, url string) {
cmd := exec.Command("ping", url, "-c", "1", "-W", "5")
err := cmd.Run()
if err != nil {
b <- false
} else {
b <- true
}
}
//更新列表
func UpdateDDNSList(db *gorm.DB) {
var s []model.DDNSCoreList
db.Table(model.DDNSLISTTABLENAME).Select("o_ddns_type.name as name,o_ddns_type.api_host as api_host,o_ddns.id,`host`,domain,user_name,`password`,`key`,secret,type").Joins("left join o_ddns_type on o_ddns.type=o_ddns_type.id").Scan(&s)
for _, item := range s {
var msg string
switch item.Type {
case 1:
var godaddy = &ddns.GoDaddy{
Host: item.Host,
Key: item.Key,
Secret: item.Secret,
Domain: item.Domain,
IPV4: ip_helper2.GetExternalIPV4(),
IPV6: ip_helper2.GetExternalIPV6(),
ApiHost: item.ApiHost,
}
msg = godaddy.Update()
}
b := make(chan bool)
//获取ping状态
go chackPing(b, item.Host+"."+item.Domain)
item.State = <-b
item.Message = msg
db.Table(model.DDNSLISTTABLENAME).Model(&item).Select("state", "message").Updates(&item)
}
}