1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "unit.nginx.org/go" 8 "os" 9 "strconv" 10) 11 12type ( 13 NS struct { 14 USER uint64 15 PID uint64 16 IPC uint64 17 CGROUP uint64 18 UTS uint64 19 MNT uint64 20 NET uint64 21 } 22 23 Output struct { 24 PID int 25 UID int 26 GID int 27 NS NS 28 FileExists bool 29 } 30) 31 32func abortonerr(err error) { 33 if err != nil { 34 panic(err) 35 } 36} 37 38// returns: [nstype]:[4026531835] 39func getns(nstype string) uint64 { 40 str, err := os.Readlink(fmt.Sprintf("/proc/self/ns/%s", nstype)) 41 if err != nil { 42 return 0 43 } 44 45 str = str[len(nstype)+2:] 46 str = str[:len(str)-1] 47 val, err := strconv.ParseUint(str, 10, 64) 48 abortonerr(err) 49 return val 50} 51 52func handler(w http.ResponseWriter, r *http.Request) { 53 pid := os.Getpid() 54 out := &Output{ 55 PID: pid, 56 UID: os.Getuid(), 57 GID: os.Getgid(), 58 NS: NS{ 59 PID: getns("pid"), 60 USER: getns("user"), 61 MNT: getns("mnt"), 62 IPC: getns("ipc"), 63 UTS: getns("uts"), 64 NET: getns("net"), 65 CGROUP: getns("cgroup"), 66 }, 67 } 68 69 err := r.ParseForm() 70 if err != nil { 71 w.WriteHeader(http.StatusInternalServerError) 72 return 73 } 74 75 if fname := r.Form.Get("file"); fname != "" { 76 _, err = os.Stat(fname); 77 out.FileExists = err == nil 78 } 79 80 data, err := json.Marshal(out) 81 if err != nil { 82 w.WriteHeader(http.StatusInternalServerError) 83 return 84 } 85 86 w.Header().Add("Content-Type", "application/json") 87 88 w.Write(data) 89} 90 91func main() { 92 http.HandleFunc("/", handler) 93 unit.ListenAndServe(":7080", nil) 94} 95