]>
Commit | Line | Data |
---|---|---|
0d6cc79d SF |
1 | #!/usr/bin/perl |
2 | # | |
3 | ############################################################################### | |
4 | # # | |
5 | # IPFire.org - A linux based firewall # | |
cc864e3d | 6 | # Copyright (C) 2017-2020 Stephan Feddersen <sfeddersen@ipfire.org> # |
0d6cc79d SF |
7 | # All Rights Reserved. # |
8 | # # | |
9 | # This program is free software: you can redistribute it and/or modify # | |
10 | # it under the terms of the GNU General Public License as published by # | |
11 | # the Free Software Foundation, either version 3 of the License, or # | |
12 | # (at your option) any later version. # | |
13 | # # | |
14 | # This program is distributed in the hope that it will be useful, # | |
15 | # but WITHOUT ANY WARRANTY; without even the implied warranty of # | |
16 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # | |
17 | # GNU General Public License for more details. # | |
18 | # # | |
19 | # You should have received a copy of the GNU General Public License # | |
20 | # along with this program. If not, see <http://www.gnu.org/licenses/>. # | |
21 | # # | |
22 | ############################################################################### | |
23 | # | |
cc864e3d | 24 | # Version: 2020/05/04 12:02:23 |
0d6cc79d | 25 | # |
cc864e3d | 26 | # This wioovpn.pl is based on the code from the IPCop WIO Addon |
0d6cc79d SF |
27 | # and is extremly adapted to work with IPFire. |
28 | # | |
29 | # Autor: Stephan Feddersen | |
30 | # Co-Autor: Alexander Marx | |
cc864e3d | 31 | # Co-Autor: Frank Mainz (for some code for the IPCop WIO Addon) |
0d6cc79d SF |
32 | # |
33 | ||
34 | # enable only the following on debugging purpose | |
35 | #use warnings; | |
36 | ||
37 | use strict; | |
38 | use POSIX qw(strftime); | |
39 | ||
0d6cc79d SF |
40 | require '/var/ipfire/general-functions.pl'; |
41 | require '/var/ipfire/lang.pl'; | |
42 | require '/usr/lib/wio/wio-lib.pl'; | |
43 | ||
44 | my %wiosettings = (); | |
45 | ||
46 | &General::readhash( "/var/ipfire/wio/wio.conf", \%wiosettings ); | |
47 | ||
48 | my $mailremark = $wiosettings{'MAILREMARK'}; | |
49 | my $logging = $wiosettings{'LOGGING'}; | |
50 | ||
51 | my ( @ovpnstatus, @ovpncfg, @ovpncache, @ovpnarray, @ovpnmatch, @ovpnwrite ); | |
52 | ||
53 | my $now = strftime "%a, %d.%m.%Y %H:%M:%S", localtime; | |
54 | my $ovpnpid = "/var/run/openvpn.pid"; | |
55 | my $ovpnmailmsg = ''; | |
cc864e3d | 56 | my $ovpncache = "/var/log/wio/.ovpncache"; |
0d6cc79d SF |
57 | my $ovpnconfig = "/var/ipfire/ovpn/ovpnconfig"; |
58 | ||
59 | my ( $name, $nameul, $ovpnclt, $ovpncltip, $realipadr, $connected ) = ''; | |
60 | my ( $ovpnmailsub, $ovpnrwlogin, $ovpnrwstatus, $status, $remark, $logmsg ) = ''; | |
61 | ||
62 | my ( @vpnstatus, @vpncfg, @vpncache, @vpnarray, @vpnwrite ); | |
63 | ||
64 | my $vpnpid = "/var/run/charon.pid"; | |
65 | my $vpnmailmsg = ''; | |
cc864e3d | 66 | my $vpncache = "/var/log/wio/.vpncache"; |
0d6cc79d SF |
67 | my $vpnconfig = "/var/ipfire/vpn/config"; |
68 | ||
cc864e3d | 69 | my ( $vpnmailsub, $vpnrwstatus ) = ''; |
0d6cc79d SF |
70 | |
71 | my $togglestat = 0; | |
72 | ||
73 | if ( ! -e "$ovpnpid" ) { | |
74 | unlink "$ovpncache"; | |
75 | } | |
76 | else { | |
77 | ||
78 | @ovpnstatus = `cat /var/run/ovpnserver.log`; | |
79 | ||
80 | open(FILE, "$ovpnconfig"); | |
81 | @ovpncfg = <FILE>; | |
82 | close (FILE); | |
83 | ||
84 | unless ( -e "$ovpncache" ) { | |
85 | open(FILE, ">$ovpncache"); | |
86 | close (FILE); | |
87 | } | |
88 | else { | |
89 | open(FILE, "$ovpncache"); | |
90 | @ovpncache = <FILE>; | |
91 | close (FILE); | |
92 | } | |
93 | ||
a25c95b3 | 94 | foreach (@ovpncfg) { |
0d6cc79d SF |
95 | chomp; |
96 | ||
97 | if ( $_ =~ "server" ) { next; } | |
98 | ||
99 | ( $name, $remark ) = (split (/\,/, $_))[3, 26]; | |
100 | ||
cc864e3d | 101 | unless ( grep (/$name/, @ovpncache) ) { push (@ovpncache, "$name,$remark,off\n"); } |
0d6cc79d SF |
102 | } |
103 | ||
a25c95b3 | 104 | foreach (@ovpncache) { |
0d6cc79d SF |
105 | chomp; |
106 | ||
107 | ( $name, $remark, $status ) = split (/\,/, $_); | |
108 | ||
cc864e3d | 109 | if ( grep (/$name/, @ovpncfg) ) { push (@ovpnarray, "$name,$remark,$status\n"); } |
0d6cc79d SF |
110 | } |
111 | ||
a25c95b3 | 112 | foreach (@ovpnarray) { |
0d6cc79d | 113 | chomp; |
a25c95b3 | 114 | |
0d6cc79d SF |
115 | ( $name, $remark, $status ) = split (/\,/, $_); |
116 | ||
cc864e3d SF |
117 | $remark = `/bin/cat $ovpnconfig | grep '$name' | cut -d "," -f 27`; |
118 | chomp ($remark); | |
119 | ||
0d6cc79d SF |
120 | if ( $name =~ m/_/ ) { $nameul = $name; } |
121 | else { ($nameul = $name) =~ s/ /_/g; } | |
122 | ||
a25c95b3 SFD |
123 | if ( grep (/$name/, @ovpnstatus) || grep (/$nameul/, @ovpnstatus) ) { |
124 | foreach (@ovpnstatus) { | |
0d6cc79d SF |
125 | chomp; |
126 | ||
127 | if ( $_ =~ "ROUTING TABLE" ) { last; } | |
128 | ||
129 | @ovpnmatch = split (/\,/, $_); | |
130 | ||
131 | if ( @ovpnmatch != 5 || $_ =~ "Common Name" ) { next; } | |
132 | ||
133 | ( $ovpnclt, $realipadr, undef, undef, $connected ) = @ovpnmatch; | |
134 | ||
135 | ( $ovpncltip, undef ) = split (/:/, $realipadr); | |
136 | ||
137 | $ovpnrwlogin = &WIO::statustime($connected); | |
138 | ||
139 | if ( $nameul eq $ovpnclt || $name eq $ovpnclt ) { | |
140 | $ovpnrwstatus = "$Lang::tr{'wio up'}"; | |
141 | $togglestat = ( $status ne 'on' ) ? 1 : 0; | |
142 | $status = 'on'; | |
143 | } | |
144 | ||
145 | if ( ! $name =~ m/_/ ) { $ovpnclt =~ s/_/ /g; } | |
146 | ||
147 | if ( $nameul eq $ovpnclt || $name eq $ovpnclt ) { push (@ovpnwrite, "$name,$remark,$status\n"); } | |
148 | ||
a25c95b3 | 149 | if ( $togglestat == 1 && ($name eq $ovpnclt || $nameul eq $ovpnclt) ) { |
0d6cc79d SF |
150 | $ovpnmailsub = "WIO OVPN - $name - $ovpnrwstatus - $now"; |
151 | $logmsg = "Client: WIO OVPN $name - IP: $ovpncltip - Status: $ovpnrwstatus"; | |
152 | $ovpnmailmsg = "Client : $name\nLogin : $ovpnrwlogin\nIP : $ovpncltip\nStatus : $ovpnrwstatus\n"; | |
153 | ||
154 | if ( $mailremark eq 'on' ) { | |
155 | $ovpnmailmsg .= "Remark : $remark\n\n"; | |
156 | } | |
157 | ||
158 | &WIO::mailsender($ovpnmailsub, $ovpnmailmsg); | |
159 | if ( $logging eq 'on' ) { &General::log("wio","$logmsg"); } | |
160 | undef ($ovpnmailsub); | |
161 | undef ($ovpnmailmsg); | |
162 | $togglestat = 0; | |
163 | } | |
164 | } | |
165 | } | |
166 | else { | |
167 | if ( $status eq 'on' ) { | |
168 | $ovpnrwstatus = "$Lang::tr{'wio down'}"; | |
169 | $status = 'off'; | |
170 | $ovpnmailsub = "WIO OVPN - $name - $ovpnrwstatus - $now"; | |
171 | $logmsg = "Client: WIO OVPN $name - Status: $ovpnrwstatus"; | |
172 | $ovpnmailmsg = "Client : $name\nLogout : $now\nStatus : $ovpnrwstatus\n"; | |
173 | ||
a25c95b3 | 174 | if ( $mailremark eq 'on' ) { $ovpnmailmsg .= "Remark : $remark\n\n"; } |
0d6cc79d SF |
175 | |
176 | &WIO::mailsender($ovpnmailsub, $ovpnmailmsg); | |
a25c95b3 | 177 | |
0d6cc79d SF |
178 | if ( $logging eq 'on' ) { &General::log("wio","$logmsg"); } |
179 | undef ($ovpnmailsub); | |
180 | undef ($ovpnmailmsg); | |
181 | } | |
182 | ||
183 | push (@ovpnwrite, "$name,$remark,$status\n"); | |
184 | } | |
185 | } | |
186 | ||
187 | open( FILE, "> $ovpncache" ); | |
188 | print FILE @ovpnwrite; | |
189 | close(FILE); | |
190 | ||
191 | } | |
192 | ||
193 | if ( ! -e "$vpnpid" ) { | |
194 | unlink "$vpncache"; | |
195 | } | |
196 | else { | |
197 | ||
cc864e3d | 198 | @vpnstatus = `/usr/local/bin/ipsecctrl I`; |
0d6cc79d SF |
199 | |
200 | open(FILE, "$vpnconfig"); | |
201 | @vpncfg = <FILE>; | |
202 | close (FILE); | |
203 | ||
cc864e3d | 204 | unless ( -e "$vpncache" ) { |
0d6cc79d SF |
205 | open(FILE, ">$vpncache"); |
206 | close (FILE); | |
207 | } | |
208 | else { | |
209 | open(FILE, "$vpncache"); | |
210 | @vpncache = <FILE>; | |
211 | close (FILE); | |
212 | } | |
213 | ||
a25c95b3 | 214 | foreach (@vpncfg) { |
0d6cc79d SF |
215 | chomp; |
216 | ||
cc864e3d | 217 | ( $name, $remark ) = (split (/\,/, $_))[2, 26]; |
0d6cc79d | 218 | |
cc864e3d | 219 | unless ( grep (/$name/, @vpncache) ) { push (@vpncache, "$name,$remark,off\n"); } |
0d6cc79d SF |
220 | } |
221 | ||
a25c95b3 | 222 | foreach (@vpncache) { |
0d6cc79d SF |
223 | chomp; |
224 | ||
225 | ( $name, $remark, $status ) = split (/\,/, $_); | |
226 | ||
cc864e3d | 227 | if ( grep (/$name/, @vpncfg) ) { push (@vpnarray, "$name,$remark,$status\n"); } |
0d6cc79d SF |
228 | } |
229 | ||
a25c95b3 | 230 | foreach (@vpnarray) { |
0d6cc79d SF |
231 | chomp; |
232 | ||
233 | ( $name, $remark, $status ) = split (/\,/, $_); | |
234 | ||
cc864e3d SF |
235 | $remark = `/bin/cat $vpnconfig | grep '$name' | cut -d "," -f 27`; |
236 | chomp ($remark); | |
237 | ||
a25c95b3 | 238 | if ( grep (/$name\{.*INSTALLED/ , @vpnstatus) ) { |
0d6cc79d SF |
239 | $vpnrwstatus = "$Lang::tr{'wio up'}"; |
240 | $togglestat = ( $status ne 'on' ) ? 1 : 0; | |
241 | $status = 'on'; | |
242 | } | |
243 | else { | |
244 | $vpnrwstatus = "$Lang::tr{'wio down'}"; | |
245 | $togglestat = ( $status ne 'off' ) ? 1 : 0; | |
246 | $status = 'off'; | |
247 | } | |
248 | ||
249 | push (@vpnwrite, "$name,$remark,$status\n"); | |
250 | ||
a25c95b3 | 251 | if ( $togglestat == 1 ) { |
cc864e3d SF |
252 | $vpnmailsub = "WIO IPsec - $name - $vpnrwstatus - $now"; |
253 | $logmsg = "Client: WIO IPSec $name - Status: $vpnrwstatus $now"; | |
a25c95b3 | 254 | $vpnmailmsg = "Client : $name\n"; |
0d6cc79d | 255 | |
a25c95b3 SFD |
256 | if ( $status eq 'on' ) { |
257 | $vpnmailmsg .= "Login : $now\n"; | |
0d6cc79d SF |
258 | } |
259 | else { | |
a25c95b3 | 260 | $vpnmailmsg .= "Logout : $now\n"; |
0d6cc79d SF |
261 | } |
262 | ||
a25c95b3 SFD |
263 | $vpnmailmsg .= "Status : $vpnrwstatus\n"; |
264 | ||
265 | if ( $mailremark eq 'on' ) { $vpnmailmsg .= "Remark : $remark\n\n"; } | |
266 | ||
0d6cc79d | 267 | &WIO::mailsender($vpnmailsub, $vpnmailmsg); |
a25c95b3 | 268 | |
0d6cc79d SF |
269 | if ( $logging eq 'on' ) { &General::log("wio","$logmsg"); } |
270 | undef ($vpnmailsub); | |
271 | undef ($vpnmailmsg); | |
272 | $togglestat = 0; | |
273 | } | |
274 | } | |
275 | ||
276 | open( FILE, "> $vpncache" ); | |
277 | print FILE @vpnwrite; | |
278 | close(FILE); | |
279 | ||
280 | } |