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}