Compare commits
	
		
			1 Commits 
		
	
	
		
			06b6b6ed9b
			...
			2ecac19807
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 2ecac19807 | 
							
								
								
									
										46
									
								
								configui.go
								
								
								
								
							
							
						
						
									
										46
									
								
								configui.go
								
								
								
								
							|  | @ -8,6 +8,7 @@ import ( | ||||||
| 	"html/template" | 	"html/template" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
|  | 	"runtime" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
|  | @ -17,8 +18,9 @@ import ( | ||||||
| 	"kumoly.io/tools/configui/public" | 	"kumoly.io/tools/configui/public" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var UNIX_SHELL = "/usr/bin/sh" | const UNIX_SHELL = "/usr/bin/sh" | ||||||
| var WIN_SHELL = "C:\\Windows\\System32\\cmd" | const WIN_SHELL = "C:\\Windows\\System32\\cmd" | ||||||
|  | const DARWIN_SHELL = "/bin/bash" | ||||||
| 
 | 
 | ||||||
| const version = "v0.1.12" | const version = "v0.1.12" | ||||||
| 
 | 
 | ||||||
|  | @ -55,6 +57,7 @@ type ConfigUI struct { | ||||||
| 	Prod       bool   `json:"production"` | 	Prod       bool   `json:"production"` | ||||||
| 	BaseUrl    string `json:"base_url"` | 	BaseUrl    string `json:"base_url"` | ||||||
| 	ConfigPath string `json:"config_path"` | 	ConfigPath string `json:"config_path"` | ||||||
|  | 	SHELL      string `json:"shell"` | ||||||
| 
 | 
 | ||||||
| 	NoReconfig bool   `json:"no_reconfig"` | 	NoReconfig bool   `json:"no_reconfig"` | ||||||
| 	AllowIP    string `json:"allow_ip"` | 	AllowIP    string `json:"allow_ip"` | ||||||
|  | @ -74,8 +77,8 @@ type ConfigUI struct { | ||||||
| 	LogLevel klog.Llevel `json:"log_level"` | 	LogLevel klog.Llevel `json:"log_level"` | ||||||
| 
 | 
 | ||||||
| 	// Running commands
 | 	// Running commands
 | ||||||
| 	Onitachi []*Oni `json:"-"` | 	Onitachi []*Oni         `json:"onitachi"` | ||||||
| 	OniIndex map[string]int | 	oniIndex map[string]int `json:"-"` | ||||||
| 
 | 
 | ||||||
| 	TmplFS     embed.FS `json:"-"` | 	TmplFS     embed.FS `json:"-"` | ||||||
| 	tmpl       *engine.Engine | 	tmpl       *engine.Engine | ||||||
|  | @ -123,8 +126,18 @@ func New() *ConfigUI { | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
| 	}).ParseFS(tmplFS, "templates/*.tmpl", "templates/**/*.tmpl")) | 	}).ParseFS(tmplFS, "templates/*.tmpl", "templates/**/*.tmpl")) | ||||||
|  | 	sh := "" | ||||||
|  | 	switch runtime.GOOS { | ||||||
|  | 	case "darwin": | ||||||
|  | 		sh = DARWIN_SHELL | ||||||
|  | 	case "windows": | ||||||
|  | 		sh = WIN_SHELL | ||||||
|  | 	default: | ||||||
|  | 		sh = UNIX_SHELL | ||||||
|  | 	} | ||||||
| 	return &ConfigUI{ | 	return &ConfigUI{ | ||||||
| 		fileIndex:  map[string]int{}, | 		fileIndex:  map[string]int{}, | ||||||
|  | 		SHELL:      sh, | ||||||
| 		Prod:       true, | 		Prod:       true, | ||||||
| 		AppName:    "ConfigUI", | 		AppName:    "ConfigUI", | ||||||
| 		BaseUrl:    "/", | 		BaseUrl:    "/", | ||||||
|  | @ -136,7 +149,7 @@ func New() *ConfigUI { | ||||||
| 		cmdTimeout: time.Second * 10, | 		cmdTimeout: time.Second * 10, | ||||||
| 		LogLevel:   klog.Lerror | klog.Linfo, | 		LogLevel:   klog.Lerror | klog.Linfo, | ||||||
| 		log:        klog.Sub("ConfigUI"), | 		log:        klog.Sub("ConfigUI"), | ||||||
| 		OniIndex:   make(map[string]int), | 		oniIndex:   make(map[string]int), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -179,6 +192,28 @@ func (cui *ConfigUI) LoadConfig(confstr string) error { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// construct oni
 | ||||||
|  | 	for _, o := range tmpConf.Onitachi { | ||||||
|  | 		if o.Cmd == "" { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		if o.Name == "" { | ||||||
|  | 			o.Name = o.Cmd | ||||||
|  | 		} | ||||||
|  | 		// update if exist
 | ||||||
|  | 		j, ok := cui.oniIndex[o.Name] | ||||||
|  | 		if ok { | ||||||
|  | 			cui.Onitachi[j].Cmd = o.Cmd | ||||||
|  | 			cui.Onitachi[j].Args = o.Args | ||||||
|  | 			cui.Onitachi[j].Envs = o.Envs | ||||||
|  | 			cui.Onitachi[j].Dir = o.Dir | ||||||
|  | 			cui.Onitachi[j].Policy = o.Policy | ||||||
|  | 		} else { | ||||||
|  | 			cui.oniIndex[o.Name] = len(cui.Onitachi) | ||||||
|  | 			cui.Onitachi = append(cui.Onitachi, o) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// copy
 | 	// copy
 | ||||||
| 	cui.configLock.Lock() | 	cui.configLock.Lock() | ||||||
| 	defer cui.configLock.Unlock() | 	defer cui.configLock.Unlock() | ||||||
|  | @ -191,6 +226,7 @@ func (cui *ConfigUI) LoadConfig(confstr string) error { | ||||||
| 	cui.HideConfig = tmpConf.HideConfig | 	cui.HideConfig = tmpConf.HideConfig | ||||||
| 	cui.NoReconfig = tmpConf.NoReconfig | 	cui.NoReconfig = tmpConf.NoReconfig | ||||||
| 	cui.ResultBellow = tmpConf.ResultBellow | 	cui.ResultBellow = tmpConf.ResultBellow | ||||||
|  | 	cui.SHELL = tmpConf.SHELL | ||||||
| 
 | 
 | ||||||
| 	cui.Actions = tmpConf.Actions | 	cui.Actions = tmpConf.Actions | ||||||
| 	for i := range cui.Actions { | 	for i := range cui.Actions { | ||||||
|  |  | ||||||
							
								
								
									
										4
									
								
								file.go
								
								
								
								
							
							
						
						
									
										4
									
								
								file.go
								
								
								
								
							|  | @ -80,9 +80,9 @@ func (f *File) Do(CmdTimeout time.Duration, report chan int) (string, error) { | ||||||
| 	// prepare cmd
 | 	// prepare cmd
 | ||||||
| 	cmd := &exec.Cmd{} | 	cmd := &exec.Cmd{} | ||||||
| 	if runtime.GOOS == "windows" { | 	if runtime.GOOS == "windows" { | ||||||
| 		cmd = exec.Command(WIN_SHELL, "/c", f.Cmd) | 		cmd = exec.Command(f.owner.SHELL, "/c", f.Cmd) | ||||||
| 	} else { | 	} else { | ||||||
| 		cmd = exec.Command(UNIX_SHELL, "-c", f.Cmd) | 		cmd = exec.Command(f.owner.SHELL, "-c", f.Cmd) | ||||||
| 	} | 	} | ||||||
| 	f.owner.log.Info("DO: ", f.Cmd) | 	f.owner.log.Info("DO: ", f.Cmd) | ||||||
| 	done := make(chan string, 1) | 	done := make(chan string, 1) | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										1
									
								
								go.mod
								
								
								
								
							|  | @ -10,4 +10,5 @@ require ( | ||||||
| require ( | require ( | ||||||
| 	github.com/mattn/go-isatty v0.0.14 // indirect | 	github.com/mattn/go-isatty v0.0.14 // indirect | ||||||
| 	golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect | 	golang.org/x/sys v0.0.0-20211103235746-7861aae1554b // indirect | ||||||
|  | 	kumoly.io/lib/stat v0.0.1 // indirect | ||||||
| ) | ) | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										2
									
								
								go.sum
								
								
								
								
							|  | @ -10,3 +10,5 @@ kumoly.io/lib/ksrv v0.0.1 h1:JfWwJ9GeiTtDfGoeG7YxJwsckralbhsLKEPLQb20Uzo= | ||||||
| kumoly.io/lib/ksrv v0.0.1/go.mod h1:ykHXeAPjNvA5jEZo5rp32edzkugLf0e+2pspct3FOFQ= | kumoly.io/lib/ksrv v0.0.1/go.mod h1:ykHXeAPjNvA5jEZo5rp32edzkugLf0e+2pspct3FOFQ= | ||||||
| kumoly.io/lib/ksrv v0.0.2-0.20211112060911-0d61b343a298 h1:0raqoIXmNpD6s1SrJbieAyIIkDyhe+aqfaXvx8wenrI= | kumoly.io/lib/ksrv v0.0.2-0.20211112060911-0d61b343a298 h1:0raqoIXmNpD6s1SrJbieAyIIkDyhe+aqfaXvx8wenrI= | ||||||
| kumoly.io/lib/ksrv v0.0.2-0.20211112060911-0d61b343a298/go.mod h1:pwd+NspxnoxPJAETRY2V4i2qZc+orKLxvWzGUBiqBW8= | kumoly.io/lib/ksrv v0.0.2-0.20211112060911-0d61b343a298/go.mod h1:pwd+NspxnoxPJAETRY2V4i2qZc+orKLxvWzGUBiqBW8= | ||||||
|  | kumoly.io/lib/stat v0.0.1 h1:Ck596El7Ixk7GZyzQq/86F1YCl7iYffHmzEdFx1sSRM= | ||||||
|  | kumoly.io/lib/stat v0.0.1/go.mod h1:zqMV9q4TC94VGbpDn/mGBTwRNWBVWlVg1taLlCBAWc8= | ||||||
|  |  | ||||||
							
								
								
									
										27
									
								
								handler.go
								
								
								
								
							
							
						
						
									
										27
									
								
								handler.go
								
								
								
								
							|  | @ -196,8 +196,8 @@ func (cui *ConfigUI) Download(w http.ResponseWriter, r *http.Request) { | ||||||
| 				panic(err) | 				panic(err) | ||||||
| 			} | 			} | ||||||
| 			w.Header().Set( | 			w.Header().Set( | ||||||
| 				"Content-Disposition", ` | 				"Content-Disposition", | ||||||
| 				attachment; filename="`+cui.AppName+`.json"`, | 				`attachment; filename="`+cui.AppName+`.json"`, | ||||||
| 			) | 			) | ||||||
| 			w.Write(data) | 			w.Write(data) | ||||||
| 			return | 			return | ||||||
|  | @ -260,13 +260,23 @@ func (cui *ConfigUI) GetConfig(w http.ResponseWriter, r *http.Request) { | ||||||
| 	w.Write(data) | 	w.Write(data) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cui *ConfigUI) GetRunning(w http.ResponseWriter, r *http.Request) { | func (cui *ConfigUI) GetOni(w http.ResponseWriter, r *http.Request) { | ||||||
| 	ksrv.JSON(w, cui.Onitachi) | 	name := r.URL.Query().Get("name") | ||||||
|  | 	if name == "" { | ||||||
|  | 		ksrv.JSON(w, cui.Onitachi) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	i, ok := cui.oniIndex[name] | ||||||
|  | 	if !ok { | ||||||
|  | 		panic(ErrorOniNotFound.New(name)) | ||||||
|  | 	} | ||||||
|  | 	oni := cui.Onitachi[i] | ||||||
|  | 	ksrv.JSON(w, oni) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cui *ConfigUI) OniStart(w http.ResponseWriter, r *http.Request) { | func (cui *ConfigUI) OniStart(w http.ResponseWriter, r *http.Request) { | ||||||
| 	name := r.URL.Query().Get("name") | 	name := r.URL.Query().Get("name") | ||||||
| 	i, ok := cui.OniIndex[name] | 	i, ok := cui.oniIndex[name] | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		panic(ErrorOniNotFound.New(name)) | 		panic(ErrorOniNotFound.New(name)) | ||||||
| 	} | 	} | ||||||
|  | @ -277,13 +287,16 @@ func (cui *ConfigUI) OniStart(w http.ResponseWriter, r *http.Request) { | ||||||
| 	case STARTED: | 	case STARTED: | ||||||
| 		panic(ErrorOniHasStarted) | 		panic(ErrorOniHasStarted) | ||||||
| 	} | 	} | ||||||
| 	oni.Start() | 	err := oni.Start() | ||||||
|  | 	if err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
| 	w.Write([]byte("ok")) | 	w.Write([]byte("ok")) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (cui *ConfigUI) OniStop(w http.ResponseWriter, r *http.Request) { | func (cui *ConfigUI) OniStop(w http.ResponseWriter, r *http.Request) { | ||||||
| 	name := r.URL.Query().Get("name") | 	name := r.URL.Query().Get("name") | ||||||
| 	i, ok := cui.OniIndex[name] | 	i, ok := cui.oniIndex[name] | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		panic(ErrorOniNotFound.New(name)) | 		panic(ErrorOniNotFound.New(name)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -17,10 +17,6 @@ | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@creativebulma/bulma-tooltip": "^1.2.0", |     "@creativebulma/bulma-tooltip": "^1.2.0", | ||||||
|     "bulma": "^0.9.3", |     "bulma": "^0.9.3", | ||||||
|     "prismjs": "^1.25.0", |  | ||||||
|     "sass": "^1.43.2" |     "sass": "^1.43.2" | ||||||
|   }, |  | ||||||
|   "devDependencies": { |  | ||||||
|     "parcel": "^2.0.0" |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										26
									
								
								server.go
								
								
								
								
							
							
						
						
									
										26
									
								
								server.go
								
								
								
								
							|  | @ -5,6 +5,7 @@ import ( | ||||||
| 	"strings" | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"kumoly.io/lib/ksrv" | 	"kumoly.io/lib/ksrv" | ||||||
|  | 	"kumoly.io/lib/stat" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func (cui *ConfigUI) ServeHTTP(w http.ResponseWriter, r *http.Request) { | func (cui *ConfigUI) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||||
|  | @ -98,9 +99,30 @@ func (cui *ConfigUI) mux() *http.ServeMux { | ||||||
| 			w.WriteHeader(404) | 			w.WriteHeader(404) | ||||||
| 		} | 		} | ||||||
| 	}) | 	}) | ||||||
| 	cuiR.HandleFunc("/api/running", func(w http.ResponseWriter, r *http.Request) { | 	cuiR.HandleFunc("/api/profile", func(w http.ResponseWriter, r *http.Request) { | ||||||
| 		if r.Method == "GET" { | 		if r.Method == "GET" { | ||||||
| 			cui.GetRunning(w, r) | 			ksrv.JSON(w, stat.GetProfile()) | ||||||
|  | 		} else { | ||||||
|  | 			w.WriteHeader(404) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 	cuiR.HandleFunc("/api/oni", func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		if r.Method == "GET" { | ||||||
|  | 			cui.GetOni(w, r) | ||||||
|  | 		} else { | ||||||
|  | 			w.WriteHeader(404) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 	cuiR.HandleFunc("/api/oni/start", func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		if r.Method == "POST" { | ||||||
|  | 			cui.OniStart(w, r) | ||||||
|  | 		} else { | ||||||
|  | 			w.WriteHeader(404) | ||||||
|  | 		} | ||||||
|  | 	}) | ||||||
|  | 	cuiR.HandleFunc("/api/oni/stop", func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		if r.Method == "POST" { | ||||||
|  | 			cui.OniStart(w, r) | ||||||
| 		} else { | 		} else { | ||||||
| 			w.WriteHeader(404) | 			w.WriteHeader(404) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
|       </li> |       </li> | ||||||
|       {{ end }} |       {{ end }} | ||||||
|     </ul> |     </ul> | ||||||
|     <!-- {{if .Actions}} |     {{/* {{if .Actions}} | ||||||
|     <p class="menu-label"> |     <p class="menu-label"> | ||||||
|       Actions |       Actions | ||||||
|     </p> |     </p> | ||||||
|  | @ -31,7 +31,7 @@ | ||||||
|       </li> |       </li> | ||||||
|       {{- end -}} |       {{- end -}} | ||||||
|     </ul> |     </ul> | ||||||
|     {{end}} --> |     {{end}} */}} | ||||||
|     {{if not .HideConfig}} |     {{if not .HideConfig}} | ||||||
|     <p class="menu-label"> |     <p class="menu-label"> | ||||||
|       System |       System | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue