xref: /unit/test/go/ns_inspect/app.go (revision 1490:cecf6b11a1e3)
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