- Start migration of dns, network & vpn lib,
- Start migration of rx3_net_adm.
This commit is contained in:
404
usr/lib/default.bash
Normal file
404
usr/lib/default.bash
Normal file
@@ -0,0 +1,404 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [[ "${DEFAULT_BASH}" != "" ]]
|
||||
then
|
||||
return
|
||||
else
|
||||
declare -g DEFAULT_BASH=1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Global Variable
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
declare -g LOG_FILE=""
|
||||
declare -g LOG_LOCK=""
|
||||
declare -g LOG_ECHO=""
|
||||
declare -g LOG_TRACE="DISABLED"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Default Options
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
shopt -s extglob
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Print Version
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
version_print()
|
||||
{
|
||||
echo "$VERSION" | sed -e 's/.*: //' -e 's/-/ /' -e 's/_/\./g' -e 's/\$$//'
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Prin Help
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
help_print()
|
||||
{
|
||||
echo "${NAME} ${HELP}"
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Quote Str
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
quote_str()
|
||||
{
|
||||
local quoted=${1//\'/\'\\\'\'}
|
||||
printf "'%s'" "$quoted"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Escape Str
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
escape_str()
|
||||
{
|
||||
echo "$*" | sed -e "s/\"/\\\\\"/g"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Line Echo
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
line_echo()
|
||||
{
|
||||
string="$1"
|
||||
count="$2"
|
||||
|
||||
echo -en "\e[2K\r"
|
||||
|
||||
if [[ "${count}" != "" ]]
|
||||
then
|
||||
printf "%05d: %s" "${count}"
|
||||
echo -en "${string}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Err Echo
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
err_echo()
|
||||
{
|
||||
echo "$@" 1>&2
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Exec CMD
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
exec_cmd()
|
||||
{
|
||||
cmd="$1"
|
||||
|
||||
|
||||
if [[ "${verbose}" == "true" ]]
|
||||
then
|
||||
echo "${cmd}" 1>&2
|
||||
fi
|
||||
|
||||
if [[ "${dry_run}" != "true" ]]
|
||||
then
|
||||
eval "${cmd}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# tab_assign
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
tab_assign()
|
||||
{
|
||||
declare -n ta_tab=$1
|
||||
ta_key=$2
|
||||
ta_value=$3
|
||||
|
||||
|
||||
if [[ "${ta_value}" == "-" ]]
|
||||
then
|
||||
ta_value=""
|
||||
fi
|
||||
|
||||
ta_tab[${ta_key}]="${ta_value}"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# var_assign
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
var_assign()
|
||||
{
|
||||
declare -n va_var=$1
|
||||
va_value=$2
|
||||
va_mode=$3
|
||||
|
||||
|
||||
if [[ "${va_value}" == "-" ]]
|
||||
then
|
||||
va_value=""
|
||||
fi
|
||||
|
||||
if [[ "${va_mode}" == "INC" ]]
|
||||
then
|
||||
va_var="${va_var} ${va_value}"
|
||||
else
|
||||
va_var="${va_value}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# file_dir_init
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
file_dir_init()
|
||||
{
|
||||
local File="$1"
|
||||
local Owner="$2"
|
||||
local Group="$3"
|
||||
|
||||
local dir
|
||||
|
||||
|
||||
if [ ! -f ${File} ]
|
||||
then
|
||||
if [[ "$( id -u)" != "0" ]]
|
||||
then
|
||||
${ECHO} "Can't perform file init of: [${File}] as non root user!"
|
||||
else
|
||||
dir="$( dirname ${File})"
|
||||
|
||||
if [ ! -d ${dir} ]
|
||||
then
|
||||
${ECHO} "Initializing directory: [${dir}]"
|
||||
|
||||
mkdir ${dir}
|
||||
chmod ug+rwx ${dir}
|
||||
chown ${Owner}:${Group} ${dir}
|
||||
fi
|
||||
|
||||
${ECHO} "Initializing file: [${File}]"
|
||||
|
||||
>${File}
|
||||
chmod ug+rw ${File}
|
||||
chown ${Owner}:${Group} ${File}
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# file_lock
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
file_lock()
|
||||
{
|
||||
local file="$1"
|
||||
local mode="$2"
|
||||
local desc="$3"
|
||||
|
||||
|
||||
if [[ ( "${mode}" == "EXCLUSIVE" ) || ( "${mode}" == "WRITE" ) ]]
|
||||
then
|
||||
flag="-x"
|
||||
else
|
||||
flag="-s"
|
||||
fi
|
||||
|
||||
if [[ "${desc}" == "" ]]
|
||||
then
|
||||
desc="9"
|
||||
fi
|
||||
|
||||
|
||||
eval "exec ${desc}<>\"\${file}\""
|
||||
|
||||
if ! flock ${flag} -w 5 ${desc}
|
||||
then
|
||||
err_echo "Failed to acquire [${mode}] lock on: [${file}]"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# file_unlock
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
file_unlock()
|
||||
{
|
||||
local desc="$1"
|
||||
|
||||
|
||||
if [[ "${desc}" == "" ]]
|
||||
then
|
||||
desc="9"
|
||||
fi
|
||||
|
||||
|
||||
eval "exec ${desc}<&-"
|
||||
eval "exec ${desc}>&-"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_set
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_set()
|
||||
{
|
||||
local log_file="$1"
|
||||
local lock_file="$2"
|
||||
local echo_function="$3"
|
||||
local log_trace="$4"
|
||||
|
||||
|
||||
LOG_FILE="${log_file}"
|
||||
LOG_LOCK="${lock_file}"
|
||||
LOG_ECHO="${echo_function}"
|
||||
|
||||
if [[ ${log_trace} != "" ]]
|
||||
then
|
||||
LOG_TRACE="${log_trace}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_print
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_print()
|
||||
{
|
||||
local log_file="$1"
|
||||
local lock_file="$2"
|
||||
local echo_function="$3"
|
||||
local log_type="$4"
|
||||
local log_prefix="$5"
|
||||
|
||||
|
||||
shift; shift; shift; shift; shift
|
||||
|
||||
if [[ "${log_type}" != "TRA" ]] || [[ "${LOG_TRACE}" != "DISABLED" ]]
|
||||
then
|
||||
${echo_function} "($BASHPID):" "$*"
|
||||
|
||||
if [[ "${log_file}" != "" ]]
|
||||
then
|
||||
if [[ "${lock_file}" != "" ]]
|
||||
then
|
||||
file_lock "${lock_file}" WRITE 8
|
||||
fi
|
||||
|
||||
printf >> "${log_file}" "%s %9s %3s %16s %s\n" "$(date --rfc-3339=seconds -u)" "($BASHPID)" "${log_type}" "${log_prefix}:" "$*"
|
||||
|
||||
if [[ "${lock_file}" != "" ]]
|
||||
then
|
||||
file_unlock 8
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_trace
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_trace()
|
||||
{
|
||||
log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "TRA" "$@"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_info
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_info()
|
||||
{
|
||||
log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "INF" "$@"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_warning
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_warning()
|
||||
{
|
||||
log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "WRN" "$@"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# log_error
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
log_error()
|
||||
{
|
||||
log_print "${LOG_FILE}" "${LOG_LOCK}" "${LOG_ECHO}" "ERR" "$@"
|
||||
}
|
||||
324
usr/lib/dns.bash
Normal file
324
usr/lib/dns.bash
Normal file
@@ -0,0 +1,324 @@
|
||||
#!/bin/bash
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
#
|
||||
# Rx3 DNS Library
|
||||
#
|
||||
# Copyright (C) 2025-2026 Arnaud G. GIBERT
|
||||
# mailto:arnaud@rx3.net
|
||||
#
|
||||
# This is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
if [[ "${RX3_DNS_LIB}" != "" ]]
|
||||
then
|
||||
return
|
||||
else
|
||||
declare -g RX3_DNS_LIB=1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
# Includes
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
: "${RX3_LIB_DIR:=/usr/lib/rx3}"
|
||||
. "${RX3_LIB_DIR}/base.bash"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
# Global Variable
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
declare -Ag DNS_A_TAB
|
||||
declare -g DNS_A_ID_LIST
|
||||
|
||||
declare -Ag DNS_PTR_TAB
|
||||
declare -g DNS_PTR_ID_LIST
|
||||
|
||||
declare -g DNS_CACHE_FILE
|
||||
declare -g DNS_CACHE_LOCK
|
||||
#declare -g DNS_CACHE_LOCK="${DNS_CACHE_FILE}"
|
||||
|
||||
declare -g DNS_CACHE_UPDATED=0
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_tab_load
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_tab_load()
|
||||
{
|
||||
log_trace "DNS" "Loading DNS cache..."
|
||||
|
||||
file_lock "${DNS_CACHE_LOCK}" READ 9
|
||||
|
||||
if [[ ( -e "${DNS_CACHE_FILE}" ) && ( "${NETWORK_CONFIG_FILE}" -ot "${DNS_CACHE_FILE}" ) ]]
|
||||
then
|
||||
log_trace "DNS" "Read CacheFile"
|
||||
|
||||
while IFS= read -r line
|
||||
do
|
||||
line=${line%%#*}
|
||||
if [[ ! -z "$line" ]]
|
||||
then
|
||||
set ${line}
|
||||
|
||||
dtl_type="$1"
|
||||
dtl_key="$2"
|
||||
dtl_value="$3"
|
||||
|
||||
dns_tab_put ${dtl_type} "${dtl_key}" "${dtl_value}"
|
||||
fi
|
||||
done < ${DNS_CACHE_FILE}
|
||||
else
|
||||
log_trace "DNS" "Init CacheFile"
|
||||
|
||||
>${DNS_CACHE_FILE}
|
||||
fi
|
||||
|
||||
file_unlock 9
|
||||
|
||||
DNS_CACHE_UPDATED=0
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_tab_save
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_tab_save()
|
||||
{
|
||||
log_trace "DNS" "Saving DNS cache..."
|
||||
|
||||
if [[ "${DNS_CACHE_UPDATED}" != "0" ]]
|
||||
then
|
||||
file_lock "${DNS_CACHE_LOCK}" WRITE 9
|
||||
|
||||
log_trace "DNS" "Write CacheFile"
|
||||
|
||||
(
|
||||
for key in "${!DNS_A_TAB[@]}"
|
||||
do
|
||||
echo "A ${key} ${DNS_A_TAB[${key}]}"
|
||||
done
|
||||
|
||||
for key in "${!DNS_PTR_TAB[@]}"
|
||||
do
|
||||
echo "PTR ${key} ${DNS_PTR_TAB[${key}]}"
|
||||
done
|
||||
) | sort -n >${DNS_CACHE_FILE}
|
||||
|
||||
file_unlock 9
|
||||
|
||||
DNS_CACHE_UPDATED=0
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_tab_get
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_tab_get()
|
||||
{
|
||||
dns_type="$1"
|
||||
dns_key="$2"
|
||||
|
||||
|
||||
case ${dns_type}
|
||||
in
|
||||
"A")
|
||||
if [[ -v DNS_A_TAB["${dns_key}"] ]]
|
||||
then
|
||||
dns_value="${DNS_A_TAB["${dns_key}"]}"
|
||||
else
|
||||
log_trace "DNS" "Lookup failed: Type: [${dns_type}] Key: [${dns_key}]"
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
|
||||
"PTR")
|
||||
if [[ -v DNS_PTR_TAB["${dns_key}"] ]]
|
||||
then
|
||||
dns_value="${DNS_PTR_TAB["${dns_key}"]}"
|
||||
else
|
||||
log_trace "DNS" "Lookup failed: Type: [${dns_type}] Key: [${dns_key}]"
|
||||
return 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
log_trace "DNS" "Lookup succeed: Type: [${dns_type}] Key: [${dns_key}] Value: [${dns_value}]"
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_tab_put
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_tab_put()
|
||||
{
|
||||
dtp_type="$1"
|
||||
dtp_key="$2"
|
||||
dtp_value="$3"
|
||||
|
||||
|
||||
if [[ "${dtp_value}" == "" ]]
|
||||
then
|
||||
log_trace "DNS" "Skiping cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]"
|
||||
else
|
||||
log_trace "DNS" "Update cache entry: Type: [${dtp_type}] Key: [${dtp_key}] Value: [${dtp_value}]"
|
||||
|
||||
var_assign DNS_${dtp_type}_ID_LIST "${dtp_key}" INC
|
||||
tab_assign DNS_${dtp_type}_TAB "${dtp_key}" "${dtp_value}"
|
||||
|
||||
DNS_CACHE_UPDATED=1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_lookup
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_lookup()
|
||||
{
|
||||
dl_type="$1"
|
||||
dl_key="$2"
|
||||
dl_flag="$3"
|
||||
|
||||
|
||||
if [[ "${dl_flag}" != "NOCACHE" ]]
|
||||
then
|
||||
dns_tab_get ${dl_type} ${dl_key}
|
||||
else
|
||||
false
|
||||
fi
|
||||
|
||||
if [[ "$?" != "0" ]]
|
||||
then
|
||||
log_trace "DNS" "Out of Cache: Type: [${dl_type}] Key: [${dl_key}] Flag: [${dl_flag}]"
|
||||
|
||||
case ${dl_type}
|
||||
in
|
||||
"A")
|
||||
dns_value="$( dig +short ${dl_key} 2>/dev/null)"
|
||||
;;
|
||||
|
||||
"PTR")
|
||||
dns_value="$( dig +short -x ${dl_key} 2>/dev/null)"
|
||||
dns_value="${dns_value%.}"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ "${dl_flag}" != "NOCACHE" ]]
|
||||
then
|
||||
dns_tab_put "${dl_type}" "${dl_key}" "${dns_value}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_tab_dump
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_tab_dump()
|
||||
{
|
||||
echo "DNS_A_ID_LIST: [${DNS_A_ID_LIST}]"
|
||||
echo
|
||||
|
||||
echo "DNS_A_TAB:"
|
||||
|
||||
for key in "${!DNS_A_TAB[@]}"
|
||||
do
|
||||
echo "[${key}]: [${DNS_A_TAB[${key}]}]"
|
||||
done | sort -n
|
||||
|
||||
echo
|
||||
|
||||
echo "DNS_PTR_ID_LIST: [${DNS_PTR_ID_LIST}]"
|
||||
echo
|
||||
|
||||
echo "DNS_PTR_TAB:"
|
||||
|
||||
for key in "${!DNS_PTR_TAB[@]}"
|
||||
do
|
||||
echo "[${key}]: [${DNS_PTR_TAB[${key}]}]"
|
||||
done | sort -n
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_init
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_init()
|
||||
{
|
||||
file_dir_init ${DNS_CACHE_FILE} root apache
|
||||
file_dir_init ${DNS_CACHE_LOCK} root apache
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# dns_deinit
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
dns_deinit()
|
||||
{
|
||||
DNS_A_TAB=()
|
||||
DNS_A_ID_LIST=""
|
||||
|
||||
DNS_PTR_TAB=()
|
||||
DNS_PTR_ID_LIST=""
|
||||
|
||||
DNS_CACHE_UPDATED=0
|
||||
|
||||
# :;
|
||||
}
|
||||
|
||||
1712
usr/lib/network.bash
Normal file
1712
usr/lib/network.bash
Normal file
File diff suppressed because it is too large
Load Diff
590
usr/lib/vpn.bash
Normal file
590
usr/lib/vpn.bash
Normal file
@@ -0,0 +1,590 @@
|
||||
#!/bin/bash
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
#
|
||||
# Rx3 VPN Library
|
||||
#
|
||||
# Copyright (C) 2025-2026 Arnaud G. GIBERT
|
||||
# mailto:arnaud@rx3.net
|
||||
#
|
||||
# This is free software: you can redistribute it and/or modify it
|
||||
# under the terms of the GNU Lesser 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 Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public
|
||||
# License along with this program; If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
if [[ "${RX3_VPN_LIB}" != "" ]]
|
||||
then
|
||||
return
|
||||
else
|
||||
declare -g RX3_VPN_LIB=1
|
||||
fi
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
# Includes
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
: "${RX3_LIB_DIR:=/usr/lib/rx3}"
|
||||
. "${RX3_LIB_DIR}/network.bash"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
# Global Variable
|
||||
#-----------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
declare -Ag VPN_JOB_TAB
|
||||
declare -Ag VPN_JOB_ID_LIST
|
||||
declare -Ag VPN_JOB_NAME_IDX
|
||||
|
||||
declare -g VPN_PID_FILE
|
||||
declare -g VPN_STATUS_FILE
|
||||
declare -g VPN_STATUS_LOCK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_config_make
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_config_make()
|
||||
{
|
||||
local Config_File="$1"
|
||||
local Device="$2"
|
||||
local Target_Config="$3"
|
||||
|
||||
local mng_port=$(( 2330 + ${Device/tun/}))
|
||||
|
||||
log_trace "VPN" "Creating config File: [${Config_File}] Device: [${Device}] Mng_Port: (${mng_port}) Target_Config: [${Target_Config}]"
|
||||
|
||||
${DEBUG} cp -f ${VPN_TEMPLATE_FILE} ${Config_File}
|
||||
${DEBUG} sed -e "s/TARGET-CFG/${Target_Config}-client.conf/" -e "s/VPN-DEVICE/${Device}/" -e "s/MNG-PORT/${mng_port}/" -i ${Config_File}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_config_make_all
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_config_make_all()
|
||||
{
|
||||
local job_id
|
||||
local config_file
|
||||
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
network_dst_tab_name_lookup "${job_name}"
|
||||
network_dst_tab_get "${dst_id}"
|
||||
|
||||
config_file="${VPN_CONFIG_FILE/DEVICE/${dst_device}}"
|
||||
|
||||
vpn_config_make "${config_file}" "${dst_device}" "${dst_config}"
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_load
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_load()
|
||||
{
|
||||
local job_id=0
|
||||
local job_pid
|
||||
local job_date
|
||||
local job_cmd
|
||||
|
||||
|
||||
log_trace "VPN" "Loading Job tab..."
|
||||
|
||||
while IFS= read -r line
|
||||
do
|
||||
line=${line%%#*}
|
||||
if [[ ! -z "$line" ]]
|
||||
then
|
||||
set ${line}
|
||||
|
||||
job_name="$1"
|
||||
job_pid="$2"
|
||||
job_date="$3 $4"
|
||||
shift; shift; shift; shift
|
||||
job_cmd="$*"
|
||||
|
||||
var_assign VPN_JOB_ID_LIST "${job_id}" INC
|
||||
|
||||
tab_assign VPN_JOB_TAB "${job_id},Name" "${job_name}"
|
||||
tab_assign VPN_JOB_TAB "${job_id},PId" "${job_pid}"
|
||||
tab_assign VPN_JOB_TAB "${job_id},Date" "${job_date}"
|
||||
tab_assign VPN_JOB_TAB "${job_id},Cmd" "${job_cmd}"
|
||||
|
||||
tab_assign VPN_JOB_NAME_IDX "${job_name}" "${job_id}"
|
||||
|
||||
job_id=$(( ${job_id} + 1))
|
||||
fi
|
||||
done <<< ${VPN_STATUS}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_get
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_get()
|
||||
{
|
||||
job_id="$1"
|
||||
|
||||
|
||||
job_name="${VPN_JOB_TAB["${job_id},Name"]}"
|
||||
job_pid="${VPN_JOB_TAB["${job_id},PId"]}"
|
||||
job_date="${VPN_JOB_TAB["${job_id},Date"]}"
|
||||
job_cmd="${VPN_JOB_TAB["${job_id},Cmd"]}"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_save
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_save()
|
||||
{
|
||||
local job_id=0
|
||||
local dst_id
|
||||
local config_file
|
||||
|
||||
|
||||
file_lock ${VPN_STATUS_LOCK} WRITE 9
|
||||
|
||||
>${VPN_STATUS_FILE}
|
||||
echo >>${VPN_STATUS_FILE} '#-------------------------------------------------------------------------------
|
||||
# VPN Status
|
||||
#-------------------------------------------------------------------------------
|
||||
|
||||
VPN_STATUS="
|
||||
#-------------------------------------------------------------------------------
|
||||
# Name PId Date Cmd
|
||||
#-------------------------------------------------------------------------------'
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
echo -e >>${VPN_STATUS_FILE} "${job_name}\t${job_pid}\t${job_date}\t${job_cmd}"
|
||||
done
|
||||
|
||||
echo >>${VPN_STATUS_FILE} '"'
|
||||
|
||||
file_unlock 9
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_init
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_init()
|
||||
{
|
||||
local job_id=0
|
||||
local dst_id
|
||||
local config_file
|
||||
|
||||
|
||||
for dst_id in ${NETWORK_DST_ID_LIST}
|
||||
do
|
||||
network_dst_tab_get ${dst_id}
|
||||
|
||||
if [[ "${dst_type}" == "2" ]] && [[ "${dst_config}" != "" ]]
|
||||
then
|
||||
config_file="${VPN_CONFIG_FILE/DEVICE/${dst_device}}"
|
||||
|
||||
var_assign VPN_JOB_ID_LIST "${job_id}" INC
|
||||
|
||||
tab_assign VPN_JOB_TAB "${job_id},Name" "${dst_name}"
|
||||
tab_assign VPN_JOB_TAB "${job_id},PId" "0"
|
||||
tab_assign VPN_JOB_TAB "${job_id},Cmd" "/usr/sbin/openvpn --config ${config_file} --daemon"
|
||||
tab_assign VPN_JOB_TAB "${job_id},Date" ""
|
||||
|
||||
tab_assign VPN_JOB_NAME_IDX "${dst_name}" "${job_id}"
|
||||
|
||||
# vpn_config_make "${config_file}" "${dst_device}" "${dst_config}"
|
||||
|
||||
log_trace "VPN" "Loading config: Id: [${job_id}] Name: [${dst_name}] Cmd: [${VPN_JOB_TAB["${job_id},Cmd"]}]"
|
||||
|
||||
job_id=$(( ${job_id} + 1))
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_deinit
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_deinit()
|
||||
{
|
||||
local job_id
|
||||
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
if [[ "${job_PId}" -gt 0 ]]
|
||||
then
|
||||
log_info "VPN" "Killing : Id: [${job_id}] Name: [${job_name}] PId: [${job_pid}]..."
|
||||
|
||||
kill -15 ${job_pid}
|
||||
fi
|
||||
done
|
||||
|
||||
log_info "VPN" "Flushing status file..."
|
||||
|
||||
file_lock ${VPN_STATUS_LOCK} WRITE 9
|
||||
|
||||
>${VPN_STATUS_FILE}
|
||||
|
||||
file_unlock 9
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_job_tab_dump
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_job_tab_dump()
|
||||
{
|
||||
echo "VPN_JOB_ID_LIST: [${VPN_JOB_ID_LIST}]"
|
||||
echo
|
||||
|
||||
echo "VPN_JOB_NAME_IDX:"
|
||||
|
||||
for key in "${!VPN_JOB_NAME_IDX[@]}"
|
||||
do
|
||||
echo "[${key}]: [${VPN_JOB_NAME_IDX[${key}]}]"
|
||||
done | sort -n
|
||||
|
||||
echo
|
||||
|
||||
echo "VPN_JOB_TAB:"
|
||||
|
||||
for key in "${!VPN_JOB_TAB[@]}"
|
||||
do
|
||||
echo "[${key}]: [${VPN_JOB_TAB[${key}]}]"
|
||||
done | sort -n
|
||||
|
||||
echo
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_supervisor
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_supervisor()
|
||||
{
|
||||
local job_id
|
||||
local job_pid
|
||||
|
||||
|
||||
log_info "VPN" "Starting Supervisor..."
|
||||
|
||||
|
||||
# Main Loop
|
||||
|
||||
while true
|
||||
do
|
||||
log_info "VPN" "New supervisor loop!"
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
|
||||
${DEBUG} kill -0 "${job_pid}" 2>/dev/null
|
||||
rc=$?
|
||||
|
||||
if [[ ${job_pid} == 0 ]] || [[ $rc != 0 ]]
|
||||
then
|
||||
log_info "VPN" "Restarting Cmd: [${job_cmd}]..."
|
||||
|
||||
eval ${DEBUG} ${job_cmd}
|
||||
|
||||
job_pid="$( ps aux | grep "${job_cmd}" | grep -v grep | head -1 | awk '{print $2}')"
|
||||
|
||||
if [[ "${job_pid}" == "" ]]
|
||||
then
|
||||
job_pid=0
|
||||
fi
|
||||
|
||||
tab_assign VPN_JOB_TAB "${job_id},PId" "${job_pid}"
|
||||
tab_assign VPN_JOB_TAB "${job_id},Date" "$(date --rfc-3339=seconds -u)"
|
||||
|
||||
log_info "VPN" "PId: [${VPN_JOB_TAB["${job_id},PId"]}]!"
|
||||
|
||||
network_dst_name_ip_update "${job_name}" "0.0.0.0"
|
||||
fi
|
||||
done
|
||||
|
||||
log_trace "VPN" "Saving VPN tab..."
|
||||
vpn_job_tab_save
|
||||
|
||||
sleep ${VPN_LOOP_DELAY}
|
||||
|
||||
log_trace "VPN" "Refreshing DNS entries..."
|
||||
network_dst_address_refresh_all
|
||||
|
||||
network_reinit
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_kill_jobs
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_jobs_kill()
|
||||
{
|
||||
local job_id
|
||||
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
${DEBUG} kill -0 "${job_pid}" 2>/dev/null
|
||||
rc=$?
|
||||
|
||||
if [[ ${job_pid} != 0 ]] && [[ $rc == 0 ]]
|
||||
then
|
||||
log_info "VPN" "Killing Job Id: [${job_id}] Job_PId: [${job_pid}] Cmd: [${job_cmd}]..."
|
||||
|
||||
kill -15 "${job_pid}"
|
||||
fi
|
||||
done
|
||||
|
||||
log_trace "VPN" "Saving VPN tab..."
|
||||
vpn_job_tab_save
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_init
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_init()
|
||||
{
|
||||
network_init
|
||||
|
||||
file_dir_init ${VPN_STATUS_LOCK} root apache
|
||||
|
||||
file_lock ${VPN_STATUS_LOCK} READ 9
|
||||
file_dir_init ${VPN_STATUS_FILE} root apache
|
||||
file_unlock 9
|
||||
|
||||
if [[ -s "${VPN_STATUS_FILE}" ]]
|
||||
then
|
||||
file_lock ${VPN_STATUS_LOCK} READ 9
|
||||
|
||||
. "${VPN_STATUS_FILE}"
|
||||
|
||||
file_unlock 9
|
||||
|
||||
vpn_job_tab_load
|
||||
else
|
||||
vpn_job_tab_init
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_deinit
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_deinit()
|
||||
{
|
||||
network_deinit
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_start
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_start()
|
||||
{
|
||||
local daemon_pid
|
||||
|
||||
|
||||
log_info "VPN" "Starting VPN..."
|
||||
|
||||
if [[ -s ${VPN_PID_FILE} ]]
|
||||
then
|
||||
daemon_pid=$( cat ${VPN_PID_FILE})
|
||||
else
|
||||
daemon_pid=0
|
||||
fi
|
||||
|
||||
${DEBUG} kill -0 "${daemon_pid}" 2>/dev/null
|
||||
rc=$?
|
||||
|
||||
if [[ "${daemon_pid}" == "0" ]] || [[ $rc != 0 ]]
|
||||
then
|
||||
vpn_config_make_all
|
||||
|
||||
vpn_supervisor &
|
||||
daemon_pid=$!
|
||||
|
||||
log_info "VPN" "Daemon started, PId: [${daemon_pid}]"
|
||||
|
||||
echo >${VPN_PID_FILE} "${daemon_pid}"
|
||||
else
|
||||
log_info "VPN" "Daemon already running PId: [${daemon_pid}]"
|
||||
fi
|
||||
|
||||
log_info "VPN" "VPN started!"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_stop
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_stop()
|
||||
{
|
||||
local daemon_pid
|
||||
|
||||
|
||||
log_info "VPN" "Stoping VPN..."
|
||||
|
||||
if [[ -s ${VPN_PID_FILE} ]]
|
||||
then
|
||||
daemon_pid=$( cat ${VPN_PID_FILE})
|
||||
else
|
||||
daemon_pid=0
|
||||
fi
|
||||
|
||||
${DEBUG} kill -0 "${daemon_pid}" 2>/dev/null
|
||||
rc=$?
|
||||
|
||||
if [[ "${daemon_pid}" == "0" ]] || [[ $rc != 0 ]]
|
||||
then
|
||||
log_info "VPN" "Daemon already stoped!"
|
||||
else
|
||||
log_info "VPN" "Stoping daemon, PId: [${daemon_pid}]..."
|
||||
|
||||
kill -15 ${daemon_pid}
|
||||
fi
|
||||
|
||||
>${VPN_PID_FILE}
|
||||
|
||||
vpn_jobs_kill
|
||||
|
||||
vpn_job_tab_deinit
|
||||
|
||||
log_info "VPN" "VPN stoped!"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
# vpn_status
|
||||
#--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
vpn_status()
|
||||
{
|
||||
local daemon_pid
|
||||
local job_id
|
||||
|
||||
|
||||
if [[ -s ${VPN_PID_FILE} ]]
|
||||
then
|
||||
daemon_pid=$( cat ${VPN_PID_FILE})
|
||||
echo "Daemon PId: (${daemon_pid})"
|
||||
else
|
||||
daemon_pid=""
|
||||
echo "Daemon not running"
|
||||
fi
|
||||
|
||||
echo "Number of VPN Jobs: (${#VPN_JOB_NAME_IDX[@]})"
|
||||
|
||||
echo -e "Id | Name | Status | PId | Date | IP | Command"
|
||||
echo "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------"
|
||||
|
||||
for job_id in ${VPN_JOB_ID_LIST}
|
||||
do
|
||||
vpn_job_tab_get "${job_id}"
|
||||
|
||||
${DEBUG} kill -0 "${job_pid}" 2>/dev/null
|
||||
rc=$?
|
||||
|
||||
if [[ "${job_pid}" == "0" ]] || [[ $rc != 0 ]]
|
||||
then
|
||||
job_status="Down"
|
||||
else
|
||||
job_status="Up"
|
||||
fi
|
||||
|
||||
network_dst_tab_name_lookup "${job_name}"
|
||||
network_dst_tab_get "${dst_id}"
|
||||
|
||||
printf "%-*s | %-*s | %-*s | %-*s | %-*s | %-*s | %-*s\n" 8 "${job_id}" 24 "${job_name}" 8 "${job_status}" 8 "${job_pid}" 32 "${job_date}" 15 "${dst_ip}" 8 "${job_cmd}"
|
||||
done
|
||||
}
|
||||
Reference in New Issue
Block a user