Установка с образа падала на шаге «Компоненты» при первой загрузке (повтор проходил): служба впервые установленного ядра включалась раньше, чем появлялся её unit-файл (systemctl enable bj-server — «Unit file does not exist»); теперь включается, только если unit-файл есть. Java 17: выбор по apt-cache без перевода (на русской системе «Кандидат:» вместо «Candidate:» — ставилась Java 11). Раскладка консоли: toggle без лишнего «grp:» (получалось grp:grp:alt_shift_toggle, Alt+Shift не переключал). Вопрос о постоянном адресе — ответ цифрой
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -282,7 +282,7 @@ func javaPkg(debs []string) string {
|
|||||||
}
|
}
|
||||||
return "default-jre-headless"
|
return "default-jre-headless"
|
||||||
}
|
}
|
||||||
out, err := run("apt-cache", "policy", "openjdk-17-jre-headless")
|
out, err := runEnv(append(os.Environ(), "LC_ALL=C"), "apt-cache", "policy", "openjdk-17-jre-headless") // «Candidate:» — без перевода
|
||||||
if err == nil && strings.Contains(out, "Candidate:") && !strings.Contains(out, "Candidate: (none)") {
|
if err == nil && strings.Contains(out, "Candidate:") && !strings.Contains(out, "Candidate: (none)") {
|
||||||
return "openjdk-17-jre-headless"
|
return "openjdk-17-jre-headless"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,8 +98,9 @@ setup_accounts
|
|||||||
if [ ! -f /var/lib/bj/.bj/network-asked ] && [ -x /usr/local/sbin/bj-network ] && command -v netplan >/dev/null; then
|
if [ ! -f /var/lib/bj/.bj/network-asked ] && [ -x /usr/local/sbin/bj-network ] && command -v netplan >/dev/null; then
|
||||||
mkdir -p /var/lib/bj/.bj && date -Iseconds > /var/lib/bj/.bj/network-asked
|
mkdir -p /var/lib/bj/.bj && date -Iseconds > /var/lib/bj/.bj/network-asked
|
||||||
printf '\n Сейчас адрес сервера: %s\n' "$(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | tr '\n' ' ')"
|
printf '\n Сейчас адрес сервера: %s\n' "$(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | tr '\n' ' ')"
|
||||||
read -t 60 -r -p " Задать постоянный адрес (рекомендуется)? [д/Н]: " ANS < /dev/tty || ANS=""
|
# ответ цифрой: консоль начинает в английской раскладке, «д» без переключения не набрать
|
||||||
case "$ANS" in [дДyY]*) /usr/local/sbin/bj-network < /dev/tty ;; esac
|
read -t 60 -r -p " Задать постоянный адрес (рекомендуется)? 1 — да, Enter — нет: " ANS < /dev/tty || ANS=""
|
||||||
|
case "$ANS" in 1*|[дДyYlL]*) /usr/local/sbin/bj-network < /dev/tty ;; esac
|
||||||
fi
|
fi
|
||||||
clear
|
clear
|
||||||
printf '\n Bridge&Join: установка на сервер\n ────────────────────────────────────────────────────────────\n'
|
printf '\n Bridge&Join: установка на сервер\n ────────────────────────────────────────────────────────────\n'
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ autoinstall:
|
|||||||
keyboard:
|
keyboard:
|
||||||
layout: us,ru
|
layout: us,ru
|
||||||
variant: ","
|
variant: ","
|
||||||
toggle: grp:alt_shift_toggle
|
toggle: alt_shift_toggle # установщик сам допишет «grp:» (с ним получалось «grp:grp:…», переключение не работало)
|
||||||
timezone: Europe/Moscow
|
timezone: Europe/Moscow
|
||||||
identity:
|
identity:
|
||||||
hostname: bj-server
|
hostname: bj-server
|
||||||
|
|||||||
@@ -145,7 +145,9 @@ func InstallStaged(staging string, opt InstallOptions) (res InstallResult) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fail("служба %s: %v", j.c.Unit, err)
|
return fail("служба %s: %v", j.c.Unit, err)
|
||||||
}
|
}
|
||||||
if added || fresh {
|
// модуль впервые на сервере — его службу включить, но только если unit-файл уже есть: при установке
|
||||||
|
// с образа ядро ставится раньше своих служб (их кладёт следующий шаг установщика и включает сам)
|
||||||
|
if added || (fresh && unitInstalled(opt.Root, j.c.Unit)) {
|
||||||
newUnits = append(newUnits, j.c.Unit)
|
newUnits = append(newUnits, j.c.Unit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -201,6 +203,16 @@ func ensureUnit(root string, units fs.FS, unit string) (bool, error) {
|
|||||||
return true, os.WriteFile(dst, b, 0o644)
|
return true, os.WriteFile(dst, b, 0o644)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// unitInstalled — есть ли unit-файл службы (свой или из пакета).
|
||||||
|
func unitInstalled(root, unit string) bool {
|
||||||
|
for _, d := range []string{"/etc/systemd/system", "/lib/systemd/system", "/usr/lib/systemd/system"} {
|
||||||
|
if _, err := os.Stat(filepath.Join(root, d, unit+".service")); err == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func contains(list []string, v string) bool {
|
func contains(list []string, v string) bool {
|
||||||
for _, x := range list {
|
for _, x := range list {
|
||||||
if x == v {
|
if x == v {
|
||||||
|
|||||||
@@ -77,6 +77,14 @@ func TestInstallSplitModuleWithUnit(t *testing.T) {
|
|||||||
t.Fatalf("повторная установка не должна включать службу: %+v", res)
|
t.Fatalf("повторная установка не должна включать службу: %+v", res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Установка ядра с образа: файла службы ещё нет (его кладёт следующий шаг установщика) — включать нечего,
|
||||||
|
// и это не ошибка (иначе systemctl enable падает: «Unit file … does not exist»).
|
||||||
|
root3 := t.TempDir()
|
||||||
|
res = InstallStaged(stageNPR(t, priv, `{"names":["bj-npr"],"new":["bj-npr"]}`), InstallOptions{Root: root3, PubKey: pub})
|
||||||
|
if !res.OK || len(res.Enabled) != 0 {
|
||||||
|
t.Fatalf("без unit-файла служба не включается: %+v", res)
|
||||||
|
}
|
||||||
|
|
||||||
// Установка с образа: unit-файл уже положен (выключенным), файла модуля нет — служба включается.
|
// Установка с образа: unit-файл уже положен (выключенным), файла модуля нет — служба включается.
|
||||||
root2 := t.TempDir()
|
root2 := t.TempDir()
|
||||||
if err := os.MkdirAll(filepath.Join(root2, "/etc/systemd/system"), 0o755); err != nil {
|
if err := os.MkdirAll(filepath.Join(root2, "/etc/systemd/system"), 0o755); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user