From a3326da0f540376cc4208bc9e2e9cb8c1f56d484 Mon Sep 17 00:00:00 2001 From: marvzhang Date: Thu, 5 Mar 2020 08:56:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5hostname=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/conf/config.yml | 2 +- backend/model/node.go | 20 +++++++--- backend/services/node.go | 3 +- backend/services/register/register.go | 54 +++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 8 deletions(-) diff --git a/backend/conf/config.yml b/backend/conf/config.yml index 32fce297..1e98a2eb 100644 --- a/backend/conf/config.yml +++ b/backend/conf/config.yml @@ -23,7 +23,7 @@ server: master: "Y" secret: "crawlab" register: - # mac地址 或者 ip地址,如果是ip,则需要手动指定IP + # mac地址/ip地址/hostname, 如果是ip,则需要手动指定IP type: "mac" ip: "" lang: # 安装语言环境, Y 为安装,N 为不安装,只对 Docker 有效 diff --git a/backend/model/node.go b/backend/model/node.go index 51cd5d7e..6e29a073 100644 --- a/backend/model/node.go +++ b/backend/model/node.go @@ -43,6 +43,7 @@ func IsMaster() bool { } // 获取本机节点 +// TODO: 这里职责不单一,需要重构 func GetCurrentNode() (Node, error) { // 获得注册的key值 key, err := register.GetRegister().GetKey() @@ -68,7 +69,7 @@ func GetCurrentNode() (Node, error) { //只在master节点运行的时候才检测master节点的信息是否存在 if IsMaster() && err == mgo.ErrNotFound { // 获取本机信息 - ip, mac, key, err := GetNodeBaseInfo() + ip, mac, hostname, key, err := GetNodeBaseInfo() if err != nil { debug.PrintStack() return node, err @@ -81,6 +82,7 @@ func GetCurrentNode() (Node, error) { Ip: ip, Name: ip, Mac: mac, + Hostname: hostname, IsMaster: true, } if err := node.Add(); err != nil { @@ -240,25 +242,31 @@ func GetNodeCount(query interface{}) (int, error) { } // 节点基本信息 -func GetNodeBaseInfo() (ip string, mac string, key string, error error) { +func GetNodeBaseInfo() (ip string, mac string, hostname string, key string, error error) { ip, err := register.GetRegister().GetIp() if err != nil { debug.PrintStack() - return "", "", "", err + return "", "", "", "", err } mac, err = register.GetRegister().GetMac() if err != nil { debug.PrintStack() - return "", "", "", err + return "", "", "", "", err + } + + hostname, err = register.GetRegister().GetHostname() + if err != nil { + debug.PrintStack() + return "", "", "", "", err } key, err = register.GetRegister().GetKey() if err != nil { debug.PrintStack() - return "", "", "", err + return "", "", "", "", err } - return ip, mac, key, nil + return ip, mac, key, hostname, nil } // 根据redis的key值,重置node节点为offline diff --git a/backend/services/node.go b/backend/services/node.go index f189ddb3..f8db160a 100644 --- a/backend/services/node.go +++ b/backend/services/node.go @@ -23,6 +23,7 @@ type Data struct { Key string `json:"key"` Mac string `json:"mac"` Ip string `json:"ip"` + Hostname string `json:"hostname"` Master bool `json:"master"` UpdateTs time.Time `json:"update_ts"` UpdateTsUnix int64 `json:"update_ts_unix"` @@ -182,6 +183,7 @@ func UpdateNodeData() { Key: key, Mac: mac, Ip: ip, + Hostname: hostname, Master: model.IsMaster(), UpdateTs: time.Now(), UpdateTsUnix: time.Now().Unix(), @@ -199,7 +201,6 @@ func UpdateNodeData() { log.Errorf(err.Error()) return } - } func MasterNodeCallback(message redis.Message) (err error) { diff --git a/backend/services/register/register.go b/backend/services/register/register.go index bbdec2f3..8169ae65 100644 --- a/backend/services/register/register.go +++ b/backend/services/register/register.go @@ -1,10 +1,13 @@ package register import ( + "bytes" "crawlab/constants" + "fmt" "github.com/apex/log" "github.com/spf13/viper" "net" + "os/exec" "reflect" "runtime/debug" "sync" @@ -19,6 +22,8 @@ type Register interface { GetIp() (string, error) // 注册节点的mac地址 GetMac() (string, error) + // 注册节点的Hostname + GetHostname() (string, error) } // ===================== mac 地址注册 ===================== @@ -40,6 +45,10 @@ func (mac *MacRegister) GetIp() (string, error) { return getIp() } +func (mac *MacRegister) GetHostname() (string, error) { + return getHostname() +} + // ===================== ip 地址注册 ===================== type IpRegister struct { Ip string @@ -61,6 +70,33 @@ func (ip *IpRegister) GetMac() (string, error) { return getMac() } +func (ip *IpRegister) GetHostname() (string, error) { + return getHostname() +} + +// ===================== mac 地址注册 ===================== +type HostnameRegister struct{} + +func (h *HostnameRegister) GetType() string { + return "mac" +} + +func (h *HostnameRegister) GetKey() (string, error) { + return h.GetHostname() +} + +func (h *HostnameRegister) GetMac() (string, error) { + return getMac() +} + +func (h *HostnameRegister) GetIp() (string, error) { + return getIp() +} + +func (h *HostnameRegister) GetHostname() (string, error) { + return getHostname() +} + // ===================== 公共方法 ===================== // 获取本机的IP地址 // TODO: 考虑多个IP地址的情况 @@ -95,6 +131,23 @@ func getMac() (string, error) { return "", nil } +func getHostname() (string, error) { + var stdout bytes.Buffer + var stderr bytes.Buffer + + cmd := exec.Command("hostname") + cmd.Stdout = &stdout + cmd.Stderr = &stderr + if err := cmd.Run(); err != nil { + log.Errorf(err.Error()) + log.Errorf(fmt.Sprintf("error: %s", stderr.String())) + debug.PrintStack() + return "", err + } + + return stdout.String(), nil +} + // ===================== 获得注册简单工厂 ===================== var register Register @@ -122,6 +175,7 @@ func GetRegister() Register { Ip: ip, } } else if registerType == constants.RegisterTypeHostname { + register = &HostnameRegister{} } log.Info("register type is :" + reflect.TypeOf(register).String())