From 55db5b66404063d4b887f4135a7c4f4730d32e2f Mon Sep 17 00:00:00 2001 From: zcy Date: Thu, 16 Apr 2020 00:25:16 +0800 Subject: [PATCH] Build BPF generator using the builder pattern --- deployments/sys/collect.go | 39 ++++++++++++++++++++++++---- internal/BPF/bpf.go | 41 ++++++++++++++++++++++++------ internal/BPF/cbuilder.go | 52 ++++++++++++++++++++++++++++++++++++++ internal/BPF/pybuilder.go | 52 ++++++++++++++++++++++++++++++++++++++ routers/r_sys.go | 2 +- 5 files changed, 172 insertions(+), 14 deletions(-) create mode 100644 internal/BPF/cbuilder.go create mode 100644 internal/BPF/pybuilder.go diff --git a/deployments/sys/collect.go b/deployments/sys/collect.go index c86070778..03594b7b6 100644 --- a/deployments/sys/collect.go +++ b/deployments/sys/collect.go @@ -4,24 +4,53 @@ import ( "fmt" "github.com/gin-gonic/gin" "lmp_ui/deployments/message" - _ "lmp_ui/internal/BPF" + "lmp_ui/internal/BPF" _ "net/http" ) type Data struct{} +func (d *Data)Handle(c *gin.Context) { + //处理前端的配置消息 + d.Collect(c) + //生成python文件和C文件 + d.Generator(c) +} + func (d *Data)Collect(c *gin.Context) { //得到前端发来的配置信息 m := fillConfigMessage(c) - //将配置信息发送给BPF generator - //var b BPF.BPFBody - //file := b.Generator(&m) + //TODO.. fmt.Println(m) - //c.JSON(http.StatusOK,name) } +//根据配置,生成python文件和C文件 +//TODO..接收配置信息 +func (d *Data)Generator(c *gin.Context) { + //先创建python文件 + py := bpf.NewConcreteBuilderPy() + //把创建好的ConcreteBuilderPy传递给DirectorPy + directorpy := bpf.NewDirectorPy(&py) + //开始构造python文件 + directorpy.ConstructPy() + result1 := py.GetResultPy() + fmt.Println(result1) + //TODO.. + + //创建C文件 + C := bpf.NewConcreteBuilderC() + //把创建好的ConcreteBuilderPy传递给DirectorPy + directorc := bpf.NewDirectorC(&C) + //开始构造python文件 + directorc.ConstructC() + result2 := py.GetResultC() + fmt.Println(result2) + //TODO.. +} + + func fillConfigMessage(c *gin.Context) message.ConfigMessage { var m message.ConfigMessage if _,ok:= c.GetPostForm("dispatchingdelay"); ok { diff --git a/internal/BPF/bpf.go b/internal/BPF/bpf.go index f394c038b..1852e3485 100644 --- a/internal/BPF/bpf.go +++ b/internal/BPF/bpf.go @@ -1,14 +1,39 @@ -package BPF +package bpf -import ( - "lmp_ui/deployments/message" - "os" -) +type DirectorPy struct { + //生成python文件的接口 + pyBuilder PyBuilder +} + +type DirectorC struct { + //生成C文件的接口 + cBuilder CBuilder +} + +func NewDirectorPy(b PyBuilder) DirectorPy { + return DirectorPy{ + pyBuilder : b, + } +} + +func NewDirectorC(c CBuilder) DirectorC { + return DirectorC{ + cBuilder : c, + } +} -type BPFBody struct{} +//生成python文件的步骤,接口和实现分离 +func (d *DirectorPy)ConstructPy() { + d.pyBuilder.AddCommonPyFileFront() + d.pyBuilder.AddPrivatePyFile() + d.pyBuilder.AddCommonPyFileEnd() +} -func (b *BPFBody)Generator(m *message.ConfigMessage) os.File { - return os.File{} +//生成C文件的步骤,接口和实现分离 +func (d *DirectorC)ConstructC() { + d.cBuilder.AddCommonCFileFront() + d.cBuilder.AddPrivateCFile() + d.cBuilder.AddCommonCFileEnd() } diff --git a/internal/BPF/cbuilder.go b/internal/BPF/cbuilder.go new file mode 100644 index 000000000..a538721e0 --- /dev/null +++ b/internal/BPF/cbuilder.go @@ -0,0 +1,52 @@ +package bpf + +import "os" + +//定义生成者模式中的Builder,这里的CBuilder是C文件生成的方法 +type CBuilder interface { + AddCommonCFileFront() + AddPrivateCFile() + AddCommonCFileEnd() +} + +//具体来创建python文件的ConcreteBuilder +type ConcreteBuilderC struct { + f os.File + status bool +} + +//返回ConcreteBuilderPy的实例 +func NewConcreteBuilderC() ConcreteBuilderC { + return ConcreteBuilderC{ + f: os.File{}, //TODO.. + status: false, + } +} + +//实现接口的方法 +func (c *ConcreteBuilderC)AddCommonCFileFront() { + //TODO.. +} +func (c *ConcreteBuilderC)AddPrivateCFile() { + //TODO.. +} +func (c *ConcreteBuilderC)AddCommonCFileEnd() { + //TODO.. +} + +//最后生成的成果 +type ProductC struct { + f os.File + status bool +} + +//生成成果, +func (b *ConcreteBuilderPy)GetResultC() ProductC { + return ProductC{ + f: b.f, + status: true, + } +} + + + diff --git a/internal/BPF/pybuilder.go b/internal/BPF/pybuilder.go new file mode 100644 index 000000000..3d91c27cc --- /dev/null +++ b/internal/BPF/pybuilder.go @@ -0,0 +1,52 @@ +package bpf + +import "os" + +// 定义生成者模式中的Builder,这里的Builder是python文件生成的方法 +type PyBuilder interface { + AddCommonPyFileFront() + AddPrivatePyFile() + AddCommonPyFileEnd() +} + +//具体来创建python文件的ConcreteBuilder +type ConcreteBuilderPy struct { + f os.File + status bool +} + +//返回ConcreteBuilderPy的实例 +func NewConcreteBuilderPy() ConcreteBuilderPy { + return ConcreteBuilderPy{ + f: os.File{}, //TODO.. + status: false, + } +} + +//实现接口的方法 +func (c *ConcreteBuilderPy)AddCommonPyFileFront() { + //TODO.. +} +func (c *ConcreteBuilderPy)AddPrivatePyFile() { + //TODO.. +} +func (c *ConcreteBuilderPy)AddCommonPyFileEnd() { + //TODO.. +} + +//最后生成的成果 +type ProductPy struct { + f os.File + status bool +} + +//生成成果, +func (b *ConcreteBuilderPy)GetResultPy() ProductPy { + return ProductPy{ + f: b.f, + status: true, + } +} + + + diff --git a/routers/r_sys.go b/routers/r_sys.go index ae1145fbb..30ae27f3b 100644 --- a/routers/r_sys.go +++ b/routers/r_sys.go @@ -7,6 +7,6 @@ import ( func RegisterRouterSys(r *gin.Engine) { data := sys.Data{} - r.POST("/data/collect", data.Collect) + r.POST("/data/collect", data.Handle) //r.POST("/data/display") }