2021-09-26 02:35:02 +00:00
package service
import (
2021-09-27 06:17:36 +00:00
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"
2021-09-26 02:35:02 +00:00
"gorm.io/gorm"
"os/exec"
)
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 . DDNSUpdataDBModel ) 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 )
if count > 0 {
return true
}
return false
}
//前台获取已配置的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 . DDNSUpdataDBModel { 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 . DDNSUpdataDBModel ) error {
return d . db . Create ( & model ) . Error
}
//保存配置到数据库
func ( d * ddnsStruct ) SaveConfig ( model model . DDNSUpdataDBModel ) 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 UpdataDDNSList ( 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 )
}
}