#!/usr/bin/perl ############################################################################### # # # IPFire.org - A linux based firewall # # Copyright (C) 2007-2023 IPFire Team # # Copyright (C) 2024 BPFire # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation, either version 3 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program. If not, see . # # # ############################################################################### use strict; use experimental 'smartmatch'; # enable only the following on debugging purpose #use warnings; #use CGI::Carp 'fatalsToBrowser'; require '/var/ipfire/general-functions.pl'; require "${General::swroot}/lang.pl"; require "${General::swroot}/header.pl"; #workaround to suppress a warning when a variable is used only once my @dummy = ( ${Header::colouryellow} ); undef (@dummy); our %hasettings=(); our %netsettings=(); my %mainsettings=(); my %timesettings=(); my $setting = "${General::swroot}/haproxy/settings"; my $configsetting = "${General::swroot}/haproxy/config"; my $loxilbipfile = "${General::swroot}/loxilb/ipconfigfile"; # because we need commas in the some data my $errormessage = ''; #remove 'ENABLE_HA' from '/var/ipfire/haproxy/settings' as it could affect haproxy running state my @nosaved=('ENABLE_HAPROXY'); my %color = (); $hasettings{'ENABLE_HAPROXY'} = 'off'; &Header::showhttpheaders(); my @MODE= ('tcp', 'http'); #Settings1 for the first screen box $hasettings{"mode"} = ''; $hasettings{"bind"} = ''; # Read Ipcop settings &General::readhash("${General::swroot}/ethernet/settings", \%netsettings); &General::readhash("${General::swroot}/main/settings", \%mainsettings); &General::readhash("/srv/web/ipfire/html/themes/ipfire/include/colors.txt", \%color); #Get GUI values &Header::getcgihash(\%hasettings); if ($hasettings{'ACTION'} eq $Lang::tr{'enable'}) { #remove @nosaved from $hasettings before writehash to 'configsettings' file since 'configsetting' is only for haproxy running state my @nosaved = ("mode", "bind", "ENABLE_HAPROXY"); map (delete ($hasettings{$_}) ,(@nosaved)); &General::writehash("$configsetting", \%hasettings); if ($hasettings{'ENABLE_HAPROXY'} eq 'on') { &General::system('/usr/bin/touch', "${General::swroot}/haproxy/enable_ha"); &General::system('/usr/local/bin/haproxyctrl', 'start'); } else { &General::system('/usr/local/bin/haproxyctrl', 'stop'); unlink "${General::swroot}/haproxy/enable_ha"; } } # Check Settings1 first because they are needed by &buildconf if ($hasettings{'ACTION'} eq $Lang::tr{'save'}) { if ($hasettings{"mode"} eq '') { $errormessage = "mode" . " is $Lang::tr{'required field'}"; goto ERROR; } if ($hasettings{"bind"} eq '') { $errormessage = "bind" . " is $Lang::tr{'required field'}"; goto ERROR; } map (delete ($hasettings{$_}) ,@nosaved,'ACTION','KEY1','KEY2','q'); # Must not be saved &General::writehash($setting, \%hasettings); # Save good settings $hasettings{'ACTION'} = $Lang::tr{'save'}; # create an 'ACTION' map ($hasettings{$_} = '',@nosaved,'KEY1','KEY2'); # and reinit vars to empty &buildconf; ERROR: } if ($hasettings{'ACTION'} eq '' ) { # First launch from GUI $hasettings{"mode"} = ''; $hasettings{"bind"} = ''; } ### START PAGE ### &Header::openpage($Lang::tr{'haproxy configuration'}, 1, $Header::extraHead); &Header::openbigbox('100%', 'left', '', $errormessage); if ($errormessage) { &Header::openbox('100%', 'left', $Lang::tr{'error messages'}); print "$errormessage \n"; &Header::closebox(); } # Read configuration file. &General::readhash("$configsetting", \%hasettings); # Checkbox pre-selection. my $checked; if ($hasettings{'ENABLE_HA'} eq "on") { $checked = "checked='checked'"; } my $sactive = "
$Lang::tr{'stopped'}
"; my @status = &General::system_output('/usr/local/bin/haproxyctrl', 'status'); if (grep(/is running/, @status)){ $sactive = "
$Lang::tr{'running'}
"; } &Header::openbox('100%', 'center', $Lang::tr{'haproxy status'}); print <
      $Lang::tr{'haproxy status'} $sactive   $Lang::tr{'enable'} END print "
\n"; &Header::closebox(); # &General::readhash($setting, \%hasettings); # Get saved settings and reset to good if needed &Header::openbox('100%', 'left', $Lang::tr{'haproxy config'}); print "
"; my %checked = (); print < $Lang::tr{'haproxy mode'} * $Lang::tr{'haproxy bind'} *
END print < * $Lang::tr{'required field'} END &Header::closebox(); &Header::closebigbox(); &Header::closepage(); # Build the configuration file mixing settings, fixed leases and advanced options sub buildconf { open(FILE, ">/${General::swroot}/haproxy/haproxy.cfg") or die "Unable to write haproxy.cfg file"; flock(FILE, 2); # Global settings print FILE <