1/*
2 * hare.go (C)2018 by Jan-Piet Mens <jp@mens.de>
3 * inspired by work done on hared.go by Juzam
4 * This is a rewrite of hare.c in Golang
5 * This is also the first time I've spent more than 10m with the language.
6 */
7
8package main
9
10import (
11       "encoding/json"
12       "strings"
13       "fmt"
14       "time"
15       "os"
16       "net"
17    )
18
19const (
20      PORTNUM = 8035
21)
22
23func main() {
24	m := []string{"user", "service", "rhost", "tty"}
25	var val string
26	var ok bool
27
28	val, ok = os.LookupEnv("PAM_SM_TYPE")	// FreeBSD
29	if !ok {
30	   val, ok = os.LookupEnv("PAM_TYPE")
31	   if !ok {
32	      // crap
33	   }
34	}
35
36	if val != "open_session" && val != "pam_sm_open_session" {
37	    fmt.Printf("%s: Neither PAM open_session nor pam_sm_open_session detected\n", os.Args[0])
38	    return
39	}
40
41	hostname, err := os.Hostname()
42	if err != nil {
43	     fmt.Printf("Cannot get local hostname: %v\n", err)
44	     return
45	}
46
47	address := "127.0.0.1"
48	if len(os.Args) == 2 {
49	   address = os.Args[1]
50	}
51
52	jlist  := make(map[string]interface{})
53
54	for i := range m {
55		k := m[i]
56		p := "PAM_" + strings.ToUpper(k)
57		v, ok := os.LookupEnv(p)
58		if !ok {
59		    jlist[k] = nil
60		} else {
61		  jlist[k] = v
62		}
63	}
64
65	jlist["hostname"] = hostname
66	jlist["tst"] = time.Now().Unix()
67
68	jbin, err := json.Marshal(jlist)
69	if err != nil {
70	   fmt.Println("ERR")
71	}
72	fmt.Println(string(jbin))
73
74	a := fmt.Sprintf("%s:%d", address, PORTNUM)
75
76	conn, err := net.Dial("udp", a)
77	if err != nil {
78	   fmt.Printf("Cannot create UDP socket %v\n", err)
79	   return
80	}
81
82	fmt.Fprintf(conn, "%s", string(jbin))
83
84	conn.Close()
85}