]> git.proxmox.com Git - pve-http-server.git/blob - PVE/APIServer/Utils.pm
d/control: drop unzip from build depends
[pve-http-server.git] / PVE / APIServer / Utils.pm
1 package PVE::APIServer::Utils;
2
3 use strict;
4 use warnings;
5
6 use Net::IP;
7
8 # all settings are used for pveproxy and pmgproxy
9 # the ALLOW/DENY/POLICY is also used by spiceproxy
10 sub read_proxy_config {
11 my ($proxy_name) = @_;
12
13 my $conffile = "/etc/default/$proxy_name";
14
15 # Note: evaluate with bash
16 my $shcmd = ". $conffile;\n";
17 $shcmd .= 'echo \"LISTEN_IP:\$LISTEN_IP\";';
18 $shcmd .= 'echo \"ALLOW_FROM:\$ALLOW_FROM\";';
19 $shcmd .= 'echo \"DENY_FROM:\$DENY_FROM\";';
20 $shcmd .= 'echo \"POLICY:\$POLICY\";';
21 $shcmd .= 'echo \"CIPHERS:\$CIPHERS\";';
22 $shcmd .= 'echo \"DHPARAMS:\$DHPARAMS\";';
23 $shcmd .= 'echo \"HONOR_CIPHER_ORDER:\$HONOR_CIPHER_ORDER\";';
24 $shcmd .= 'echo \"COMPRESSION:\$COMPRESSION\";';
25
26 my $data = -f $conffile ? `bash -c "$shcmd"` : '';
27
28 my $res = {};
29
30 while ($data =~ s/^(.*)\n//) {
31 my ($key, $value) = split(/:/, $1, 2);
32 next if !defined($value) || $value eq '';
33 if ($key eq 'ALLOW_FROM' || $key eq 'DENY_FROM') {
34 my $ips = [];
35 foreach my $ip (split(/,/, $value)) {
36 if ($ip eq 'all') {
37 push @$ips, Net::IP->new('0/0') || die Net::IP::Error() . "\n";
38 push @$ips, Net::IP->new('::/0') || die Net::IP::Error() . "\n";
39 next;
40 }
41 push @$ips, Net::IP->new(normalize_v4_in_v6($ip)) || die Net::IP::Error() . "\n";
42 }
43 $res->{$key} = $ips;
44 } elsif ($key eq 'LISTEN_IP') {
45 $res->{$key} = $value;
46 } elsif ($key eq 'POLICY') {
47 die "unknown policy '$value'\n" if $value !~ m/^(allow|deny)$/;
48 $res->{$key} = $value;
49 } elsif ($key eq 'CIPHERS') {
50 $res->{$key} = $value;
51 } elsif ($key eq 'DHPARAMS') {
52 $res->{$key} = $value;
53 } elsif ($key eq 'HONOR_CIPHER_ORDER' || $key eq 'COMPRESSION') {
54 die "unknown value '$value' - use 0 or 1\n" if $value !~ m/^(0|1)$/;
55 $res->{$key} = $value;
56 } else {
57 # silently skip everythin else?
58 }
59 }
60
61 return $res;
62 }
63
64 sub normalize_v4_in_v6 {
65 my ($ip_text) = @_;
66
67 my $ip = Net::IP->new($ip_text) || die Net::IP::Error() . "\n";
68 my $v4_mapped_v6_prefix = Net::IP->new('::ffff:0:0/96');
69 if ($v4_mapped_v6_prefix->overlaps($ip)) {
70 return Net::IP::ip_get_embedded_ipv4($ip_text);
71 }
72 return $ip_text;
73 }
74
75 1;