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