Handle hostnames with upper-case letters
[webmin.git] / squid / save_pool.cgi
1 #!/usr/local/bin/perl
2 # save_pool.cgi
3 # Create, update or delete a delay pool
4
5 require './squid-lib.pl';
6 $access{'delay'} || &error($text{'delay_ecannot'});
7 &ReadParse();
8 &lock_file($config{'squid_conf'});
9 $conf = &get_config();
10 &error_setup($text{'pool_err'});
11
12 @pools = &find_config("delay_class", $conf);
13 @params = &find_config("delay_parameters", $conf);
14 @access = &find_config("delay_access", $conf);
15 $pools = &find_config("delay_pools", $conf);
16 $pools = { 'name' => 'delay_pools' } if (!$pools);
17 if (!$in{'new'}) {
18         ($pool) = grep { $_->{'values'}->[0] == $in{'idx'} } @pools;
19         ($param) = grep { $_->{'values'}->[0] == $in{'idx'} } @params;
20         }
21 else {
22         $pool = { 'name' => 'delay_class',
23                   'values' => [ $pools->{'values'}->[0] + 1 ] };
24         $param = { 'name' => 'delay_parameters',
25                    'values' => [ $pools->{'values'}->[0] + 1 ] };
26         }
27
28 if ($in{'delete'}) {
29         # When deleting, the numbers of any pools 'above' it must be shifted
30         # down, any delay_access directives removed and the delay_pools count
31         # decreased
32         @access = grep { $_->{'values'}->[0] != $in{'idx'} } @access;
33         @pools = grep { $_ ne $pool } @pools;
34         @params = grep { $_ ne $param } @params;
35         map { $_->{'values'}->[0]-- if ($_->{'values'}->[0] > $in{'idx'}) } 
36                 (@access, @pools, @params);
37         &save_directive($conf, "delay_class", \@pools);
38         &save_directive($conf, "delay_parameters", \@params);
39         &save_directive($conf, "delay_access", \@access);
40         $pools->{'values'}->[0]--;
41         &save_directive($conf, "delay_pools", [ $pools ]);
42         }
43 else {
44         # Validate and store inputs
45         $pool->{'values'}->[1] = $in{'class'};
46         if ($in{'class'} == 1) {
47                 @v = ( &parse_limit("agg") );
48                 }
49         elsif ($in{'class'} == 2) {
50                 @v = ( &parse_limit("agg"), &parse_limit("ind") );
51                 }
52         elsif ($in{'class'} == 3) {
53                 @v = ( &parse_limit("agg"), &parse_limit("net"),
54                        &parse_limit("ind") );
55                 }
56         elsif ($in{'class'} == 4) {
57                 @v = ( &parse_limit("agg"), &parse_limit("net"),
58                        &parse_limit("ind"), &parse_limit("user") );
59                 }
60         elsif ($in{'class'} == 5) {
61                 @v = ( &parse_limit("tag") );
62                 }
63         $param->{'values'} = [ $param->{'values'}->[0], @v ];
64
65         if ($in{'new'}) {
66                 # Add the pool and increment the count
67                 $pools->{'values'}->[0]++;
68                 push(@pools, $pool);
69                 push(@params, $param);
70                 &save_directive($conf, "delay_pools", [ $pools ]);
71                 }
72         &save_directive($conf, "delay_class", \@pools);
73         &save_directive($conf, "delay_parameters", \@params);
74         &save_directive($conf, "delay_access", \@access);
75         }
76
77 &flush_file_lines();
78 &unlock_file($config{'squid_conf'});
79 &webmin_log($in{'new'} ? "create" : $in{'delete'} ? "delete" : "modify",
80             "pool", $in{'idx'}, \%in);
81 &redirect("edit_delay.cgi");
82
83 # parse_limit(name)
84 sub parse_limit
85 {
86 if ($in{"$_[0]_def"}) {
87         return "-1/-1";
88         }
89 else {
90         local @ud = ( .125, 1, 125, 1000, 125000, 1000000 );
91         local $u1 = $in{"$_[0]_1_n"};
92         local $u2 = $in{"$_[0]_2_n"};
93         $u1 =~ /^\d+$/ || $u1 == -1 || &error(&text('pool_elimit1', $u1));
94         $u2 =~ /^\d+$/ || $u2 == -1 || &error(&text('pool_elimit2', $u2));
95         $u1 = int($u1 * $ud[$in{"$_[0]_1_u"}]);
96         $u2 = int($u2 * $ud[$in{"$_[0]_2_u"}]);
97         return "$u1/$u2";
98         }
99 }
100