From 8c0b417894069df13ba911988a1797c8a4a54983 Mon Sep 17 00:00:00 2001 From: zhanghan2021 Date: Thu, 2 Dec 2021 17:23:52 +0800 Subject: [PATCH 1/3] Add server to send messages and agent to execute firewall commands --- README.md | 60 +++++++++++++++++---- pkg/app/agent/main.go | 13 +++-- pkg/app/agent/network/client.go | 30 +++++++++-- pkg/app/server/agentmanager/agent.go | 10 ++-- pkg/app/server/agentmanager/agentmanager.go | 1 + pkg/app/server/main.go | 4 +- pkg/app/server/network/server.go | 42 ++++++++++++--- pkg/protocol/message.go | 1 + pkg/utils/command.go | 33 ++++++++---- pkg/utils/os/firewall.go | 56 +++++++++++++++++++ 10 files changed, 204 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 1233f9af..83cd21bf 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,63 @@ #### 介绍 -PilotGo是一个运维管理平台。 +PilotGo是一个openEuler社区原生的运维管理平台。 #### 软件架构 -软件架构说明 +开发工具:golang 1.15 +系统支持:openEuler、麒麟操作系统 -#### 安装教程 +PilotGo项目后端采用golang语言开发,使用到以下开源库: -1. xxxx -2. xxxx -3. xxxx +​ web框架:https://github.com/gin-gonic/gin -#### 使用说明 +​ websocket:https://github.com/gorilla/websocket -1. xxxx -2. xxxx -3. xxxx +​ 日志框架:https://github.com/sirupsen/logrus + +​ 文件监控:https://github.com/fsnotify/fsnotify + +​ 配置解析:https://github.com/spf13/viper + +​ mock测试:https://github.com/golang/mock + +以及系统自带库: + +​ net/http + +​ os + +​ time 等 + +前端代码主要使用到以下技术: + +​ JavaScript技术:https://www.javascript.com + +​ vue框架:https://cn.vuejs.org + +​ element组件:https://element.eleme.cn + +可在该网站方便查询第三方库及系统库的API文档: + +​ https://pkg.go.dev/ + +​ https://pkg.go.dev/std + +#### 安装、启动教程 + +``` +# Required before startup +go >=1.15; nodejs >=14; yarn +# Installing yarn using NPM +npm install -g yarn +# install dependencies +yarn / yarn install +# vue server with hot reload at localhost:8080 +yarn run dev +# web server with hot reload at localhost:8080 +go run web-main.go +``` #### 参与贡献 diff --git a/pkg/app/agent/main.go b/pkg/app/agent/main.go index bbecb77a..fdf67402 100644 --- a/pkg/app/agent/main.go +++ b/pkg/app/agent/main.go @@ -1,13 +1,12 @@ package main import ( - "fmt" - "os" - "time" - - "openeluer.org/PilotGo/PilotGo/pkg/app/agent/network" - "openeluer.org/PilotGo/PilotGo/pkg/protocol" - "openeluer.org/PilotGo/PilotGo/pkg/utils" + "fmt" + "openeluer.org/PilotGo/PilotGo/pkg/app/agent/network" + "openeluer.org/PilotGo/PilotGo/pkg/protocol" + "openeluer.org/PilotGo/PilotGo/pkg/utils" + "os" + "time" ) func main() { diff --git a/pkg/app/agent/network/client.go b/pkg/app/agent/network/client.go index 2adef98a..920a2bde 100644 --- a/pkg/app/agent/network/client.go +++ b/pkg/app/agent/network/client.go @@ -1,10 +1,11 @@ package network import ( - "fmt" - "net" + "fmt" + "net" + "openeluer.org/PilotGo/PilotGo/pkg/utils/os" - "openeluer.org/PilotGo/PilotGo/pkg/protocol" + "openeluer.org/PilotGo/PilotGo/pkg/protocol" ) type AgentMessageHandler func(*SocketClient, *protocol.Message) error @@ -31,16 +32,35 @@ func (c *SocketClient) Connect(addr string) error { fmt.Println("read error:", err) return } - // fmt.Println("read data:", string(buff[:n])) readBuff = append(readBuff, buff[:n]...) - // 切割frame + //切割frame i, f := protocol.TlvDecode(&readBuff) + if i != 0 { readBuff = readBuff[i:] msg := protocol.ParseMessage(*f) c.MessageProcesser.ProcessMessage(c, msg) + cmd := string(msg.Body) + fmt.Println("recv message:", cmd) + + switch cmd{ + case "firewall stop" : + tmp:= os.Stop() + fmt.Println(tmp) + case "firewall restart": + tmp:=os.Restart() + fmt.Println(tmp) + case "firewall reload": + tmp:=os.Reload() + fmt.Println(tmp) + case "firewall config": + tmp:= os.Config() + fmt.Println(tmp) + default: + fmt.Println("消息未执行!") + } } } }(c) diff --git a/pkg/app/server/agentmanager/agent.go b/pkg/app/server/agentmanager/agent.go index fdc92392..700e2c98 100644 --- a/pkg/app/server/agentmanager/agent.go +++ b/pkg/app/server/agentmanager/agent.go @@ -89,21 +89,21 @@ func (a *Agent) GetSysInfo() { } -func send(conn net.Conn, data []byte) error { - sendData := protocol.TlvEncode(data) - fmt.Println("send data:", string(sendData)) +func Send(conn net.Conn, msg *protocol.Message) (error, error) { + data := msg.Encode() + sendData := protocol.TlvEncode(data) data_length := len(sendData) send_count := 0 for { n, err := conn.Write(sendData[send_count:]) if err != nil { - return err + return err, nil } if n+send_count >= data_length { send_count = send_count + n break } } - return nil + return nil, nil } diff --git a/pkg/app/server/agentmanager/agentmanager.go b/pkg/app/server/agentmanager/agentmanager.go index a92c25d4..05fce5af 100644 --- a/pkg/app/server/agentmanager/agentmanager.go +++ b/pkg/app/server/agentmanager/agentmanager.go @@ -51,6 +51,7 @@ func AddandRunAgent(c net.Conn) { agent.StartListen() GetAgentManager().AddAgent(agent) fmt.Println("add new agent from:", c.RemoteAddr().String()) + } func StopAgentManager() { diff --git a/pkg/app/server/main.go b/pkg/app/server/main.go index 5ae399a5..1e4b15bd 100644 --- a/pkg/app/server/main.go +++ b/pkg/app/server/main.go @@ -1,8 +1,8 @@ package main import ( - "openeluer.org/PilotGo/PilotGo/pkg/app/server/agentmanager" - "openeluer.org/PilotGo/PilotGo/pkg/app/server/network" + "openeluer.org/PilotGo/PilotGo/pkg/app/server/agentmanager" + "openeluer.org/PilotGo/PilotGo/pkg/app/server/network" ) func main() { diff --git a/pkg/app/server/network/server.go b/pkg/app/server/network/server.go index 9c121dca..0a0c747e 100644 --- a/pkg/app/server/network/server.go +++ b/pkg/app/server/network/server.go @@ -1,14 +1,19 @@ package network import ( - "fmt" - "net" + "bufio" + "fmt" + "net" + "openeluer.org/PilotGo/PilotGo/pkg/app/server/agentmanager" + "openeluer.org/PilotGo/PilotGo/pkg/protocol" + "os" + "time" ) type SocketServer struct { - // MessageProcesser *protocol.MessageProcesser - OnAccept func(net.Conn) - OnStop func() + // MessageProcesser *protocol.MessageProcesser + OnAccept func(net.Conn) + OnStop func() } func (s *SocketServer) Run(addr string) error { @@ -16,17 +21,42 @@ func (s *SocketServer) Run(addr string) error { if err != nil { return err } + fmt.Println("Waiting for agents") + for { conn, err := listener.Accept() if err != nil { fmt.Println("accept error:", err) continue } - s.OnAccept(conn) + + go SendHandle(conn); } } +func SendHandle(conn net.Conn) { + for { + fmt.Println("请输入指令:") + inputReader := bufio.NewReader(os.Stdin) + input, err := inputReader.ReadString('\n') + if err != nil { + continue + } + data := &protocol.Message{ + Type: protocol.AgentScan, + Body: []byte(input), + } + + _, err = agentmanager.Send(conn, data) + if err != nil { + fmt.Println("send error:", err) + } + + time.Sleep(time.Second) + } +} + func (s *SocketServer) Stop() { } diff --git a/pkg/protocol/message.go b/pkg/protocol/message.go index 20d41949..5279cc5b 100644 --- a/pkg/protocol/message.go +++ b/pkg/protocol/message.go @@ -19,6 +19,7 @@ const ( AgentUpdate = 8 AgentUninstall = 9 Info = 10 + AgentScan = 11 ) type Message struct { diff --git a/pkg/utils/command.go b/pkg/utils/command.go index a7b9e299..bcc62780 100644 --- a/pkg/utils/command.go +++ b/pkg/utils/command.go @@ -1,18 +1,29 @@ package utils import ( - "fmt" - "os/exec" + "bytes" + "os/exec" ) -func RunCommand(name string, args ...string) ([]byte, error) { - cmd := exec.Command(name, args...) - out, err := cmd.CombinedOutput() - if err != nil { - fmt.Printf("run command error, err:%s, cmd:%s, args: %s\n", err, name, args) - fmt.Println(string(out)) - return nil, err - } +//func RunCommand(name string, args ...string) ([]byte, error) { +// cmd := exec.Command(name, args...) +// out, err := cmd.CombinedOutput() +// if err != nil { +// fmt.Printf("run command error, err:%s, cmd:%s, args: %s\n", err, name, args) +// fmt.Println(string(out)) +// return nil, err +// } +// +// return out, nil +//} - return out, nil +func RunCommand(s string) (string, error) { + + cmd := exec.Command("/bin/bash", "-c", s) + var out bytes.Buffer + cmd.Stdout = &out + + err := cmd.Run() + + return out.String(), err } diff --git a/pkg/utils/os/firewall.go b/pkg/utils/os/firewall.go index cf1f67e0..63083ad5 100644 --- a/pkg/utils/os/firewall.go +++ b/pkg/utils/os/firewall.go @@ -1 +1,57 @@ package os + +import ( + "fmt" + "openeluer.org/PilotGo/PilotGo/pkg/utils" +) + +type ZonePort struct { + Zone string + Port int +} + +func Restart() bool { + tmp, _ := utils.RunCommand("service firewalld restart") + if len(tmp) != 0 { + fmt.Println("重启防火墙失败!") + return false + } + return true +} + +func Config() bool { + tmp, _ := utils.RunCommand("firewall-cmd --list-all") + if len(tmp) != 0 { + fmt.Println("重启防火墙失败!") + return false + } + return true +} + +func Reload() bool { + tmp, _ := utils.RunCommand("firewall-cmd --reload") + if len(tmp) != 0 { + fmt.Println("更新防火墙失败!") + return false + } + return true +} + +func Stop() bool { + tmp, _ := utils.RunCommand("service firewalld stop") + if len(tmp) != 0 { + fmt.Println("关闭防火墙失败!") + return false + } + return true +} + +func DelZonePort(zp *ZonePort) string { //zone = block dmz drop external home internal public trusted work + tmp, _ := utils.RunCommand(fmt.Sprintf("firewall-cmd --permanent --zone=public --remove-port=%v/tcp", zp.Port)) + return tmp +} + +func AddZonePortPermanent(zp *ZonePort) string { //zone = block dmz drop external home internal public trusted work + tmp, _ := utils.RunCommand(fmt.Sprintf("firewall-cmd --permanent --zone=public --add-port=%v/tcp", zp.Port)) + return tmp +} -- Gitee From e83babec141cfa4449f2bd61579e716e8476b54f Mon Sep 17 00:00:00 2001 From: zhanghan Date: Thu, 2 Dec 2021 09:34:25 +0000 Subject: [PATCH 2/3] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 83cd21bf..e51b5311 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ npm install -g yarn yarn / yarn install # vue server with hot reload at localhost:8080 yarn run dev -# web server with hot reload at localhost:8080 +# web server with hot reload at localhost:8083 go run web-main.go ``` -- Gitee From 7fa8b33f0ae46ed615eb317d8abdf901384ac4f6 Mon Sep 17 00:00:00 2001 From: zhanghan Date: Thu, 2 Dec 2021 09:35:15 +0000 Subject: [PATCH 3/3] update README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e51b5311..83cd21bf 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ npm install -g yarn yarn / yarn install # vue server with hot reload at localhost:8080 yarn run dev -# web server with hot reload at localhost:8083 +# web server with hot reload at localhost:8080 go run web-main.go ``` -- Gitee