package main import ( "encoding/json" "errors" "net" "os" "path/filepath" ) func removeMap(conn net.Conn, instance string, objmap map[string]interface{}) error { program, has := objmap["package"] if !has { return errors.New("a package is required") } keep_data, has := objmap["keep_data"] if !has { keep_data = false } return remove(conn, instance, program.(string), keep_data.(bool)) } func remove(conn net.Conn, instance string, program string, keep_data bool) error { package_path, err := filepath.Abs(filepath.Join(instance, "apps", program)) if err != nil { return err } info_path, err := filepath.Abs(filepath.Join(package_path, "boundaries.json")) if err != nil { return err } if exists, err := path_exists(info_path); !exists || err != nil { return errors.New("package not found") } infofile_content, err := os.ReadFile(info_path) if err != nil { return err } var info map[string]interface{} err = json.Unmarshal(infofile_content, &info) if err != nil { return err } err = os.RemoveAll(package_path) if err != nil { return err } var_path, err := filepath.Abs(filepath.Join(instance, "var", program)) if exists, err := path_exists(var_path); exists && err == nil && !keep_data { err = os.RemoveAll(var_path) if err != nil { return err } } desktop_path, err := filepath.Abs(filepath.Join(instance, "exec", "desktop", program+".desktop")) if exists, err := path_exists(desktop_path); exists && err == nil { err = os.Remove(desktop_path) if err != nil { return err } } bin_files, has := info["bin"] if has { switch bin_files.(type) { case string: err = remove_bin(instance, bin_files.(string)) if err != nil { return err } case map[string]interface{}: for _, path := range bin_files.(map[string]interface{}) { err = remove_bin(instance, path.(string)) if err != nil { return err } } default: return errors.New("unknown type for bin") } } return nil } func remove_bin(instance string, path string) error { bin_path, err := filepath.Abs(filepath.Join(instance, "exec", "bin", path)) if err != nil { return err } if exists, err := path_exists(bin_path); exists && err == nil { err = os.Remove(bin_path) if err != nil { return err } } return nil }