Агент: - ssh: sshd_config(.d), ключи хоста, authorized_keys root и пользователей - system: весь /etc/ufw и /etc/default/ufw, /etc/sysctl.conf, /etc/hosts, свои файлы в /etc/cron.d (пакетные отсекаются через dpkg -S) - certs: /etc/letsencrypt, /root/.acme.sh; xui: сертификаты по путям из базы - docker: daemon.json и логины в registry; telegraf: /etc/default/telegraf - caddy: бинарник бэкапится, если Caddy собран с плагинами - units: свои systemd-юниты с состоянием enabled/active и drop-in *.service.d - etc: изменённые конфиги любых пакетов (dpkg conffiles) и свои файлы в /etc, кроме привязанного к железу и облаку - в манифесте: часовой пояс, swap, вручную поставленные пакеты; версия apt-пакета в строке категории - предупреждения: программы юнитов вне бэкапа, каталоги /opt и /usr/local/bin без категории, контейнеры без compose Restore: - часовой пояс, swap-файл, доустановка вручную поставленных пакетов - свои юниты включаются и запускаются как на старом сервере Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 lines
1.1 KiB
Go
35 lines
1.1 KiB
Go
package sysx
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseDpkgS(t *testing.T) {
|
|
out := "openssh-server: /etc/ssh/sshd_config\n" +
|
|
"diversion by foo from: /usr/bin/caddy\n" +
|
|
"cron, cron-daemon-common: /etc/cron.d/e2scrub_all\n"
|
|
paths := []string{"/etc/ssh/sshd_config", "/etc/cron.d/e2scrub_all", "/etc/cron.d/ban-blacklist"}
|
|
owned := ParseDpkgS(out, paths)
|
|
if !owned["/etc/ssh/sshd_config"] || !owned["/etc/cron.d/e2scrub_all"] || owned["/etc/cron.d/ban-blacklist"] {
|
|
t.Fatalf("owned = %v", owned)
|
|
}
|
|
}
|
|
|
|
func TestModifiedConffiles(t *testing.T) {
|
|
out := " /etc/ssh/sshd_config aaa\n" +
|
|
" /etc/fail2ban/fail2ban.conf bbb\n" +
|
|
" /etc/old.conf ccc obsolete\n" +
|
|
" /etc/missing.conf ddd\n" +
|
|
"\n"
|
|
sums := map[string]string{
|
|
"/etc/ssh/sshd_config": "aaa", // не менялся
|
|
"/etc/fail2ban/fail2ban.conf": "changed", // изменён
|
|
"/etc/old.conf": "x", // obsolete — пропускаем
|
|
}
|
|
got := modifiedConffiles(out, func(p string) string { return sums[p] })
|
|
if !slices.Equal(got, []string{"/etc/fail2ban/fail2ban.conf"}) {
|
|
t.Fatalf("modified = %v", got)
|
|
}
|
|
}
|