#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#
# Initial script for Linux UBLinux
# This script are launching before starting init from initrd script
# Current dir allways must be set to root (/)
# All system path must be relative, except initrd dirs

ENABLED=yes
[[ ${ENABLED} == "yes" ]] || exit 0
DEBUGMODE=no

PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin

[[ -d /usr/lib/ublinux ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
debug_mode "$0" "$@"

SYSCONF="${ROOTFS}${SYSCONF}"
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/network; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null


set_hostname(){
    local SET_HOSTNAME=$1
    local SET_DOMAIN=$2
    # Удалить предыдущее имя хоста
    OLD_HOSTNAME=$(tail -1 ${ROOTFS}/etc/hostname 2>/dev/null); OLD_HOSTNAME=${OLD_HOSTNAME%%.*}
    [[ -n ${OLD_HOSTNAME} ]] && sed -E -e "s/\s${OLD_HOSTNAME}(\s|$)/ /g" -e "s/\s${OLD_HOSTNAME}(\s|$)/ /g" -e "s/\s${OLD_HOSTNAME}\.[-0-9a-zA-Z.]*(\s|$)/ /g" -e "/^\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s*$/d" -i ${ROOTFS}/etc/hosts

    # Если нет новой строки, то вставить
    tail -c1 -- ${ROOTFS}/etc/hosts 2>/dev/null| grep -qx $'\n' || echo >> ${ROOTFS}/etc/hosts

    HOSTS_1="127.0.0.1  sb-ssl.l.google.com safebrowsing.clients.google.com safebrowsing.cache.l.google.com"
    grep -q "^\s*${HOSTS_1}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_1}" >> ${ROOTFS}/etc/hosts
    HOSTS_2="127.0.0.1  ${SET_HOSTNAME%%.*}"
    grep -q "^\s*${HOSTS_2}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_2}" >> ${ROOTFS}/etc/hosts

    echo "${SET_HOSTNAME}" > ${ROOTFS}/etc/hostname
    
    if [[ -n ${SET_DOMAIN} ]]; then
	HOSTS_3="127.0.0.1    ${SET_HOSTNAME}"
	grep -q "^\s*${HOSTS_3}\s*$" ${ROOTFS}/etc/hosts || echo "${HOSTS_3}" >> ${ROOTFS}/etc/hosts

	## Указать доменных пользователей AccountsService, что-бы были видны для выбора логина в DM
	ls -d ${ROOTFS}/home/*@*/ 2>/dev/null | xargs -ri basename {} | xargs -ri touch ${ROOTFS}/var/lib/AccountsService/users/{}
	## Домен для сервера dhcpd
	if [[ -f ${ROOTFS}/etc/dhcpd.conf ]]; then
	    sed s/"option domain-name .*"/"option domain-name \"${SET_DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf
	    sed s/"option nis-domain .*"/"option nis-domain \"${SET_DOMAIN}\";"/g -i ${ROOTFS}/etc/dhcpd.conf
	fi
	## Имя хоста записать в конфиг с суфиксом домена
	[[ -f ${ROOTFS}/etc/ublinux/system ]] && { grep -q "^\s*HOSTNAME=${SET_HOSTNAME}\s*$" ${ROOTFS}/etc/ublinux/system || sed "s/^\s*HOSTNAME=.*/HOSTNAME=${SET_HOSTNAME}/g" -i ${ROOTFS}/etc/ublinux/system; }
    fi
}

set_hostname_live(){
    local SET_HOSTNAME=$1
    local SET_DOMAIN=$2
    hostname "${SET_HOSTNAME}"
    hostnamectl set-hostname "${SET_HOSTNAME}"
    ## Если меняется имя хоста в запущенных X, то новое имя добавляем в xauth
    who | grep "(:[0-9.]*)$" | cut -d' ' -f1 | xargs -ri su {} -c "xauth list | sed 's|^.*/|su {} -c \\\\\"xauth add ${SET_HOSTNAME}/|;s|$|\\\\\"|'" | xargs -ri sh -c '{}'
    # Если указан задан домен в имени хоста и не соответствует DOMAIN, то задаём переменную DOMAIN=
    #[[ ${DOMAIN} != ${SET_DOMAIN} ]] && ubconfig --noexecute set network DOMAIN="${SET_DOMAIN}"
    # При условии, что в имене хоста домен указан отличный от DOMAIN
    [[ ${HOSTNAME} == ${SET_HOSTNAME} ]] || ubconfig --target global [system] set HOSTNAME="${SET_HOSTNAME}"
}

exec_hostname(){
    DEFAULT_HOSTNAME="ublinux-pc"
    KERNEL_HOSTNAME=$(cmdline_value hostname)
    [[ -n ${KERNEL_HOSTNAME} ]] && HOSTNAME=${KERNEL_HOSTNAME}
    [[ -z ${HOSTNAME} ]] && HOSTNAME="${DEFAULT_HOSTNAME}"
    if [[ -n ${DOMAIN} ]]; then
	SET_HOSTNAME="${HOSTNAME%%.*}.${DOMAIN}"
	SET_DOMAIN=${DOMAIN}
    else
	SET_HOSTNAME=${HOSTNAME}
	# Если в имени хоста указан домен, то зададим на сеанс DOMAIN
	[[ ${HOSTNAME} != ${HOSTNAME#*.} ]] && SET_DOMAIN="${HOSTNAME#*.}"
    fi
    set_hostname "${SET_HOSTNAME}" "${SET_DOMAIN}"
    # Если выполнение в initrd, то пропустить
    [[ -n ${ROOTFS} ]] || set_hostname_live "${SET_HOSTNAME}" "${SET_DOMAIN}"
}

################
##### MAIN #####
################

    exec_hostname $@
