]> git.ipfire.org Git - ipfire-2.x.git/blame - src/wio/main/wiovpn.pl
WIO - shutdown function removed, adjustments to IPsec status display
[ipfire-2.x.git] / src / wio / main / wiovpn.pl
CommitLineData
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
37use strict;
38use POSIX qw(strftime);
39
0d6cc79d
SF
40require '/var/ipfire/general-functions.pl';
41require '/var/ipfire/lang.pl';
42require '/usr/lib/wio/wio-lib.pl';
43
44my %wiosettings = ();
45
46&General::readhash( "/var/ipfire/wio/wio.conf", \%wiosettings );
47
48my $mailremark = $wiosettings{'MAILREMARK'};
49my $logging = $wiosettings{'LOGGING'};
50
51my ( @ovpnstatus, @ovpncfg, @ovpncache, @ovpnarray, @ovpnmatch, @ovpnwrite );
52
53my $now = strftime "%a, %d.%m.%Y %H:%M:%S", localtime;
54my $ovpnpid = "/var/run/openvpn.pid";
55my $ovpnmailmsg = '';
cc864e3d 56my $ovpncache = "/var/log/wio/.ovpncache";
0d6cc79d
SF
57my $ovpnconfig = "/var/ipfire/ovpn/ovpnconfig";
58
59my ( $name, $nameul, $ovpnclt, $ovpncltip, $realipadr, $connected ) = '';
60my ( $ovpnmailsub, $ovpnrwlogin, $ovpnrwstatus, $status, $remark, $logmsg ) = '';
61
62my ( @vpnstatus, @vpncfg, @vpncache, @vpnarray, @vpnwrite );
63
64my $vpnpid = "/var/run/charon.pid";
65my $vpnmailmsg = '';
cc864e3d 66my $vpncache = "/var/log/wio/.vpncache";
0d6cc79d
SF
67my $vpnconfig = "/var/ipfire/vpn/config";
68
cc864e3d 69my ( $vpnmailsub, $vpnrwstatus ) = '';
0d6cc79d
SF
70
71my $togglestat = 0;
72
73if ( ! -e "$ovpnpid" ) {
74 unlink "$ovpncache";
75}
76else {
77
78@ovpnstatus = `cat /var/run/ovpnserver.log`;
79
80open(FILE, "$ovpnconfig");
81@ovpncfg = <FILE>;
82close (FILE);
83
84unless ( -e "$ovpncache" ) {
85 open(FILE, ">$ovpncache");
86 close (FILE);
87}
88else {
89 open(FILE, "$ovpncache");
90 @ovpncache = <FILE>;
91 close (FILE);
92}
93
a25c95b3 94foreach (@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 104foreach (@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 112foreach (@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
187open( FILE, "> $ovpncache" );
188print FILE @ovpnwrite;
189close(FILE);
190
191}
192
193if ( ! -e "$vpnpid" ) {
194 unlink "$vpncache";
195}
196else {
197
cc864e3d 198@vpnstatus = `/usr/local/bin/ipsecctrl I`;
0d6cc79d
SF
199
200open(FILE, "$vpnconfig");
201@vpncfg = <FILE>;
202close (FILE);
203
cc864e3d 204unless ( -e "$vpncache" ) {
0d6cc79d
SF
205 open(FILE, ">$vpncache");
206 close (FILE);
207}
208else {
209 open(FILE, "$vpncache");
210 @vpncache = <FILE>;
211 close (FILE);
212}
213
a25c95b3 214foreach (@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 222foreach (@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 230foreach (@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
276open( FILE, "> $vpncache" );
277print FILE @vpnwrite;
278close(FILE);
279
280}