net/haproxy: support unix sockets as server addresses, refs #2040

This commit is contained in:
Frank Wall 2021-11-20 00:44:32 +01:00
parent 1aac7bde4b
commit 4d94864c93
3 changed files with 46 additions and 2 deletions

View file

@ -67,9 +67,21 @@
<help><![CDATA[Add resolver options. Use TAB key to complete typing.]]></help>
<hint>Type option name or choose from list.</hint>
</field>
<field>
<label>UNIX Socket</label>
<type>header</type>
<style>table_server_type table_server_type_unix</style>
</field>
<field>
<id>server.unix_socket</id>
<label>Frontend (Socket Origin)</label>
<type>dropdown</type>
<help>Select the frontend that provides the UNIX socket. This UNIX socket will be used as the server's address, making it possible to send connections to this frontend. Only frontends that provide the unix@ pattern as listen address can be selected.</help>
</field>
<field>
<label>Common Options</label>
<type>header</type>
<style>table_server_type table_server_type_static table_server_type_template</style>
</field>
<field>
<id>server.port</id>

View file

@ -1,6 +1,6 @@
<model>
<mount>//OPNsense/HAProxy</mount>
<version>3.3.0</version>
<version>3.4.0</version>
<description>the HAProxy load balancer</description>
<items>
<general>
@ -1251,6 +1251,7 @@
<OptionValues>
<static>static</static>
<template>template</template>
<unix>unix socket</unix>
</OptionValues>
</type>
<serviceName type="TextField">
@ -1342,6 +1343,21 @@
<advanced type="TextField">
<Required>N</Required>
</advanced>
<unix_socket type="ModelRelationField">
<Model>
<template>
<source>OPNsense.HAProxy.HAProxy</source>
<items>frontends.frontend</items>
<display>name</display>
<filters>
<bind>/unix@/</bind>
</filters>
</template>
</Model>
<ValidationMessage>Related frontend item not found</ValidationMessage>
<Required>N</Required>
<Multiple>N</Multiple>
</unix_socket>
</server>
</servers>
<healthchecks>

View file

@ -1657,13 +1657,29 @@ backend {{backend.name}}
# ERROR: server data not found ({{server}})
{% else %}
{# # check if all required server parameters are set #}
{% if (server_data.type|default("") == 'static' and server_data.address|default("") == '') or (server_data.type|default("") == 'template' and (server_data.serviceName|default("") == '' or server_data.number|default("") == '')) %}
{% if (server_data.type|default("") == 'static' and server_data.address|default("") == '') or (server_data.type|default("") == 'template' and (server_data.serviceName|default("") == '' or server_data.number|default("") == '')) or (server_data.type|default("") == 'unix' and server_data.unix_socket|default("") == '') %}
# ERROR: server is invalid, required parameters not set ({{server_data.name}})
{% else %}
{# # server type #}
{% set server_basics = [] %}
{% if server_data.type|default("") == 'template' %}
{% do server_basics.append('server-template ' ~ server_data.name ~ ' ' ~ server_data.number ~ ' ' ~ server_data.serviceName) %}
{% elif server_data.type|default("") == 'unix' %}
{# # extract unix socket information from frontend #}
{% set frontend_data = helpers.getUUID(server_data.unix_socket) %}
{% set socket_path = "" %}
{% for bind in frontend_data.bind.split(",") %}
{# # check if this is a unix socket #}
{% set unix_bind = bind | regex_replace ("^unix@.*","TRUE") %}
{% if unix_bind == "TRUE" %}
{# # extract socket name and add full path #}
{% set socket_name = bind | regex_replace ("^unix@","") %}
{% set socket_path = "unix@/tmp/haproxy/sockets/" ~ socket_name %}
{% do server_basics.append('server ' ~ server_data.name ~ ' ' ~ socket_path) %}
{# # only the first unix socket is considered #}
{% break %}
{% endif %}
{% endfor %}
{% else %}
{% do server_basics.append('server ' ~ server_data.name ~ ' ' ~ server_data.address) %}
{% endif %}