package main import ( "encoding/json" "errors" "io" "net" "os" "os/exec" "path/filepath" ) func runMap(conn net.Conn, instance string, objmap map[string]interface{}) (int, error) { program, has := objmap["package"] if !has { return 0, errors.New("a package is required") } arguments, has := objmap["arguments"] if !has { arguments = "" } target, has := objmap["target"] if !has { target = "run" } workdir, has := objmap["workdir"] if !has { return 0, errors.New("a workdir is required") } return run(conn, instance, program.(string), arguments.(string), target.(string), workdir.(string)) } func run(conn net.Conn, instance string, program string, arguments string, target string, workdir string) (int, error) { package_path, err := filepath.Abs(filepath.Join(instance, "apps", program)) if err != nil { return 0, err } var_path, err := filepath.Abs(filepath.Join(instance, "var", program)) if err != nil { return 0, err } info_path, err := filepath.Abs(filepath.Join(package_path, "boundaries.json")) if err != nil { return 0, err } if exists, err := path_exists(info_path); !exists || err != nil { return 0, errors.New("package " + program + " not found") } working_dir, err := filepath.Abs(workdir) if err != nil { return 0, err } infofile_content, err := os.ReadFile(info_path) if err != nil { return 0, err } var info map[string]interface{} err = json.Unmarshal(infofile_content, &info) if err != nil { return 0, err } _, has := info["name"] if !has { return 0, errors.New("invalid boundaries.json file. name field not found") } command_interface, has := info["command"] if !has { return 0, errors.New("invalid boundaries.json file. command field not found") } commands := command_interface.(map[string]interface{}) command, has := commands[target] if !has { return 0, errors.New("target " + target + " not found") } command, err = filepath.Abs(filepath.Join(package_path, command.(string))) if err != nil { return 0, err } cmd := exec.Command("sh", "-c", command.(string)+" "+arguments) cmd.Dir = working_dir cmd.Env = append(cmd.Environ(), "APP_DIR="+package_path, "VAR_DIR="+var_path) cmd.Stdout = io.MultiWriter(conn, os.Stdout) cmd.Stderr = io.MultiWriter(conn, os.Stderr) cmd.Stdin = conn err = cmd.Run() if err != nil { return 0, err } return 0, nil }