Генерация ваучеров портала Pfsense без необходимости входа в брандмауэр

Я хотел бы знать, есть ли какой-либо метод, который можно использовать для генерации ваучеров, которые можно использовать на портале Pfsense. В основном у меня есть брандмауэр, который подает интернет на Wi-Fi роутер для гостей. Я хотел бы иметь какой-то интерфейс для работника, чтобы иметь возможность создавать ваучеры и раздавать их клиентам без необходимости входа в Wi-Fi. Я нашел двух потенциальных клиентов в Интернете: https://sourceforge.net/projects/vouchergen/ и https://github.com/jpardobl/pfsense_vouchers_rest но они больше не работают. Любой совет? Заранее спасибо.

1 ответ

Решение

Я только что закончил писать простую страницу PHP, чтобы сделать это. Он работает с базой данных MySQL, которая имеет только две таблицы: одну для ваучеров и другую для IP-адресов, которым я хочу предоставить доступ к этой странице.

Как только пользователь выбирает тип ваучера (минуты) и нажимает "Создать", он выбирает любой действительный ваучер в локальной базе данных и помечает его как использованный.

Вот код:

<!DOCTYPE html>
<html>
    <head>   
        <meta charset="UTF-8">
        <title>Vouchers DSA</title>
    </head>
    <body> 
        <?php
        function gera_form(){
            ?>
            <style>
            table {
                font-family: arial, sans-serif;
                border-collapse: collapse;
                width: 100%;
            }
            td, th {
                border: 1px solid #dddddd;
                text-align: left;
                padding: 8px;
            }
            tr:nth-child(even) {
                background-color: #dddddd;
            }
        </style>
        <?php
            echo '<h2 align="center">Gerador de vouchers para WiFi</center></h2>';
            echo '<p align="center">Selecione a duração desejada e clique em "Gerar Voucher"</center></p>';
            echo '<br><br>';
            echo '<div align="center">';
            echo '<form method="POST">';
            echo '<select name="state">'; 
            echo '<option value="--">Duração</option>';
            echo '<option value="30">1/2 hora</option>';
            echo '<option value="60">1 hora</option>';
            echo '<option value="120">2 horas</option>';
            echo '<option value="1440">1 dia</option>';
            echo '<option value="43200">1 mês</option>';
            echo '</select>';
            echo '<br><br><input type="submit" value="Gerar Voucher">';
            echo '</form> </center>';
            echo '</div>';  
        }    
        $ip=get_client_ip();
        $hostname="localhost";  
        $username="root";  
        $password="771477";  
        $db = "banco_voucher";  
        $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);       
        function get_client_ip() {
            $ipaddress = '';
            if (getenv('HTTP_CLIENT_IP'))
                $ipaddress = getenv('HTTP_CLIENT_IP');
            else if(getenv('HTTP_X_FORWARDED_FOR'))
                $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
            else if(getenv('HTTP_X_FORWARDED'))
                $ipaddress = getenv('HTTP_X_FORWARDED');
            else if(getenv('HTTP_FORWARDED_FOR'))
                $ipaddress = getenv('HTTP_FORWARDED_FOR');
            else if(getenv('HTTP_FORWARDED'))
               $ipaddress = getenv('HTTP_FORWARDED');
            else if(getenv('REMOTE_ADDR'))
                $ipaddress = getenv('REMOTE_ADDR');
            else
                $ipaddress = 'UNKNOWN';
            return $ipaddress;
        }
        function get_voucher($valor, $ip, $dbh){       
            $hostname="localhost";  
            $username="root";  
            $password="771477";  
            $db = "banco_voucher";  
            $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);    
            foreach($dbh->query("update vouchers 
                                    set solicitado_por = 
                                    (select id_usuario from usuarios where ip_maquina = '$ip'), 
                                    solicitado_em = now(), 
                                    validade = 0
                                    where validade != 0 and minutos = '$valor'
                                    limit 1;" ) as $row);
        }
        function get_time($minutos){
            $dur = "";
            if ($minutos == 30) {
                $dur = "1/2 hora";
            } else if ($minutos == 60) {
                $dur = "1 hora";
            } else if ($minutos == 120) {
                $dur = "2 horas";
            } else if ($minutos == 1440) {
                $dur = "1 dia";
            } else if ($minutos == 43200) {
                $dur = "1 mes";
            } else {
                $dur = "desconhecida";
            }
            return $dur;
        }
        function gera_tabela($ip){
            $hostname="localhost";  
            $username="root";  
            $password="771477";  
            $db = "banco_voucher";  
            $dbh = new PDO("mysql:host=$hostname;dbname=$db", $username, $password);      
            $historico = array("<table>
                                <tr>
                                <th>Departamento</th>
                                <th>Voucher</th>
                                <th>Duracao</th>
                                <th>Data</th>
                                </tr>",);
            $teste = array ("a");
            try {
                $select = $dbh->query("select b.departamento, 
                                        a.cod_voucher, a.minutos, 
                                        date_format(a.solicitado_em, '%d/%c/%Y - %H:%i:%s') as stamp 
                                        from vouchers as a
                                        right join usuarios as b on (solicitado_por = id_usuario)
                                        where ip_maquina = '$ip' and cod_voucher is not null
                                        order by stamp desc limit 10;");
            } catch (Exception $exc) {
                echo $exc->getTraceAsString();
            }
            $result = $select->fetchAll();
            echo "<br><br>";
            echo $historico[0];
            $i = 0;
            foreach($result as $row){
                $dur = get_time($row['minutos']);        
                array_push($historico, "<tr><td>".$row['departamento']."</td>"
                        . "<td>".$row['cod_voucher']."</td>"
                        . "<td>".$dur."</td>"
                        . "<td>".$row['stamp']."</td>"
                        . "</tr>");
                $i++;
                echo $historico[$i];       
            }
            echo "</table>";
        }
        foreach($dbh->query("select-count(ip_maquina) as ip from usuarios where ip_maquina = '$ip';") as $row){
            if($row['ip'] == 0){
                echo "<h1>Acesso negado</h1>";
                echo "<p>Sua estação de trabalho não tem as permissões de acesso necessárias."
                        . "<br>Contate a equipe de TI para mais informações.</p><hr>";
                echo "<address>Gestão de vouchers - Divisão Sul Americana da IASD</address>";
            }
            else if($row['ip'] != 0){
                gera_form();
                get_voucher($_POST['state'], $ip);
                gera_tabela($ip);
                if(isset($_POST['state'])){
                    header("Location:SandBox.php");
                    unset($_POST['state']);
                    if($_POST['state']=="--"){
                        echo "Escolha um tempo apropriado para a validade do voucher.";
                    }
                }
            }     
    }
        ?>
    </body>
</html>

Так как это моя первая php-страница, это может быть катастрофой в глазах опытного php-программиста, однако она довольно функциональна и делает то, что вам нужно.

Просто скопируйте приведенный выше код в файл с именем SandBox.php и поместите его в папку Apache / www / html.

Таблицы в MySQL могут быть созданы с использованием этих кодов:

Для ваучеров:

CREATE TABLE `vouchers` (
  `id_voucher` int(11) NOT NULL AUTO_INCREMENT,
  `cod_voucher` varchar(10) DEFAULT NULL,
  `validade` bit(1) DEFAULT NULL,
  `solicitado_em` varchar(20) DEFAULT NULL,
  `solicitado_por` varchar(15) DEFAULT NULL,
  `minutos` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_voucher`)
) ENGINE=InnoDB AUTO_INCREMENT=131073 DEFAULT CHARSET=utf8;

Вы должны выполнить обновление вручную в столбце "validade", чтобы установить значение "1" [означает действительный] для всех ваучеров. После выбора на странице она будет обновлена ​​до "0" [означает, что используется].

update vouchers set validade = 1;

Для IP-адресов, которым будет разрешен доступ к странице:

CREATE TABLE `usuarios` (
  `id_usuario` int(11) NOT NULL AUTO_INCREMENT,
  `ip_maquina` varchar(15) DEFAULT NULL,
  `departamento` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_usuario`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

Вы должны выполнить ручную вставку в эту таблицу, анализируя IP-адрес компьютера управления и его имя / местоположение / метку / все, что вы хотите использовать в качестве удобочитаемого идентификатора.

insert into usuarios(ip_maquina, departamento) values ('10.91.198.12', 'Cyber Cafe');

PS: названия полей на португальском.

Чтобы загрузить файл.csv из PfSense в локальную базу данных:

LOAD DATA LOCAL INFILE '/home/infra/Downloads/vouchers.csv' 
INTO TABLE vouchers
LINES TERMINATED BY '\n' (cod_voucher);

Надеюсь, это поможет вам.

Другие вопросы по тегам