#!/bin/sh
### BEGIN INIT INFO
# Provides:          hds-ssh
# Required-Start:
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Parola lui root la prima pornire si drepturile cheilor SSH
### END INIT INFO
# Copyright (C) 2026 moneasoftware.com (Monea Eduard) & hdsatelit.com (HD Satelit)
# SPDX-License-Identifier: GPL-2.0-only
#
# Porneste inaintea lui dropbear (S09, dropbear e S10):
# - pune drepturile pe care dropbear le cere pentru cheile lui root (/home/root/.ssh 0700, authorized_keys 0600, ale lui
#   root); cu drepturi mai largi dropbear refuza cheile si intrarea ar merge numai cu parola;
# - la prima pornire cheama `hds-ssh-parola prima` in fundal: `openssl rand` asteapta generatorul nucleului, care dupa
#   un flash (fara samanta salvata) se poate initializa dupa cateva secunde, iar enigma2 porneste abia dupa rc3.
#   Pana la parola, root intra numai cu o cheie (in imagine parola e `*`);
# - tot numai la prima pornire dupa flash, `hds-ssh-stick prima` in fundal: cheile publice din dosarul hdsatelit/ssh de
#   pe stickul de flash (acolo urca-pe-stick-016.sh pune cheia calculatorului) intra in authorized_keys, o singura data
#   (semnul /etc/hdsatelit-ssh/stick-citit); dupa aceea cheile noi intra numai din ecranul Acces SSH sau din web.
# - Telnet (portul 23, ca la celelalte imagini): `busybox inetd /etc/hds-telnet-inetd.conf`, cu programul de logare
#   hds-telnet-poarta: din casa root intra direct cand „Fara parola in reteaua locala” e pornita, altfel cu parola; din
#   afara casei legatura se inchide. `hds-ssh telnet` il porneste numai pe el (la instalarea pachetului din feed);
# - o singura data dupa actualizarea pachetului (semnul /etc/hdsatelit-ssh/regula-implicita): regula „Fara parola in
#   reteaua locala” ramasa exact cea veche din pachet (oprita, nealeasa de om) devine cea noua, pornita; o regula aleasa
#   de om ramane cum a lasat-o.
# Parola nu trece niciodata prin acest script.

PAROLA=/usr/sbin/hds-ssh-parola
STICK=/usr/sbin/hds-ssh-stick
SSH=/home/root/.ssh
REGULA=/etc/security/hds-ssh-retea-locala.conf
REGULA_NOUA=/usr/share/hdsatelit-ssh/hds-ssh-retea-locala.conf
SEMN_REGULA=/etc/hdsatelit-ssh/regula-implicita
INETD_CONF=/etc/hds-telnet-inetd.conf
INETD_PID=/var/run/hds-telnet-inetd.pid

# regula din pachetele de pana la r2, oprita; numai aceasta, octet cu octet, se inlocuieste
regula_veche() {
	printf '%s\n' "# „Fără parolă în rețeaua locală” (Setări > Rețea & Conexiuni > Acces SSH): OPRITĂ." \
		"# Fisierul il scrie ecranul „Acces SSH” (Components/HdsAccesSsh.py); pam_access il citeste la fiecare logare prin" \
		"# dropbear (/etc/pam.d/dropbear). Numai o regula „-” care se potriveste lasa root sa intre fara parola; regula de mai jos" \
		"# se potriveste cu oricine si trimite la verificarea parolei." \
		"+ : ALL : ALL"
}

regula_implicita() {
	[ -f "$SEMN_REGULA" ] && return 0
	if [ -f "$REGULA_NOUA" ] && regula_veche | cmp -s - "$REGULA"; then
		cp -f "$REGULA_NOUA" "$REGULA.nou" && chmod 644 "$REGULA.nou" && mv -f "$REGULA.nou" "$REGULA"
	fi
	mkdir -p /etc/hdsatelit-ssh && : > "$SEMN_REGULA"
}

telnet_porneste() {
	[ -f "$INETD_CONF" ] && [ -x /usr/sbin/hds-telnet-poarta ] || return 0
	if [ -f "$INETD_PID" ] && kill -0 "$(cat "$INETD_PID" 2>/dev/null)" 2>/dev/null; then
		return 0
	fi
	# in prim-plan (-f), pus in fundal de noi: pidul e chiar al lui, fara asteptare la pornirea receptorului
	busybox inetd -f "$INETD_CONF" < /dev/null > /dev/null 2>&1 &
	echo $! > "$INETD_PID"
}

case "$1" in
telnet)
	telnet_porneste
	;;
start|"")
	regula_implicita
	telnet_porneste
	if [ -d "$SSH" ]; then
		chown root:root "$SSH" 2>/dev/null
		chmod 700 "$SSH"
		if [ -f "$SSH/authorized_keys" ]; then
			chown root:root "$SSH/authorized_keys" 2>/dev/null
			chmod 600 "$SSH/authorized_keys"
		fi
	fi
	# zavorul lui hds-ssh-parola fara flock (un dosar) ramas dupa o cadere de curent; la pornire nu-l tine nimeni
	rmdir /etc/hdsatelit-ssh/.zavor.d 2>/dev/null
	# prima pornire dupa flash: /etc e nou, deci nici parola, nici semnul stickului
	if [ -x "$STICK" ] && [ ! -f /etc/hdsatelit-ssh/facuta ] && [ ! -f /etc/hdsatelit-ssh/stick-citit ]; then
		nice -n 10 "$STICK" prima < /dev/null > /dev/null 2>&1 &
	fi
	if [ -x "$PAROLA" ] && [ ! -f /etc/hdsatelit-ssh/facuta ]; then
		HDS_SSH_LA_PORNIRE=1 nice -n 10 "$PAROLA" prima < /dev/null > /dev/null 2>&1 &
	fi
	;;
stop|restart|force-reload|status)
	;;
*)
	echo "folosire: $0 start" >&2
	exit 1
	;;
esac
exit 0
