diff --git a/.travis.yml b/.travis.yml index 350c38de..ce031ee1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,4 +17,5 @@ install: - go install ./mu script: - cd mu && go build + - go test -cover ./... sudo: required diff --git a/mu/boot.go b/mu/boot.go index 684a87a8..2ef9235c 100644 --- a/mu/boot.go +++ b/mu/boot.go @@ -71,6 +71,12 @@ func boot() { if err != nil { Log.Error(err) } + + err = client.UpdateNodeInfo() + if err != nil { + Log.Error(err) + } + }() time.Sleep(muconfig.Conf.Base.SyncTime * time.Second) } diff --git a/mu/flag.go b/mu/flag.go index 4404baec..42a0eadd 100644 --- a/mu/flag.go +++ b/mu/flag.go @@ -5,13 +5,15 @@ import ( ) var ( - debug bool - logPath string + debug bool + logPath string + configPath string ) func InitFlag() { // flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname") flag.StringVar(&logPath, "log_path", "./ss.log", "log file path") + flag.StringVar(&configPath, "config_path", "./config.conf", "log file path") flag.BoolVar(&debug, "debug", false, "debug") flag.Parse() } diff --git a/mu/log.go b/mu/log.go index dbbc2c0c..0d5984bb 100644 --- a/mu/log.go +++ b/mu/log.go @@ -2,6 +2,7 @@ package main import ( "github.com/Sirupsen/logrus" + "github.com/orvice/shadowsocks-go/mu/log" "io" "os" ) @@ -22,5 +23,5 @@ func InitLog() { Log.Level = logrus.DebugLevel Log.Debug("debug on") } - + log.SetLogClient(Log) } diff --git a/mu/log/client.go b/mu/log/client.go new file mode 100644 index 00000000..6e270819 --- /dev/null +++ b/mu/log/client.go @@ -0,0 +1,11 @@ +package log + +import ( + "github.com/orvice/shadowsocks-go/mu/user" +) + +type Client interface { + Info(user user.User, args ...interface{}) + Error(user user.User, args ...interface{}) + Debug(user user.User, args ...interface{}) +} diff --git a/mu/log/log.go b/mu/log/log.go index d62509f9..cb5a5cc3 100644 --- a/mu/log/log.go +++ b/mu/log/log.go @@ -7,3 +7,7 @@ import ( var ( Log = logrus.New() ) + +func SetLogClient(client *logrus.Logger) { + Log = client +} diff --git a/mu/mysql/mysql.go b/mu/mysql/mysql.go index 4d0c6204..fdbd2c2b 100644 --- a/mu/mysql/mysql.go +++ b/mu/mysql/mysql.go @@ -111,3 +111,7 @@ func (c *Client) GetUsers() ([]user.User, error) { func (c *Client) LogNodeOnlineUser(onlineUserCount int) error { return nil } + +func (c *Client) UpdateNodeInfo() error { + return nil +} diff --git a/mu/system/client.go b/mu/system/client.go new file mode 100644 index 00000000..be452d0b --- /dev/null +++ b/mu/system/client.go @@ -0,0 +1,27 @@ +package system + +import ( + "os/exec" + "strings" +) + +type Client struct { +} + +func GetLoad() (string, error) { + output, err := exec.Command("cat", "/proc/loadavg").Output() + if err != nil { + return "", err + } + + return string(output), nil +} + +func GetUptime() (string, error) { + output, err := exec.Command("cat", "/proc/uptime").Output() + if err != nil { + return "", err + } + loadAry := strings.Split(string(output), " ") + return loadAry[0], nil +} diff --git a/mu/system/client_test.go b/mu/system/client_test.go new file mode 100644 index 00000000..d8bed94d --- /dev/null +++ b/mu/system/client_test.go @@ -0,0 +1,21 @@ +package system + +import ( + "testing" +) + +func TestGetUptime(t *testing.T) { + output, err := GetUptime() + if err != nil { + t.Error(err) + } + t.Log(output) +} + +func TestGetLoad(t *testing.T) { + output, err := GetLoad() + if err != nil { + t.Error(err) + } + t.Log(output) +} diff --git a/mu/user/user.go b/mu/user/user.go index fd224a28..1df28939 100644 --- a/mu/user/user.go +++ b/mu/user/user.go @@ -24,6 +24,7 @@ func SetClient(c Client) { type Client interface { GetUsers() ([]User, error) LogNodeOnlineUser(onlineUserCount int) error + UpdateNodeInfo() error } type User interface { diff --git a/mu/webapi/web.go b/mu/webapi/web.go index 2f7c123c..b0beb084 100644 --- a/mu/webapi/web.go +++ b/mu/webapi/web.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "github.com/orvice/shadowsocks-go/mu/log" + "github.com/orvice/shadowsocks-go/mu/system" "github.com/orvice/shadowsocks-go/mu/user" ) @@ -75,8 +76,9 @@ func (c *Client) UpdateTraffic(userId int, u, d string) error { return err } if ret.Ret == 0 { - return UpdateTrafficFail + return errors.New(ret.Msg) } + log.Log.Debug("update traffic debug:", ret.Msg) return nil } @@ -95,3 +97,30 @@ func (c *Client) LogNodeOnlineUser(onlineUserCount int) error { } return nil } + +func (c *Client) UpdateNodeInfo() error { + uptime, err := system.GetUptime() + if err != nil { + log.Log.Error(err) + uptime = "0" + } + + load, err := system.GetLoad() + if err != nil { + load = "0 0 0" + } + + res, err := c.httpPostNodeInfo(load, uptime) + if err != nil { + return nil + } + var ret BaseRet + err = json.Unmarshal([]byte(res), &ret) + if err != nil { + return err + } + if ret.Ret == 0 { + return UpdateOnlineCountFail + } + return nil +} diff --git a/mu/webapi/web_net.go b/mu/webapi/web_net.go index ed35e637..29cc9106 100644 --- a/mu/webapi/web_net.go +++ b/mu/webapi/web_net.go @@ -20,6 +20,10 @@ func (c *Client) genNodeOnlineCountUrl(id int) string { return fmt.Sprintf("%s/nodes/%d/online_count?key=%s", c.baseUrl, id, c.key) } +func (c *Client) genNodeInfoUrl(id int) string { + return fmt.Sprintf("%s/nodes/%d/info?key=%s", c.baseUrl, id, c.key) +} + func (c *Client) httpGet(urlStr string) (string, error) { resp, err := http.Get(urlStr) if err != nil { @@ -68,3 +72,20 @@ func (c *Client) httpPostNodeOnlineCount(count int) (string, error) { } return string(body), nil } + +func (c *Client) httpPostNodeInfo(load, uptime string) (string, error) { + urlStr := c.genNodeInfoUrl(c.nodeId) + resp, err := http.PostForm(urlStr, + url.Values{"load": {load}, "uptime": {uptime}}) + + if err != nil { + return "", err + } + + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + return string(body), nil +}