This commit is contained in:
Maxim Slipenko 2025-04-13 16:58:15 +03:00
parent 8070112bf2
commit a51a8ab963
12 changed files with 442 additions and 173 deletions

@ -11,7 +11,7 @@
<g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"> <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
<text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text> <text x="33.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
<text x="33.5" y="14">coverage</text> <text x="33.5" y="14">coverage</text>
<text x="86" y="15" fill="#010101" fill-opacity=".3">16.7%</text> <text x="86" y="15" fill="#010101" fill-opacity=".3">15.8%</text>
<text x="86" y="14">16.7%</text> <text x="86" y="14">15.8%</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 926 B

After

Width:  |  Height:  |  Size: 926 B

143
build.go

@ -20,8 +20,10 @@
package main package main
import ( import (
"bytes"
"log/slog" "log/slog"
"os" "os"
"os/exec"
"path/filepath" "path/filepath"
"strings" "strings"
@ -32,6 +34,7 @@ import (
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db" database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils" "gitea.plemya-x.ru/Plemya-x/ALR/internal/osutils"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" "gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
@ -66,9 +69,56 @@ func BuildCmd() *cli.Command {
}, },
}, },
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
wd, err := os.Getwd()
if err != nil {
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
executable, err := os.Executable()
if err != nil {
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
cmd := exec.Command(executable, "_internal-mount", wd)
var stdout bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
wd = stdout.String()
defer func() {
slog.Warn("unmounting...")
cmd := exec.Command(executable, "_internal-umount", wd)
var stdout bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
slog.Error(gotext.Get("Error getting working directory"), "err", err)
os.Exit(1)
}
}()
err = utils.DropCapsToAlrUser()
if err != nil {
slog.Error(gotext.Get("Error dropping capabilities"), "err", err)
os.Exit(1)
}
_, err = os.Stat(wd)
if err != nil {
slog.Error(gotext.Get("Error dropping capabilities"), "err", err)
os.Exit(1)
}
ctx := c.Context ctx := c.Context
cfg := config.New() cfg := config.New()
err := cfg.Load() err = cfg.Load()
if err != nil { if err != nil {
slog.Error(gotext.Get("Error loading config"), "err", err) slog.Error(gotext.Get("Error loading config"), "err", err)
os.Exit(1) os.Exit(1)
@ -84,42 +134,6 @@ func BuildCmd() *cli.Command {
var script string var script string
var packages []string var packages []string
// repository := "default"
// repoDir := cfg.GetPaths().RepoDir
switch {
case c.IsSet("script"):
script = c.String("script")
packages = append(packages, c.String("script-package"))
case c.IsSet("package"):
// TODO: handle multiple packages
packageInput := c.String("package")
arr := strings.Split(packageInput, "/")
var packageSearch string
if len(arr) == 2 {
packageSearch = arr[1]
} else {
packageSearch = arr[0]
}
pkgs, _, _ := rs.FindPkgs(ctx, []string{packageSearch})
pkg, ok := pkgs[packageSearch]
if len(pkg) < 1 || !ok {
slog.Error(gotext.Get("Package not found"))
os.Exit(1)
}
// repository = pkg[0].Repository
if pkg[0].BasePkgName != "" {
// script = filepath.Join(repoDir, repository, pkg[0].BasePkgName, "alr.sh")
packages = append(packages, pkg[0].Name)
}
default:
// script = filepath.Join(repoDir, "alr.sh")
}
// Обнаружение менеджера пакетов // Обнаружение менеджера пакетов
mgr := manager.Detect() mgr := manager.Detect()
@ -139,8 +153,14 @@ func BuildCmd() *cli.Command {
rs, rs,
) )
// Сборка пакета var res *build.BuildResult
res, err := builder.BuildPackageFromScript(
switch {
case c.IsSet("script"):
script = c.String("script")
packages = append(packages, c.String("script-package"))
res, err = builder.BuildPackageFromScript(
ctx, ctx,
&build.BuildPackageFromScriptArgs{ &build.BuildPackageFromScriptArgs{
Script: script, Script: script,
@ -159,11 +179,50 @@ func BuildCmd() *cli.Command {
slog.Error(gotext.Get("Error building package"), "err", err) slog.Error(gotext.Get("Error building package"), "err", err)
os.Exit(1) os.Exit(1)
} }
case c.IsSet("package"):
// TODO: handle multiple packages
packageInput := c.String("package")
// Получение текущей рабочей директории arr := strings.Split(packageInput, "/")
wd, err := os.Getwd() var packageSearch string
if len(arr) == 2 {
packageSearch = arr[1]
} else {
packageSearch = arr[0]
}
pkgs, _, _ := rs.FindPkgs(ctx, []string{packageSearch})
pkg, ok := pkgs[packageSearch]
if len(pkg) < 1 || !ok {
slog.Error(gotext.Get("Package not found"))
os.Exit(1)
}
if pkg[0].BasePkgName != "" {
packages = append(packages, pkg[0].Name)
}
res, err = builder.BuildPackageFromDb(
ctx,
&build.BuildPackageFromDbArgs{
Package: &pkg[0],
Packages: packages,
BuildArgs: build.BuildArgs{
Opts: &types.BuildOpts{
Clean: c.Bool("clean"),
Interactive: c.Bool("interactive"),
},
PkgFormat_: build.GetPkgFormat(mgr),
Info: info,
},
},
)
if err != nil { if err != nil {
slog.Error(gotext.Get("Error getting working directory"), "err", err) slog.Error(gotext.Get("Error building package"), "err", err)
os.Exit(1)
}
default:
slog.Error(gotext.Get("Nothing to build"))
os.Exit(1) os.Exit(1)
} }

@ -17,8 +17,13 @@
package main package main
import ( import (
"fmt"
"log/slog" "log/slog"
"os" "os"
"os/exec"
"os/user"
"path/filepath"
"strings"
"syscall" "syscall"
"github.com/hashicorp/go-hclog" "github.com/hashicorp/go-hclog"
@ -47,10 +52,6 @@ func InternalBuildCmd() *cli.Command {
slog.Error("aa", "err", err) slog.Error("aa", "err", err)
os.Exit(1) os.Exit(1)
} }
slog.Info("",
"uid", os.Getuid(),
"gid", os.Getgid(),
)
cfg := config.New() cfg := config.New()
err = cfg.Load() err = cfg.Load()
if err != nil { if err != nil {
@ -131,3 +132,135 @@ func InternalInstallCmd() *cli.Command {
}, },
} }
} }
func InternalMountCmd() *cli.Command {
return &cli.Command{
Name: "_internal-mount",
HideHelp: true,
Hidden: true,
Action: func(c *cli.Context) error {
sourceDir := c.Args().First()
u, _ := user.Current()
logger.SetupForGoPlugin()
err := syscall.Setuid(0)
if err != nil {
slog.Error("Failed to setuid(0)", "err", err)
os.Exit(1)
}
alrRunDir := "/var/run/alr"
err = os.MkdirAll(alrRunDir, 0o750)
if err != nil {
slog.Error("Error creating /var/run/alr directory", "err", err)
os.Exit(1)
}
_, gid, _ := utils.GetUidGidAlrUser()
// Меняем группу на alr и права
err = os.Chown(alrRunDir, 0, gid) // root:alr
if err != nil {
slog.Error("Failed to chown /var/run/alr", "err", err)
os.Exit(1)
}
// Создаем поддиректорию для bindfs
targetDir := filepath.Join(alrRunDir, fmt.Sprintf("bindfs-%d", os.Getpid()))
err = os.MkdirAll(targetDir, 0o750) // 0750: владелец (root) и группа (alr) имеют доступ
if err != nil {
slog.Error("Error creating bindfs target directory", "err", err)
os.Exit(1)
}
// Устанавливаем владельца и группу (root:alr)
err = os.Chown(targetDir, 0, gid)
if err != nil {
slog.Error("Failed to chown bindfs directory", "err", err)
os.Exit(1)
}
bindfsCmd := exec.Command(
"bindfs",
fmt.Sprintf("--map=%s/alr:@%s/@alr", u.Uid, u.Gid),
sourceDir,
targetDir,
)
bindfsCmd.Stderr = os.Stderr
if err := bindfsCmd.Start(); err != nil {
slog.Error("Error starting bindfs", "err", err)
os.Exit(1)
}
fmt.Print(targetDir)
return nil
},
}
}
func InternalUnmountCmd() *cli.Command {
return &cli.Command{
Name: "_internal-umount",
HideHelp: true,
Hidden: true,
Action: func(c *cli.Context) error {
currentUser, err := user.Current()
if err != nil {
slog.Error("Failed to get current user", "err", err)
os.Exit(1)
}
uid, gid, err := utils.GetUidGidAlrUserString()
if err != nil {
slog.Error("Failed to get alr user info", "err", err)
os.Exit(1)
}
if currentUser.Uid != uid && currentUser.Gid != gid {
slog.Error("Only alr user can unmount these directories")
os.Exit(1)
}
targetDir := c.Args().First()
if targetDir == "" {
slog.Error("No target directory specified")
os.Exit(1)
}
if !strings.HasPrefix(targetDir, "/var/run/alr/") {
slog.Error("Can only unmount directories under /var/run/alr")
os.Exit(1)
}
if _, err := os.Stat(targetDir); os.IsNotExist(err) {
slog.Error("Target directory does not exist", "dir", targetDir)
os.Exit(1)
}
err = syscall.Setuid(0)
if err != nil {
slog.Error("Failed to setuid(0)", "err", err)
os.Exit(1)
}
umountCmd := exec.Command("umount", targetDir)
umountCmd.Stderr = os.Stderr
if err := umountCmd.Run(); err != nil {
slog.Error("Error unmounting directory", "dir", targetDir, "err", err)
os.Exit(1)
}
if err := os.Remove(targetDir); err != nil {
slog.Error("Error removing directory", "dir", targetDir, "err", err)
os.Exit(1)
}
return nil
},
}
}

@ -9,56 +9,64 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: build.go:44 #: build.go:47
msgid "Build a local package" msgid "Build a local package"
msgstr "" msgstr ""
#: build.go:50 #: build.go:53
msgid "Path to the build script" msgid "Path to the build script"
msgstr "" msgstr ""
#: build.go:55 #: build.go:58
msgid "Specify subpackage in script (for multi package script only)" msgid "Specify subpackage in script (for multi package script only)"
msgstr "" msgstr ""
#: build.go:60 #: build.go:63
msgid "Name of the package to build and its repo (example: default/go-bin)" msgid "Name of the package to build and its repo (example: default/go-bin)"
msgstr "" msgstr ""
#: build.go:65 #: build.go:68
msgid "" msgid ""
"Build package from scratch even if there's an already built package available" "Build package from scratch even if there's an already built package available"
msgstr "" msgstr ""
#: build.go:73 #: build.go:74 build.go:79 build.go:89 build.go:103
msgid "Error loading config"
msgstr ""
#: build.go:81
msgid "Error initialization database"
msgstr ""
#: build.go:110
msgid "Package not found"
msgstr ""
#: build.go:127
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:133
msgid "Error parsing os release"
msgstr ""
#: build.go:159
msgid "Error building package"
msgstr ""
#: build.go:166
msgid "Error getting working directory" msgid "Error getting working directory"
msgstr "" msgstr ""
#: build.go:175 #: build.go:110 build.go:115
msgid "Error dropping capabilities"
msgstr ""
#: build.go:123
msgid "Error loading config"
msgstr ""
#: build.go:131
msgid "Error initialization database"
msgstr ""
#: build.go:141
msgid "Unable to detect a supported package manager on the system"
msgstr ""
#: build.go:147
msgid "Error parsing os release"
msgstr ""
#: build.go:179 build.go:221
msgid "Error building package"
msgstr ""
#: build.go:197
msgid "Package not found"
msgstr ""
#: build.go:225
msgid "Nothing to build"
msgstr ""
#: build.go:234
msgid "Error moving the package" msgid "Error moving the package"
msgstr "" msgstr ""
@ -170,10 +178,6 @@ msgstr ""
msgid "Command install expected at least 1 argument, got %d" msgid "Command install expected at least 1 argument, got %d"
msgstr "" msgstr ""
#: install.go:84
msgid "Error dropping capabilities"
msgstr ""
#: install.go:96 #: install.go:96
msgid "Error pulling repositories" msgid "Error pulling repositories"
msgstr "" msgstr ""
@ -311,7 +315,7 @@ msgstr ""
msgid "ERROR" msgid "ERROR"
msgstr "" msgstr ""
#: internal/utils/cmd.go:65 #: internal/utils/cmd.go:74
msgid "You need to be root" msgid "You need to be root"
msgstr "" msgstr ""
@ -331,11 +335,11 @@ msgstr ""
msgid "Enable interactive questions and prompts" msgid "Enable interactive questions and prompts"
msgstr "" msgstr ""
#: main.go:183 #: main.go:185
msgid "Show help" msgid "Show help"
msgstr "" msgstr ""
#: main.go:187 #: main.go:189
msgid "Error while running app" msgid "Error while running app"
msgstr "" msgstr ""
@ -351,7 +355,7 @@ msgstr ""
msgid "Downloading sources" msgid "Downloading sources"
msgstr "" msgstr ""
#: pkg/build/build.go:507 #: pkg/build/build.go:535
msgid "Installing dependencies" msgid "Installing dependencies"
msgstr "" msgstr ""
@ -385,19 +389,19 @@ msgstr ""
msgid "AutoReq is not implemented for this package format, so it's skipped" msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr "" msgstr ""
#: pkg/build/script_executor.go:236 #: pkg/build/script_executor.go:237
msgid "Building package metadata" msgid "Building package metadata"
msgstr "" msgstr ""
#: pkg/build/script_executor.go:355 #: pkg/build/script_executor.go:356
msgid "Executing prepare()" msgid "Executing prepare()"
msgstr "" msgstr ""
#: pkg/build/script_executor.go:364 #: pkg/build/script_executor.go:365
msgid "Executing build()" msgid "Executing build()"
msgstr "" msgstr ""
#: pkg/build/script_executor.go:393 pkg/build/script_executor.go:413 #: pkg/build/script_executor.go:394 pkg/build/script_executor.go:414
msgid "Executing %s()" msgid "Executing %s()"
msgstr "" msgstr ""
@ -490,3 +494,15 @@ msgstr ""
#: search.go:119 #: search.go:119
msgid "Error executing template" msgid "Error executing template"
msgstr "" msgstr ""
#: upgrade.go:48
msgid "Upgrade all installed packages"
msgstr ""
#: upgrade.go:111 upgrade.go:129
msgid "Error checking for updates"
msgstr ""
#: upgrade.go:133
msgid "There is nothing to do."
msgstr ""

@ -16,57 +16,67 @@ msgstr ""
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Gtranslator 47.1\n" "X-Generator: Gtranslator 47.1\n"
#: build.go:44 #: build.go:47
msgid "Build a local package" msgid "Build a local package"
msgstr "Сборка локального пакета" msgstr "Сборка локального пакета"
#: build.go:50 #: build.go:53
msgid "Path to the build script" msgid "Path to the build script"
msgstr "Путь к скрипту сборки" msgstr "Путь к скрипту сборки"
#: build.go:55 #: build.go:58
msgid "Specify subpackage in script (for multi package script only)" msgid "Specify subpackage in script (for multi package script only)"
msgstr "Укажите подпакет в скрипте (только для многопакетного скрипта)" msgstr "Укажите подпакет в скрипте (только для многопакетного скрипта)"
#: build.go:60 #: build.go:63
msgid "Name of the package to build and its repo (example: default/go-bin)" msgid "Name of the package to build and its repo (example: default/go-bin)"
msgstr "Имя пакета для сборки и его репозиторий (пример: default/go-bin)" msgstr "Имя пакета для сборки и его репозиторий (пример: default/go-bin)"
#: build.go:65 #: build.go:68
msgid "" msgid ""
"Build package from scratch even if there's an already built package available" "Build package from scratch even if there's an already built package available"
msgstr "Создайте пакет с нуля, даже если уже имеется готовый пакет" msgstr "Создайте пакет с нуля, даже если уже имеется готовый пакет"
#: build.go:73 #: build.go:74 build.go:79 build.go:89 build.go:103
msgid "Error getting working directory"
msgstr "Ошибка при получении рабочего каталога"
#: build.go:110 build.go:115
#, fuzzy
msgid "Error dropping capabilities"
msgstr "Ошибка при открытии базы данных"
#: build.go:123
#, fuzzy #, fuzzy
msgid "Error loading config" msgid "Error loading config"
msgstr "Ошибка при кодировании конфигурации" msgstr "Ошибка при кодировании конфигурации"
#: build.go:81 #: build.go:131
msgid "Error initialization database" msgid "Error initialization database"
msgstr "Ошибка инициализации базы данных" msgstr "Ошибка инициализации базы данных"
#: build.go:110 #: build.go:141
msgid "Package not found"
msgstr "Пакет не найден"
#: build.go:127
msgid "Unable to detect a supported package manager on the system" msgid "Unable to detect a supported package manager on the system"
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе" msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
#: build.go:133 #: build.go:147
msgid "Error parsing os release" msgid "Error parsing os release"
msgstr "Ошибка при разборе файла выпуска операционной системы" msgstr "Ошибка при разборе файла выпуска операционной системы"
#: build.go:159 #: build.go:179 build.go:221
msgid "Error building package" msgid "Error building package"
msgstr "Ошибка при сборке пакета" msgstr "Ошибка при сборке пакета"
#: build.go:166 #: build.go:197
msgid "Error getting working directory" msgid "Package not found"
msgstr "Ошибка при получении рабочего каталога" msgstr "Пакет не найден"
#: build.go:175 #: build.go:225
#, fuzzy
msgid "Nothing to build"
msgstr "Исполнение build()"
#: build.go:234
msgid "Error moving the package" msgid "Error moving the package"
msgstr "Ошибка при перемещении пакета" msgstr "Ошибка при перемещении пакета"
@ -181,11 +191,6 @@ msgstr "Установить новый пакет"
msgid "Command install expected at least 1 argument, got %d" msgid "Command install expected at least 1 argument, got %d"
msgstr "Для команды install ожидался хотя бы 1 аргумент, получено %d" msgstr "Для команды install ожидался хотя бы 1 аргумент, получено %d"
#: install.go:84
#, fuzzy
msgid "Error dropping capabilities"
msgstr "Ошибка при открытии базы данных"
#: install.go:96 #: install.go:96
msgid "Error pulling repositories" msgid "Error pulling repositories"
msgstr "Ошибка при извлечении репозиториев" msgstr "Ошибка при извлечении репозиториев"
@ -324,7 +329,7 @@ msgstr "%s %s загружается — %s/с\n"
msgid "ERROR" msgid "ERROR"
msgstr "ОШИБКА" msgstr "ОШИБКА"
#: internal/utils/cmd.go:65 #: internal/utils/cmd.go:74
msgid "You need to be root" msgid "You need to be root"
msgstr "" msgstr ""
@ -344,11 +349,11 @@ msgstr "Аргументы, которые будут переданы мене
msgid "Enable interactive questions and prompts" msgid "Enable interactive questions and prompts"
msgstr "Включение интерактивных вопросов и запросов" msgstr "Включение интерактивных вопросов и запросов"
#: main.go:183 #: main.go:185
msgid "Show help" msgid "Show help"
msgstr "Показать справку" msgstr "Показать справку"
#: main.go:187 #: main.go:189
msgid "Error while running app" msgid "Error while running app"
msgstr "Ошибка при запуске приложения" msgstr "Ошибка при запуске приложения"
@ -364,7 +369,7 @@ msgstr "Массив контрольных сумм должен быть то
msgid "Downloading sources" msgid "Downloading sources"
msgstr "Скачивание источников" msgstr "Скачивание источников"
#: pkg/build/build.go:507 #: pkg/build/build.go:535
msgid "Installing dependencies" msgid "Installing dependencies"
msgstr "Установка зависимостей" msgstr "Установка зависимостей"
@ -402,19 +407,19 @@ msgid "AutoReq is not implemented for this package format, so it's skipped"
msgstr "" msgstr ""
"AutoReq не реализовано для этого формата пакета, поэтому будет пропущено" "AutoReq не реализовано для этого формата пакета, поэтому будет пропущено"
#: pkg/build/script_executor.go:236 #: pkg/build/script_executor.go:237
msgid "Building package metadata" msgid "Building package metadata"
msgstr "Сборка метаданных пакета" msgstr "Сборка метаданных пакета"
#: pkg/build/script_executor.go:355 #: pkg/build/script_executor.go:356
msgid "Executing prepare()" msgid "Executing prepare()"
msgstr "Исполнение prepare()" msgstr "Исполнение prepare()"
#: pkg/build/script_executor.go:364 #: pkg/build/script_executor.go:365
msgid "Executing build()" msgid "Executing build()"
msgstr "Исполнение build()" msgstr "Исполнение build()"
#: pkg/build/script_executor.go:393 pkg/build/script_executor.go:413 #: pkg/build/script_executor.go:394 pkg/build/script_executor.go:414
msgid "Executing %s()" msgid "Executing %s()"
msgstr "Исполнение %s()" msgstr "Исполнение %s()"
@ -511,6 +516,18 @@ msgstr "Ошибка при разборе шаблона"
msgid "Error executing template" msgid "Error executing template"
msgstr "Ошибка при выполнении шаблона" msgstr "Ошибка при выполнении шаблона"
#: upgrade.go:48
msgid "Upgrade all installed packages"
msgstr "Обновить все установленные пакеты"
#: upgrade.go:111 upgrade.go:129
msgid "Error checking for updates"
msgstr "Ошибка при проверке обновлений"
#: upgrade.go:133
msgid "There is nothing to do."
msgstr "Здесь нечего делать."
#, fuzzy #, fuzzy
#~ msgid "Unable to create config directory" #~ msgid "Unable to create config directory"
#~ msgstr "Не удалось создать каталог конфигурации ALR" #~ msgstr "Не удалось создать каталог конфигурации ALR"
@ -546,15 +563,6 @@ msgstr "Ошибка при выполнении шаблона"
#~ msgid "Error installing package" #~ msgid "Error installing package"
#~ msgstr "Ошибка при установке пакета" #~ msgstr "Ошибка при установке пакета"
#~ msgid "Upgrade all installed packages"
#~ msgstr "Обновить все установленные пакеты"
#~ msgid "Error checking for updates"
#~ msgstr "Ошибка при проверке обновлений"
#~ msgid "There is nothing to do."
#~ msgstr "Здесь нечего делать."
#~ msgid "Error opening config file, using defaults" #~ msgid "Error opening config file, using defaults"
#~ msgstr "" #~ msgstr ""
#~ "Ошибка при открытии конфигурационного файла, используются значения по " #~ "Ошибка при открытии конфигурационного файла, используются значения по "

@ -26,17 +26,26 @@ import (
"github.com/leonelquinteros/gotext" "github.com/leonelquinteros/gotext"
) )
func GetUidGidAlrUser() (int, int, error) { func GetUidGidAlrUserString() (string, string, error) {
u, err := user.Lookup("alr") u, err := user.Lookup("alr")
if err != nil {
return "", "", err
}
return u.Uid, u.Gid, nil
}
func GetUidGidAlrUser() (int, int, error) {
strUid, strGid, err := GetUidGidAlrUserString()
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }
uid, err := strconv.Atoi(u.Uid) uid, err := strconv.Atoi(strUid)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }
gid, err := strconv.Atoi(u.Gid) gid, err := strconv.Atoi(strGid)
if err != nil { if err != nil {
return 0, 0, err return 0, 0, err
} }

@ -88,7 +88,7 @@ func GetApp() *cli.App {
Commands: []*cli.Command{ Commands: []*cli.Command{
InstallCmd(), InstallCmd(),
RemoveCmd(), RemoveCmd(),
// UpgradeCmd(), UpgradeCmd(),
InfoCmd(), InfoCmd(),
ListCmd(), ListCmd(),
BuildCmd(), BuildCmd(),
@ -103,6 +103,8 @@ func GetApp() *cli.App {
// TEST // TEST
InternalBuildCmd(), InternalBuildCmd(),
InternalInstallCmd(), InternalInstallCmd(),
InternalMountCmd(),
InternalUnmountCmd(),
// InternalBuild2Cmd(), // InternalBuild2Cmd(),
}, },
Before: func(c *cli.Context) error { Before: func(c *cli.Context) error {

@ -489,9 +489,37 @@ type InstallPkgsArgs struct {
func (b *Builder) InstallALRPackages( func (b *Builder) InstallALRPackages(
ctx context.Context, ctx context.Context,
input interface {
OsInfoProvider
BuildOptsProvider
PkgFormatProvider
},
alrPkgs []db.Package, alrPkgs []db.Package,
opts types.BuildOpts, ) error {
) { for _, pkg := range alrPkgs {
res, err := b.BuildPackageFromDb(
ctx,
&BuildPackageFromDbArgs{
Package: &pkg,
Packages: []string{},
BuildArgs: BuildArgs{
Opts: input.BuildOpts(),
Info: input.OSRelease(),
PkgFormat_: input.PkgFormat(),
},
},
)
if err != nil {
return err
}
err = b.installerExecutor.InstallLocal(res.PackagePaths)
if err != nil {
return err
}
}
return nil
} }
func (b *Builder) BuildALRDeps( func (b *Builder) BuildALRDeps(

@ -18,7 +18,6 @@ package build
import ( import (
"log/slog" "log/slog"
"os"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
) )
@ -27,8 +26,6 @@ func NewMainBuilder(
cfg Config, cfg Config,
repos PackageFinder, repos PackageFinder,
) *Builder { ) *Builder {
slog.Info("", "uid", os.Geteuid(), "gid", os.Getegid())
s, err := GetSafeScriptExecutor() s, err := GetSafeScriptExecutor()
if err != nil { if err != nil {
slog.Info("i will panic") slog.Info("i will panic")

@ -78,6 +78,7 @@ func (e *LocalScriptExecutor) ExecuteFirstPass(ctx context.Context, input *Build
interp.ReadDirHandler2(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий interp.ReadDirHandler2(handlers.RestrictedReadDir(scriptDir)), // Ограничиваем чтение директорий
interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов interp.StatHandler(handlers.RestrictedStat(scriptDir)), // Ограничиваем доступ к статистике файлов
interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов interp.OpenHandler(handlers.RestrictedOpen(scriptDir)), // Ограничиваем открытие файлов
interp.Dir(scriptDir),
) )
if err != nil { if err != nil {
return "", nil, err return "", nil, err

@ -82,6 +82,7 @@ func ParseOSRelease(ctx context.Context) (*OSRelease, error) {
interp.ReadDirHandler2(handlers.NopReadDir), interp.ReadDirHandler2(handlers.NopReadDir),
interp.StatHandler(handlers.NopStat), interp.StatHandler(handlers.NopStat),
interp.Env(expand.ListEnviron()), interp.Env(expand.ListEnviron()),
interp.Dir("/"),
) )
if err != nil { if err != nil {
return nil, err return nil, err

@ -34,6 +34,7 @@ import (
database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db" database "gitea.plemya-x.ru/Plemya-x/ALR/internal/db"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides" "gitea.plemya-x.ru/Plemya-x/ALR/internal/overrides"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/types" "gitea.plemya-x.ru/Plemya-x/ALR/internal/types"
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/build" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/build"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/distro"
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager" "gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
@ -54,10 +55,16 @@ func UpgradeCmd() *cli.Command {
}, },
}, },
Action: func(c *cli.Context) error { Action: func(c *cli.Context) error {
err := utils.DropCapsToAlrUser()
if err != nil {
slog.Error(gotext.Get("Error dropping capabilities"), "err", err)
os.Exit(1)
}
ctx := c.Context ctx := c.Context
cfg := config.New() cfg := config.New()
err := cfg.Load() err = cfg.Load()
if err != nil { if err != nil {
slog.Error(gotext.Get("Error loading config"), "err", err) slog.Error(gotext.Get("Error loading config"), "err", err)
os.Exit(1) os.Exit(1)
@ -71,7 +78,14 @@ func UpgradeCmd() *cli.Command {
os.Exit(1) os.Exit(1)
} }
slog.Debug("builder setup")
builder := build.NewMainBuilder(
cfg,
rs,
)
info, err := distro.ParseOSRelease(ctx) info, err := distro.ParseOSRelease(ctx)
slog.Debug("ParseOSRelease", "err", err)
if err != nil { if err != nil {
slog.Error(gotext.Get("Error parsing os-release file"), "err", err) slog.Error(gotext.Get("Error parsing os-release file"), "err", err)
os.Exit(1) os.Exit(1)
@ -84,6 +98,7 @@ func UpgradeCmd() *cli.Command {
} }
if cfg.AutoPull() { if cfg.AutoPull() {
slog.Debug("autopull")
err = rs.Pull(ctx, cfg.Repos()) err = rs.Pull(ctx, cfg.Repos())
if err != nil { if err != nil {
slog.Error(gotext.Get("Error pulling repos"), "err", err) slog.Error(gotext.Get("Error pulling repos"), "err", err)
@ -98,22 +113,22 @@ func UpgradeCmd() *cli.Command {
} }
if len(updates) > 0 { if len(updates) > 0 {
builder := build.NewBuilder( err = builder.InstallALRPackages(
ctx, ctx,
types.BuildOpts{ &build.BuildArgs{
Manager: mgr, Opts: &types.BuildOpts{
Clean: c.Bool("clean"), Clean: c.Bool("clean"),
Interactive: c.Bool("interactive"), Interactive: c.Bool("interactive"),
}, },
rs, Info: info,
info, PkgFormat_: build.GetPkgFormat(mgr),
cfg, },
updates,
) )
builder.InstallPkgs(ctx, updates, nil, types.BuildOpts{ if err != nil {
Manager: mgr, slog.Error(gotext.Get("Error checking for updates"), "err", err)
Clean: c.Bool("clean"), os.Exit(1)
Interactive: c.Bool("interactive"), }
})
} else { } else {
slog.Info(gotext.Get("There is nothing to do.")) slog.Info(gotext.Get("There is nothing to do."))
} }