#!/usr/bin/env python # aclamfilter: procmail filter for ClamAV virus-checking # By Adam Sampson # Based on Matt Hahnfeld's ClamFilter: http://www.everysoft.com/clamfilter.html BLOCK = 8192 PREFIX = "X-Offog-" import sys, os, commands, tempfile def die(s): sys.stderr.write("aclamfilter: " + s + "\n") sys.stderr.flush() sys.exit(1) def main(): fn = tempfile.mktemp() try: f = open(fn, "w") while 1: d = sys.stdin.read(BLOCK) if d == "": break f.write(d) f.close() except IOError: die("Unable to write temporary file " + fn) try: (pr, pw) = os.pipe() except: die("pipe() failed") try: pid = os.fork() except: die("fork() failed") if pid == 0: os.close(pr) fd = os.open(fn, os.O_RDONLY) os.dup2(fd, 0) os.close(fd) os.dup2(pw, 1) os.dup2(pw, 2) cmd = ["clamdscan", "--stdout", "--recursive", "-"] os.execvp(cmd[0], cmd) sys.stderr.write("aclamfilter: cannot exec " + cmd[0] + "\n") sys.stderr.flush() os._exit(0) os.close(pw) f = os.fdopen(pr) found = [] while 1: l = f.readline() if l == "": break l = l.strip() i = l.find(": ") if l.endswith(" FOUND") and i != -1: found.append(l[i + 2:-6]) f.close() (deadpid, status) = os.waitpid(pid, 0) if (status >> 8) == 0: headers = "" else: headers = PREFIX + "Virus-Found: " + (" ".join(found)) + "\n" f = open(fn, "r") while 1: l = f.readline() if l == "\n" or l == "": break sys.stdout.write(l) sys.stdout.write(headers) sys.stdout.write(l) while 1: d = f.read(BLOCK) if d == "": break sys.stdout.write(d) sys.stdout.flush() f.close() os.unlink(fn) sys.exit(0) if __name__ == "__main__": main()