From d03c481b335034206824a140894d456f423d3252 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 26 Jan 2024 07:11:35 +1200 Subject: [PATCH] Initial 2024-01-26 --- .editorconfig | 5 + .gitignore | 29 + cmpSnipper/cmpSnipper.go | 122 ++++ cmpSnipper/cmpSnipperConf.go | 103 ++++ cmpSnipper/cmpSnipperHttpServ.go | 84 +++ cmpSnipper/cmpSnipperHttpUtil.go | 245 ++++++++ cmpSnipper/cmpSnipperHttpWsHandle.go | 168 ++++++ cmpSnipper/cmpSnipperLog.go | 57 ++ cmpSnipper/cmpSnipperSignal.go | 84 +++ cmpSnipper/cmpSnipperSnip.go | 78 +++ cmpSnipper/cmpSnipperSnipCliList.go | 12 + cmpSnipper/cmpSnipperSnipLeftMenu.go | 32 ++ cmpSnipper/cmpSnipperSnipPing.go | 70 +++ cmpSnipper/cmpSnipperSnipRand4d.go | 16 + cmpSnipper/cmpSnipperUtil.go | 87 +++ cmpSnipper/cmpSnippetHttpCli.go | 196 +++++++ cmpSnipper/cmpSnippetSshCli.go | 288 ++++++++++ go.mod | 12 + go.sum | 10 + main.go | 28 + plug/CmpPlug1/CmpPlug1.go | 34 ++ static/cmpSwoPage.css | 558 ++++++++++++++++++ static/cmpSwoPage.js | 809 +++++++++++++++++++++++++++ static/cmpSwoUtil.js | 343 ++++++++++++ static/default.css | 333 +++++++++++ static/default.js | 299 ++++++++++ static/img/favicon.png | Bin 0 -> 4669 bytes static/img/tkf-favicon-32x32.png | Bin 0 -> 192 bytes static/img/tux-favicon.png | Bin 0 -> 3762 bytes static/img/umbrella-black.png | Bin 0 -> 47281 bytes static/img/umbrella-color.png | Bin 0 -> 82805 bytes static/index.html | 61 ++ static/index2.html | 61 ++ 33 files changed, 4224 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 cmpSnipper/cmpSnipper.go create mode 100644 cmpSnipper/cmpSnipperConf.go create mode 100644 cmpSnipper/cmpSnipperHttpServ.go create mode 100644 cmpSnipper/cmpSnipperHttpUtil.go create mode 100644 cmpSnipper/cmpSnipperHttpWsHandle.go create mode 100644 cmpSnipper/cmpSnipperLog.go create mode 100644 cmpSnipper/cmpSnipperSignal.go create mode 100644 cmpSnipper/cmpSnipperSnip.go create mode 100644 cmpSnipper/cmpSnipperSnipCliList.go create mode 100644 cmpSnipper/cmpSnipperSnipLeftMenu.go create mode 100644 cmpSnipper/cmpSnipperSnipPing.go create mode 100644 cmpSnipper/cmpSnipperSnipRand4d.go create mode 100644 cmpSnipper/cmpSnipperUtil.go create mode 100644 cmpSnipper/cmpSnippetHttpCli.go create mode 100644 cmpSnipper/cmpSnippetSshCli.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 plug/CmpPlug1/CmpPlug1.go create mode 100644 static/cmpSwoPage.css create mode 100644 static/cmpSwoPage.js create mode 100644 static/cmpSwoUtil.js create mode 100644 static/default.css create mode 100644 static/default.js create mode 100644 static/img/favicon.png create mode 100644 static/img/tkf-favicon-32x32.png create mode 100644 static/img/tux-favicon.png create mode 100644 static/img/umbrella-black.png create mode 100644 static/img/umbrella-color.png create mode 100644 static/index.html create mode 100644 static/index2.html diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..2a884c7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ + + [*] + end_of_line = lf + indent_style = tab + tab_width = 4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9e95b2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +**/*_ +**/.#* +**/0* +**/1* +**/2* +**/3* +**/4* +**/5* +**/6* +**/7* +**/8* +**/9* + +**/*-test.go + +**/*.so +**/*.log* +**/*log +**/LOG* + +**/main +**/main2 + +static2/** +cache/** +data/** +old/** +outer/** +secret/** diff --git a/cmpSnipper/cmpSnipper.go b/cmpSnipper/cmpSnipper.go new file mode 100644 index 0000000..16d67f7 --- /dev/null +++ b/cmpSnipper/cmpSnipper.go @@ -0,0 +1,122 @@ + + package cmpSnipper + + import ( + "errors" + "plugin" + ) + + type cmpPluginStruct struct { + Name string + Plug *plugin.Plugin + } + + + type App struct { + Conf interface{} + ErrIsDir error // = errors.New("Is directory") + + CliList []cmpWbsCliStruct + + cmpSnipperHttpServ cmpSnipperHttpServ + + Rand4d int + + PlugList []cmpPluginStruct + + SshList []cmpSshCliStruct + } + + func (app *App) PlugInit(name string, file string) { + qqq := map[string]interface{}{ + "Aaa": "Bbb", + } + + var plug cmpPluginStruct + + var p *plugin.Plugin + + p, err := plugin.Open(file) + + if err != nil { + app.Log(err) + return + } + + plug.Name = name + plug.Plug = p + + plugInitReq, err := plug.Plug.Lookup("CmpPlug1Init") + + if err != nil { + app.Log(err) + return + } + + plugInitFnc := plugInitReq.(func(int, func(any, ...interface{}), map[string]interface{}) interface{}) + + plugInitRes := plugInitFnc(33, app.Log, qqq) + + app.Log("%+v", plugInitRes) + + app.PlugList = append(app.PlugList, plug) + } + + func (app *App) PlugCall(pnam string, fnam string) { + for _, plug := range app.PlugList { + if plug.Name != pnam { + continue + } + + plugFuncReq, err := plug.Plug.Lookup(fnam) + + if err != nil { + app.Log(err) + return + } + + plugFuncFnc := plugFuncReq.(func() error) + + plugFuncRes := plugFuncFnc() + + app.Log("%+v", plugFuncRes) + } + } + + func (app *App) Prep() (error) { + app.ErrIsDir = errors.New("Is directory") + + app.LogSetup() + + var err = app.ConfLoadFile("secret/zest.json"); + + if err != nil { + return err + } + + return nil + } + + func (app *App) Proc() error { + var err error // = make(chan error, 1) + + var term = make(chan bool, 1) + + go app.WaitSignal(term) + + err = app.HttpServStart() + + if err != nil { + return err + } + + <-term + + app.HttpServStop() + + app.Log("Terminating") + + return nil + } + + // end diff --git a/cmpSnipper/cmpSnipperConf.go b/cmpSnipper/cmpSnipperConf.go new file mode 100644 index 0000000..b89f3ca --- /dev/null +++ b/cmpSnipper/cmpSnipperConf.go @@ -0,0 +1,103 @@ + + package cmpSnipper + + import ( + "fmt" + "errors" + "strconv" + "encoding/json" + ) + + func (app *App) IfcGet(ifc interface{}, arr ...string) (interface{}, error) { + var cnt = len(arr); + var idx string + + for j := 0; j < cnt; j++ { + idx = arr[j] + + switch v := ifc.(type) { + case string: + app.Log("Convert string to ifc") + ifc = ifc.(interface{}) + + case map[string]interface{}: + // app.Log("Valid ifc " + idx) + ifc = v[idx]; + + default: + app.Log("Invalid type variable %s %T", idx, ifc) + return nil, errors.New("Invalid type variable"); + } + } + + if ifc == nil { + return nil, errors.New("Undefine variable " + idx); + } + + // app.Log("Found ifc %s %T", idx, ifc) + + return ifc, nil; + } + + func (app *App) ConfGetIfc(arr ...string) (interface{}, error) { + return app.IfcGet(app.Conf, arr...); + } + + func (app *App) ConfGetStr(arr ...string) (string, error) { + ifc, err := app.ConfGetIfc(arr...); + + if err != nil { + return "", err; + } + + switch ifc.(type) { + case string: + return ifc.(string), nil; + case float64: + f := ifc.(float64) + u := uint64(f) + return strconv.FormatUint(u, 10), nil; + default: + return "", errors.New("Invalid type value !s"); + } + + return "", errors.New("Invalid type value"); + } + + func (app *App) ConfGetArr(arr ...string) ([]interface{}, error) { + ifc, err := app.ConfGetIfc(arr...); + + if err != nil { + return nil, err; + } + + switch v := ifc.(type) { + case []interface{}: + return v, nil + default: + fmt.Printf("Invalid type value %+q\n", ifc) + return nil, errors.New("Invalid type value !s"); + } + + return nil, errors.New("Invalid type value"); + } + + func (app *App) ConfLoadFile(file string) error { + data, err := app.FileReadLimit(file, 1048576); + + if err != nil { + app.Log(err) + return err + } + + // fmt.Println(string(data)); + + err = json.Unmarshal(data, &app.Conf) + + if err != nil { + app.Log(err) + return err + } + + return nil; + } diff --git a/cmpSnipper/cmpSnipperHttpServ.go b/cmpSnipper/cmpSnipperHttpServ.go new file mode 100644 index 0000000..0b0e6d7 --- /dev/null +++ b/cmpSnipper/cmpSnipperHttpServ.go @@ -0,0 +1,84 @@ + + package cmpSnipper + + import ( + "net" + "net/http" + ) + + type tcpKeepAliveListener struct { + *net.TCPListener + } + + type cmpSnipperHttpServ struct { + HttpListener net.Listener + } + + func (app *App) HttpServStart() error { + var err error; + + // var subjHttpPortString string = "7070"; + // var subjHttpPortUint16 uint16 = subjConf.Http.Port; + + host, err := app.ConfGetStr("http", "host") + + // fmt.Printf("Success load : %+v\n", host) + + if err != nil { + app.Log(err) + return err + } + + port, err := app.ConfGetStr("http", "port") + + // fmt.Printf("Success load : %+v\n", port) + + if err != nil { + app.Log(err) + return err + } + + // if subjHttpPortUint16 == 0 || subjHttpPortString != strconv.FormatUint(uint64(subjHttpPortUint16), 10) { + // fmt.Printf("Invalid http.port %s != %d\n", subjHttpPortString, subjHttpPortUint16) + // app.Log(".Fatal"); + // } + + + httpFileServer := http.FileServer(http.Dir("static")) + http.Handle("/go-prefix/static/", http.StripPrefix("/go-prefix/static/", httpFileServer)) + + http.HandleFunc("/" , app.HttpReq); + http.HandleFunc("/go-prefix/ws" , app.HttpWebSockHand) + + var addr = host + ":" + port + + server := &http.Server{Addr: addr} + + app.Log("Listenning: '%s'", port); + + app.cmpSnipperHttpServ.HttpListener, err = net.Listen("tcp", addr) + + // defer app.HttpServClose() + + if err != nil { + app.Log(err) + return err + } + + go func() { + err = server.Serve(tcpKeepAliveListener{app.cmpSnipperHttpServ.HttpListener.(*net.TCPListener)}) + + if err == nil { + app.Log(err) + return // err + } + }() + + return nil + } + + func (app *App) HttpServStop() { + app.cmpSnipperHttpServ.HttpListener.Close() + + app.Log("Server Closed") + } diff --git a/cmpSnipper/cmpSnipperHttpUtil.go b/cmpSnipper/cmpSnipperHttpUtil.go new file mode 100644 index 0000000..a628f02 --- /dev/null +++ b/cmpSnipper/cmpSnipperHttpUtil.go @@ -0,0 +1,245 @@ + + package cmpSnipper + + import ( + "os" + "strings" + "encoding/json" + "net/http" + ) + + func (app *App) HttpRespText(w http.ResponseWriter, data []byte) { + w.Write(data) + + return + } + + func (app *App) HttpRespJson(w http.ResponseWriter, data any) { + w.Header().Set("Content-Type", "application/json") + + jsonResp, err := json.MarshalIndent(data, "", "\t") + + if err != nil { + app.Log("Error happened in JSON marshal. Err: %s", err) + return + } + + app.HttpRespText(w, jsonResp) + } + + func HttpRespCodeText(w http.ResponseWriter, req *http.Request, code int, cont string, mesg any) { + w.WriteHeader(code) + + w.Header().Set("Content-Type", cont) + + + } + + func (app *App) HttpRespForbidden(w http.ResponseWriter, req *http.Request, mesg string) { + w.WriteHeader(http.StatusForbidden) + + resp := make(map[string]any) + resp["code"] = 403 + resp["status"] = "Forbidden" + resp["message"] = mesg + + app.HttpRespJson(w, resp) + } + + + + func (app *App) HttpReqDir1(w http.ResponseWriter, req *http.Request, targ string, path string) { + resp := map[string]interface{}{ + "path" : path, + "directory": targ, + "content" : nil, + } + + entries, err := os.ReadDir(targ) + + if err != nil { + app.Log(err) + app.HttpRespForbidden(w, req, "Server error") + } + + var slice []interface{}; + + for _, e := range entries { + slice = append(slice, map[string]interface{}{ + "name": e.Name(), + }) + + // fmt.Println(e.Name()); + } + + resp["content"] = slice + + app.HttpRespJson(w, resp) + + return + } + + func (app *App) HttpReqDir(w http.ResponseWriter, req *http.Request, targ string, path string) { + finx := path + "/index.html" + + data, err := app.FileReadLimit(finx, 1048576); + + if os.IsNotExist(err) { + app.HttpReqDir1(w, req, targ, path) + return + } + + if err == app.ErrIsDir { + app.HttpReqDir1(w, req, targ, path) + return + } + + if err != nil { + app.Log("Err: %s", err) + app.HttpRespForbidden(w, req, "Server error") + return + } + + w.Header().Set("Content-Type", "text/html") + + app.HttpRespText(w, data) + + return + } + + func (app *App) HttpReq(w http.ResponseWriter, req *http.Request) { + // https://go.dev/src/net/http/request.go + +// fmt.Printf("Request: %+v\n", req) + + var auri = (strings.Split(req.RequestURI, "/")) + auri[0] = "/" + + var aidx = 0 + + app.Log("Auri: %+v", auri) + + var locTarg map[string]interface{} + var locEnd bool + + locList, err := app.ConfGetArr("http", "location") + + if err != nil { + app.HttpRespForbidden(w, req, "Invalid http.location") + return + } + + for uid, uri := range auri { + locEnd = false + + for _, locIfc := range locList { + var locMap map[string]interface{}; + + switch v := locIfc.(type) { + case map[string]interface{}: + locMap = v; + } + + if locMap == nil { + app.Log("Not Found") + continue + } + + locUri := locMap["uri"] + + if 1 == 0 { +// fmt.Printf("Found: %+v\n", locUri) + continue + } + + if locUri != uri { +// fmt.Printf(" %s != %s\n", locUri, uri) + continue + } + +// fmt.Printf("Found: %s\n", uri) + + locTarg = locMap + locEnd = true + aidx = uid + + switch v := locMap["list"].(type) { + case []interface{}: + locList = v; +// fmt.Printf("Found list\n"); + } + } + + if !locEnd { + break + } + } +/* + fmt.Printf("Targ %+v\n", locTarg); + fmt.Printf("Targ %+v\n", locEnd ); + fmt.Printf("Targ %s \n", locTarg["uri"] ); + fmt.Printf("Targ %+v\n", auri[(aidx+1):]); +*/ + switch locTarg["type"] { + case "json": + targ := locTarg["targ"].(string) + + app.HttpRespJson(w, locTarg[targ]) + + return + + case "func": + targ := locTarg["targ"].(string) + parm := locTarg["parm"] + + resp, err := app.CallFuncByName(targ, parm) + + if err != nil { + app.Log("Err: %s", err) + break + } + + app.HttpRespJson(w, resp) + + return + + case "directory": + targ := locTarg["targ"].(string) + + path := targ + "/" + strings.Join(auri[(aidx+1):], "/") + + app.Log("Location: %s", path) + + data, err := app.FileReadLimit(path, 1048576); + + if os.IsNotExist(err) { + break + } + + if err == app.ErrIsDir { + app.HttpReqDir(w, req, targ, path) + return + } + + if err != nil { + app.Log("Err: %s", err) + app.HttpRespForbidden(w, req, "Server error") + return + } + + w.Header().Set("Content-Type", "text/html") + + app.HttpRespText(w, data) + + return + + case "redirect": + http.Redirect(w, req, locTarg["targ"].(string), int(locTarg["code"].(float64))) + + return + +// case "ws": + } + + app.HttpRespForbidden(w, req, "Invalid type") + } diff --git a/cmpSnipper/cmpSnipperHttpWsHandle.go b/cmpSnipper/cmpSnipperHttpWsHandle.go new file mode 100644 index 0000000..73098f5 --- /dev/null +++ b/cmpSnipper/cmpSnipperHttpWsHandle.go @@ -0,0 +1,168 @@ + + package cmpSnipper + + import ( + "time" + "net/http" + + "github.com/gorilla/websocket" + ) + + type cmpWbsCliStruct struct { + W http.ResponseWriter + Connect *websocket.Conn + HostPort string + } + + var upgrader = websocket.Upgrader{ + ReadBufferSize: 1024, + WriteBufferSize: 1024, + HandshakeTimeout: 60 * time.Second, + } + + func (app *App) HttpWebSockHand(w http.ResponseWriter, req *http.Request) { + conn, err := upgrader.Upgrade(w, req, nil) + + defer conn.Close() + + if err != nil { + app.Log(err) + return + } + + app.Log("HttpWebSockHand:for") + + HostPort := req.Header.Get("X-Real-Ip") + + if HostPort == "" { + HostPort = req.Header.Get("X-Forwarded-For") + } + + if HostPort == "" { + HostPort = req.RemoteAddr + } + + app.Log("New client: %s", HostPort) + + var cmpWbsCli cmpWbsCliStruct = cmpWbsCliStruct{ + w, + conn, + HostPort, + } + + + app.CliList = append(app.CliList, cmpWbsCli) + + app.Log(app.CliList) + + for i, cli := range app.CliList { + app.Log("Client %s, %s", i, cli.HostPort) + } + + for { + var inp = map[string]interface{}{} + var out = map[string]interface{}{ + "snip": "", + "result": nil, + } + + err := conn.ReadJSON(&inp) + + if err != nil { + app.Log("Read JSON: %s", err) + app.Log(err) + + var list []cmpWbsCliStruct + + for _, ii := range app.CliList { + if ii.HostPort == HostPort { + continue + } + + list = append(list, ii) + } + + app.CliList = list + + return + } + + app.Log("Received message: %+v", inp) + + out["snip"] = inp["snip"] + + // app.Log("Copy snip OK") + + var snip string; + + snip = inp["snip"].(string) + + // app.Log("Look snip") + + if app.SnipExists(snip) { + out["result"], err = app.SnipCall(cmpWbsCli, snip, inp) + + if err != nil { + out["error"] = "Server error" + } + } else { + out["error"] = "Unknown snip" + app.Log("Unknow snip:", inp["snip"]) + } + + err = conn.WriteJSON(out) + + if err != nil { + app.Log(err) + } + + // for + } + + return + } + + func (app *App) HttpWebSockSendTo(cmpWbsCli cmpWbsCliStruct, snip string, result map[string]interface{}) { + var err error + + out := map[string]interface{}{ + "snip": snip, + "result": result, + } + + err = cmpWbsCli.Connect.WriteJSON(out) + + if err != nil { + app.Log(err) + return + } + + return + } + + func (app *App) HttpWebSockSendAll(snip string, result map[string]interface{}) { + var err error + + app.Log("Send to all") + + out := map[string]interface{}{ + "snip": snip, + "result": result, + } + + for _, ii := range app.CliList { + if ii.HostPort == "" { + break + } + + err = ii.Connect.WriteJSON(out) + + if err != nil { + app.Log(err) + continue + } + } + + return + } + diff --git a/cmpSnipper/cmpSnipperLog.go b/cmpSnipper/cmpSnipperLog.go new file mode 100644 index 0000000..0aa6848 --- /dev/null +++ b/cmpSnipper/cmpSnipperLog.go @@ -0,0 +1,57 @@ + + package cmpSnipper + + import ( + "fmt" + "log" + "time" + "encoding/json" + ) + + func (app *App) LogMod(arg interface{}) string { + var str string + + switch t := arg.(type) { + case nil: + str = /* "N:" + */ "null" + + case string: + str = /* "S:" + */ t + + case error: + str = /* "E:" + */ t.Error() + + case byte: + str = /* "B:" + */ string(t) + + case []byte: + str = /* "A:" + */ string(t) + + case interface{}: + obyte, _ := json.MarshalIndent(arg, "", "\t") + str = /* "J:" + */ string(obyte) + + default: + str = /* "U:" + */ fmt.Sprintf("Unknown type %T", t) + } + + return str + } + + func (app *App) Log(farg any, iargs ...interface{}) { + var str = app.LogMod(farg) + + log.SetPrefix(time.Now().UTC().Format("2006-01-02 15:04:05") + ": ") + + oargs := make([]interface{}, len(iargs)) + + for k, arg := range iargs { + oargs[k] = app.LogMod(arg) + } + + log.Output(2, fmt.Sprintf(str + "\n", oargs...)) + } + + func (app *App) LogSetup() { + log.SetFlags( log.Lshortfile ); + } diff --git a/cmpSnipper/cmpSnipperSignal.go b/cmpSnipper/cmpSnipperSignal.go new file mode 100644 index 0000000..81187ec --- /dev/null +++ b/cmpSnipper/cmpSnipperSignal.go @@ -0,0 +1,84 @@ + + package cmpSnipper + + import ( + "os" + "os/signal" + "syscall" + ) + + func (app *App) WaitSignal(term chan bool) { + var sigreq = make(chan os.Signal, 1) + + for true { + signal.Notify(sigreq) + sigrcv := <-sigreq + + // app.Log("Got signal: %s", sigrcv) + + if sigrcv == syscall.SIGTERM { + term <- true + // continue + return + } + + if sigrcv == syscall.SIGINT { + term <- true + // continue + return + } + + if sigrcv == syscall.SIGQUIT { + term <- true + // continue + return + } + + if sigrcv == syscall.SIGUSR1 { + app.Log("Got signal: %s", sigrcv) + continue + } + + if sigrcv == syscall.SIGUSR2 { + app.Log("Got signal: %s", sigrcv) + + app.Log("Rand 4d: %d", app.Rand4d) + + continue + } + + // 1) SIGHUP + // 2) SIGINT + // 3) SIGQUIT + // 4) SIGILL + // 5) SIGTRAP + // 6) SIGABRT + // 7) SIGBUS + // 8) SIGFPE + // 9) SIGKILL + // 10) SIGUSR1 + // 11) SIGSEGV + // 12) SIGUSR2 + // 13) SIGPIPE + // 14) SIGALRM + // 15) SIGTERM + // 16) SIGSTKFLT + // 17) SIGCHLD + // 18) SIGCONT + // 19) SIGSTOP + // 20) SIGTSTP + // 21) SIGTTIN + // 22) SIGTTOU + // 23) SIGURG + // 24) SIGXCPU + // 25) SIGXFSZ + // 26) SIGVTALRM + // 27) SIGPROF + // 28) SIGWINCH + // 29) SIGIO + // 30) SIGPWR + // 31) SIGSYS + + app.Log("Got signal: %s", sigrcv) + } + } diff --git a/cmpSnipper/cmpSnipperSnip.go b/cmpSnipper/cmpSnipperSnip.go new file mode 100644 index 0000000..76ac646 --- /dev/null +++ b/cmpSnipper/cmpSnipperSnip.go @@ -0,0 +1,78 @@ + + package cmpSnipper + + import ( + "reflect" + "errors" + ) + + func (app *App) SnipExists(funcName string) bool { + snipName := app.UpperFirst(funcName) + "Snip" + refCls := reflect.ValueOf(app) + refMth := refCls.MethodByName(snipName) + + if !refMth.IsValid() { + return false + } + + return true + } + + func (app *App) SnipCall(cmpWbsCli cmpWbsCliStruct, fnName string, ifcII interface{}) (interface{}, error) { + snName := app.UpperFirst(fnName) + "Snip" + refCls := reflect.ValueOf(app) + refMth := refCls.MethodByName(snName) + + if !refMth.IsValid() { + app.Log("Call method \"%s\" not found", snName) + return nil, errors.New("Call method not founnd") + } + + app.Log("Call method \"%s\"", snName) + + ifcIM := map[string]interface{}{ + "InputArgument" : ifcII, + "HostPort" : cmpWbsCli.HostPort, + } + + refIL := []reflect.Value{ + reflect.ValueOf(ifcIM), + } + + refOL := refMth.Call(refIL) + + infOI := refOL[0].Interface() + + app.Log("Interface output item %+v", infOI) + + return infOI, nil + } + + func (app *App) SnipGetCli(parm any) (cmpWbsCliStruct, error) { + var err error + var cmpWbsCli cmpWbsCliStruct + + HostPortIfc, err := app.IfcGet(parm.(map[string]interface{}), "HostPort") + + if err != nil { + app.Log("Invalid iterface") + return cmpWbsCli, err + } + + HostPort, ok := HostPortIfc.(string) + + if !ok { + app.Log("Invalid string") + return cmpWbsCli, errors.New("Can't covert to string") + } + + for _, ii := range app.CliList { + if HostPort != ii.HostPort { + continue + } + + return ii, nil + } + + return cmpWbsCli, errors.New("Client " + HostPort + " not found") + } diff --git a/cmpSnipper/cmpSnipperSnipCliList.go b/cmpSnipper/cmpSnipperSnipCliList.go new file mode 100644 index 0000000..0eeacce --- /dev/null +++ b/cmpSnipper/cmpSnipperSnipCliList.go @@ -0,0 +1,12 @@ + + package cmpSnipper + + func (app *App) CliListSnip(parm any) (any, error) { + // app.Log("") + + ret := map[string]interface{}{ + "list" : app.CliList, + } + + return ret, nil + } diff --git a/cmpSnipper/cmpSnipperSnipLeftMenu.go b/cmpSnipper/cmpSnipperSnipLeftMenu.go new file mode 100644 index 0000000..e872313 --- /dev/null +++ b/cmpSnipper/cmpSnipperSnipLeftMenu.go @@ -0,0 +1,32 @@ + + package cmpSnipper + + import ( + "encoding/json" + ) + + func (app *App) LeftMenuSnip(parm any) (any, error) { + // app.Log("Read data") + + mainMenuFile, err := app.ConfGetStr("mainMenuFile") + + if err != nil { + return nil, err + } + + data, err := app.FileReadLimit(mainMenuFile, 1048576) + + if err != nil { + return nil, err + } + + var res = map[string]interface{}{} + + err = json.Unmarshal(data, &res) + + if err != nil { + return nil, err + } + + return res, nil + } diff --git a/cmpSnipper/cmpSnipperSnipPing.go b/cmpSnipper/cmpSnipperSnipPing.go new file mode 100644 index 0000000..7393a80 --- /dev/null +++ b/cmpSnipper/cmpSnipperSnipPing.go @@ -0,0 +1,70 @@ + + package cmpSnipper + + import ( + "os/exec" + "context" + "time" + "strings" + "syscall" + ) + + func (app *App) PingSnip(parm any) (any, error) { + // log.Println("PingSnip") + + path, err := exec.LookPath("ping") + + app.Log("Prog:", path) + + if err != nil { + return map[string]interface{}{ + "retval" : 127, + "error" : "No prog", + }, nil + } + + ctx, cancel := context.WithTimeout(context.Background(), 10 * time.Second) + + defer cancel() + + cmd := exec.CommandContext(ctx, "ping", "-c", "4", "8.8.8.8") + + cmd.Stdin = strings.NewReader("") + + var stdout strings.Builder + cmd.Stdout = &stdout + + var stderr strings.Builder + cmd.Stderr = &stderr + + var exitCode int; + + err = cmd.Run() + + if err != nil { + // try to get the exit code + if exitError, ok := err.(*exec.ExitError); ok { + ws := exitError.Sys().(syscall.WaitStatus) + exitCode = ws.ExitStatus() + } else { + // This will happen (in OSX) if `name` is not available in $PATH, + // in this situation, exit code could not be get, and stderr will be + // empty string very likely, so we use the default fail code, and format err + // to string and set to stderr + + app.Log("Could not get exit code for failed program") + exitCode = 255 + } + } else { + // success, exitCode should be 0 if go is ok + ws := cmd.ProcessState.Sys().(syscall.WaitStatus) + exitCode = ws.ExitStatus() + } + + return map[string]interface{}{ + "retval" : exitCode, + "error" : err, + "stdout" : stdout.String(), + "stderr" : stderr.String(), + }, nil + } diff --git a/cmpSnipper/cmpSnipperSnipRand4d.go b/cmpSnipper/cmpSnipperSnipRand4d.go new file mode 100644 index 0000000..bb8e2db --- /dev/null +++ b/cmpSnipper/cmpSnipperSnipRand4d.go @@ -0,0 +1,16 @@ + + package cmpSnipper + + import ( + "math/rand" + ) + + func (app *App) Rand4dSnip(parm any) (any, error) { + // app.Log("Rand4dSnip") + + app.Rand4d = rand.Intn(10000) + 1000 + + return map[string]interface{}{ + "rand4d" : app.Rand4d, + }, nil + } diff --git a/cmpSnipper/cmpSnipperUtil.go b/cmpSnipper/cmpSnipperUtil.go new file mode 100644 index 0000000..7af4966 --- /dev/null +++ b/cmpSnipper/cmpSnipperUtil.go @@ -0,0 +1,87 @@ + + package cmpSnipper + + import ( + "os" + "errors" + "strings" + + "reflect" + ) + + func (app *App) FileReadLimit(file string, mSize int64) ([]byte, error) { + info, err := os.Stat(file) + + if err != nil { + return nil, err + } + + if info.IsDir() { + return nil, app.ErrIsDir + } + + fSize := info.Size() + + if fSize > mSize { + return nil, errors.New("File is big") + } + + fd, err := os.Open(file) + + if err != nil { + return nil, err + } + + defer fd.Close() + + var rata = make([]byte, fSize); + + rSize, err := fd.Read(rata); + + if fSize != int64(rSize) { + return nil, errors.New("Can't read full file size") + } + + return rata, nil + } + + func (app *App) UpperFirst(si string) string { + bi := []byte(si) + ss := strings.Title(string(bi[0])) + bo := bi + bo[0] = ss[0] + + return string(bo) + } + + func (app *App) CallFuncByName(funcName string, ifcIL ...interface{}) ([]interface{}, error) { + refCls := reflect.ValueOf(app) + refMth := refCls.MethodByName(funcName) + + if !refMth.IsValid() { + app.Log("Call method \"%s\" not found", funcName) + return nil, errors.New("Call method not founnd") + } + + app.Log("Call method \"%s\"", funcName) + + refIL := make([]reflect.Value, len(ifcIL)) + + for i, ifcII := range ifcIL { + refIL[i] = reflect.ValueOf(ifcII) + } + + // fmt.Println("reflect input list", refIL); + + refOL := refMth.Call(refIL) + + infOL := make([]interface{}, len(refOL)) + + for i, refOI := range refOL { + infOL[i] = refOI.Interface() + } + + app.Log("Interface output list %+v", infOL) + + return infOL, nil + } diff --git a/cmpSnipper/cmpSnippetHttpCli.go b/cmpSnipper/cmpSnippetHttpCli.go new file mode 100644 index 0000000..ed4fd49 --- /dev/null +++ b/cmpSnipper/cmpSnippetHttpCli.go @@ -0,0 +1,196 @@ + + package cmpSnipper + + import ( +// "crypto/md5" + "net/http" +// "os" + "io" +// "fmt" + "bufio" +// "io/ioutil" + "bytes" + "strings" +// "golang.org/x/net/html" +// "net/url" + "encoding/json" + "compress/gzip" + "compress/flate" + "github.com/andybalholm/brotli" + ) + + func (app *App) HttpGet(url string) (map[string]interface{}) { + ret := map[string]interface{}{ + "Error" : nil , + "RequestUrl" : url , + "StatusCode" : 0 , + "ContentRaw" : nil , + "ContentJson" : nil , + "Header" : nil , + "Content-Encoding" : "" , + "Content-Type" : "" , + "Content-Length" : "" , + } + + app.Log(url) + + cli := &http.Client{} + + ifcRawHead, err := app.ConfGetIfc("httpTest", "head") + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + mapIfcHead := ifcRawHead.(map[string]interface{}) + + mapStrHead := make(map[string][]string) + + for key, val := range mapIfcHead { + mapStrHead[key] = []string{ val.(string) } + } + + req, err := http.NewRequest("GET", url, nil) + + req.Header = mapStrHead + + res, err := cli.Do(req) + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + defer res.Body.Close() + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + ret["StatusCode" ] = res.StatusCode + ret["Content-Length"] = res.ContentLength + ret["Header" ] = res.Header + + // app.Log("Response status: %s", res.Status) + // app.Log("Header: %+v", res.Header) + + // app.Log("TransferEncoding: %+v", res.TransferEncoding) + // app.Log("ContentLength: %+v", res.ContentLength) + + var tmpl []string + + tmpl = res.Header["Content-Encoding"] + if len(tmpl) > 0 { + ret["Content-Encoding"] = tmpl[0] + } + + tmpl = res.Header["Content-Type"] + if len(tmpl) > 0 { + tmpl = strings.Split(tmpl[0], ";") + + if len(tmpl) > 0 { + ret["Content-Type"] = tmpl[0] + } + } + + // Content-Disposition: attachment; name="fieldName"; filename="myfile.txt" + + + out := new(bytes.Buffer) + var encReader io.Reader + + switch ret["Content-Encoding"] { + case "": + encReader = bufio.NewReader(res.Body) + case "br": + encReader = brotli.NewReader(res.Body) + case "gzip": + encReader, err = gzip.NewReader(res.Body) + case "deflate": + encReader = flate.NewReader(res.Body) + default: + app.Log("Unknown Content-Encoding %s", ret["Content-Encoding"]) + encReader = bufio.NewReader(res.Body) + } + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + size, err := out.ReadFrom(encReader) + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + app.Log("Read %s", size) + + var contRaw []byte = out.Bytes() + ret["ContentRaw"] = contRaw + + if ret["Content-Type"] == "application/json" { + var contJson interface{} + + err = json.Unmarshal(contRaw, &contJson) + + if err != nil { + app.Log(err) + ret["Error"] = err + return ret + } + + ret["ContentJson"] = contJson + } + + return ret + } + + func (app *App) CmpHttpTestSnip(parm any) (any, error) { + var err error + + cli, err := app.SnipGetCli(parm) + + if err != nil { + return map[string]interface{}{ + "status": "error", + "error" : "Not client found", + }, err + } + + url, err := app.ConfGetStr("httpTest", "url") + + if err != nil { + return map[string]interface{}{ + "status": "error", + "error" : "Not test URL", + }, err + } + + go func() { + var a map[string]interface{} + + a = app.HttpGet(url) + + app.Log(a) + + app.HttpWebSockSendTo(cli, "cmpHttpTest", map[string]interface{}{ + "status" : "response", + "response": a, + }) + }() + + + return map[string]interface{}{ + "status" : "request", + "request": url, + }, nil + } diff --git a/cmpSnipper/cmpSnippetSshCli.go b/cmpSnipper/cmpSnippetSshCli.go new file mode 100644 index 0000000..4897d7d --- /dev/null +++ b/cmpSnipper/cmpSnippetSshCli.go @@ -0,0 +1,288 @@ + + package cmpSnipper + + import ( + "io" + "bufio" + "strings" + "net" + "golang.org/x/crypto/ssh" + ) + + type cmpSshCliStruct struct { + Host string + Connect *ssh.Client + Session *ssh.Session + Output *bufio.Reader + } + + + func (app *App) SshAddHostKey(host string, remote net.Addr, pubKey ssh.PublicKey) error { + app.Log(pubKey) + return nil + } + + func (app *App) SshConnReal(cmpSshCli *cmpSshCliStruct, host string, keyfile string) error { + var err error + + cmpSshCli.Host = host + + key, err := app.FileReadLimit(keyfile, 1048576) + + if err != nil { + app.Log(err) + return err + } + + signer, err := ssh.ParsePrivateKey(key) + + if err != nil { + app.Log(err) + return err + } + + config := &ssh.ClientConfig{ + User: "root", + Auth: []ssh.AuthMethod{ + // HostKeyCallback: InsecureIgnoreHostKey(), + // ssh.Password("yourpassword"), + ssh.PublicKeys(signer), + }, +// HostKeyCallback: ssh.FixedHostKey(hostKey), + HostKeyCallback: ssh.HostKeyCallback(func(host string, remote net.Addr, key ssh.PublicKey) error { + app.SshAddHostKey(host, remote, key) + + return nil + }), + } + + cmpSshCli.Connect, err = ssh.Dial("tcp", cmpSshCli.Host, config) + + if err != nil { + app.Log(err) + return err + } + + return nil + } + + func (app *App) SshSession(cmpSshCli *cmpSshCliStruct) error { + var err error + + cmpSshCli.Session, err = cmpSshCli.Connect.NewSession() + + if err != nil { + app.Log(err) + return err + } + + // defer cmpSshCli.Session.Close() + + modes := ssh.TerminalModes{ + ssh.ECHO: 0, + } + + err = cmpSshCli.Session.RequestPty("xterm", 50, 80, modes) + + if err != nil { + app.Log(err) + return err + } + + // sshIn, err := session.StdinPipe() + // if err != nil { + // app.Log(err) + // return err + // } + + sshOut, err := cmpSshCli.Session.StdoutPipe() + + if err != nil { + app.Log(err) + return err + } + + sshErr, err := cmpSshCli.Session.StderrPipe() + + if err != nil { + app.Log(err) + return err + } + + output := io.MultiReader(sshOut, sshErr) + + cmpSshCli.Output = bufio.NewReader(output) + + return nil + } + + func (app *App) SshConn(host string, keyfile string) (int, error) { + var err error + + // app.Log(url) + + var cmpSshCli cmpSshCliStruct + + err = app.SshConnReal(&cmpSshCli, host, keyfile) + + if err != nil { + return -1, err + } + + err = app.SshSession(&cmpSshCli) + + if err != nil { + return -1, err + } + + app.SshList = append(app.SshList, cmpSshCli) + + app.Log("Append new") + + return len(app.SshList)-1, nil + } + + func (app *App) SshExec(cmpWbsCli cmpWbsCliStruct, idx int, cma []string) (error) { + var err error + + cmd := strings.Join(cma, " ") + + cmpSshCli := app.SshList[idx] + + // app.Log("idx: '%s', '%s'", idx, cmpSshCli.Host) + + err = cmpSshCli.Session.Start(cmd) + + if err != nil { + app.Log(err) + return err + } + + res := map[string]interface{}{ + "string": nil, + } + + var bli []byte + var sli string + + for { + bli, _, err = cmpSshCli.Output.ReadLine() + + if err != nil { + app.Log("Complete") + break + } + + sli = string(bli) + + app.Log(sli) + + res["string"] = sli + + app.HttpWebSockSendTo(cmpWbsCli, "cmpSshTest", res) + } + + cmpSshCli.Session.Wait() + + app.Log("Free resource SshList[" + string(idx) + "]") + + cmpSshCli.Session.Close() + + cmpSshCli.Connect.Close() + + + app.Log("Remove SshList[" + string(idx) + "]") + + var list []cmpSshCliStruct + + for i, li := range app.SshList { + if i == idx { + continue + } + + list = append(list, li) + } + + app.SshList = list + + app.Log("End") + + // done <- true + + return nil + } + + func (app *App) CmpSshTestSnip(parm any) (any, error) { + var err error + + // var ifcIM map[string]interface{} = parm + + cli, err := app.SnipGetCli(parm) + + // app.Log(cli) + + if err != nil { + return map[string]interface{}{ + "string": "Not client found", + }, err + } + + + host, err := app.ConfGetStr("sshTestHost", "HostPort") + + if err != nil { + return map[string]interface{}{ + "string": "Not set sshTestHost.HostPort", + }, err + } + + keyfile, err := app.ConfGetStr("sshTestHost", "PrivateKeyFile") + + if err != nil { + return map[string]interface{}{ + "string": "Not set sshTestHost.PrivateKeyFile", + }, err + } + + cmi, err := app.ConfGetIfc("sshTestHost", "Command") + + if err != nil { + return map[string]interface{}{ + "string": "Not set sshTestHost.Command", + }, err + } + + cml := cmi.([]interface{}) + + cma := make([]string, len(cml)) + + for i, v := range cml { + cma[i] = v.(string) + } + + /* + if cma[0] == "none" { + return map[string]interface{}{ + "string": "Can't get command", + }, err + } + */ + + idx, err := app.SshConn(host, keyfile) + + if err != nil { + return map[string]interface{}{ + "string": "Connection to '" + host + "' failed", + }, err + } + + go func() { + app.SshExec(cli, idx, cma) + }() + + app.Log("Wait") + + return map[string]interface{}{ + "string": "Launch: " + strings.Join(cma, " "), + }, nil + } diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..13c65e0 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module t/z + +go 1.20 + +require ( + github.com/andybalholm/brotli v1.1.0 + github.com/gorilla/websocket v1.5.1 + golang.org/x/crypto v0.14.0 + golang.org/x/net v0.17.0 +) + +require golang.org/x/sys v0.13.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..1a1142e --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/main.go b/main.go new file mode 100644 index 0000000..9c6054c --- /dev/null +++ b/main.go @@ -0,0 +1,28 @@ + + package main + + import ( + // "fmt" + "os" + + "t/z/cmpSnipper" + ) + + func main() { + var app cmpSnipper.App; + var err error + + err = app.Prep() + + if err != nil { + os.Exit(1) + } + + err = app.Proc() + + if err != nil { + os.Exit(1) + } + + os.Exit(0) + } diff --git a/plug/CmpPlug1/CmpPlug1.go b/plug/CmpPlug1/CmpPlug1.go new file mode 100644 index 0000000..88c20ee --- /dev/null +++ b/plug/CmpPlug1/CmpPlug1.go @@ -0,0 +1,34 @@ + + package main + + import ( + "fmt" + +// "net/html" + ) + + type CmpPlug struct { + Log func(any, ...interface{}) + } + + var plg CmpPlug + + func CmpPlug1Init(in int, f func(any, ...interface{}), ifc map[string]interface{} ) interface{} { + plg.Log = f + + ifc["Ccc"] = "Ddd" + + fmt.Printf("This is CmpPlug1: %d\n", in) + + return ifc + } + + func CmpPlug1Some() error { + plg.Log("This is CmpPlug1Some") + + return nil + } + + func main() { + fmt.Print(23) + } diff --git a/static/cmpSwoPage.css b/static/cmpSwoPage.css new file mode 100644 index 0000000..e396f05 --- /dev/null +++ b/static/cmpSwoPage.css @@ -0,0 +1,558 @@ +body { + color:#ccc; + background-color:#222; + font-size: 20px; +} + +@media (display-mode: fullscreen) { + body { + color:#ccc; + background-color:#444; + } +} + + +button { + background-color:transparent; + border:1px solid grey; + border-radius:3px; + color: white; + width:24px; + height:24px; + font-size:18px; +} +button:hover { + background-color:transparent; + border:1px solid white; + color: white; +} + + +/* +input[type="checkbox"]:checked, +input[type="checkbox"]:not(:checked), +input[type="radio"]:checked, +input[type="radio"]:not(:checked) +{ + position: absolute; + left: -9999px; +} +input[type="checkbox"]:checked + label, +input[type="checkbox"]:not(:checked) + label, +input[type="radio"]:checked + label, +input[type="radio"]:not(:checked) + label { + // display: inline-block; + position: relative; + padding-left: 28px; + line-height: 20px; + cursor: pointer; +} +input[type="checkbox"]:checked + label:before, +input[type="checkbox"]:not(:checked) + label:before, +input[type="radio"]:checked + label:before, +input[type="radio"]:not(:checked) + label:before { + content: ""; + position: absolute; + left: 0px; + top: 0px; + width: 18px; + height: 18px; + border: 1px solid green; + background-color: #444; +} +input[type="checkbox"]:checked + label:before, +input[type="checkbox"]:not(:checked) + label:before { + border-radius: 4px; +} +input[type="radio"]:checked + label:before, +input[type="radio"]:not(:checked) + label:before { + border-radius: 100%; +} +input[type="checkbox"]:checked + label:after, +input[type="checkbox"]:not(:checked) + label:after, +input[type="radio"]:checked + label:after, +input[type="radio"]:not(:checked) + label:after { + content: ""; + position: absolute; + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + transition: all 0.2s ease; +} +input[type="checkbox"]:checked + label:after, +input[type="checkbox"]:not(:checked) + label:after { + left: 3px; + top: 4px; + width: 10px; + height: 5px; + border-radius: 1px; + border-left: 4px solid #ccc; + border-bottom: 4px solid #ccc; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + transform: rotate(-45deg); +} +input[type="radio"]:checked + label:after, +input[type="radio"]:not(:checked) + label:after { + left: 5px; + top: 5px; + width: 10px; + height: 10px; + border-radius: 100%; + background-color: #e145a3; +} +input[type="checkbox"]:not(:checked) + label:after, +input[type="radio"]:not(:checked) + label:after { + opacity: 0; +} +input[type="checkbox"]:checked + label:after, +input[type="radio"]:checked + label:after { + opacity: 1; +} + +*/ + + +table { + width:100%; + padding: 0px; +} + +table tr.odd:nth-child(2n) { + background: #2f2f2f; +} + +table tr.odd:hover { + background: #282828; +} + +table tbody.odd:nth-child(2n) { + background: #2f2f2f; +} + +table tbody.odd:hover { + background: #282828; +} + +table tr td { + padding:4px; +} + +a { color: #37a4a4; text-decoration:none; } +a:visited { color: #37a4a4; text-decoration:none; } + +#bodyDiv { + position:absolute; + top:0; + left:0; + right:0; + bottom:0; + border:0px solid black; +} + +#topper { + position:absolute; + top:0; + left:0; + right:0; + height:32px; + border:0px solid grey; + overflow:hidden; +} + +#topperTab { + vertical-align:top; + color:#222; + background: {SWS_BGCOLOR}; +} + +#topperTabLeft { + width:33%; +} + +#topperTabCenter { + width:33%; + text-align:center; +} + +#topperTabRight { + width:33%; + text-align:right; +} + +#footer { + background-color: #222; + position:absolute; + left:0; + right:0; + bottom:0; + height:32px; + overflow:hidden; + border:0px solid grey; +} + +#footerTab { + margin:0; + padding:0; + vertical-align:top; + border:0px solid grey; +} + +#footerTabLeft { + width:33%; +} +#footerTabCenter { + width:33%; + text-align:center; +} +#footerTabRight { + width:33%; + text-align:right; +} + +/***********************/ + +#leftMenu { + position:absolute; + top:32px; + left:0px; + width:142px; + bottom:32px; + border:0px solid grey; + padding:0px; + overflow:auto; +} + +#leftMenu input[type=button].leftMenuButton { + white-space: normal; + padding:4px 14px 4px 14px; + border:1px solid grey; + border-radius:4px; + background: #333; + color:#eee; + display:block; + width:138px; + margin:4px; +} + +#leftMenu button.leftMenuButton { + white-space: normal; + padding:4px 14px 4px 14px; + border:1px solid grey; + border-radius:4px; + background: #333; + color:#eee; + display:block; + width:138px; + height:100%; + margin:4px; + font-size:12px; +} + +#leftMenu a.leftMenuLink { + white-space: normal; + padding:4px 14px 4px 14px; + border:0px solid grey; + border-radius:4px; + display:block; + text-align:center; +} + + +#leftMenu div { + position:relative; +} + +#leftMenu .menuNotifyLab { + border: 1px solid grey; + border-radius: 4px; + width: 6px; + height: 6px; + background-color: red; + position: absolute; + bottom: 8px; + right: 8px; +} + +#leftMenu .menuNotifyLabAnim1 { + animation-duration: 0.8s; + animation-name: menuNotifyLabAnim1f; + animation-timing-function: linear; + animation-direction: alternate; +} + +@keyframes menuNotifyLabAnim1f { + from { + bottom: 500px; + } + + to { + bottom: 8px; + } +} + +#leftMenu .menuNotifyLabAnim2 { + animation-duration: 0.6s; + animation-name: menuNotifyLabAnim2f; + animation-timing-function: linear; +} + +@keyframes menuNotifyLabAnim2f { + from { + width: 6px; + height: 6px; + + bottom: 8px; + right: 8px; + } + + 50% { + width: 12px; + height: 12px; + + bottom: 5px; + right: 5px; + } + + to { + width: 6px; + height: 6px; + + bottom: 8px; + right: 8px; + } +} + +#leftMenu .menuNotifyLabHide { + opacity:0; + animation-duration: 0.6s; + animation-name: menuNotifyLabAnim3f; + animation-timing-function: linear; +} + +@keyframes menuNotifyLabAnim3f { + from { + width: 6px; + height: 6px; + + bottom: 8px; + right: 8px; + + opacity:1; + } + + to { + width: 12px; + height: 12px; + + bottom: 5px; + right: 5px; + + opacity:0; + } +} + +.leftMenuBlock { + display: block; + position: relative; + margin-top:4px; + margin-bottom:8px; + padding-bottom:8px; +} + +div.leftMenuBlockName { + display: block; +} + +button.leftMenuBlockName { + display: block; + border:0; +} + +.leftMenuBlockNameButton { + position: absolute; + top: 1px; + right:1px; + + border:1px solid green; + border-radius:12px; + padding:0px; + width :24px; + height :24px; + font-size:12px; +} + +.leftMenuBlockHide > .leftMenuBlockBody { + display: none; +} + +.leftMenuBlockBody { + display: block; +} + +/*******************************/ + +#mainRoot { + position:absolute; + top:32px; + left:150px; + right:0; + bottom:32px; + border:1px solid grey; + overflow:hidden; +} + + +input[type=text] { + background: #333; + color:#eee; +} + +input[type=button] { + padding:4px 14px 4px 14px; + border:1px solid grey; + border-radius:4px; + background: #333; + color:#eee; +} + +.headWord { + display:inline-block; + overflow:hidden; +} + +.footerWord { + display:inline-block; + overflow:hidden; + padding:0 2px 0 2px; +} + + + +/*********/ + +#page { + z-index:20; + position:fixed; + top:32px; + left:2px; + right:2px; + bottom:0; + border:1px solid #000; + border-radius:4px; + background:#222; + padding:6px; +} + +#pageBody { + border:0px solid red; + overflow:auto; + width:100%; + height:100%; +} + +#topRight { + z-index:10; + position:fixed; + background:#000; + top:-4px; + left:76%; + right:80px; + bottom:0px; + overflow:auto; + border:1px solid #000; + border-radius:4px; + padding:8px; + opacity:0.8; +} + +#topRight:hover { + z-index:50; + border:1px solid green; +} + +#topCent { + z-index:10; + position:fixed; + background:#222; + top:0; + left:20%; + right:20%; + border:1px solid #222; + padding:8px; +} + +#topCent:hover { + z-index:50; +} + +#topLeft { + z-index:10; + position:fixed; + background:#000; + top:-6px; + left:-2px; + right:80%; + border:1px solid #444; + padding:8px; +} + +#topLeft:hover { + z-index:50; + border:1px solid green; +} + +#srvDate { + animation-duration: 3s; + animation-name: an1; + letter-spacing: normal; +} + +#srvTime { + animation-duration: 3s; + animation-name: an1; + letter-spacing: normal; +} + +@keyframes an1 { + from { + letter-spacing: 8px; + font-size: 32px; + } + + to { + letter-spacing: normal; + font-size: inhrerit; + } +} + + +/*******/ + +.buttonIco { + border:1px solid grey; + border-radius:4px; + padding:2px; + margin:0; + min-width:54px; + background-color:transparent; + color:white; + font-size:16px; +} + +/*******/ + +#diag { + z-index:50; + position:fixed; + border:1px solid red; + border-radius:8px; + background-color:#222; + top:20px; + left:20px; + min-width:640px; + min-height:480px; + overflow:hidden; +} diff --git a/static/cmpSwoPage.js b/static/cmpSwoPage.js new file mode 100644 index 0000000..0905592 --- /dev/null +++ b/static/cmpSwoPage.js @@ -0,0 +1,809 @@ + class cmpSwoPage { + constructor() { + this.cmpSwoOnConnect = []; + this.cmpSwoOnDisconnect = []; + + this.cmpOnLoad(); + } + + cmpSwoPageInit() { + this.snip = {}; + + if(!this.sws_sta_prefix) + this.sws_sta_prefix = "go-prefix/static/"; + + if(!this.sws_dyn_prefix) + this.sws_dyn_prefix = "go-prefix/ws"; + + this.connect(); + + + this.git = null; + + this.cmpSwoTaskListInit(); + + this.srvTime = 0; + } + + connect() { + var serv = ""; + + if(window.location.protocol == "https:") + serv = "wss://"; + else + serv = "ws://" + + serv += window.location.host + "/" + this.sws_dyn_prefix ; + + this.wsrv = new WebSocket(serv); + + this.wsrv.onopen = this.onopen.bind (this); + this.wsrv.onclose = this.onclose.bind (this); + this.wsrv.onmessage = this.onmessage.bind (this); + this.wsrv.onerror = this.onerror.bind (this); + + this.WSState(1); + } + + onopen(evt) { + console.log("Connected to WebSocket server"); + + for(var i = 0; i < this.cmpSwoOnConnect.length; i++) { + (this.cmpSwoOnConnect[i])(); + } + + if(this.pprm == "only-connect") + return; + + // this.gitInfoReq(); + + // this.leftMenuReq(); + + // this.contentReq(); + } + + onclose(evt) { + for(var i = 0; i < this.cmpSwoOnDisconnect.length; i++) { + (this.cmpSwoOnDisconnect[i])(); + } + + console.log("Disconnected"); + + console.log("Reason: ", evt); + + if(!this.connInterval) { + setTimeout(this.connect.bind(this), 100); + } + } + + onmessage(evt) { + // console.log('Retrieved data from server: ' + evt.data); + + var obj = null; + + if(!evt.data) { + return console.log("Empty answer"); + } + + try { + obj = JSON.parse(evt.data); + } catch(e) { + console.log(evt); + console.log(e); + } + + if(!obj) { + console.log("Invalid JSON"); + + return; + } + + if(!obj.snip) { + console.log("Undefine/empty obj.snip", obj); + return; + } + + if(obj.task) { + console.log("Recv snip: " + obj.snip, "Tasked"); + + if(this.cmpSwoTaskListProc(obj) == 1) { + return; + } + } + + if(obj.snip != "swoTick1000") { + console.log("Recv snip: " + obj.snip, obj); + } + + if(obj.errors) { + console.log("Error: ", obj.errors); + } + + if(!obj.result) { + return console.log("Empty result"); + } + + if(this.snip[obj.snip]) { + console.log("Call this.snip[" + obj.snip + "].rcv"); + return (this.snip[obj.snip].rcv).bind(this, obj.result); + } + + do { + var snipFn = obj.snip + "Rcv"; + + if(typeof(this[snipFn]) != "function") + break; + + console.log("Call this[" + snipFn + "]"); + // console.log(this[snipFn]) + + return this[snipFn](obj.result); + } while(0); + + return console.log("Unknown snip '" + obj.snip + "'"); + } + + onerror(evt, e) { + console.log('Error occured: ', evt.data); + console.log(evt); + console.log(e); + } + + // Util + + setFavicon(i) { + var link = document.querySelector("link[rel~='icon']"); + + if (!link) { + link = document.createElement('link'); + link.rel = 'icon'; + document.head.appendChild(link); + } +/* + if(i) + link.href = '/go-prefix/static/img/umbrella-color.png'; + else + link.href = '/go-prefix/static/img/umbrella-black.png'; + + console.log(link.href); +*/ + } + + WSState(z) { + if(!this.wsrv) { + console.log("WebSocket is NULL"); + return 1; + } + + var m = ""; + + switch(this.wsrv.readyState) { + case this.wsrv.CONNECTING : m = "WebSocket state is CONNECTING" ; break; + case this.wsrv.OPEN : m = "WebSocket state is OPEN" ; break; + case this.wsrv.CLOSING : m = "WebSocket state is CLOSING" ; break; + case this.wsrv.CLOSED : m = "WebSocket state is CLOSED" ; break; + default : m = "WebSocket state is UNKNOWN" ; break; + } + + if(z) + console.log(m); + + if(this.wsrv.readyState == this.wsrv.OPEN) { + this.setFavicon(0); + + return 0; + } + + this.setFavicon(1); + + return 1; + } + + readySnip() { + if(!this.wsrv) { + console.log("WebSocket is NULL"); + return false; + } + + if(this.wsrv.readyState == this.wsrv.OPEN) + return true; + + return false; + } + + reqSnip(snip, obj) { + if(this.WSState()) { + return this.WSState(1); + } + + if(obj) { + obj.snip = snip; + } + else { + obj = { + snip: snip, + }; + } + + console.log("Send snip: " + obj.snip, obj); + + var str = JSON.stringify(obj); + + return this.wsrv.send(str); + } + + + gitInfoReq() { + return this.reqSnip("gitInfo"); + } + + gitInfoRcv(obj) { + var n; + + if(!this.git) { + this.git = obj; + } + + if(obj.gitStatus) { + if((n = document.getElementById("gitStatus"))) { + n.innerHTML = obj.gitStatus; + } + + if((n = document.getElementById("gitTitl"))) { + n.setAttribute("title", obj.gitStatus); + n.style.color = (obj.gitStatus == "treeClean") ? "#86de74" : "#ff3b6b"; + } + } + + if(obj.gitTimeStamp) { + if((n = document.getElementById("gitDate"))) { + n.innerHTML = unixtimeToYYYYMMDD(obj.gitTimeStamp); + + if(obj.gitTimeStamp != this.git.gitTimeStamp) + n.style.color = "#ffff64"; + else + n.style.color = "#86de74"; + } + + if((n = document.getElementById("gitTime"))) { + n.innerHTML = unixtimeToHHMMSS(obj.gitTimeStamp); + + if(obj.gitTimeStamp != this.git.gitTimeStamp) + n.style.color = "#ffff64"; + else + n.style.color = "#86de74"; + } + } + + if(obj.gitCommit && (n = document.getElementById("gitCHID"))) { + n.innerHTML = obj.gitCommit.substr(0, 8); + + if(obj.gitTimeStamp != this.git.gitTimeStamp) + n.style.color = "#ffff64"; + else + n.style.color = "#86de74"; + } + + if(obj.gitComment && (n = document.getElementById("gitComm"))) { + n.innerHTML = obj.gitComment; + + if(obj.gitTimeStamp != this.git.gitTimeStamp) + n.style.color = "#ffff64"; + else + n.style.color = "#86de74"; + } + } + + swoTick1000Rcv(obj) { + var tzOff = checkTZ(0); + + obj.ymd = unixtimeToYYYYMMDD(obj["time"] + tzOff); + obj.hms = unixtimeToHHMMSS (obj["time"] + tzOff); + + this.srvTime = obj["time"]; + + setNodeText("srvDate", obj, "ymd", 0); + setNodeText("srvTime", obj, "hms", 0); + } + + timeReStyle(sta) { + var n1 = document.getElementById("srvDate"); + var n2 = document.getElementById("srvTime"); + + if(sta == "connect") { + if(n1) n1.style.color = "#86de74"; + if(n2) n2.style.color = "#86de74"; + } + else { + if(n1) n1.style.color = "#ff3b6b"; + if(n2) n2.style.color = "#ff3b6b"; + } + + return; + } + + // Logic + + swoSystemctlRestartSelfServiceReq() { + this.reqSnip("swoSystemctlRestartSelfService"); + } + + swoSystemctlRestartSelfServiceRcv() { + ; + } + + rand4dReq() { + this.reqSnip("rand4d"); + } + + rand4dRcv(obj) { + return setNodeText("srvRand", obj, "rand4d"); + } + + pingReq() { + return this.reqSnip("ping"); + } + + pingRcv(obj) { + console.log("pingRcv", obj); + } + +/****************/ + + leftMenuNameClick(obj) { + if(!obj) + return console.log("No obj"); + + var nodeButton = null; + var nodeBlock = null; + var node = null; + + // console.log(button); + + if(obj.parentNode) { + node = obj; + } + else if(obj?.target?.parentNode) { + node = obj?.target; + } + + var mid = node.getAttribute("mid"); + + if(!mid) + console.log("Can't get mid"); + + if(!this.leftMenu.list[mid]) + console.log("Invalid mid"); + + nodeBlock = this.leftMenu.list[mid].nodeBlock; + nodeButton = this.leftMenu.list[mid].nodeButt; + + if(!nodeBlock) + return console.log("Invalid nodeBlock"); + + if(!nodeBlock.classList) + return console.log("Invalid nodeBlock.classList"); + + if(!nodeBlock.classList.contains("leftMenuBlock")) + return console.log("nodeBlock is not leftMenuBlock"); + + if(nodeBlock.classList.contains("leftMenuBlockHide")) { + nodeBlock.classList.remove("leftMenuBlockHide"); + nodeButton.innerHTML = "-"; + } + else { + nodeBlock.classList.add("leftMenuBlockHide"); + nodeButton.innerHTML = "+"; + } + + return; + } + + leftMenuItemLinkRend(obj, parn) { + var link = dcrt({ + tag : "a" , + parn : parn , + id : obj?.id , + class: "leftMenuLink" , + href : obj.href , + html : obj.html + }); + } + + leftMenuItemRend(obj, parn) { + if(obj.type == "link") + return this.leftMenuItemLinkRend(obj, parn); + + var cli = null; + + if(this[obj.func]) { + cli = this[obj.func].bind(this, obj.parm); + } + else { + console.log("Invalid func '" + obj.func + "'"); + } + + var cont = null; + + if(obj.parn) { + cont = dcrt({ + tag : "div", + parn : parn, + id : obj.parn + }); + } + else { + cont = parn; + } + + var but = dcrt({ + tag : "button" , + parn : cont , + id : obj?.id , + class: "leftMenuButton" , + click: cli , + html : obj.html + }); + + // but.setAttribute("onclick", "window.page." + obj.list[i].func + "();"); + } + + leftMenuBlockRend(obj) { + if(!this.leftMenuNodeRoot) { + return console.log("No .leftMenuNodeRoot"); + } + + var id = this.leftMenu.list.length; + + var nodeBlock = dcrt({ + tag : "div", + parn : this.leftMenuNodeRoot, + class: "leftMenuBlock" + }); + + if(!obj.view) + nodeBlock.classList.add("leftMenuBlockHide"); + + var nodeButt = dcrt({ + mid : id , + tag : "button" , + parn : nodeBlock , + class: "leftMenuBlockNameButton", + click: this.leftMenuNameClick.bind(this), + html : "+" + }); + + var nodeName = dcrt({ + mid : id , + tag : "button" , + parn : nodeBlock , + class: "leftMenuBlockName" , + click: this.leftMenuNameClick.bind(this), + html : obj.name + }); + + var nodeBody = dcrt({ + tag : "div", + parn : nodeBlock, + class: "leftMenuBlockBody" + }); + + this.leftMenu.list[id] = { + nodeBlock : nodeBlock , + nodeButt : nodeButt , + nodeName : nodeName , + nodeBody : nodeBody + } + + for(var i = 0; i < obj.list.length; i++) { + this.leftMenuItemRend(obj.list[i], nodeBody); + } + + return; + } + + leftMenuReq() { + this.reqSnip("leftMenu"); + } + + leftMenuRcv(obj) { + this.leftMenuNodeRoot = document.getElementById("leftMenu"); + + if(!this.leftMenuNodeRoot) { + return console.log("No .leftMenuNodeRoot"); + } + + this.leftMenuNodeRoot.innerHTML = ""; + + this.leftMenu = { + list: [] + } + + if(!obj.list) { + return console.log("No obj.list"); + } + + for(var i = 0; i < obj.list.length; i++) { + this.leftMenuBlockRend(obj.list[i]); + } + + if(obj.defaultPage) { + var parm = {}; + + if(obj.defaultPageParm) + parm = obj.defaultPageParm; + + this.pageContent = obj.defaultPage; + + this.contentReq(obj.defaultPage, parm); + } + } + +/****************/ + + swoTaskListRcv(obj) { + console.log(obj); + } + + swoTaskListReq() { + this.reqSnip("swoTaskList"); + } + + swoLockListRcv(obj) { + console.log(obj); + } + + swoLockListReq() { + this.reqSnip("swoLockList"); + } + + swoSetLogFileNameReq() { + this.reqSnip("swoSetLogFileName"); + } + + swoSetLogFileNameRcv(obj) { + console.log(obj); + } + +/****************/ + + cmpSwoTaskListInit() { + this.cmpSwoTaskList = []; + + this.cmpSwoTaskListNode = document.getElementById("cmpSwoTaskList"); + + if(!this.cmpSwoTaskListNode) { + console.log("No cmpSwoTaskList"); + } + + return; + } + + cmpSwoTaskListRendItem(name, obj) { + if(!this.cmpSwoTaskListNode) { + return; + } + + this.cmpSwoTaskList[name].node = dcrt({ + tag : "span", + parn : this.cmpSwoTaskListNode, + html : "[" + obj.snip + "]" + }); + + return; + } + + cmpSwoTaskListProc(obj) { + // if(!this.cmpSwoTaskListNode) { + // return 1; + // } + + var name = obj.task.task; + + if(obj.task.stat == "work") { + var tbj = { + snip: obj.snip, + node: null + }; + + this.cmpSwoTaskList[name] = tbj; + + // console.log("Append cmpSwoTaskList node " + name); + this.cmpSwoTaskListRendItem(name, obj); + + return 1; + } + + if(obj.task.stat == "complete") { + if(this.cmpSwoTaskList[name]?.node) { + // console.log("Remove cmpSwoTaskList node " + name + " by complete"); + this.cmpSwoTaskList[name].node.remove(); + } + + return 0; + } + + if(obj.task.stat == "lock") { + if(this.cmpSwoTaskList[name]?.node) { + // console.log("Remove cmpSwoTaskList node " + name + " by lock"); + this.cmpSwoTaskList[name].node.remove(); + } + + // console.log(obj); + + var cause = obj?.lock?.cause; + + if(cause) { + alert("Заблокировано: " + cause); + } + else { + alert("Заблокировано"); + } + + return 0; + } + +// if(obj.task.stat == "error") { +// ; +// +// return 0; +// } + + console.log("Unknown obj.task.stat: " + obj.task.stat); + console.log(obj); + + return; + } + + cmpOnLoad() { + console.log("OnLoad") + + this.nodeDataHeadRoot = document.getElementById("tblheadroot"); + this.nodeDataBodyRoot = document.getElementById("tblbodyroot"); + + dcrt({ + tag : "h4", + html : "Default page title", + style: "margin:4px;", + parn : this.nodeDataHeadRoot + }); + + dcrt({ + tag : "span", + html : "Default page data", + parn : this.nodeDataBodyRoot + }); + } + + cmpSshTestReq() { + this.nodeDataHeadRoot.innerHTML = ""; + this.nodeDataBodyRoot.innerHTML = ""; + + if(!this.nodeSshTestHead) { + this.nodeSshTestHead = dcrt({ + tag : "h4", + style: "margin:4px;", + html : "Test SSH", + parn : this.nodeDataHeadRoot + }); + + this.nodeSshTestBody = dcrt({ + tag : "tbody" + }); + + this.nodeSshTestRoot = dcrt({ + tag : "table", + parn : this.nodeDataBodyRoot, + child: [ this.nodeSshTestBody ] + }); + } + else { + this.nodeDataHeadRoot.appendChild(this.nodeSshTestHead) + this.nodeDataBodyRoot.appendChild(this.nodeSshTestRoot) + this.nodeSshTestBody.innerHTML = ""; + } + + this.reqSnip("cmpSshTest"); + } + + cmpSshTestRcv(obj) { + dcrt({ + tag : "tr", + parn : this.nodeSshTestBody, + child: [{ + tag : "td", + html : obj.string + }] + }); + } + + cmpHttpTestReq() { + this.nodeDataHeadRoot.innerHTML = ""; + this.nodeDataBodyRoot.innerHTML = ""; + + if(!this.nodeHttpTestHead) { + this.nodeHttpTestHead = dcrt({ + tag : "h4", + style: "margin:4px;", + html : "Test HTTP", + parn : this.nodeDataHeadRoot + }); + + this.nodeHttpTestBody = dcrt({ + tag : "tbody" + }); + + this.nodeHttpTestRoot = dcrt({ + tag : "table", + parn : this.nodeDataBodyRoot, + child: [ this.nodeHttpTestBody ] + }); + } + else { + this.nodeDataHeadRoot.appendChild(this.nodeHttpTestHead) + this.nodeDataBodyRoot.appendChild(this.nodeHttpTestRoot) + this.nodeHttpTestBody.innerHTML = ""; + } + + this.reqSnip("cmpHttpTest"); + } + + cmpHttpTestRcv(obj) { + if(obj.status == "error") { + dcrt({ + tag : "tr", + parn : this.nodeHttpTestBody, + child: [{ + tag : "td", + html : obj.error + }] + }); + + return; + } + + if(obj.status == "request") { + dcrt({ + tag : "tr", + parn : this.nodeHttpTestBody, + child: [{ + tag : "td", + html : obj.request + }] + }); + + return; + } + + if(obj.status == "response") { + dcrt({ + tag : "tr", + parn : this.nodeHttpTestBody, + child: [{ + tag : "td", + child: [{ + tag : "pre", + html : JSON.stringify(obj.response, null, 2) + }] + }] + }); + + return; + } + + dcrt({ + tag : "tr", + parn : this.nodeHttpTestBody, + child: [{ + tag : "td", + html : "Unknown status: '" + obj.status + "'" + }] + }); + + console.log(obj.status, obj) + + return; + } + + // END class + } diff --git a/static/cmpSwoUtil.js b/static/cmpSwoUtil.js new file mode 100644 index 0000000..01e1a5f --- /dev/null +++ b/static/cmpSwoUtil.js @@ -0,0 +1,343 @@ + + function unixtimeToYYYYMMDD(s) { + var n; + + if(s) + n = new Date(s * 1000); + else + n = new Date(); + + var m = n.getMonth()+1; + var d = n.getDate(); + + return (n.getFullYear()) + "-" + (m < 10 ? ("0" + m) : m) + "-" + (d < 10 ? ("0" + d) : d); + } + + function unixtimeToHHMMSS(s) { + var n; + + if(s) + n = new Date(s * 1000); + else + n = new Date(); + + var h = n.getHours(); + var m = n.getMinutes(); + var s = n.getSeconds(); + + return (h < 10 ? ("0" + h) : h) + ":" + (m < 10 ? ("0" + m) : m) + ":" + (s < 10 ? ("0" + s) : s); + } + + function checkTZ(z) { + if((new Date()).getTimezoneOffset()) + return 0; + + if(z) + console.log("Auto correct TimeZone"); + + return 12 * 60 * 60; + } + + function setNodeText(nn, obj, idx, q) { + var n = null; + + if(typeof q == "undefined") + q = 1; + + switch(typeof nn) { + case "string": + n = document.getElementById(nn); + break; + + case "object": + if(nn.nodeType != 1) + return console.log("Invalid node object"); + + n = nn; + + break; + + default: + return console.log("Invalid node type"); + } + + if(!n) { + if(q == 1) + return console.log("No node '" + nn + "'"); + + return; + } + + if(!obj[idx]) + return; + + n.innerHTML = obj[idx]; + + return; + } + + + function dpst(no, p) { + var n = null; + + do { + if(p.before) { + n = p.before; + break; + } + + if(p.after) { + n = p.after; + break; + } + + if(p.parn) { + n = p.parn; + break; + } + + return; + } while(0); + + if(typeof(n) == "string") { + n = document.getElementById(n); + + if(!n) + return false; + } + + if(n.nodeType !== 1) { + console.log("Invalid node type"); + return false; + } + + if(p.before) { + n.parentNode.insertBefore(no, n); + return true; + } + + if(p.after) { + if(p.after.nextSibling) + n.parentNode.insertBefore(no, n.nextSibling); + else + n.parentNode.appendChild(no); + + return true; + } + + if(p.parn) { + n.appendChild(no); + return true; + } + + return false; + } + + function dcrt(p) { + var at = ""; + var no = null; + var spc = { + "tag" : 1, + "html" : 1, + "parn" : 1, + "child" : 1, + "class" : 1, + + "after" : 1, + "before" : 1, + + "click" : 1, + "keyup" : 1, + "keypress" : 1, + "change" : 1, + "load" : 1, + + "src" : 1 + } + + if(!p.tag) { + console.log("Empty .tag"); + return null; + } + + no = document.createElement(p.tag); + + for(at in p) { + if(spc[at]) + continue; + + no.setAttribute(at, p[at]); + } + + if(p.class) + no.className = p.class; + + dpst(no, p); + + if(p.html) { + no.innerHTML = p.html; + } + + if(p.click) { + no.addEventListener("click", p.click, false); + } + + if(p.keyup) { + no.addEventListener("keyup", p.keyup, false); + } + + if(p.keypress) { + no.addEventListener("keypress", p.keypress, false); + } + + if(p.change) { + no.addEventListener("change", p.change, false); + } + + if(p.load) { + no.addEventListener("load", p.load, false); + // no.onload = p.load; + } + + if(p.src) { + no.setAttribute("src", p.src); + // no.src = p.src; + } + + if(!p.child) + return no; + + var ch = null; + + for(at = 0; at < p.child.length; at++) { + if(!p.child[at]) + continue; + + if(!p.child[at].nodeType) + ch = dcrt(p.child[at]); + else + ch = p.child[at] + + if(!ch) + continue; + + no.appendChild(ch); + } + + return no; + } + + class diag { + constructor(parm) { + this.buildBody(parm); + } + + buildBody(parm) { + var top = 0.8 * (window.innerHeight- 480)/2; + var left = 1.0 * (window.innerWidth - 640)/2; + + this.diagRoot = dcrt({ + tag : "div", + parn : "body", + id : "diag", + style: "display:none; top:"+top+"px; left:"+left+"px;" + }); + + this.diagHead = dcrt({ + tag : "div", + style: "position:absolute; top:0px; left:-2px; right:-2px; height:20px; background:#000; padding:10px; font-weight:bold;", + html : "DIALOG", + parn : this.diagRoot + }); + + this.diagBody = dcrt({ + tag : "div", + style: "position:absolute; left:0; right:0; top:40px; bottom:40px; padding:6px; border:0px solid white;", + parn : this.diagRoot, + // child: parm.child + }); + + this.diagFloor= dcrt({ + tag : "div", + style: "position:absolute; left:-2px; right:-2px; bottom:0px; height:20px; background:#000; padding:10px;", + parn : this.diagRoot + }); + + do { + if(!parm.head) + break; + + if(!parm.head.html) + break; + + this.diagHead.innerHTML = parm.head.html; + } while(0); + + do { + if(!parm.body) + break; + + if(!parm.body.node) + break; + + parm.body.node.parn = this.diagBody; + + dcrt(parm.body.node); + } while(0); + + do { + if(!parm.floor) + break; + + if(!parm.floor.node) + break; + + parm.floor.node.parn = this.diagFloor; + + dcrt(parm.floor.node); + } while(0); + + this.diagHead.addEventListener('mousedown', this.diagDraggable.bind(this), false); + } + + diagDraggable(e) { + var e = e || window.event; + + if(window.diag) + window.diag.diagRoot.style.zIndex = 49; + + window.diag = this; + + this.diagInnerX = e.clientX + window.pageXOffset - this.diagRoot.offsetLeft; + this.diagInnerY = e.clientY + window.pageYOffset - this.diagRoot.offsetTop; + + this.diagHandMove = this.diagMove .bind(this); + this.diagHandMouseUp = this.diagMouseUp.bind(this); + + window.addEventListener('mousemove', this.diagHandMove , false); + window.addEventListener('mouseup' , this.diagHandMouseUp, true); + } + + diagMouseUp(e) { + window.removeEventListener('mousemove', this.diagHandMove); + window.removeEventListener('mouseup' , this.diagHandMouseUp); + } + + diagMove(e) { + this.diagRoot.style.zIndex = 50; + this.diagRoot.style.position = 'fixed'; + this.diagRoot.style.left = e.clientX + window.pageXOffset - this.diagInnerX + 'px'; + this.diagRoot.style.top = e.clientY + window.pageYOffset - this.diagInnerY + 'px'; + } + + show() { + this.diagRoot.style.display = "block"; + } + + hide() { + this.diagRoot.style.display = "none"; + } + + // CLASS + }; + diff --git a/static/default.css b/static/default.css new file mode 100644 index 0000000..84d335a --- /dev/null +++ b/static/default.css @@ -0,0 +1,333 @@ + +body { + color:#ccc; + background-color:#222; + font-size: 20px; + font-family: monospace; +} + +@media (display-mode: fullscreen) { + body { + color:#ccc; + background-color:#444; + } +} + + +input[type="checkbox"]:checked, +input[type="checkbox"]:not(:checked), +input[type="radio"]:checked, +input[type="radio"]:not(:checked) +{ + position: absolute; + left: -9999px; +} +input[type="checkbox"]:checked + label, +input[type="checkbox"]:not(:checked) + label, +input[type="radio"]:checked + label, +input[type="radio"]:not(:checked) + label { + display: inline-block; + position: relative; + padding-left: 28px; + line-height: 20px; + cursor: pointer; +} +input[type="checkbox"]:checked + label:before, +input[type="checkbox"]:not(:checked) + label:before, +input[type="radio"]:checked + label:before, +input[type="radio"]:not(:checked) + label:before { + content: ""; + position: absolute; + left: 0px; + top: 0px; + width: 18px; + height: 18px; + border: 1px solid green; + background-color: #444; +} +input[type="checkbox"]:checked + label:before, +input[type="checkbox"]:not(:checked) + label:before { + border-radius: 4px; +} +input[type="radio"]:checked + label:before, +input[type="radio"]:not(:checked) + label:before { + border-radius: 100%; +} +input[type="checkbox"]:checked + label:after, +input[type="checkbox"]:not(:checked) + label:after, +input[type="radio"]:checked + label:after, +input[type="radio"]:not(:checked) + label:after { + content: ""; + position: absolute; + -webkit-transition: all 0.2s ease; + -moz-transition: all 0.2s ease; + -o-transition: all 0.2s ease; + transition: all 0.2s ease; +} +input[type="checkbox"]:checked + label:after, +input[type="checkbox"]:not(:checked) + label:after { + left: 3px; + top: 4px; + width: 10px; + height: 5px; + border-radius: 1px; + border-left: 4px solid #ccc; + border-bottom: 4px solid #ccc; + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + transform: rotate(-45deg); +} +input[type="radio"]:checked + label:after, +input[type="radio"]:not(:checked) + label:after { + left: 5px; + top: 5px; + width: 10px; + height: 10px; + border-radius: 100%; + background-color: #e145a3; +} +input[type="checkbox"]:not(:checked) + label:after, +input[type="radio"]:not(:checked) + label:after { + opacity: 0; +} +input[type="checkbox"]:checked + label:after, +input[type="radio"]:checked + label:after { + opacity: 1; +} + + + + +table { + width:100%; + padding: 4px; +} + +table tr.odd:nth-child(2n) { + background: #2f2f2f; +} + +table tr.odd:hover { + background: #282828; +} + +table tr td { + padding:4px; +} + +a { color: #37a4a4; text-decoration:none; } +a:visited { color: #37a4a4; text-decoration:none; } + +input[type=text] { + background: #333; + color:#eee; +} + +input[type=button] { + padding:4px 14px 4px 14px; + border:1px solid grey; + border-radius:4px; + background: #333; + color:#eee; +} + +.headWord { + display:inline-block; + overflow:hidden; +} + +.lftButn { + padding:4px 14px 4px 14px; + border:1px solid grey; + border-radius:4px; + background: #333; + color:#eee; + display:block; + width:100%; + margin:4px; +} + +/*********/ + +#page { + z-index:20; + position:fixed; + top:32px; + left:2px; + right:2px; + bottom:0; + border:1px solid #000; + border-radius:4px; + background:#222; + padding:6px; +} + +#pageBody { + border:0px solid red; + overflow:auto; + width:100%; + height:100%; +} + +#topRight { + z-index:10; + position:fixed; + background:#000; + top:-4px; + left:76%; + right:80px; + bottom:0px; + overflow:auto; + border:1px solid #000; + border-radius:4px; + padding:8px; + opacity:0.8; +} + +#topRight:hover { + z-index:50; + border:1px solid green; +} + +#topCent { + z-index:10; + position:fixed; + background:#222; + top:0; + left:20%; + right:20%; + border:1px solid #222; + padding:8px; +} + +#topCent:hover { + z-index:50; +} + +#topLeft { + z-index:10; + position:fixed; + background:#000; + top:-6px; + left:-2px; + right:80%; + border:1px solid #444; + padding:8px; +} + +#topLeft:hover { + z-index:50; + border:1px solid green; +} + +/*******/ + +#diag { + z-index:50; + position:fixed; + border:1px solid red; + border-radius:8px; + background-color:#222; + top:20px; + left:20px; + min-width:640px; + min-height:480px; + overflow:hidden; +} + +/*******/ + +#cmpKernelVanilaNodeRoot { + border:1px solid grey; + position:absolute; + top:16px; + right:4px; + width:300px; + height:90px; + overflow:hidden; +} + +#cmpKernelVanilaTitle { + padding-left:32px; + background-image: url(/go-prefix/static/img/tux-favicon.png); + background-repeat:no-repeat; + background-size:16px; + background-position: 8px 2px; +} + +#cmpKernelVanilaHead { + font-size:16px; + border-bottom:1px solid grey; +} + +#cmpKernelVanilaHeadButton { + border:0px solid grey; + position:absolute; + top:0; + right:-24px; + + padding:0px; + padding-right:0px; + margin:0; + background-color:transparent; + color:white; + font-size:16px; +} +#cmpKernelVanilaNodeRoot:hover #cmpKernelVanilaHeadButton { + right:8px; + transform: rotate(-180deg); + transition: right 1s, transform 1s; +} + +#cmpTinkoffCurrencyNodeRoot { + border:1px solid grey; + position:absolute; + top:110px; + right:4px; + width:300px; + height:90px; + overflow:hidden; +} + +#cmpTinkoffCurrencyTitle { + padding-left:32px; + background-image: url(/go-prefix/static/img/tkf-favicon-32x32.png); + background-repeat:no-repeat; + background-size:16px; + background-position: 8px 2px; +} + +#cmpTinkoffCurrencyHead { + font-size:16px; + border-bottom:1px solid grey; +} + +#cmpTinkoffCurrencyHeadButton { + border:0px solid grey; + position:absolute; + top:0; + right:-24px; + + padding:0px; + padding-right:0px; + margin:0; + background-color:transparent; + color:white; + font-size:16px; +} +#cmpTinkoffCurrencyNodeRoot:hover #cmpTinkoffCurrencyHeadButton { + right:8px; + transform: rotate(-270deg); + transition: right 1s, transform 1s; +} + +#cmpTinkoffCurrencyButton { + width: 100%; + height: 100%; + background-image: url(/go-prefix/static/img/tkf-logo-tinkoff.ru.png); + background-repeat:no-repeat; + background-size:32px; + background-position: 8px 2px; +} diff --git a/static/default.js b/static/default.js new file mode 100644 index 0000000..6ddc1c3 --- /dev/null +++ b/static/default.js @@ -0,0 +1,299 @@ + +// import { modTrm } from "/go-prefix/static/modTrm.js"; +// import { modYdl } from "/go-prefix/static/modYdl.js"; +// import { modNeverc } from "/go-prefix/static/modNeverc.js"; + + class cmpPage extends cmpSwoPage { + constructor() { + super(); + +// Object.assign(this, modTrm); +// Object.assign(this, modYdl); +// Object.assign(this, modNeverc); + + { + this.tblheadroot = document.getElementById("tblheadroot"); + this.tblbodyroot = document.getElementById("tblbodyroot"); + + this.tblbody = document.getElementById("tblbody"); + } + + // this.trmInitOnce(); + // this.ydlInitOnce(); + + this.cmpSwoOnConnect.push( this.timeReStyle.bind(this, "connect") ); + this.cmpSwoOnConnect.push( this.leftMenuReq.bind(this) ); + // this.cmpSwoOnConnect.push( this.trmConnect.bind(this) ); + // this.cmpSwoOnConnect.push( this.ydlConnect.bind(this) ); + this.cmpSwoOnDisconnect.push( this.timeReStyle.bind(this, "disconnect") ); + + this.cmpSwoPageInit(); + + this.offLineInit(); + + ; + } + + + setHeadHeight(ii) { + this.tblheadroot.style.bottom = ii + "px"; + this.tblbodyroot.style.top = (ii+1) + "px"; + } + + setHead(node) { + if(this.tblheadview) + this.tblheadview.style.display = "none"; + + this.tblheadview = node; + this.tblheadroot.appendChild(node); + this.tblheadview.style.display = ""; + } + + setBody(node) { + if(this.tblbodyview) + this.tblbodyview.style.display = "none"; + + this.tblbodyview = node; + this.tblbodyroot.appendChild(node); + this.tblbodyview.style.display = ""; + } + + // Util + + setNode(nn, obj, idx) { + var n = document.getElementById(nn); + + if(!n) + return console.log("No node '" + nn + "'"); + + n.innerHTML = obj[idx]; + + return; + } + + // Logic + + contentReq(page, parm) { + console.log("contentReq", page); + + if(page == "trmShow") { + this.trmShow(); + } + } + + + + + rndTabHead(parn, hdr) { + var hdrTb = document.getElementById("tblhtr"); + + if(!hdrTb) + return; + + hdrTb.innerHTML = ""; + + for(var n = parn?.firstChild?.firstChild, i = 0; n; n = n.nextSibling, i++) { + var sta = "border-right:1px solid grey; border-bottom:1px solid grey; "; + + if(hdr[i].child) { + sta = ""; + } + + var th = dcrt({ + tag : "th", + parn : hdrTb, + style: sta + "width:" + (n.offsetWidth) + "px;", + child: hdr[i].child ? hdr[i].child : null + }); + + if(hdr[i].html) { + th.innerHTML = hdr[i].html; + } + } + + var n = document.getElementById("tblbodyroot"); + + if(n) { + n.style.top = (hdrTb.offsetHeight + 6) + "px"; + } + + return; + } + + + // + + + // + + getSpeeddialElemReq() { + return this.reqSnip("getSpeeddialElem", null); + } + + getSpeeddialElemRcv(obj) { + var i = 0; + + for(i = 0; i < obj.length; i++) { + this.rndSpeeddialElem(obj[i]); + } + } + + // + + offLineInit() { + if(1) + return; + + this.spdNodeLeftMenu = dcrt({ + tag : "div", + parn : "mainRoot", + style: "width:320px; position:relative; height:calc(100% - 10px); top:5px; left:5px; border:1px solid grey;" + }); + + this.spdNodeLeftMenuScrTop = dcrt({ + tag : "div", + parn : this.spdNodeLeftMenu, + style: "width:100%; margin:0px; height:40px; border-bottom:1px solid grey;" + }); + + this.spdNodeLeftMenuBody = dcrt({ + tag : "div", + parn : this.spdNodeLeftMenu, + style: "width:100%; margin:0px; height:calc(100% - 80px); overflow-x:hidden; scroll-x:auto;" + }) + + this.spdNodeLeftMenuScrBottom = dcrt({ + tag : "div", + parn : this.spdNodeLeftMenu, + style: "width:100%; margin:0px; height:40px; border-top:1px solid grey;" + }); + + return; + } + + rndSpeeddialElem(obj) { + if(obj.type != "local") + return; + + var lab = dcrt({ + tag : "div", + style: "padding:16px;", + html : obj.label ? obj.label : obj.ip4v + }); + + var com = dcrt({ + tag : "div", + style: "color:#888; padding-left:32px; margin-right:32px;", + html : (obj.label ? obj.ip4v : "") + (obj.xport ? (" / " + obj.xport) : "") + }); + + var zzz = null; + + if(obj.xport == "A0") { + zzz = this.rndECtl(); + } + + dcrt({ + tag : "div", + parn : this.spdNodeLeftMenuBody, + style: "position:relative; width:calc(100%-10px); margin:5px; height:100px; border:1px solid grey;", + child: [ + lab, + com, + zzz + ] + }); + } + + rndECtl() { + if(!this.listECtl) + this.listECtl = []; + + var id = this.listECtl.legth; + + this.listECtl[id] = {}; + + this.listECtl[id].nodePoint = dcrt({ + tag : "div", + style: "position:absolute; top:2px; width:0px; height:0px; border-radius:17px; border:16px solid;" + }); + + this.listECtl[id].nodePoint.style.left = "2px"; + this.listECtl[id].nodePoint.style.borderColor = "#a33"; + + this.listECtl[id].nodeLabel = dcrt({ + tag : "div" + }); + + this.listECtl[id].nodeRoot = dcrt({ + tag : "div", + style: "position:absolute; top:32px; right:32px; width:84px; height:36px; border:1px solid grey; border-radius:18px;", + click: this.clickECtl.bind(this, id), + child: [ + this.listECtl[id].nodePoint, + this.listECtl[id].nodeLabel + ] + }); + + return this.listECtl[id].nodeRoot; + } + + clickECtl(id) { + var style = this.listECtl[id].nodePoint.style; + + if(style.left) { + style.left = ""; + style.right = "2px"; + style.borderColor = "#3a3"; + } + else { + style.left = "2px"; + style.right = ""; + style.borderColor = "#a33"; + } + + + return; + } + + //========================== + + urlMod(parm) { + if(!parm?.urlMod.url) + return console.log("No .url"); + + if(!parm?.urlMod.title) + return console.log("No .title"); + + // const nextState = parm?.urlMod.nextState; // { additionalInformation: 'Updated the URL with JS' }; + + // This will create a new entry in the browser's history, without reloading + window.history.pushState(parm?.urlMod.nextState, parm?.urlMod.title, parm.urlMod.url); + + // This will replace the current entry in the browser's history, without reloading + window.history.replaceState(parm?.urlMod.nextState, parm?.urlMod.title, parm.urlMod.url); + + // console.log(window.location) + } + + // END class + } + + + window.diag = null; + function diagMove(e) { + window.diag.diagMove(e); + } + function diagMouseUp(e) { + window.diag.diagRoot.style.zIndex = 50; + window.removeEventListener('mousemove', diagMove, false); + } + + var page = null; + + document.addEventListener("DOMContentLoaded", function(event) { + page = new cmpPage(); + window.page = page; + }); + +// END diff --git a/static/img/favicon.png b/static/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e625c912baf03b80fe8d27d58728ce0661b1f57 GIT binary patch literal 4669 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

Fl~P+djsI0HiOOXS9>i#CqQQ?9PtE1JpU z;%Y~$UN_2W6_OuR^wz!mSZuC4#=mH^3I0aIPHXsrYV>}$%oe)2PdHkyqioP6 zUP>oS>!M@bBqhi1x4F)jwFeEePJB$yQAg04+85<)O~;s03xYGW!>^s-Po`(psrHv~ zhthhTR_`vI4~ebd<(9S=+pMBTk)`C~z2e;2xgY9Hq6d5z@6XH@ifq|CZk<^gWu#sC ztNt5gpBOeZ_F8Al@4e>U-S;71Tj(vD@(u)=Cw)Y`5jM{VyCo!v7aI$c98SOOuKU{w zibP8hO{xm*hJ#!XX6a<}!pY9T-`cB;D=TxKTJDpEabUf+ znVvyd_Y={(*U!T{=CTzgJ}s~CwNde8J#&MYL$g%(<{t5;>D<%&b^@33)Y2Xac&MykKtoZj{N*(*I+%ZgH4*Axe5V% z@&;3dV0dm9tyPsV96+UabwE=SY3@J!(MO3wNqO^!&ovnJpYC*cJ6mfUiqDPNR|}VM z`-({3)2hW^R+0Ucn07|xRGt?7s>&l@_5FxhSkJO!Ez;hvQzmY)EQzg6^Hy&3%*`J< wurc{JgHpVX3d)A zchE5fD8yJ2rjY6=%$`rGDZ m-uU#4%{>Oymoqt}+oVsntKU5HtTG&E6@#a%pUXO@geCw{vq$s* literal 0 HcmV?d00001 diff --git a/static/img/tux-favicon.png b/static/img/tux-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fba67acbb5a68eec567d594e569859cca27ccf GIT binary patch literal 3762 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 ctVb#T2QV5U0*yL6eE literal 0 HcmV?d00001 diff --git a/static/img/umbrella-black.png b/static/img/umbrella-black.png new file mode 100644 index 0000000000000000000000000000000000000000..a1d981eeb73469e48cfe531f93c2f1248c04ba26 GIT binary patch literal 47281 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ƺy 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 CPZJgZ literal 0 HcmV?d00001 diff --git a/static/img/umbrella-color.png b/static/img/umbrella-color.png new file mode 100644 index 0000000000000000000000000000000000000000..10b21c3eecfe184f80b8e6fc0604904fc507886e GIT binary patch literal 82805 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 DSEi`H literal 0 HcmV?d00001 diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..5b93bd1 --- /dev/null +++ b/static/index.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + +
+
+ + +
+   + +   + + +
USER
+
+
+
+
+
+ +
+
+
+ +
diff --git a/static/index2.html b/static/index2.html new file mode 100644 index 0000000..5b93bd1 --- /dev/null +++ b/static/index2.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + +
+
+ + +
+   + +   + + +
USER
+
+
+
+
+
+ +
+
+
+ +