Skip to content

Instantly share code, notes, and snippets.

@chrisneal
Last active July 4, 2017 15:48
Show Gist options
  • Save chrisneal/72419e6672e2370331d34aa09be158fa to your computer and use it in GitHub Desktop.
Save chrisneal/72419e6672e2370331d34aa09be158fa to your computer and use it in GitHub Desktop.
ClamAV Virus check
package main
import (
"bufio"
"encoding/binary"
"fmt"
"io"
"net"
"os"
"strings"
"time"
)
func main() {
var filename string
var conn net.Conn
var err error
hostname := os.Args[1]
port := os.Args[2]
filename = os.Args[3]
timeout := time.Duration(5) * time.Second
conn, err = net.DialTimeout("tcp", fmt.Sprintf("%s:%s", hostname, port), timeout)
if err != nil {
fmt.Println(err)
return
}
defer conn.Close()
file, err := os.Open(filename)
if err != nil {
fmt.Println(err)
return
}
defer file.Close()
result := bufio.NewReader(conn)
buffer := make([]byte, 2048)
var data string
if _, err := conn.Write([]byte("nINSTREAM\n")); err != nil {
fmt.Println("INSTREAM write error")
return
}
for {
readSize, err := file.Read(buffer)
if err != nil {
if err == io.EOF {
break
}
fmt.Println("Error while reading file '%s': %s", filename, err.Error())
return
}
if readSize > 0 {
if err = binary.Write(conn, binary.BigEndian, uint32(readSize)); err != nil {
fmt.Println("size write error %s, %d, %s", filename, readSize, err.Error())
return
}
if _, err = conn.Write(buffer[0:readSize]); err != nil {
fmt.Println("data write error %s, %d, %s", filename, readSize, err.Error())
return
}
}
}
binary.Write(conn, binary.BigEndian, uint32(0))
data, err = result.ReadString('\n')
if err != nil {
fmt.Println("read error")
return
}
if strings.Contains(data, "FOUND") {
fmt.Println("found virus")
return
}
if strings.Contains(data, "ERROR") {
fmt.Println("error")
return
}
fmt.Println("no virus")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment