package socket import ( "bytes" "fmt" "github.com/kisielk/og-rek" "github.com/nlpodyssey/gopickle/pickle" "net" ) const ( commandTerminator = "<F2B_END_COMMAND>" pingCommand = "ping" socketReadBufferSize = 10000 ) func (s *Fail2BanSocket) sendCommand(command []string) (interface{}, error) { err := write(s.encoder, command) if err != nil { return nil, err } return read(&s.socket) } func write(encoder *ogórek.Encoder, command []string) error { err := encoder.Encode(command) if err != nil { return err } err = encoder.Encode(commandTerminator) if err != nil { return err } return nil } func read(s *net.Conn) (interface{}, error) { buf := make([]byte, socketReadBufferSize) _, err := (*s).Read(buf) if err != nil { return nil, err } bufReader := bytes.NewReader(buf) unpickler := pickle.NewUnpickler(bufReader) unpickler.FindClass = func(module, name string) (interface{}, error) { if module == "builtins" && name == "str" { return &Py_builtins_str{}, nil } return nil, fmt.Errorf("class not found: " + module + " : " + name) } return unpickler.Load() }