2018-03-14 14:12:26 +08:00
|
|
|
// Copyright (C) 2014-2018 Goodrain Co., Ltd.
|
2017-11-07 11:40:44 +08:00
|
|
|
// RAINBOND, Application Management Platform
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version. For any non-GPL usage of Rainbond,
|
|
|
|
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
|
|
|
|
// must be obtained first.
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
2018-03-14 14:33:31 +08:00
|
|
|
|
2017-11-07 11:40:44 +08:00
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
package util
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"runtime"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"io/ioutil"
|
|
|
|
|
|
|
|
"regexp"
|
|
|
|
|
|
|
|
"github.com/Sirupsen/logrus"
|
|
|
|
"github.com/tidwall/gjson"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Source(l *logrus.Entry) *logrus.Entry {
|
|
|
|
_, file, line, ok := runtime.Caller(2)
|
|
|
|
if !ok {
|
|
|
|
file = "<???>"
|
|
|
|
line = 1
|
|
|
|
} else {
|
|
|
|
slash := strings.LastIndex(file, "/")
|
|
|
|
file = file[slash+1:]
|
|
|
|
}
|
|
|
|
return l.WithField("source", fmt.Sprintf("%s:%d", file, line))
|
|
|
|
}
|
|
|
|
|
|
|
|
//ExternalIP 获取本机ip
|
|
|
|
func ExternalIP() (net.IP, error) {
|
|
|
|
ifaces, err := net.Interfaces()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
for _, iface := range ifaces {
|
|
|
|
if iface.Flags&net.FlagUp == 0 {
|
|
|
|
continue // interface down
|
|
|
|
}
|
|
|
|
if iface.Flags&net.FlagLoopback != 0 {
|
|
|
|
continue // loopback interface
|
|
|
|
}
|
|
|
|
addrs, err := iface.Addrs()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
for _, addr := range addrs {
|
|
|
|
var ip net.IP
|
|
|
|
switch v := addr.(type) {
|
|
|
|
case *net.IPNet:
|
|
|
|
ip = v.IP
|
|
|
|
case *net.IPAddr:
|
|
|
|
ip = v.IP
|
|
|
|
}
|
|
|
|
if ip == nil || ip.IsLoopback() {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
ip = ip.To4()
|
|
|
|
if ip == nil {
|
|
|
|
continue // not an ipv4 address
|
|
|
|
}
|
|
|
|
return ip, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil, errors.New("are you connected to the network?")
|
|
|
|
}
|
|
|
|
|
|
|
|
//GetHostID 获取机器ID
|
2018-04-24 17:14:58 +08:00
|
|
|
func GetHostID(nodeIDFile string) (string, error) {
|
|
|
|
_, err := os.Stat(nodeIDFile)
|
2017-11-07 11:40:44 +08:00
|
|
|
if err != nil {
|
2018-04-24 17:14:58 +08:00
|
|
|
return "", err
|
2017-11-07 11:40:44 +08:00
|
|
|
}
|
2018-04-24 17:14:58 +08:00
|
|
|
body, err := ioutil.ReadFile(nodeIDFile)
|
2017-11-07 11:40:44 +08:00
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
info := strings.Split(strings.TrimSpace(string(body)), "=")
|
|
|
|
if len(info) == 2 {
|
|
|
|
return info[1], nil
|
|
|
|
}
|
|
|
|
return "", fmt.Errorf("Invalid host uuid from file")
|
|
|
|
}
|
|
|
|
|
|
|
|
var rex *regexp.Regexp
|
|
|
|
|
|
|
|
//Format 格式化处理监控数据
|
|
|
|
func Format(source map[string]gjson.Result) map[string]interface{} {
|
2017-12-29 15:27:19 +08:00
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
2018-04-24 17:14:58 +08:00
|
|
|
logrus.Warnf("error deal with source msg %v", source)
|
2017-12-29 15:27:19 +08:00
|
|
|
}
|
|
|
|
}()
|
2017-11-07 11:40:44 +08:00
|
|
|
if rex == nil {
|
|
|
|
var err error
|
|
|
|
rex, err = regexp.Compile(`\d+\.\d{3,}`)
|
|
|
|
if err != nil {
|
|
|
|
logrus.Error("create regexp error.", err.Error())
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var data = make(map[string]interface{})
|
|
|
|
|
|
|
|
for k, v := range source {
|
|
|
|
if rex.MatchString(v.String()) {
|
|
|
|
d := strings.Split(v.String(), ".")
|
|
|
|
data[k] = fmt.Sprintf("%s.%s", d[0], d[1][0:2])
|
|
|
|
} else {
|
|
|
|
data[k] = v.String()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return data
|
|
|
|
}
|