diff --git a/core/function.go b/core/function.go index c5dc639..1cc5757 100644 --- a/core/function.go +++ b/core/function.go @@ -114,11 +114,11 @@ func AddCommand(prefix string, cmds []Function) { if !cmd.Regex { for i := range cmd.Rules { if prefix != "" { - cmd.Rules[i] += prefix + `\s+` + cmd.Rules[i] + cmd.Rules[i] = prefix + `\s+` + cmd.Rules[i] } cmd.Rules[i] = strings.Replace(cmd.Rules[i], " ", `\s+`, -1) cmd.Rules[i] = strings.Replace(cmd.Rules[i], "?", `(\S+)`, -1) - cmd.Rules[i] += "^" + cmd.Rules[i] + "$" + cmd.Rules[i] = "^" + cmd.Rules[i] + "$" } } functions = append(functions, cmd) diff --git a/develop/jd_help/help.go b/develop/jd_help/help.go index 4b7494f..23c6b69 100644 --- a/develop/jd_help/help.go +++ b/develop/jd_help/help.go @@ -96,7 +96,7 @@ func init() { } } for i := range f { - qinglong.SetEnv(&qinglong.Env{ + qinglong.SetEnv(qinglong.Env{ Name: i, Value: f[i], }) diff --git a/develop/qinglong/config.go b/develop/qinglong/config.go index 11d7a47..91d8221 100644 --- a/develop/qinglong/config.go +++ b/develop/qinglong/config.go @@ -1 +1,115 @@ package qinglong + +import ( + "fmt" + "regexp" + "strings" + + "github.com/cdle/sillyGirl/core" + "github.com/cdle/sillyGirl/im" +) + +func init() { + core.AddCommand("ql", []core.Function{ + { + Rules: []string{`config`}, + Admin: true, + Handle: func(_ im.Sender) interface{} { + config, err := GetConfig() + if err != nil { + return err + } + return config + }, + }, + }) +} + +func GetConfig() (string, error) { + config := "data" + if err := req(CONFIG, &config, "/config.sh"); err != nil { + return "", err + } + return config, nil +} + +func SvaeConfig(content string) error { + if err := req(POST, CONFIG, map[string]interface{}{ + "name": "config.sh", + "content": content, + }, "/save"); err != nil { + return err + } + return nil +} + +func GetEnvs(searchValue string) ([]Env, error) { + envs := []Env{} + content, err := GetConfig() + if err != nil { + return nil, err + } + lines := strings.Split(content, "\n") + for _, line := range lines { + if searchValue != "" && !strings.Contains(line, searchValue) { + continue + } + for i, pattern := range []string{`^\s*export\s+([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*#[#\s]*export\s+([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*#[#\s]*([^'"=\s]+)=[ '"]?(.*?)['"]?$`} { + if v := regexp.MustCompile(pattern).FindStringSubmatch(line); len(v) > 0 { + e := Env{} + if i == 1 || i == 3 { + e.Status = 1 + } + e.Name = v[1] + e.Value = v[2] + envs = append(envs, e) + break + } + } + } + return envs, nil +} + +func SetEnv(env Env) error { + config, err := GetConfig() + if err != nil { + return err + } + lines := strings.Split(config, "\n") + set := false + for j, line := range lines { + for i, pattern := range []string{`^\s*export\s+([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*#[#\s]*export\s+([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*([^'"=\s]+)=[ '"]?(.*?)['"]?$`, `^\s*#[#\s]*([^'"=\s]+)=[ '"]?(.*?)['"]?$`} { + if v := regexp.MustCompile(pattern).FindStringSubmatch(line); len(v) > 0 { + e := Env{} + if i == 1 || i == 3 { + e.Status = 1 + } + e.Name = v[1] + e.Value = v[2] + if env.Name != e.Name { + continue + } + if env.Value != e.Value { + e.Value = env.Value + } + if env.Status != e.Status { + e.Status = env.Status + } + h := "" + if e.Status == 1 { + h = "# " + } + if i <= 1 { + h = "export " + } + lines[j] = h + fmt.Sprintf("%s=\"%s\"", e.Name, e.Value) + set = true + break + } + } + } + if !set { + lines = append(lines, fmt.Sprintf("export %s=\"%s\"", env.Name, env.Value)) + } + return SvaeConfig(strings.Join(lines, "\n")) +} diff --git a/develop/qinglong/env.go b/develop/qinglong/env.go index 6bfd2cb..8fb8815 100644 --- a/develop/qinglong/env.go +++ b/develop/qinglong/env.go @@ -65,7 +65,7 @@ func init() { }, }, { - Rules: []string{`env find ?)`}, + Rules: []string{`env find ?`}, Admin: true, Handle: func(s im.Sender) interface{} { m := s.Get() @@ -84,15 +84,13 @@ func init() { }, }, { - Rules: []string{`export ([^'"=]+)=['"]?([^=]+?)['"]?`}, - Regex: true, + Rules: []string{`env set ? ?`}, Admin: true, Handle: func(s im.Sender) interface{} { - e := &Env{ + err := SetEnv(Env{ Name: s.Get(0), Value: s.Get(1), - } - err := SetEnv(e) + }) if err != nil { return err } @@ -135,39 +133,39 @@ func GetEnv(name string) (*Env, error) { return nil, nil } -func GetEnvs(searchValue string) ([]Env, error) { - er := EnvResponse{} - if err := req(ENVS, &er, "?searchValue="+searchValue); err != nil { - return nil, err - } - return er.Data, nil -} +// func GetEnvs(searchValue string) ([]Env, error) { +// er := EnvResponse{} +// if err := req(ENVS, &er, "?searchValue="+searchValue); err != nil { +// return nil, err +// } +// return er.Data, nil +// } -func SetEnv(e *Env) error { - if e.Name == "JD_COOKIE" { - return errors.New("不支持的操作") - } - envs, err := GetEnvs("") - if err != nil { - return err - } - for _, env := range envs { - if env.Name == e.Name { - if e.Remarks != "" { - env.Remarks = e.Remarks - } - if e.Value != "" { - env.Value = e.Value - } - if e.Name != "" { - env.Name = e.Name - } - env.Timestamp = "" - return req(PUT, ENVS, env) - } - } - return AddEnv(e) -} +// func SetEnv(e *Env) error { +// if e.Name == "JD_COOKIE" { +// return errors.New("不支持的操作") +// } +// envs, err := GetEnvs("") +// if err != nil { +// return err +// } +// for _, env := range envs { +// if env.Name == e.Name { +// if e.Remarks != "" { +// env.Remarks = e.Remarks +// } +// if e.Value != "" { +// env.Value = e.Value +// } +// if e.Name != "" { +// env.Name = e.Name +// } +// env.Timestamp = "" +// return req(PUT, ENVS, env) +// } +// } +// return AddEnv(e) +// } func ModEnv(e *Env) error { envs, err := GetEnvs("") @@ -205,8 +203,5 @@ func formatEnv(env *Env) string { if env.Status != 0 { status = "已禁用" } - if env.Remarks == "" { - env.Remarks = "无" - } - return fmt.Sprintf("名称:%v\n编号:%v\n备注:%v\n状态:%v\n时间:%v\n值:%v", env.Name, env.ID, env.Remarks, status, env.Timestamp, env.Value) + return fmt.Sprintf("名称:%v\n备注:%v\n状态:%v\n值:%v", env.Name, env.Remarks, status, env.Value) } diff --git a/develop/qinglong/init.go b/develop/qinglong/init.go index cfb2cda..02dcece 100644 --- a/develop/qinglong/init.go +++ b/develop/qinglong/init.go @@ -31,6 +31,7 @@ var POST = "POST" var DELETE = "DELETE" var ENVS = "envs" var CRONS = "crons" +var CONFIG = "configs" type Carrier struct { Get string @@ -79,6 +80,7 @@ func req(ps ...interface{}) error { body := []byte{} api := ENVS apd := "" + var get *string var c *Carrier var toParse interface{} for _, p := range ps { @@ -87,7 +89,7 @@ func req(ps ...interface{}) error { switch p.(string) { case GET, POST, DELETE, PUT: method = p.(string) - case ENVS, CRONS: + case ENVS, CRONS, CONFIG: api = p.(string) default: apd = p.(string) @@ -96,6 +98,8 @@ func req(ps ...interface{}) error { body = p.([]byte) case *Carrier: c = p.(*Carrier) + case *string: + get = p.(*string) default: if strings.Contains(reflect.TypeOf(p).String(), "*") { toParse = p @@ -135,11 +139,13 @@ func req(ps ...interface{}) error { } if toParse != nil { if err := json.Unmarshal(data, toParse); err != nil { - fmt.Println(err) return err } - // fmt.Println(string(data)) - // fmt.Println(toParse) + } + if get != nil { + if *get, err = jsonparser.GetString(data, *get); err != nil { + return err + } } if c != nil { c.Value, _ = jsonparser.GetString(data, strings.Split(c.Get, ".")...)