Net-Squid-ReverseProxy

 view release on metacpan or  search on metacpan

lib/Net/Squid/ReverseProxy.pm  view on Meta::CPAN

package Net::Squid::ReverseProxy;

use 5.006;
use strict;
use Carp qw/croak/;

use vars qw/$VERSION/;
$VERSION = '0.04';


sub new {

    my $class = shift;
    my %arg = @_;

    unless (defined $arg{'squid_version'} &&
            defined $arg{'squid_conf'} &&
            defined $arg{'squid'} ) {
        croak "the path to both squid and squid.conf as well as squid version are required";
    }

    unless (-f $arg{'squid_conf'} && -w $arg{'squid_conf'} ) {
        croak "squid config file doesn't exist or isn't writable";
    }

    unless (-f $arg{'squid'} && -x $arg{'squid'} ) {
        croak "squid program doesn't exist or isn't executable";
    }

    bless \%arg, $class;
}

sub init_reverseproxy {

    my $self = shift;
    my %arg = @_;

    my $cfg = $self->{'squid_conf'};
    my $squid = $self->{'squid'};
    my $version = $self->{'squid_version'};

    my $cache_mem = $arg{'cache_mem'} || 50;
    my $maximum_object_size = $arg{'maximum_object_size'} || 2048;
    my $maximum_object_size_in_memory = $arg{'maximum_object_size_in_memory'} || 64;
    my $cache_dir_size = $arg{'cache_dir_size'} || 50;
    my $visible_hostname = $arg{'visible_hostname'} || 'localhost.localdomain';

    if ($arg{'cache_dir'} ) {
        my $uid = (stat $arg{'cache_dir'})[4];
        my $user = (getpwuid $uid)[0];

        if ($user ne 'nobody') {
            croak "init failed, $arg{'cache_dir'} must be owned by nobody";
        } 
    }

    my $cache_dir = $arg{'cache_dir'} || '/tmp/squidcache';

    my $module_dir = $INC{'Net/Squid/ReverseProxy.pm'};
    $module_dir =~ s/\.pm$//;

    my @cfg; my $fd;

    open $fd, "<", "$module_dir/squidcfg" or croak "can't open template file $!";
    while (<$fd>) {
        push @cfg,$_;

        if (/ARG INPUT BEGIN/) {
            push @cfg,
                "cache_mem $cache_mem MB\n",
                "maximum_object_size $maximum_object_size KB\n",
                "maximum_object_size_in_memory $maximum_object_size_in_memory KB\n",
                "cache_dir ufs $cache_dir $cache_dir_size 16 256\n",
                "visible_hostname $visible_hostname\n";

            if ( $version < 3.0 ) {
                push @cfg, "acl all src all\n";
	    }
        }
    }
    close $fd;

    open $fd, "<", $cfg or croak $!;
    my @oldcfg = <$fd>;
    close $fd;

    my $fdw;

    open $fdw,">",$cfg or croak $!;
    print $fdw @cfg;
    close $fdw;

    system "$squid -k kill >/dev/null 2>&1";
    system "$squid -z >/dev/null 2>&1 && $squid";

    if ($? == 0) {
        return 1;

    } else {

        open $fdw,">",$cfg or croak $!;
        print $fdw @oldcfg;
        close $fdw;

        croak "init failed, can't run 'squid -z' and startup squid";
    }
}


sub add_dstdomain_proxy {



( run in 1.569 second using v1.01-cache-2.11-cpan-39bf76dae61 )