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 } 29) 30 31func abortonerr(err error) { 32 if err != nil { 33 panic(err) 34 } 35} 36 37// returns: [nstype]:[4026531835] 38func getns(nstype string) uint64 { 39 str, err := os.Readlink(fmt.Sprintf("/proc/self/ns/%s", nstype)) 40 if err != nil { 41 return 0 42 } 43 44 str = str[len(nstype)+2:] 45 str = str[:len(str)-1] 46 val, err := strconv.ParseUint(str, 10, 64) 47 abortonerr(err) 48 return val 49} 50 51func handler(w http.ResponseWriter, r *http.Request) { 52 pid := os.Getpid() 53 out := &Output{ 54 PID: pid, 55 UID: os.Getuid(), 56 GID: os.Getgid(), 57 NS: NS{ 58 PID: getns("pid"), 59 USER: getns("user"), 60 MNT: getns("mnt"), 61 IPC: getns("ipc"), 62 UTS: getns("uts"), 63 NET: getns("net"), 64 CGROUP: getns("cgroup"), 65 }, 66 } 67 data, err := json.Marshal(out) 68 if err != nil { 69 w.WriteHeader(http.StatusInternalServerError) 70 return 71 } 72 73 w.Header().Add("Content-Type", "application/json") 74 75 w.Write(data) 76} 77 78func main() { 79 http.HandleFunc("/", handler) 80 unit.ListenAndServe(":7080", nil) 81} 82