158 lines
7.3 KiB
Python
Executable File
158 lines
7.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import subprocess
|
|
import os
|
|
import sys
|
|
import argparse
|
|
|
|
# HINWEIS: Dieses Skript ist für die Ausführung INNERHALB des Containers gedacht.
|
|
|
|
def run_command(command_str, description, input_str=None):
|
|
"""Führt einen Shell-Befehl als String aus und prüft auf Fehler."""
|
|
print(f"\n--- {description} ---")
|
|
try:
|
|
process = subprocess.run(
|
|
command_str,
|
|
check=True,
|
|
shell=True,
|
|
text=True,
|
|
input=input_str,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE
|
|
)
|
|
print(f"--- ERFOLG: {description} ---")
|
|
if process.stdout:
|
|
print(f"STDOUT:\n{process.stdout}")
|
|
if process.stderr:
|
|
print(f"STDERR:\n{process.stderr}", file=sys.stderr)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"FEHLER bei '{description}': Befehl '{command_str}' gab den Exit-Code {e.returncode} zurück", file=sys.stderr)
|
|
if e.stdout:
|
|
print(f"STDOUT:\n{e.stdout}", file=sys.stderr)
|
|
if e.stderr:
|
|
print(f"STDERR:\n{e.stderr}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
def main():
|
|
"""Hauptfunktion des Skripts."""
|
|
if os.geteuid() != 0:
|
|
print("FEHLER: Dieses Skript muss als root im Container ausgeführt werden.", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
parser = argparse.ArgumentParser(description="Konfiguriert einen neuen Container.")
|
|
parser.add_argument("password", help="Das gewünschte root-Passwort.")
|
|
parser.add_argument("hostname", help="Der Hostname für diesen Container.")
|
|
parser.add_argument("distro", help="Die Distribution des Containers (z.B. 'arch', 'ubuntu').")
|
|
parser.add_argument("ssh_key", nargs='?', default="", help="Der öffentliche SSH-Schlüssel für den Benutzer 'jonnybravo'.")
|
|
args = parser.parse_args()
|
|
|
|
root_password = args.password
|
|
hostname = args.hostname
|
|
distro = args.distro
|
|
password_input = f"{root_password}\n{root_password}\n"
|
|
|
|
# --- Distributionsspezifische Konfiguration ---
|
|
distro_configs = {
|
|
"arch": {
|
|
"update": "pacman -Syu --noconfirm",
|
|
"install": "pacman -S --noconfirm",
|
|
"ssh_package": "openssh",
|
|
"ssh_service": "sshd.service",
|
|
"pre_install_cmds": [
|
|
("Pacman-Schlüsselbund initialisieren", "pacman-key --init"),
|
|
("Pacman-Schlüsselbund füllen", "pacman-key --populate archlinux")
|
|
],
|
|
"user_groups": "users,wheel"
|
|
},
|
|
"ubuntu": {
|
|
"update": "apt-get update && apt-get upgrade -y",
|
|
"install": "apt-get install -y",
|
|
"ssh_package": "openssh-server",
|
|
"ssh_service": "ssh.service",
|
|
"pre_install_cmds": [
|
|
("Locales-Paket installieren", "apt-get install -y locales"),
|
|
("Locales generieren", "echo 'de_DE.UTF-8 UTF-8' > /etc/locale.gen && echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && locale-gen")
|
|
],
|
|
"user_groups": "users,sudo"
|
|
},
|
|
"debian": {
|
|
"update": "apt-get update && apt-get upgrade -y",
|
|
"install": "apt-get install -y",
|
|
"ssh_package": "openssh-server",
|
|
"ssh_service": "ssh.service",
|
|
"pre_install_cmds": [
|
|
("Locales-Paket installieren", "apt-get install -y locales"),
|
|
("Locales generieren", "echo 'de_DE.UTF-8 UTF-8' > /etc/locale.gen && echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen && locale-gen")
|
|
],
|
|
"user_groups": "users,sudo"
|
|
},
|
|
"fedora": {
|
|
"update": "dnf upgrade -y",
|
|
"install": "dnf install -y",
|
|
"ssh_package": "openssh-server",
|
|
"ssh_service": "sshd.service",
|
|
"pre_install_cmds": [],
|
|
"user_groups": "users,wheel"
|
|
}
|
|
}
|
|
|
|
if distro not in distro_configs:
|
|
print(f"FEHLER: Nicht unterstützte Distribution: {distro}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
config = distro_configs[distro]
|
|
print(f"Starte die Konfiguration für Container '{hostname}' mit Distribution '{distro}'...")
|
|
|
|
# --- Allgemeine Konfiguration ---
|
|
run_command("passwd", "Root-Passwort setzen", input_str=password_input)
|
|
run_command(f"echo '{hostname}' > /etc/hostname", "Hostname setzen")
|
|
run_command("ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime", "Zeitzone setzen")
|
|
run_command("echo 'LANG=de_DE.UTF-8' > /etc/locale.conf", "Standardsprache setzen")
|
|
if distro != "fedora": # Fedora hat andere Keyboard-Settings
|
|
run_command("echo 'KEYMAP=de-latin1' > /etc/vconsole.conf", "Tastaturlayout setzen")
|
|
|
|
# --- Distributionsspezifische Befehle ausführen ---
|
|
for description, command in config["pre_install_cmds"]:
|
|
run_command(command, description)
|
|
|
|
run_command(config["update"], "System aktualisieren")
|
|
run_command(f"{config['install']} {config['ssh_package']}", "OpenSSH installieren")
|
|
|
|
# Störende Cloud-Init-Konfiguration entfernen, die Passwort-Auth blockiert
|
|
run_command("rm -f /etc/ssh/sshd_config.d/60-cloudimg-settings.conf", "Entferne Cloud-Image-SSH-Einstellungen", input_str=None)
|
|
|
|
# --- SSH und Benutzerkonfiguration ---
|
|
run_command(f"systemctl enable {config['ssh_service']}", "SSH-Dienst aktivieren")
|
|
run_command("sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config", "Root-Login in sshd_config erlauben")
|
|
run_command("sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config", "Passwort-Authentifizierung in sshd_config erlauben")
|
|
run_command("sed -i 's/^#*LogLevel.*/LogLevel DEBUG3/' /etc/ssh/sshd_config", "SSH LogLevel DEBUG3 setzen")
|
|
run_command(f"systemctl restart {config['ssh_service']}", "SSH-Dienst neustarten")
|
|
|
|
# Benutzer 'jonnybravo' erstellen und sudo-Rechte geben
|
|
wheel_group_equivalent = "wheel" if distro in ["arch", "fedora"] else "sudo"
|
|
run_command(f"useradd -m -G {config['user_groups']} -s /bin/bash jonnybravo", "Benutzer 'jonnybravo' hinzufügen")
|
|
run_command("passwd jonnybravo", "Passwort für jonnybravo setzen", input_str=password_input)
|
|
|
|
# SSH-Schlüssel für jonnybravo einrichten
|
|
if args.ssh_key:
|
|
print("--- Richte SSH-Schlüssel für Benutzer 'jonnybravo' ein ---")
|
|
ssh_dir = "/home/jonnybravo/.ssh"
|
|
authorized_keys_file = os.path.join(ssh_dir, "authorized_keys")
|
|
run_command(f"mkdir -p {ssh_dir}", f"Erstelle Verzeichnis {ssh_dir}")
|
|
run_command(f"echo '{args.ssh_key}' > {authorized_keys_file}", f"Schreibe Schlüssel nach {authorized_keys_file}")
|
|
run_command(f"chown -R jonnybravo:jonnybravo {ssh_dir}", f"Setze Eigentümer für {ssh_dir}")
|
|
run_command(f"chmod 700 {ssh_dir}", f"Setze Berechtigungen für {ssh_dir}")
|
|
run_command(f"chmod 600 {authorized_keys_file}", f"Setze Berechtigungen für {authorized_keys_file}")
|
|
|
|
if wheel_group_equivalent == "wheel":
|
|
run_command("echo '%wheel ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/wheel_nopasswd", "Passwortloses sudo für Gruppe 'wheel' aktivieren")
|
|
else: # sudo group
|
|
run_command("echo '%sudo ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/sudo_nopasswd", "Passwortloses sudo für Gruppe 'sudo' aktivieren")
|
|
|
|
|
|
print(f"\n=== Container '{hostname}' erfolgreich konfiguriert! ===")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|