ClamAV-Client-0.11/0000755000175400001440000000000010174304146014417 5ustar julianusers00000000000000ClamAV-Client-0.11/CHANGES0000644000175400001440000000053210174304146015412 0ustar julianusers00000000000000# Legend: # --- = A new release # x = Changed something significant, or removed a feature # * = Fixed a bug # + = Added a feature (in a backwards compatible way) --- 0.11 (2005-01-21 22:46) * Actually include Makefile.PL. --- 0.10 (initial release) (2005-01-12 00:00) # $Id: CHANGES,v 1.2 2005/01/21 22:50:41 julian Exp $ # vim:tw=79 ClamAV-Client-0.11/debian/0000755000175400001440000000000010174304146015641 5ustar julianusers00000000000000ClamAV-Client-0.11/debian/control0000644000175400001440000000133110174304146017242 0ustar julianusers00000000000000Source: libclamav-client-perl Section: perl Priority: optional Maintainer: Julian Mehnle Build-Depends-Indep: debhelper (>= 4.0.2), perl (>= 5.8.0-7), libmodule-build-perl, libtest-simple-perl Standards-Version: 3.6.1 Package: libclamav-client-perl Architecture: all Depends: ${perl:Depends}, liberror-perl, ${misc:Depends} Suggests: clamav-daemon Description: A client class for the ClamAV `clamd` virus scanner daemon ClamAV::Client is a class acting as a client for a ClamAV `clamd` virus scanner daemon. The daemon may run locally or on a remote system as ClamAV::Client can use both Unix domain sockets and TCP/IP sockets. The full functionality of the `clamd` client/server protocol is supported. ClamAV-Client-0.11/debian/copyright0000644000175400001440000000123410174304146017574 0ustar julianusers00000000000000This is the Debian package for the ClamAV-Client CPAN distribution, which is available from . (C) 2004-2005 Julian Mehnle . Julian Mehnle is the upstream author as well as the maintainer of the Debian package. This is free software; you can redistribute it and/or modify it under the same terms as Perl or Courier themselves, that is under the terms of either the GNU General Public License (version 2 or later) or the Artistic License. On Debian GNU/Linux systems, the complete text of these licenses can be found in these files: /usr/share/common-licenses/GPL /usr/share/common-licenses/Artistic ClamAV-Client-0.11/debian/changelog0000644000175400001440000000050710174304146017515 0ustar julianusers00000000000000libclamav-client-perl (0.11) unstable; urgency=low * Actually include Makefile.PL in the source package. -- Julian Mehnle Fri, 21 Jan 2005 23:47:59 +0100 libclamav-client-perl (0.10) unstable; urgency=low * Initial Release. -- Julian Mehnle Wed, 12 Jan 2005 00:09:17 +0100 ClamAV-Client-0.11/debian/rules0000755000175400001440000000174110174304146016724 0ustar julianusers00000000000000#!/usr/bin/make -f PACKAGE = $(shell dh_listpackages) ifndef PERL PERL = /usr/bin/perl endif TMP = $(CURDIR)/debian/$(PACKAGE) BUILD = ./Build build: build-stamp build-stamp: dh_testdir $(PERL) Build.PL installdirs=vendor $(BUILD) touch build-stamp clean: dh_testdir dh_testroot -$(BUILD) distclean dh_clean build-stamp install-stamp install: install-stamp install-stamp: build-stamp dh_testdir dh_testroot dh_clean -k $(BUILD) test $(BUILD) install destdir=$(TMP) touch install-stamp # Build architecture-independent files here: binary-indep: build install dh_testdir dh_testroot dh_installdocs README TODO dh_installchangelogs CHANGES #dh_installexamples -XCVS examples/* #dh_installman dh_install dh_compress dh_fixperms dh_installdeb dh_perl dh_gencontrol dh_md5sums dh_builddeb # Build architecture-dependent files here: binary-arch: # Nothing to do. binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install ClamAV-Client-0.11/debian/compat0000644000175400001440000000000210174304146017037 0ustar julianusers000000000000004 ClamAV-Client-0.11/META.yml0000644000175400001440000000115510174304146015672 0ustar julianusers00000000000000--- #YAML:1.0 name: ClamAV-Client version: 0.11 author: - Julian Mehnle abstract: |- A client class for the ClamAV C virus scanner daemon license: perl requires: Error: 0 IO::File: 0 IO::Socket: 0 IO::Socket::INET: 0 IO::Socket::UNIX: 0 perl: 0 provides: ClamAV::Client: file: lib/ClamAV/Client.pm version: 0.11 ClamAV::Client::Error: file: lib/ClamAV/Client.pm version: 0.11 ClamAV::Config: file: lib/ClamAV/Config.pm version: 0.11 ClamAV::Config::Error: file: lib/ClamAV/Config.pm version: 0.11 generated_by: Module::Build version 0.26 ClamAV-Client-0.11/lib/0000755000175400001440000000000010174304146015165 5ustar julianusers00000000000000ClamAV-Client-0.11/lib/ClamAV/0000755000175400001440000000000010174304146016270 5ustar julianusers00000000000000ClamAV-Client-0.11/lib/ClamAV/Client.pm0000644000175400001440000003457310174304146020060 0ustar julianusers00000000000000# # ClamAV::Client class, # a client class for the ClamAV clamd virus scanner daemon. # # (C) 2004-2005 Julian Mehnle # $Id: Client.pm,v 1.6 2005/01/21 22:50:14 julian Exp $ # ############################################################################## =head1 NAME ClamAV::Client - A client class for the ClamAV C virus scanner daemon =cut package ClamAV::Client; =head1 VERSION 0.11 =cut our $VERSION = '0.11'; =head1 SYNOPSIS =head2 Creating a scanner client use ClamAV::Client; # Try using socket options from clamd.conf, or use default socket: my $scanner = ClamAV::Client->new(); # Use a local Unix domain socket: my $scanner = ClamAV::Client->new( socket_name => '/var/run/clamav/clamd.ctl' ); # Use a TCP socket: my $scanner = ClamAV::Client->new( socket_host => '127.0.0.1', socket_port => 3310 ); die("ClamAV daemon not alive") if not defined($scanner) or not $scanner->ping(); =head2 Daemon maintenance my $version = $scanner->version; # Retrieve the ClamAV version string. $scanner->reload(); # Reload the malware pattern database. $scanner->quit(); # Terminates the ClamAV daemon. $scanner->shutdown(); # Likewise. =head2 Path scanning (lazy) # Scan a single file or a whole directory structure, # and stop at the first infected file: my ($path, $result) = $scanner->scan_path($path); my ($path, $result) = $scanner->scan_path( $path, ClamAV::Client::SCAN_MODE_NORMAL ); my ($path, $result) = $scanner->scan_path( $path, ClamAV::Client::SCAN_MODE_RAW ); =head2 Path scanning (complete) # Scan a single file or a whole directory structure, # and scan all files without stopping at the first infected one: my %results = $scanner->scan_path_complete($path); while (my ($path, $result) = each %results) { ... } =head2 Other scanning methods # Scan a stream, i.e. read from an I/O handle: my $result = $scanner->scan_stream($handle); # Scan a scalar value: my $result = $scanner->scan_scalar(\$value); =cut use warnings; use strict; use Error qw(:try); use Carp; use IO::Socket; use ClamAV::Config; use constant TRUE => (0 == 0); use constant FALSE => not TRUE; use constant SOCKET_TYPE_AUTO => 0; use constant SOCKET_TYPE_UNIX => 1; use constant SOCKET_TYPE_TCP => 2; use constant DEFAULT_SOCKET_NAME => '/var/run/clamav/clamd.ctl'; use constant DEFAULT_SOCKET_HOST => '127.0.0.1'; use constant DEFAULT_SOCKET_PORT => 3310; use constant SCAN_MODE_NORMAL => FALSE; use constant SCAN_MODE_RAW => TRUE; use constant STREAM_BLOCK_SIZE => 4096; # Interface: ############################################################################## =head1 DESCRIPTION B is a class acting as a client for a ClamAV C virus scanner daemon. The daemon may run locally or on a remote system as B can use both Unix domain sockets and TCP/IP sockets. The full functionality of the C client/server protocol is supported. =cut sub new; sub ping; sub version; sub reload; sub quit; sub scan_path; sub scan_path_complete; sub scan_stream; sub scan_scalar; # Implementation: ############################################################################## =head2 Constructor The following constructor is provided: =over =item B: RETURNS ClamAV::Client Creates a new C object. If I socket options are specified, first the socket options from the local C configuration file are tried, then the Unix domain socket C is tried, then finally the TCP/IP socket at C<127.0.0.1> on port C<3310> is tried. If either Unix domain or TCP/IP socket options are explicitly specified, only these are used. C<%options> is a list of key/value pairs representing any of the following options: =over =item B A scalar containing the absolute name of the local Unix domain socket. Defaults to B<'/var/run/clamav/clamd.ctl'>. =item B A scalar containing the name or IP address of the TCP/IP socket. Defaults to B<'127.0.0.1'>. =item B A scalar containing the port number of the TCP/IP socket. Defaults to B<3310>. =back =cut sub new { my ($class, %options) = @_; if ($options{socket_name}) { # Caller explicitly specified local Unix domain socket. $options{socket_type} = SOCKET_TYPE_UNIX; $options{socket_host} ||= DEFAULT_SOCKET_HOST; } elsif ($options{socket_host} or $options{socket_port}) { # Caller explicitly specified TCP socket. $options{socket_type} = SOCKET_TYPE_TCP; $options{socket_host} ||= DEFAULT_SOCKET_HOST; $options{socket_port} ||= DEFAULT_SOCKET_PORT; } else { # Caller hasn't specified anything. # Try reading local clamd config file: try { ClamAV::Config->clamd_config; } catch ClamAV::Config::Error with { # Ignore access problems to clamd configuration file. }; # Try local Unix domain socket first...: $options{socket_name} = ClamAV::Config->clamd_option('LocalSocket') or # ...otherwise try TCP socket: $options{socket_host} = ClamAV::Config->clamd_option('TCPAddr'), $options{socket_port} = ClamAV::Config->clamd_option('TCPSocket'); if ($options{socket_name}) { # Local clamd config file has specified local Unix domain socket. $options{socket_type} = SOCKET_TYPE_UNIX; $options{socket_host} ||= DEFAULT_SOCKET_HOST; } elsif ($options{socket_host} or $options{socket_port}) { # Local clamd config file has speficied TCP socket. $options{socket_type} = SOCKET_TYPE_TCP; $options{socket_host} ||= DEFAULT_SOCKET_HOST; $options{socket_port} ||= DEFAULT_SOCKET_PORT; } else { # Neither caller nor clamd config file have specified anything, set # socket auto detection mode. $options{socket_type} = SOCKET_TYPE_AUTO; $options{socket_host} = DEFAULT_SOCKET_HOST; $options{socket_name} = DEFAULT_SOCKET_NAME; $options{socket_port} = DEFAULT_SOCKET_PORT; } } my $self = { socket_type => $options{socket_type}, socket_name => $options{socket_name}, socket_host => $options{socket_host}, socket_port => $options{socket_port} }; bless($self, $class); return $self; } =back =head2 Instance methods The following instance methods are provided: =head3 Daemon maintenance =over =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Returns B ('PONG') if the ClamAV daemon is alive. Throws a ClamAV::Client::Error exception otherwise. =cut sub ping { my ($self) = @_; return $self->_simple_command("PING"); } =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Returns the version string of the ClamAV daemon. =cut sub version { my ($self) = @_; return $self->_simple_command("VERSION"); } =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Instructs the ClamAV daemon to reload its malware database. Returns B if the reloading succeeds, or throws a ClamAV::Client::Error exception otherwise. =cut sub reload { my ($self) = @_; return $self->_simple_command("RELOAD"); } =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Terminates the ClamAV daemon. Returns B if the termination succeeds, or throws a ClamAV::Client::Error exception otherwise. =cut sub quit { # Caution, this terminates the ClamAV daemon! my ($self) = @_; return $self->_simple_command("QUIT"); } *shutdown = *shutdown = \&quit; =item B: RETURNS SCALAR, SCALAR; THROWS ClamAV::Client::Error =item B: RETURNS SCALAR, SCALAR; THROWS ClamAV::Client::Error Scans a single file or a whole directory structure, and stops at the first infected file found. The specified path must be absolute. A scan mode may be specified: a mode of B (which is the default) causes a normal scan (C) with archive support enabled, a mode of B causes a raw scan with archive support disabled. If an infected file is found, returns a list consisting of the path of the file and the name of the malware signature that matched the file. Otherwise, returns the originally specified path and B. =cut sub scan_path { my ($self, $path, $scan_mode_raw) = @_; my $command = ($scan_mode_raw ? 'RAWSCAN' : 'SCAN'); my $response = $self->_simple_command("$command $path"); return $self->_parse_scan_response($response); } =item B: RETURNS HASH; THROWS ClamAV::Client::Error Scans a single file or a whole directory structure I, not stopping at the first infected file found. The specified path must be absolute. Only the normal, non-raw mode is supported for complete scans by ClamAV. Returns a hash with a list of infected files found, with the file paths as the keys and the matched malware signature names as the values. =cut sub scan_path_complete { my ($self, $path, $scan_mode_raw) = @_; if ($scan_mode_raw) { throw ClamAV::Client::Error("Raw mode not supported for path complete (CONTSCAN) scanning"); } my $socket = $self->_socket; $socket->print("CONTSCAN $path\n"); my %results; while (my $response = $socket->getline()) { my ($file_name, $result) = $self->_parse_scan_response($response); $results{$file_name} = $result; } $socket->close(); %results = () if values(%results) == 1 and not defined((values(%results))[0]); return %results; } =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Scans a stream, that is, reads from an I/O handle. If the stream is found to be infected, returns the name of the matching malware signature, B otherwise. =cut sub scan_stream { my ($self, $handle, $scan_mode_raw) = @_; if ($scan_mode_raw) { throw ClamAV::Client::Error("Raw mode not supported for stream (STREAM) scanning"); } my $socket = $self->_socket; $socket->print("STREAM\n"); my $port_spec = $socket->getline(); if (not $port_spec =~ /^PORT (\d+)$/i) { throw ClamAV::Client::Error("Invalid server response to STREAM command: \"$port_spec\""); } my $port = $1; require IO::Socket::INET; my $stream_socket = IO::Socket::INET->new( Proto => 'tcp', PeerHost => $self->{socket_host}, PeerPort => $port ); # If we didn't manage to gain a connection, throw exception: if (not defined($stream_socket)) { throw ClamAV::Client::Error( "Could not establish TCP socket connection on port $port for STREAM scan" ); } $stream_socket->autoflush(TRUE); my $block; $stream_socket->print($block) while $handle->read($block, STREAM_BLOCK_SIZE); $stream_socket->close(); my $response = $self->{'socket'}->getline(); $socket->close(); my (undef, $result) = $self->_parse_scan_response($response); return $result; } =item B: RETURNS SCALAR; THROWS ClamAV::Client::Error Scans the value referenced by the given scalarref. If the value is found to be infected, returns the name of the matching malware signature, B otherwise. =cut sub scan_scalar { my ($self, $scalar_ref, $scan_mode_raw) = @_; open(my $handle, '<', $scalar_ref); return $self->scan_stream($handle, $scan_mode_raw); } =back =cut sub _socket { my ($self) = @_; # Try to reuse cached socket connection: my $socket = $self->{'socket'}; while (not defined($socket) or not $socket->opened) { # (Re-)establish socket connection. # Try to connect through Unix domain socket: if ( $self->{socket_type} == SOCKET_TYPE_UNIX or $self->{socket_type} == SOCKET_TYPE_AUTO ) { require IO::Socket::UNIX; $socket = IO::Socket::UNIX->new( Peer => $self->{socket_name} ); last if defined($socket); } # Try to connect through TCP socket: if ( $self->{socket_type} == SOCKET_TYPE_TCP or $self->{socket_type} == SOCKET_TYPE_AUTO ) { require IO::Socket::INET; $socket = IO::Socket::INET->new( Proto => 'tcp', PeerHost => $self->{socket_host}, PeerPort => $self->{socket_port} ); last if defined($socket); } # We haven't managed to gain a connection, throw exception: throw ClamAV::Client::Error( "Could not establish socket connection, tried UNIX domain and TCP sockets" ); } $socket->autoflush(TRUE); return $self->{'socket'} = $socket; } sub _simple_command { my ($self, $command) = @_; my $socket = $self->_socket; $socket->print("$command\n"); chomp(my $response = $socket->getline()); $socket->close(); return $response; } sub _parse_scan_response { my ($self, $response) = @_; chomp($response); if (not $response =~ /^(.*): (?:OK|(.*) FOUND)$/i) { throw ClamAV::Client::Error("Invalid server response to scan command: \"$response\""); } return ($1, $2); # (, | undef) } =head1 SEE ALSO The L and L man-pages. =head1 AVAILABILITY and SUPPORT The latest version of ClamAV::Client is available on CPAN and at L. Support is usually (but not guaranteed to be) given by the author, Julian Mehnle . =head1 AUTHOR and LICENSE ClamAV::Client is Copyright (C) 2004-2005 Julian Mehnle . ClamAV::Client is free software. You may use, modify, and distribute it under the same terms as Perl itself, i.e. under the GNU GPL or the Artistic License. =cut package ClamAV::Client::Error; use base qw(Error::Simple); package ClamAV::Client; TRUE; # vim:tw=79 ClamAV-Client-0.11/lib/ClamAV/Config.pm0000644000175400001440000000622710174304146020042 0ustar julianusers00000000000000# # ClamAV::Config class # # (C) 2004-2005 Julian Mehnle # $Id: Config.pm,v 1.3 2005/01/21 22:50:14 julian Exp $ # ############################################################################## =head1 NAME ClamAV::Config - A Perl class providing configuration information for Perl modules related to ClamAV =cut package ClamAV::Config; =head1 VERSION 0.11 =cut our $VERSION = 0.11; =head1 SYNOPSIS use ClamAV::Config; # ClamAV base configuration: ClamAV::Config->config_dir; ClamAV::Config->clamd_config_file; # clamd run-time configuration: ClamAV::Config->clamd_config; ClamAV::Config->clamd_option($option); =cut use warnings; use strict; use Error qw(:try); use IO::File; # Private declarations: ############################################################################## use constant TRUE => (0 == 0); use constant FALSE => not TRUE; my $clamd_config; # Interface: ############################################################################## =head1 DESCRIPTION This class provides configuration information for Perl modules related to the ClamAV virus scanner, e.g. installation specific file system paths and run-time configuration options. =cut sub clamd_option; # Implementation: ############################################################################## =head2 ClamAV base configuration The following ClamAV base configuration information is provided as class methods: =over =item B The base configuration directory of ClamAV. =cut use constant config_dir => '/etc/clamav'; =item B The absolute file name of the I configuration file. =cut use constant clamd_config_file => config_dir . '/clamd.conf'; =back =head2 clamd run-time configuration The following clamd run-time configuration information is provided as class methods: =over =item B Returns all clamd run-time configuration options as a hash reference. =cut sub clamd_config { my ($self) = @_; return $clamd_config if $clamd_config; my $file = IO::File->new($self->clamd_config_file); if (not $file) { $clamd_config = {}; throw ClamAV::Config::Error( 'Could not open clamd config file "' . $self->clamd_config_file . '" for reading' ); } while (my $line = $file->getline) { chomp($line); next if $line =~ /^\s*#/; if (not $line =~ /^\s*(\w+)(?:\s+(\S+))?\s*$/) { $clamd_config = {}; throw ClamAV::Config::Error('Malformed line in clamd configuration file encountered'); } $clamd_config->{$1} = (defined($2) ? $2 : TRUE); } return $clamd_config; } =item B Returns the value of the specified clamd run-time configuration option. =cut sub clamd_option { my ($self, $option) = @_; return $self->clamd_config->{$option}; } =back =head1 SEE ALSO For AVAILABILITY, SUPPORT, and LICENSE information, see L. =head1 AUTHOR Julian Mehnle =cut package ClamAV::Config::Error; use base qw(Error::Simple); package ClamAV::Config; TRUE; # vim:tw=79 ClamAV-Client-0.11/MANIFEST0000644000175400001440000000035710174304146015555 0ustar julianusers00000000000000Build.PL CHANGES debian/changelog debian/compat debian/control debian/copyright debian/rules lib/ClamAV/Client.pm lib/ClamAV/Config.pm Makefile.PL MANIFEST This list of files META.yml README TODO SIGNATURE Added here by Module::Build ClamAV-Client-0.11/TODO0000644000175400001440000000034210174304146015106 0ustar julianusers00000000000000# Legend: # --- = A new release # x = Change something significant, or remove a feature # * = Fix a bug # + = Add a feature (in a backwards compatible way) # $Id: TODO,v 1.1 2005/01/11 23:15:30 julian Exp $ # vim:tw=79 ClamAV-Client-0.11/README0000644000175400001440000000113610174304146015300 0ustar julianusers00000000000000ClamAV::Client 0.11 A client class for the ClamAV `clamd` virus scanner daemon. (C) 2004-2005 Julian Mehnle ============================================================================== ClamAV::Client is a class acting as a client for a ClamAV `clamd` virus scanner daemon. The daemon may run locally or on a remote system as ClamAV::Client can use both Unix domain sockets and TCP/IP sockets. The full functionality of the `clamd` client/server protocol is supported. # $Id: README,v 1.2 2005/01/21 22:49:30 julian Exp $ # vim:tw=79 ClamAV-Client-0.11/Makefile.PL0000644000175400001440000000212510174304146016371 0ustar julianusers00000000000000# Note: this file was auto-generated by Module::Build::Compat version 0.03 unless (eval "use Module::Build::Compat 0.02; 1" ) { print "This module requires Module::Build to install itself.\n"; require ExtUtils::MakeMaker; my $yn = ExtUtils::MakeMaker::prompt (' Install Module::Build now from CPAN?', 'y'); unless ($yn =~ /^y/i) { die " *** Cannot install without Module::Build. Exiting ...\n"; } require Cwd; require File::Spec; require CPAN; # Save this 'cause CPAN will chdir all over the place. my $cwd = Cwd::cwd(); my $makefile = File::Spec->rel2abs($0); CPAN::Shell->install('Module::Build::Compat') or die " *** Cannot install without Module::Build. Exiting ...\n"; chdir $cwd or die "Cannot chdir() back to $cwd: $!"; } eval "use Module::Build::Compat 0.02; 1" or die $@; use lib '_build/lib'; Module::Build::Compat->run_build_pl(args => \@ARGV); require Module::Build; Module::Build::Compat->write_makefile(build_class => 'Module::Build'); ClamAV-Client-0.11/Build.PL0000644000175400001440000000123510174304146015714 0ustar julianusers00000000000000use Module::Build; my $build = Module::Build->new( module_name => 'ClamAV::Client', dist_author => 'Julian Mehnle ', license => 'perl', requires => { # Core requirements: perl => 0, IO::File => 0, IO::Socket => 0, IO::Socket::UNIX => 0, IO::Socket::INET => 0, Error => 0 }, recommends => { }, create_makefile_pl => 'passthrough', sign => 1 ); $build->create_build_script(); # $Id: Build.PL,v 1.1 2005/01/11 23:15:30 julian Exp $ # vim:tw=79 ClamAV-Client-0.11/SIGNATURE0000644000175400001440000000301110174304146015676 0ustar julianusers00000000000000This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.35. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It would check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 76f3be9657be82710f2cae9d58f5152b71adb102 Build.PL SHA1 da9f3057d5d255cc36601a33dee247887beb4eeb CHANGES SHA1 5428b8bb40c98a9663d33c772959c386b5a4d5be MANIFEST SHA1 d7e95e024dca8096850569ddcb39bf8fb46a6388 META.yml SHA1 a359d4072690a21ce63e4b393bdbc19d72b6be5a Makefile.PL SHA1 eb99ffb8849cdad427f6ad2d2a9b35c742808b7e README SHA1 20c2a16b5c5da26818a364498dc6a772ec13ae55 TODO SHA1 9056ea36f8c74450768c73e08185b44084bd7281 debian/changelog SHA1 9c6b057a2b9d96a4067a749ee3b3b0158d390cf1 debian/compat SHA1 391b86693b32d690640df233f06a52047c35a3a3 debian/control SHA1 eed1708e61860d30832153f4b48fbef4eedecb0e debian/copyright SHA1 f07d3cc654d62025ba37a53a83db9cf3aa21fede debian/rules SHA1 4eb519f054afbd758e816caacff18bce6390443d lib/ClamAV/Client.pm SHA1 cf53d72ebca4c6aa00007a402c1c871a9c6c855e lib/ClamAV/Config.pm -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) iD8DBQFB8YhmaWlsL2XXXh8RAhKGAJ4iX3n8qVnDdhY6HoeVglTZEM62VACfcxOb dQfsfR1VbprOpTyCDQFrP44= =TXmu -----END PGP SIGNATURE-----