mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-28 18:02:02 +08:00
tce opt ctx.cgi
This commit is contained in:
parent
da6859c5e0
commit
8f37fd7b23
@ -9,4 +9,3 @@ source etc/local.shy
|
|||||||
alias import nfs
|
alias import nfs
|
||||||
alias send send
|
alias send send
|
||||||
alias dial dial
|
alias dial dial
|
||||||
config debug on
|
|
||||||
|
@ -1162,17 +1162,17 @@ func (m *Message) Sort(key string, arg ...string) *Message { // {{{
|
|||||||
result = true
|
result = true
|
||||||
}
|
}
|
||||||
case "time":
|
case "time":
|
||||||
ti, e := time.ParseInLocation(m.Conf("time_layout"), table[i][key], time.Local)
|
ti, e := time.ParseInLocation(m.Confx("time_layout"), table[i][key], time.Local)
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
tj, e := time.ParseInLocation(m.Conf("time_layout"), table[j][key], time.Local)
|
tj, e := time.ParseInLocation(m.Confx("time_layout"), table[j][key], time.Local)
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
if tj.Before(ti) {
|
if tj.Before(ti) {
|
||||||
result = true
|
result = true
|
||||||
}
|
}
|
||||||
case "time_r":
|
case "time_r":
|
||||||
ti, e := time.ParseInLocation(m.Conf("time_layout"), table[i][key], time.Local)
|
ti, e := time.ParseInLocation(m.Confx("time_layout"), table[i][key], time.Local)
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
tj, e := time.ParseInLocation(m.Conf("time_layout"), table[j][key], time.Local)
|
tj, e := time.ParseInLocation(m.Confx("time_layout"), table[j][key], time.Local)
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
if ti.Before(tj) {
|
if ti.Before(tj) {
|
||||||
result = true
|
result = true
|
||||||
@ -1598,13 +1598,13 @@ func (m *Message) Confv(key string, args ...interface{}) interface{} { // {{{
|
|||||||
hand = x.Hand
|
hand = x.Hand
|
||||||
}
|
}
|
||||||
|
|
||||||
switch value := x.Value.(type) {
|
switch x.Value.(type) {
|
||||||
case string:
|
case string:
|
||||||
x.Value = fmt.Sprintf("%v", value)
|
x.Value = fmt.Sprintf("%v", args[0])
|
||||||
case bool:
|
case bool:
|
||||||
x.Value = Right(fmt.Sprintf("%v", value))
|
x.Value = Right(fmt.Sprintf("%v", args[0]))
|
||||||
case int:
|
case int:
|
||||||
i, e := strconv.Atoi(fmt.Sprintf("%v", value))
|
i, e := strconv.Atoi(fmt.Sprintf("%v", args[0]))
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
x.Value = i
|
x.Value = i
|
||||||
case nil:
|
case nil:
|
||||||
@ -1940,7 +1940,7 @@ var CGI = template.FuncMap{
|
|||||||
}
|
}
|
||||||
if m, ok := arg[0].(*Message); ok {
|
if m, ok := arg[0].(*Message); ok {
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return fmt.Sprintf("%v", m)
|
return fmt.Sprintf("%v", m.Format())
|
||||||
}
|
}
|
||||||
|
|
||||||
switch which := arg[1].(type) {
|
switch which := arg[1].(type) {
|
||||||
@ -2005,32 +2005,27 @@ var CGI = template.FuncMap{
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
"conf": func(arg ...interface{}) string { // {{{
|
"conf": func(arg ...interface{}) interface{} { // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, ok := arg[0].(*Message); ok {
|
if m, ok := arg[0].(*Message); ok {
|
||||||
|
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return fmt.Sprintf("%v", m)
|
list := []string{}
|
||||||
|
for k, _ := range m.target.Configs {
|
||||||
|
list = append(list, k)
|
||||||
|
}
|
||||||
|
return list
|
||||||
}
|
}
|
||||||
|
|
||||||
switch which := arg[1].(type) {
|
switch which := arg[1].(type) {
|
||||||
case string:
|
case string:
|
||||||
if len(arg) == 2 {
|
if len(arg) == 2 {
|
||||||
return m.Conf(which)
|
return m.Confv(which)
|
||||||
}
|
|
||||||
|
|
||||||
switch value := arg[2].(type) {
|
|
||||||
case string:
|
|
||||||
return m.Conf(which, value)
|
|
||||||
case int:
|
|
||||||
return fmt.Sprintf("%d", m.Confi(which, value))
|
|
||||||
case bool:
|
|
||||||
return fmt.Sprintf("%t", m.Confs(which, value))
|
|
||||||
default:
|
|
||||||
return m.Conf(which, fmt.Sprintf("%v", arg[2]))
|
|
||||||
}
|
}
|
||||||
|
return m.Confv(which, arg[2:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
@ -2051,69 +2046,155 @@ var CGI = template.FuncMap{
|
|||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
|
|
||||||
"detail": func(arg ...interface{}) string { // {{{
|
"detail": func(arg ...interface{}) interface{} { // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, ok := arg[0].(*Message); ok {
|
switch m := arg[0].(type) {
|
||||||
|
case *Message:
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return strings.Join(m.Meta["detail"], "")
|
return m.Meta["detail"]
|
||||||
}
|
}
|
||||||
return m.Detail(arg[1:]...)
|
|
||||||
|
index := 0
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case int:
|
||||||
|
index = value
|
||||||
|
case string:
|
||||||
|
i, e := strconv.Atoi(value)
|
||||||
|
m.Assert(e)
|
||||||
|
index = i
|
||||||
|
}
|
||||||
|
if len(arg) == 2 {
|
||||||
|
return m.Detail(index)
|
||||||
|
}
|
||||||
|
return m.Detail(index, arg[2])
|
||||||
|
case map[string][]string:
|
||||||
|
return strings.Join(m["detail"], "")
|
||||||
|
case []string:
|
||||||
|
return strings.Join(m, "")
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("%v", arg[0])
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
"option": func(arg ...interface{}) string { // {{{
|
"option": func(arg ...interface{}) interface{} { // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, ok := arg[0].(*Message); ok {
|
switch m := arg[0].(type) {
|
||||||
|
case *Message:
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return fmt.Sprintf("%v", m)
|
return m.Meta["option"]
|
||||||
}
|
}
|
||||||
switch which := arg[1].(type) {
|
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case int:
|
||||||
|
if 0 <= value && value < len(m.Meta["option"]) {
|
||||||
|
return m.Meta["option"][value]
|
||||||
|
}
|
||||||
case string:
|
case string:
|
||||||
if len(arg) == 2 {
|
if len(arg) == 2 {
|
||||||
return m.Option(which)
|
return m.Meta[value]
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.Option(which, arg[2:]...)
|
switch val := arg[2].(type) {
|
||||||
|
case int:
|
||||||
|
if 0 <= val && val < len(m.Meta[value]) {
|
||||||
|
return m.Meta[value][val]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
case map[string][]string:
|
||||||
|
if len(arg) == 1 {
|
||||||
|
return strings.Join(m["option"], "")
|
||||||
|
}
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case string:
|
||||||
|
return strings.Join(m[value], "")
|
||||||
|
}
|
||||||
|
case []string:
|
||||||
|
return strings.Join(m, "")
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("%v", arg[0])
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
"result": func(arg ...interface{}) string { // {{{
|
"result": func(arg ...interface{}) interface{} { // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, ok := arg[0].(*Message); ok {
|
switch m := arg[0].(type) {
|
||||||
|
case *Message:
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return strings.Join(m.Meta["result"], "")
|
return m.Meta["result"]
|
||||||
}
|
}
|
||||||
return m.Result(arg[1:]...)
|
|
||||||
|
index := 0
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case int:
|
||||||
|
index = value
|
||||||
|
case string:
|
||||||
|
i, e := strconv.Atoi(value)
|
||||||
|
m.Assert(e)
|
||||||
|
index = i
|
||||||
|
}
|
||||||
|
if len(arg) == 2 {
|
||||||
|
return m.Result(index)
|
||||||
|
}
|
||||||
|
return m.Result(index, arg[2])
|
||||||
|
case map[string][]string:
|
||||||
|
return strings.Join(m["result"], "")
|
||||||
|
case []string:
|
||||||
|
return strings.Join(m, "")
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("%v", arg[0])
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
"append": func(arg ...interface{}) string { // {{{
|
"append": func(arg ...interface{}) interface{} { // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
if m, ok := arg[0].(*Message); ok {
|
switch m := arg[0].(type) {
|
||||||
|
case *Message:
|
||||||
if len(arg) == 1 {
|
if len(arg) == 1 {
|
||||||
return fmt.Sprintf("%v", m)
|
return m.Meta["append"]
|
||||||
}
|
}
|
||||||
switch which := arg[1].(type) {
|
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case int:
|
||||||
|
if 0 <= value && value < len(m.Meta["append"]) {
|
||||||
|
return m.Meta["append"][value]
|
||||||
|
}
|
||||||
case string:
|
case string:
|
||||||
if len(arg) == 2 {
|
if len(arg) == 2 {
|
||||||
return m.Append(which)
|
return m.Meta[value]
|
||||||
}
|
}
|
||||||
|
|
||||||
return m.Append(which, arg[2:]...)
|
switch val := arg[2].(type) {
|
||||||
|
case int:
|
||||||
|
if 0 <= val && val < len(m.Meta[value]) {
|
||||||
|
return m.Meta[value][val]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
case map[string][]string:
|
||||||
|
if len(arg) == 1 {
|
||||||
|
return strings.Join(m["append"], "")
|
||||||
|
}
|
||||||
|
switch value := arg[1].(type) {
|
||||||
|
case string:
|
||||||
|
return strings.Join(m[value], "")
|
||||||
|
}
|
||||||
|
case []string:
|
||||||
|
return strings.Join(m, "")
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("%v", arg[0])
|
||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}, // }}}
|
}, // }}}
|
||||||
|
@ -66,11 +66,26 @@ func (nfs *NFS) open(name string) (*os.File, error) { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func dir(m *ctx.Message, name string, level int) { // {{{
|
func dir(m *ctx.Message, name string, level int, deep bool, fields []string) { // {{{
|
||||||
back, e := os.Getwd()
|
back, e := os.Getwd()
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
os.Chdir(name)
|
os.Chdir(name)
|
||||||
defer os.Chdir(back)
|
defer os.Chdir(back)
|
||||||
|
s, e := os.Stat(".")
|
||||||
|
for _, k := range fields {
|
||||||
|
switch k {
|
||||||
|
case "filename":
|
||||||
|
m.Add("append", "filename", "..")
|
||||||
|
case "dir":
|
||||||
|
m.Add("append", "dir", "true")
|
||||||
|
case "size":
|
||||||
|
m.Add("append", "size", 0)
|
||||||
|
case "line":
|
||||||
|
m.Add("append", "line", 0)
|
||||||
|
case "time":
|
||||||
|
m.Add("append", "time", s.ModTime().Format("2006-01-02 15:04:05"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if fs, e := ioutil.ReadDir("."); m.Assert(e) {
|
if fs, e := ioutil.ReadDir("."); m.Assert(e) {
|
||||||
for _, f := range fs {
|
for _, f := range fs {
|
||||||
@ -119,15 +134,23 @@ func dir(m *ctx.Message, name string, level int) { // {{{
|
|||||||
|
|
||||||
if !(m.Confx("dir_type") == "file" && f.IsDir() ||
|
if !(m.Confx("dir_type") == "file" && f.IsDir() ||
|
||||||
m.Confx("dir_type") == "dir" && !f.IsDir()) {
|
m.Confx("dir_type") == "dir" && !f.IsDir()) {
|
||||||
m.Add("append", "filename", filename)
|
for _, k := range fields {
|
||||||
m.Add("append", "dir", f.IsDir())
|
switch k {
|
||||||
m.Add("append", "size", f.Size())
|
case "filename":
|
||||||
m.Add("append", "line", line)
|
m.Add("append", "filename", filename)
|
||||||
m.Add("append", "time", f.ModTime().Format("2006-01-02 15:04:05"))
|
case "dir":
|
||||||
|
m.Add("append", "dir", f.IsDir())
|
||||||
|
case "size":
|
||||||
|
m.Add("append", "size", f.Size())
|
||||||
|
case "line":
|
||||||
|
m.Add("append", "line", line)
|
||||||
|
case "time":
|
||||||
|
m.Add("append", "time", f.ModTime().Format("2006-01-02 15:04:05"))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if f.IsDir() && deep {
|
||||||
if f.IsDir() {
|
dir(m, f.Name(), level+1, deep, fields)
|
||||||
dir(m, f.Name(), level+1)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -815,7 +838,9 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
|
|
||||||
"dir_name": &ctx.Config{Name: "dir_name(name/tree/path/full)", Value: "name", Help: "dir命令输出文件名的类型, name: 文件名, tree: 带缩进的文件名, path: 相对路径, full: 绝对路径"},
|
"dir_name": &ctx.Config{Name: "dir_name(name/tree/path/full)", Value: "name", Help: "dir命令输出文件名的类型, name: 文件名, tree: 带缩进的文件名, path: 相对路径, full: 绝对路径"},
|
||||||
"dir_info": &ctx.Config{Name: "dir_info(sizes/lines/files/dirs)", Value: "sizes lines files dirs", Help: "dir命令输出目录的统计信息, info: 输出统计信息, 否则输出"},
|
"dir_info": &ctx.Config{Name: "dir_info(sizes/lines/files/dirs)", Value: "sizes lines files dirs", Help: "dir命令输出目录的统计信息, info: 输出统计信息, 否则输出"},
|
||||||
|
"dir_deep": &ctx.Config{Name: "dir_deep(yes/no)", Value: "yes", Help: "dir命令输出目录的统计信息, info: 输出统计信息, 否则输出"},
|
||||||
"dir_type": &ctx.Config{Name: "dir_type(file/dir)", Value: "file", Help: "dir命令输出的文件类型, file: 只输出普通文件, dir: 只输出目录文件, 否则输出所有文件"},
|
"dir_type": &ctx.Config{Name: "dir_type(file/dir)", Value: "file", Help: "dir命令输出的文件类型, file: 只输出普通文件, dir: 只输出目录文件, 否则输出所有文件"},
|
||||||
|
"dir_field": &ctx.Config{Name: "dir_field", Value: "filename line size time", Help: "表格排序字段"},
|
||||||
"sort_field": &ctx.Config{Name: "sort_field", Value: "line", Help: "表格排序字段"},
|
"sort_field": &ctx.Config{Name: "sort_field", Value: "line", Help: "表格排序字段"},
|
||||||
"sort_order": &ctx.Config{Name: "sort_order(int/int_r/string/string_r/time/time_r)", Value: "int", Help: "表格排序类型"},
|
"sort_order": &ctx.Config{Name: "sort_order(int/int_r/string/string_r/time/time_r)", Value: "int", Help: "表格排序类型"},
|
||||||
|
|
||||||
@ -1093,7 +1118,11 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"pwd": &ctx.Command{Name: "pwd", Help: "查看当前路径", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"pwd": &ctx.Command{Name: "pwd", Help: "查看当前路径", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if len(arg) > 0 { // {{{
|
if m.Options("dir") { // {{{
|
||||||
|
m.Echo(m.Option("dir"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(arg) > 0 {
|
||||||
os.Chdir(arg[0])
|
os.Chdir(arg[0])
|
||||||
}
|
}
|
||||||
wd, e := os.Getwd()
|
wd, e := os.Getwd()
|
||||||
@ -1101,14 +1130,19 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
m.Echo(wd) // }}}
|
m.Echo(wd) // }}}
|
||||||
}},
|
}},
|
||||||
"dir": &ctx.Command{
|
"dir": &ctx.Command{
|
||||||
Name: "dir dir [dir_info info] [dir_name name|tree|path|full] [dir_type file|dir] [sort_field name] [sort_order type]",
|
Name: "dir dir [dir_deep yes|no] [dir_info info] [dir_name name|tree|path|full] [dir_type file|dir] [sort_field name] [sort_order type]",
|
||||||
Help: "查看目录, dir: 目录名, dir_info: 显示统计信息, dir_name: 文件名类型, dir_type: 文件类型, sort_field: 排序字段, sort_order: 排序类型",
|
Help: "查看目录, dir: 目录名, dir_info: 显示统计信息, dir_name: 文件名类型, dir_type: 文件类型, sort_field: 排序字段, sort_order: 排序类型",
|
||||||
Form: map[string]int{"dir_info": 1, "dir_name": 1, "dir_type": 1, "sort_field": 1, "sort_order": 1},
|
Form: map[string]int{"dir_field": 1, "dir_deep": 1, "dir_info": 1, "dir_name": 1, "dir_type": 1, "sort_field": 1, "sort_order": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
d := "." // {{{
|
d := "./" + m.Option("dir") // {{{
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
d = arg[0]
|
d = arg[0]
|
||||||
}
|
}
|
||||||
|
if s, e := os.Stat(d); m.Assert(e) && !s.IsDir() {
|
||||||
|
d = path.Dir(d)
|
||||||
|
}
|
||||||
|
fields := strings.Split(m.Confx("dir_field"), " ")
|
||||||
|
|
||||||
trip := 0
|
trip := 0
|
||||||
if m.Confx("dir_name") == "path" {
|
if m.Confx("dir_name") == "path" {
|
||||||
wd, e := os.Getwd()
|
wd, e := os.Getwd()
|
||||||
@ -1121,7 +1155,8 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
m.Option(v, 0)
|
m.Option(v, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
dir(m, d, 0)
|
m.Option("time_layout", "2006-01-02 15:04:05")
|
||||||
|
dir(m, d, 0, ctx.Right(m.Confx("dir_deep")), fields)
|
||||||
m.Sort(m.Confx("sort_field"), m.Confx("sort_order"))
|
m.Sort(m.Confx("sort_field"), m.Confx("sort_order"))
|
||||||
m.Table(func(maps map[string]string, list []string, line int) bool {
|
m.Table(func(maps map[string]string, list []string, line int) bool {
|
||||||
for i, v := range list {
|
for i, v := range list {
|
||||||
@ -1145,9 +1180,9 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"git": &ctx.Command{
|
"git": &ctx.Command{
|
||||||
Name: "git branch|status|diff|log|info arg... [git_path path]...",
|
Name: "git branch|status|diff|log|info arg... [dir path]...",
|
||||||
Help: "版本控制, branch: 分支管理, status: 查看状态, info: 查看分支与状态, git_path: 指定路径",
|
Help: "版本控制, branch: 分支管理, status: 查看状态, info: 查看分支与状态, dir: 指定路径",
|
||||||
Form: map[string]int{"git_path": 1, "git_info": 1, "git_log": 1, "git_log_form": 1},
|
Form: map[string]int{"dir": 1, "git_info": 1, "git_log": 1, "git_log_form": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if len(arg) == 0 { // {{{
|
if len(arg) == 0 { // {{{
|
||||||
arg = []string{"info"}
|
arg = []string{"info"}
|
||||||
@ -1166,10 +1201,10 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
}
|
}
|
||||||
wd, e := os.Getwd()
|
wd, e := os.Getwd()
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
if !m.Has("git_path") {
|
if !m.Has("dir") {
|
||||||
m.Option("git_path", m.Conf("git_path"))
|
m.Option("dir", m.Confx("dir"))
|
||||||
}
|
}
|
||||||
for _, p := range m.Meta["git_path"] {
|
for _, p := range m.Meta["dir"] {
|
||||||
if !path.IsAbs(p) {
|
if !path.IsAbs(p) {
|
||||||
p = path.Join(wd, p)
|
p = path.Join(wd, p)
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import ( // {{{
|
|||||||
"path"
|
"path"
|
||||||
|
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"mime"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
@ -111,6 +112,7 @@ func (web *WEB) Trans(m *ctx.Message, key string, hand func(*ctx.Message, *ctx.C
|
|||||||
http.Redirect(w, r, msg.Append("redirect"), http.StatusFound)
|
http.Redirect(w, r, msg.Append("redirect"), http.StatusFound)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if msg.Has("template") {
|
if msg.Has("template") {
|
||||||
msg.Spawn().Cmd("/render", msg.Meta["template"])
|
msg.Spawn().Cmd("/render", msg.Meta["template"])
|
||||||
return
|
return
|
||||||
@ -145,6 +147,12 @@ func (web *WEB) ServeHTTP(w http.ResponseWriter, r *http.Request) { // {{{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
r.Form.Add("path", r.URL.Path)
|
||||||
|
if strings.HasPrefix(r.URL.Path, "/index") {
|
||||||
|
r.Form.Add("dir", strings.TrimPrefix(r.URL.Path, "/index"))
|
||||||
|
r.URL.Path = "/index"
|
||||||
|
}
|
||||||
|
|
||||||
web.ServeMux.ServeHTTP(w, r)
|
web.ServeMux.ServeHTTP(w, r)
|
||||||
|
|
||||||
if web.Message != nil && web.Confs("logheaders") {
|
if web.Message != nil && web.Confs("logheaders") {
|
||||||
@ -296,6 +304,37 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
"argument": []interface{}{"tmux", "show-buffer"},
|
"argument": []interface{}{"tmux", "show-buffer"},
|
||||||
"template": "result", "title": "buffer",
|
"template": "result", "title": "buffer",
|
||||||
},
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"module": "nfs", "command": "git",
|
||||||
|
"argument": []interface{}{},
|
||||||
|
"template": "result", "title": "git",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"module": "nfs", "command": "dir",
|
||||||
|
"argument": []interface{}{"dir_type", "all", "dir_deep", "false", "dir_field", "time size line filename", "sort_field", "time", "sort_order", "time_r"},
|
||||||
|
"template": "append", "title": "",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"template": "upload", "title": "upload",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"template": "create", "title": "create",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"module": "nfs", "detail": []interface{}{"pwd"},
|
||||||
|
"template": "detail", "title": "detail",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"xujianing": []interface{}{
|
||||||
|
map[string]interface{}{
|
||||||
|
"module": "nfs", "detail": []interface{}{"pwd"},
|
||||||
|
"template": "detail", "title": "detail",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"module": "nfs", "command": "dir",
|
||||||
|
"argument": []interface{}{"dir_type", "all", "dir_deep", "false", "dir_field", "time size line filename", "sort_field", "time", "sort_order", "time_r"},
|
||||||
|
"template": "append", "title": "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}, Help: "资源列表"},
|
}, Help: "资源列表"},
|
||||||
},
|
},
|
||||||
@ -564,9 +603,48 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"/index": &ctx.Command{Name: "/index", Help: "网页门户", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/index": &ctx.Command{Name: "/index", Help: "网页门户", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
|
r := m.Optionv("request").(*http.Request)
|
||||||
w := m.Optionv("response").(http.ResponseWriter)
|
w := m.Optionv("response").(http.ResponseWriter)
|
||||||
w.Header().Add("Content-Type", "text/html")
|
|
||||||
|
|
||||||
|
login := m.Spawn().Cmd("/login")
|
||||||
|
if login.Has("template") {
|
||||||
|
m.Copy(login, "append")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
aaa := login.Appendv("aaa").(*ctx.Message)
|
||||||
|
list := m.Confv("index", aaa.Cap("username"))
|
||||||
|
if list == nil {
|
||||||
|
m.Echo("no right, please contact manager")
|
||||||
|
m.Append("template", "result")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if m.Options("details") {
|
||||||
|
if !ctx.Right(m.Find(m.Option("module")).Cmd("right", aaa.Cap("username"), "check", "command", m.Option("details")).Result(0)) {
|
||||||
|
m.Echo("no right, please contact manager")
|
||||||
|
m.Append("template", "result")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
msg := m.Find(m.Option("module")).Cmd(m.Option("details"))
|
||||||
|
m.Copy(msg, "result").Copy(msg, "append")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
dir := path.Join(m.Cap("directory"), m.Option("dir"))
|
||||||
|
if s, e := os.Stat(dir); e == nil && m.Option("dir") != "" && !s.IsDir() {
|
||||||
|
w.Header().Set("Content-type", mime.TypeByExtension(dir))
|
||||||
|
http.ServeFile(w, r, dir)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ctx.Right(m.Spawn(c).Cmd("right", aaa.Cap("username"), "check", "command", "/index", "dir", dir).Result(0)) {
|
||||||
|
m.Echo("no right, please contact manager")
|
||||||
|
m.Append("template", "result")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Option("dir", dir)
|
||||||
|
w.Header().Add("Content-Type", "text/html")
|
||||||
tpl := template.New("render").Funcs(ctx.CGI)
|
tpl := template.New("render").Funcs(ctx.CGI)
|
||||||
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("common_tmpl"))))
|
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("common_tmpl"))))
|
||||||
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("upload_tmpl"))))
|
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("upload_tmpl"))))
|
||||||
@ -577,19 +655,37 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
[]byte{27, 91, 109}, []byte("</span>"),
|
[]byte{27, 91, 109}, []byte("</span>"),
|
||||||
}
|
}
|
||||||
|
|
||||||
list := m.Confv("index", "shy")
|
|
||||||
for _, v := range list.([]interface{}) {
|
for _, v := range list.([]interface{}) {
|
||||||
val := v.(map[string]interface{})
|
val := v.(map[string]interface{})
|
||||||
msg := m.Find(val["module"].(string)).Cmd(val["command"], val["argument"])
|
if _, ok := val["detail"]; ok {
|
||||||
for i, v := range msg.Meta["result"] {
|
detail := val["detail"].([]interface{})
|
||||||
b := []byte(v)
|
msg := m.Spawn().Add("detail", detail[0].(string), detail[1:])
|
||||||
for i := 0; i < len(replace)-1; i += 2 {
|
msg.Option("title", val["title"])
|
||||||
b = bytes.Replace(b, replace[i], replace[i+1], -1)
|
msg.Option("module", val["module"])
|
||||||
}
|
m.Assert(tpl.ExecuteTemplate(w, val["template"].(string), msg))
|
||||||
msg.Meta["result"][i] = string(b)
|
continue
|
||||||
|
}
|
||||||
|
if _, ok := val["module"]; ok {
|
||||||
|
if _, ok := val["command"]; ok {
|
||||||
|
msg := m.Find(val["module"].(string)).Cmd(val["command"], val["argument"])
|
||||||
|
for i, v := range msg.Meta["result"] {
|
||||||
|
b := []byte(v)
|
||||||
|
for i := 0; i < len(replace)-1; i += 2 {
|
||||||
|
b = bytes.Replace(b, replace[i], replace[i+1], -1)
|
||||||
|
}
|
||||||
|
msg.Meta["result"][i] = string(b)
|
||||||
|
}
|
||||||
|
if msg.Option("title", val["title"]) == "" {
|
||||||
|
msg.Option("title", m.Option("dir"))
|
||||||
|
}
|
||||||
|
m.Assert(tpl.ExecuteTemplate(w, val["template"].(string), msg))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := val["template"]; ok {
|
||||||
|
m.Assert(tpl.ExecuteTemplate(w, val["template"].(string), m))
|
||||||
}
|
}
|
||||||
msg.Option("title", val["title"])
|
|
||||||
m.Assert(tpl.ExecuteTemplate(w, val["template"].(string), msg.Meta))
|
|
||||||
}
|
}
|
||||||
}},
|
}},
|
||||||
"/travel": &ctx.Command{Name: "/travel", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/travel": &ctx.Command{Name: "/travel", Help: "文件上传", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
@ -710,13 +806,9 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
// 共享列表
|
// 共享列表
|
||||||
share := m.Sess("share", m.Target())
|
share := m.Sess("share", m.Target())
|
||||||
index := share.Target().Index
|
index := share.Target().Index
|
||||||
m.Log("fuck", "%v", share.Target().Index)
|
|
||||||
m.Log("fuck", "%v", aaa.Format())
|
|
||||||
if index != nil && index[aaa.Cap("username")] != nil {
|
if index != nil && index[aaa.Cap("username")] != nil {
|
||||||
for k, v := range index[aaa.Cap("username")].Index {
|
for k, v := range index[aaa.Cap("username")].Index {
|
||||||
m.Log("fuck", "%v", v.Commands)
|
|
||||||
for _, j := range v.Commands {
|
for _, j := range v.Commands {
|
||||||
m.Log("fuck", "%v", j.Shares)
|
|
||||||
for _, n := range j.Shares {
|
for _, n := range j.Shares {
|
||||||
for _, nn := range n {
|
for _, nn := range n {
|
||||||
if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match {
|
if match, e := regexp.MatchString(nn, m.Option("dir")); m.Assert(e) && match {
|
||||||
@ -925,19 +1017,15 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
}},
|
}},
|
||||||
"/render": &ctx.Command{Name: "/render [main [tmpl]]", Help: "模板响应, main: 模板入口, tmpl: 附加模板", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/render": &ctx.Command{Name: "/render [main [tmpl]]", Help: "模板响应, main: 模板入口, tmpl: 附加模板", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
w := m.Optionv("response").(http.ResponseWriter) // {{{
|
w := m.Optionv("response").(http.ResponseWriter) // {{{
|
||||||
|
w.Header().Add("Content-Type", "text/html")
|
||||||
|
|
||||||
tpl := template.Must(template.New("render").Funcs(ctx.CGI).ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("common_tmpl"))))
|
tpl := template.New("render").Funcs(ctx.CGI)
|
||||||
|
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), m.Conf("common_tmpl"))))
|
||||||
if len(arg) > 1 {
|
if len(arg) > 1 {
|
||||||
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), arg[1])))
|
tpl = template.Must(tpl.ParseGlob(path.Join(m.Conf("template_dir"), arg[1])))
|
||||||
}
|
}
|
||||||
|
|
||||||
main := m.Conf("common_main")
|
m.Assert(tpl.ExecuteTemplate(w, m.Confx("common_main", arg, 0), m.Message()))
|
||||||
if len(arg) > 0 {
|
|
||||||
main = arg[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
w.Header().Add("Content-Type", "text/html")
|
|
||||||
m.Assert(tpl.ExecuteTemplate(w, main, m.Message()))
|
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"/json": &ctx.Command{Name: "/json", Help: "json响应", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"/json": &ctx.Command{Name: "/json", Help: "json响应", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
|
@ -22,14 +22,95 @@
|
|||||||
<body>
|
<body>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{define "message"}}
|
{{define "notice"}}
|
||||||
<fieldset class="message"><legend>message</legend>
|
<fieldset class="notice"><legend>notice</legend>
|
||||||
<pre>{{meta .message}}</pre>
|
<pre>{{result .Meta}}</pre>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<style>
|
<style>
|
||||||
.message {
|
.notice {color:red}
|
||||||
color:red;
|
</style>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{define "detail"}}
|
||||||
|
<fieldset><legend>{{append . "title"}}</legend>
|
||||||
|
<a onclick="return action('{{option .Meta "module"}}', '{{detail .Meta}}')" href="/"><code>{{detail .Meta}}</code></a>
|
||||||
|
<pre><code class="result"></code></pre>
|
||||||
|
|
||||||
|
</fieldset>
|
||||||
|
<script>
|
||||||
|
function action(module, detail, cb) {
|
||||||
|
var xhr = new XMLHttpRequest();
|
||||||
|
cb = function(msg) {
|
||||||
|
var result = document.getElementsByClassName("result")[0];
|
||||||
|
result.innerHTML = msg.result;
|
||||||
}
|
}
|
||||||
|
xhr.onreadystatechange = function() {
|
||||||
|
switch (xhr.readyState) {
|
||||||
|
case 4:
|
||||||
|
switch (xhr.status) {
|
||||||
|
case 200:
|
||||||
|
try {
|
||||||
|
var msg = JSON.parse(xhr.responseText||'{"result":[]}');
|
||||||
|
} catch (e) {
|
||||||
|
msg = {"result": [xhr.responseText]}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg && console.log(msg)
|
||||||
|
msg.result && console.log(msg.result.join(""));
|
||||||
|
typeof cb == "function" && cb(msg)
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xhr.open("POST", "?module="+encodeURIComponent(module)+"&details="+encodeURIComponent(detail));
|
||||||
|
xhr.send()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{define "result"}}
|
||||||
|
<fieldset><legend>{{append . "title"}}</legend>
|
||||||
|
<pre><code>{{result .Meta|unscaped}}</code></pre>
|
||||||
|
</fieldset>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{define "append_link"}}
|
||||||
|
<td><a onclick="return jump('{{.}}')" href="{{.}}"><code>{{.}}</code></a></td>
|
||||||
|
<script>
|
||||||
|
function jump(to) {
|
||||||
|
location.href = location.href + "/" +to;
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{define "append"}}
|
||||||
|
<fieldset><legend>{{append . "title"}}</legend>
|
||||||
|
<table class="append">
|
||||||
|
{{$msg := .}}
|
||||||
|
{{$ncol := append . |len}}
|
||||||
|
{{$nrow := append . 0|append .|len}}
|
||||||
|
<tr>{{range append .}}<th class="append_head">{{.}}</th>{{end}}</tr>
|
||||||
|
{{range $row, $val := append . 0|append .}}
|
||||||
|
<tr>
|
||||||
|
{{range append $msg}}
|
||||||
|
{{$value := append $msg . $row}}
|
||||||
|
{{if eq . "filename"}}
|
||||||
|
{{template "append_link" $value}}
|
||||||
|
{{else}}
|
||||||
|
<td><code>{{$value}}</code></td>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
|
<style>
|
||||||
|
.append td {padding-right:20px}
|
||||||
|
.append th {background-color:lightgreen}
|
||||||
|
.append code {font-size:14px}
|
||||||
</style>
|
</style>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
|
@ -84,8 +84,8 @@
|
|||||||
{{$meta := .Meta}}
|
{{$meta := .Meta}}
|
||||||
|
|
||||||
{{template "head" $meta}}
|
{{template "head" $meta}}
|
||||||
{{if meta $meta.message}}
|
{{if meta $meta.notice}}
|
||||||
{{template "message" $meta}}
|
{{template "notice" $meta}}
|
||||||
{{end}}
|
{{end}}
|
||||||
{{template "login" $meta}}
|
{{template "login" $meta}}
|
||||||
{{template "tail" $meta}}
|
{{template "tail" $meta}}
|
||||||
|
@ -112,12 +112,6 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{define "result"}}
|
|
||||||
<fieldset><legend>{{meta . "title"}}</legend>
|
|
||||||
<pre><code>{{meta . "result"|unscaped}}</code></pre>
|
|
||||||
</fieldset>
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
{{define "upload"}}
|
{{define "upload"}}
|
||||||
<fieldset><legend>upload</legend>
|
<fieldset><legend>upload</legend>
|
||||||
<form method="POST" action="/create?dir={{option . "dir"}}" enctype="multipart/form-data">
|
<form method="POST" action="/create?dir={{option . "dir"}}" enctype="multipart/form-data">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user