Загрузить файлы в «/»
This commit is contained in:
parent
a891b6fd28
commit
06f5beccfc
1 changed files with 109 additions and 5 deletions
|
|
@ -737,13 +737,66 @@ in
|
|||
nvidia.acceptLicense = true;
|
||||
};
|
||||
nix.settings = {
|
||||
extra-substituters = [ "http://nixos.builds.node" ];
|
||||
trusted-public-keys = [ "nixos.builds.node:E/XNkcdzB0EyTyEJuOTXJH8qynxgCfQ87JHkbD88uF8=" ];
|
||||
# Локальный кэш идёт первым — большинство пакетов уже собраны на build-ноде
|
||||
substituters = [
|
||||
"http://nixos.builds.node"
|
||||
"https://cache.nixos.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"nixos.builds.node:E/XNkcdzB0EyTyEJuOTXJH8qynxgCfQ87JHkbD88uF8="
|
||||
"cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY="
|
||||
];
|
||||
trusted-substituters = [ "http://nixos.builds.node" ];
|
||||
auto-optimise-store = true;
|
||||
# Если build-нода временно недоступна — переходим к cache.nixos.org, не зависаем
|
||||
connect-timeout = 5;
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
# На дисках 50 GiB автоматически запускать GC при нехватке места
|
||||
min-free = 2147483648; # 2 GiB — порог запуска GC
|
||||
max-free = 5368709120; # 5 GiB — цель освобождения
|
||||
};
|
||||
nix.extraOptions = ''
|
||||
experimental-features = nix-command flakes
|
||||
'';
|
||||
nix.gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
randomizedDelaySec = "45min"; # машины не запускают GC одновременно
|
||||
options = "--delete-older-than 14d";
|
||||
};
|
||||
# Хранить не более 5 поколений в меню GRUB
|
||||
boot.loader.grub.configurationLimit = 5;
|
||||
# Периодический TRIM для SSD (безопасен и на HDD — просто no-op)
|
||||
services.fstrim.enable = true;
|
||||
# nix-daemon стартует только после Yggdrasil, иначе nixos.builds.node недостижим
|
||||
systemd.services.nix-daemon = {
|
||||
after = [ "yggdrasil.service" ];
|
||||
wants = [ "yggdrasil.service" ];
|
||||
};
|
||||
# Уникальный hostname на основе последних 6 цифр MAC-адреса основного интерфейса.
|
||||
# networking.hostName = "nixos" остаётся fallback-значением в /etc/hostname;
|
||||
# сервис перекрывает его transient-именем при каждой загрузке.
|
||||
systemd.services.hostname-from-mac = {
|
||||
description = "Set unique hostname from primary NIC MAC address";
|
||||
wantedBy = [ "network-pre.target" ];
|
||||
before = [ "network-pre.target" ];
|
||||
after = [ "systemd-udev-settle.service" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
RemainAfterExit = true;
|
||||
};
|
||||
script = ''
|
||||
mac=$(${pkgs.iproute2}/bin/ip link show \
|
||||
| grep -v LOOPBACK \
|
||||
| grep -oE '([0-9a-f]{2}:){5}[0-9a-f]{2}' \
|
||||
| head -1 \
|
||||
| tr -d ':')
|
||||
if [ -n "$mac" ]; then
|
||||
${pkgs.systemd}/bin/hostnamectl set-hostname --transient "nixos-''${mac: -6}"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
# Директория для хранения данных о физическом расположении компьютера
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/lib/place 0755 student users -"
|
||||
];
|
||||
|
||||
##### НАСТРОЙКИ ГРАФИКИ И РАБОЧЕГО СТОЛА ######
|
||||
hardware.graphics = {
|
||||
|
|
@ -871,6 +924,57 @@ in
|
|||
tree
|
||||
wget
|
||||
git
|
||||
yad
|
||||
# Утилита фиксации физического расположения компьютера в аудитории.
|
||||
# Использование: place [АУДИТОРИЯ] (например: place А-101)
|
||||
# Запись: /var/lib/place/location (JSON, доступен root по SSH)
|
||||
# При запуске от root через SSH автоматически подключается к X-сессии student на :0
|
||||
(pkgs.writeShellApplication {
|
||||
name = "place";
|
||||
runtimeInputs = [ yad coreutils util-linux ];
|
||||
text = ''
|
||||
ROOM_ARG="''${1:-}"
|
||||
PLACE_FILE="/var/lib/place/location"
|
||||
|
||||
# Когда запускается от root по SSH — показать диалог на локальном X :0
|
||||
if [ -z "''${DISPLAY:-}" ]; then
|
||||
export DISPLAY=":0"
|
||||
export XAUTHORITY="/home/student/.Xauthority"
|
||||
fi
|
||||
|
||||
if ! result=$(yad \
|
||||
--title="Место компьютера" \
|
||||
--text="Зафиксируйте расположение этого компьютера в аудитории.\nДанные сохраняются в /var/lib/place/location." \
|
||||
--form \
|
||||
--field="Аудитория" \
|
||||
--field="Ряд:NUM" \
|
||||
--field="Место:NUM" \
|
||||
--button="Сохранить:0" \
|
||||
--button="Отмена:1" \
|
||||
--width=340 \
|
||||
-- "''${ROOM_ARG}" 1 1 \
|
||||
2>/dev/null); then
|
||||
exit 0 # Нажата «Отмена» — без ошибки
|
||||
fi
|
||||
|
||||
room=$(printf '%s' "''${result}" | cut -d'|' -f1)
|
||||
row=$(printf '%s' "''${result}" | cut -d'|' -f2 | cut -d'.' -f1)
|
||||
seat=$(printf '%s' "''${result}" | cut -d'|' -f3 | cut -d'.' -f1)
|
||||
|
||||
if [ -z "''${room}" ]; then
|
||||
echo "Ошибка: поле «Аудитория» не заполнено" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "$(dirname "''${PLACE_FILE}")"
|
||||
printf '{"room":"%s","row":%s,"seat":%s,"host":"%s","at":"%s"}\n' \
|
||||
"''${room}" "''${row}" "''${seat}" "$(hostname)" "$(date -Iseconds)" \
|
||||
> "''${PLACE_FILE}"
|
||||
|
||||
echo "Сохранено: аудитория ''${room}, ряд ''${row}, место ''${seat}"
|
||||
echo "Файл: ''${PLACE_FILE}"
|
||||
'';
|
||||
})
|
||||
];
|
||||
|
||||
# удаленный доступ в пределах нашей сети
|
||||
|
|
|
|||
Loading…
Reference in a new issue