func main() { if len(os.Args) < 2 { fmt.Fprintf(os.Stderr, "Usage: %s -h for help\n", os.Args[0]) os.Exit(1) } config_file := goopt.String([]string{"-c", "--config"}, "nrpe.cfg", "config file to use") //the first option, will be the default, if the -m isnt given run_mode := goopt.Alternatives([]string{"-m", "--mode"}, []string{"foreground", "daemon", "systemd"}, "operating mode") goopt.Parse(nil) //implement different run modes.. fmt.Println(*run_mode) config_obj := new(read_config.ReadConfig) config_obj.Init(*config_file) err := config_obj.ReadConfigFile() common.CheckError(err) //extract the commands command[cmd_name] = "/bin/foobar" config_obj.ReadCommands() config_obj.ReadPrivileges() //TODO check for errors //what we gonna do with the group? pwd := drop_privilege.Getpwnam(config_obj.Nrpe_user) drop_privilege.DropPrivileges(int(pwd.Uid), int(pwd.Gid)) //we have to read it from config service := ":5666" err = setupSocket(4, service, config_obj) common.CheckError(err) }
func prepareConnection(endpoint string, transport_type int) net.Conn { tcpAddr, err := net.ResolveTCPAddr("tcp4", endpoint) common.CheckError(err) conn, err := getSocket(transport_type, endpoint, tcpAddr) common.CheckError(err) if conn != nil { return conn } return nil }
func handleClient(conn net.Conn, config_obj *read_config.ReadConfig) { // close connection on exit defer conn.Close() pkt_rcv, _ := common.ReceivePacket(conn) cmd := string(pkt_rcv.CommandBuffer[:common.GetLen(pkt_rcv.CommandBuffer[:])]) pkt_rcv_crc32value := pkt_rcv.CRC32Value if crc32, _ := common.DoCRC32(&pkt_rcv); crc32 != pkt_rcv_crc32value { fmt.Println("WARNING: CRC not matching", crc32, pkt_rcv_crc32value) } pkt_send := common.PrepareToSend(cmd, common.RESPONSE_PACKET) if pkt_send.ResultCode == common.STATE_UNKNOWN { //its a response, but not to the HELLO_COMMAND if config_obj.IsCommandAllowed(cmd) { str_cmd := config_obj.GetCommand(cmd) fmt.Println("executing:", str_cmd) return_id, return_stdout := common.ExecuteCommand(str_cmd) pkt_send.ResultCode = return_id copy(pkt_send.CommandBuffer[:], return_stdout) pkt_send.CRC32Value, _ = common.DoCRC32(&pkt_send) } else { pkt_send.ResultCode = common.STATE_CRITICAL } } err := common.SendPacket(conn, pkt_send) common.CheckError(err) }
func setupSocket(socket_version int, service string, config_obj *read_config.ReadConfig) error { socket_type := "tcp4" if socket_version == 6 { socket_type = "tcp6" } tcpAddr, err := net.ResolveTCPAddr(socket_type, service) common.CheckError(err) listener, err := net.ListenTCP("tcp", tcpAddr) if err != nil { return err } for { if conn, err := listener.Accept(); err != nil { continue } else { // run as a goroutine go handleClient(conn, config_obj) } } return nil }
func main() { if len(os.Args) < 2 { fmt.Printf("%s -h for help\n", os.Args[0]) os.Exit(1) } var host = goopt.String([]string{"-H", "--host"}, "127.0.0.1", "The remote host running NRPE-Server") var port = goopt.Int([]string{"-p", "--port"}, 5666, "The remote port on which the NRPE-server listens") var transport = goopt.Int([]string{"-t", "--transport"}, 0, "Transport type: 0 - clear, 1 - ssl, 2 -ssh") var command = goopt.String([]string{"-c", "--command"}, "version", "The check command defined in the nrpe.cfg file you would like to trigger") goopt.Parse(nil) service := fmt.Sprintf("%s:%d", *host, *port) conn := prepareConnection(service, *transport) pkt_to_send := common.PrepareToSend(*command, common.QUERY_PACKET) err := common.SendPacket(conn, pkt_to_send) common.CheckError(err) response_from_command, _ := common.ReceivePacket(conn) fmt.Println(string(response_from_command.CommandBuffer[:])) os.Exit(int(response_from_command.ResultCode)) }