You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hestiacp/bin/v-update-sys-ip

191 lines
5.7 KiB

#!/bin/bash
# info: update system IP
# options: NONE
#
# example: v-update-sys-ip
# # Intended for internal usage
#
# This function scans configured IP in the system and register them with Hestia
# internal database. This call is intended for use on vps servers, where IP is
# set by hypervisor.
#----------------------------------------------------------#
# Variables & Functions #
#----------------------------------------------------------#
# Includes
# shellcheck source=/etc/hestiacp/hestia.conf
source /etc/hestiacp/hestia.conf
# shellcheck source=/usr/local/hestia/func/main.sh
source $HESTIA/func/main.sh
# shellcheck source=/usr/local/hestia/func/ip.sh
source $HESTIA/func/ip.sh
# shellcheck source=/usr/local/hestia/func/domain.sh
source $HESTIA/func/domain.sh
# load config file
source_conf "$HESTIA/conf/hestia.conf"
#----------------------------------------------------------#
# Verifications #
#----------------------------------------------------------#
# Perform verification if read-only mode is enabled
check_hestia_demo_mode
#----------------------------------------------------------#
# Action #
#----------------------------------------------------------#
confd=$(get_conf_d_name "$WEB_SYSTEM")
pconfd=$(get_conf_d_name "$PROXY_SYSTEM")
# Listing system IP addresses
nics="$(ip -d -j link show | jq -r '.[] | if .link_type == "loopback" then empty else .ifname end')"
for nic in $nics; do
nic_type="$(ip -d -j link show "$nic" | jq -r '.[].linkinfo.info_kind')"
if [ "$nic_type" = "bridge" ]; then
break
fi
nic_ipv4s="$(ip -4 -d -j addr show "$nic" | jq -r '.[] | select(length > 0) | .addr_info[] | if .scope == "global" then .local else empty end')"
if [ -z "$ips" ]; then
ips="$nic_ipv4s"
else
ips="$ips $nic_ipv4s"
fi
done
v_ips="$(ls $HESTIA/data/ips/)"
ip_num="$(echo "$ips" | wc -w)"
v_ip_num="$(echo "$v_ips" | wc -w)"
# Checking primary IP change
if [ "$ip_num" -eq "1" ] && [ "$v_ip_num" -eq "1" ]; then
if [ -n "$v_ips" ] && [ "$ips" != "$v_ips" ]; then
new_ip="$ips"
old_ip="$v_ips"
fi
fi
# Updating configs
if [ -n "$old_ip" ]; then
mv $HESTIA/data/ips/$old_ip $HESTIA/data/ips/$new_ip
# Generating timestamp
new_timestamp
# Updating IP's values
ip="$new_ip"
interface="$(ip -d -j addr show | jq --arg IP "$ip" -r '.[] | if .addr_info[].local == $IP then .ifname else empty end')"
prefixlen="$(ip -d -j addr show | jq --arg IP "$ip" -r '.[].addr_info[] | if .local == $IP then .prefixlen else empty end')"
netmask="$(convert_cidr "$prefixlen")"
update_ip_value '$INTERFACE' "$interface"
update_ip_value '$NETMASK' "$netmask"
update_ip_value '$TIME' "$time"
update_ip_value '$DATE' "$date"
# Updating PROXY
if [ -n "$PROXY_SYSTEM" ]; then
cd /etc/$PROXY_SYSTEM/$pconfd
if [ -e "$old_ip.conf" ]; then
mv $old_ip.conf $new_ip.conf
sed -i "s/$old_ip/$new_ip/g" $new_ip.conf
fi
fi
# Updating WEB
if [ -n "$WEB_SYSTEM" ]; then
cd /etc/$WEB_SYSTEM/$confd
if [ -e "$old_ip.conf" ]; then
mv $old_ip.conf $new_ip.conf
sed -i "s/$old_ip/$new_ip/g" $new_ip.conf
fi
for user in $($BIN/v-list-sys-users plain); do
sed -i "s/$old_ip/$new_ip/g" $HESTIA/data/users/$user/web.conf
$BIN/v-rebuild-web-domains "$user" no
done
if [ -e "/etc/apache2/mods-available/remoteip.conf" ]; then
sed -i "s/$old_ip/$new_ip/g" /etc/apache2/mods-available/remoteip.conf
fi
if [ -e "/etc/apache2/mods-enabled/rpaf.conf" ]; then
sed -i "s/$old_ip/$new_ip/g" /etc/apache2/mods-enabled/rpaf.conf
fi
$BIN/v-restart-proxy
$BIN/v-restart-web
fi
# Updating MAIL
if [ -n "$IMAP_SYSTEM" ]; then
for user in $($BIN/v-list-sys-users plain); do
$BIN/v-rebuild-mail-domains "$user" no
done
$BIN/v-restart-mail
fi
# Updating DNS
if [ -n "$DNS_SYSTEM" ]; then
for user in $($BIN/v-list-sys-users plain); do
sed -i "s/$old_ip/$new_ip/g" $HESTIA/data/users/$user/dns.conf
sed -i "s/$old_ip/$new_ip/g" $HESTIA/data/users/$user/dns/*.conf
$BIN/v-rebuild-dns-domains "$user" no
done
$BIN/v-restart-dns
fi
# Updating FTP
if [ -n "$FTP_SYSTEM" ] && [ "$FTP_SYSTEM" = 'vsftpd' ]; then
ftp_conf="$(find /etc/ -maxdepth 2 -name $FTP_SYSTEM.conf)"
if [ -n "$ftp_conf" ]; then
sed -i "s/$old_ip/$new_ip/g" "$ftp_conf"
$BIN/v-restart-ftp
fi
fi
# Updating firewall
if [ -n "$FIREWALL_SYSTEM" ]; then
sed -i "s/$old_ip/$new_ip/g" $HESTIA/data/firewall/*.conf
$BIN/v-update-firewall
fi
fi
# Adding system IP
for ip in $ips; do
check_ip="$(ip addr list | grep -w "$ip")"
if [ ! -e "$HESTIA/data/ips/$ip" ] && [ -n "$check_ip" ]; then
interface="$(ip -d -j addr show | jq --arg IP "$ip" -r '.[] | if .addr_info[].local == $IP then .ifname else empty end')"
prefixlen="$(ip -d -j addr show | jq --arg IP "$ip" -r '.[].addr_info[] | if .local == $IP then .prefixlen else empty end')"
netmask="$(convert_cidr "$prefixlen")"
$BIN/v-add-sys-ip "$ip" "$netmask" "$interface"
elif [ -e "/etc/nginx/conf.d/$ip.conf" ]; then
process_http2_directive "/etc/nginx/conf.d/$ip.conf"
fi
done
# Updating NAT
if [ -e $HESTIA/conf/nopublickip ]; then
ip="$(ls -t $HESTIA/data/ips/ | head -n1)"
$BIN/v-change-sys-ip-nat "$ip" "$ip"
else
pub_ipv4="$(curl -fsLm5 --retry 2 --ipv4 -H "Simple-Hestiacp: yes" https://hestiaip.brepo.ru/)"
if [ ! -e "$HESTIA/data/ips/$pub_ipv4" ]; then
if [ -z "$(grep -R "$pub_ipv4" $HESTIA/data/ips/)" ]; then
ip="$(ls -t $HESTIA/data/ips/ | head -n1)"
$BIN/v-change-sys-ip-nat "$ip" "$pub_ipv4"
fi
fi
fi
# Updating IP usage counters
$BIN/v-update-sys-ip-counters
#----------------------------------------------------------#
# Hestia #
#----------------------------------------------------------#
exit