forked from Plemya-x/ALR
wip
This commit is contained in:
parent
fe3acf5b85
commit
240ee852c8
@ -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.0%</text>
|
<text x="86" y="15" fill="#010101" fill-opacity=".3">15.9%</text>
|
||||||
<text x="86" y="14">16.0%</text>
|
<text x="86" y="14">15.9%</text>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 926 B After Width: | Height: | Size: 926 B |
4
build.go
4
build.go
@ -175,13 +175,15 @@ func BuildCmd() *cli.Command {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
builder, err := build.NewMainBuilder(
|
builder, cleanup, err := build.NewMainBuilder(
|
||||||
deps.Cfg,
|
deps.Cfg,
|
||||||
|
deps.Manager,
|
||||||
deps.Repos,
|
deps.Repos,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
if scriptArgs != nil {
|
if scriptArgs != nil {
|
||||||
res, err = builder.BuildPackageFromScript(
|
res, err = builder.BuildPackageFromScript(
|
||||||
|
16
install.go
16
install.go
@ -58,30 +58,28 @@ func InstallCmd() *cli.Command {
|
|||||||
return cliutils.FormatCliExit(gotext.Get("Command install expected at least 1 argument, got %d", args.Len()), nil)
|
return cliutils.FormatCliExit(gotext.Get("Command install expected at least 1 argument, got %d", args.Len()), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
mgr := manager.Detect()
|
|
||||||
if mgr == nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
deps, err := appbuilder.
|
deps, err := appbuilder.
|
||||||
New(ctx).
|
New(ctx).
|
||||||
WithConfig().
|
WithConfig().
|
||||||
WithDB().
|
WithDB().
|
||||||
WithReposNoPull().
|
WithReposNoPull().
|
||||||
WithDistroInfo().
|
WithDistroInfo().
|
||||||
|
WithManager().
|
||||||
Build()
|
Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer deps.Defer()
|
defer deps.Defer()
|
||||||
|
|
||||||
builder, err := build.NewMainBuilder(
|
builder, cleanup, err := build.NewMainBuilder(
|
||||||
deps.Cfg,
|
deps.Cfg,
|
||||||
|
deps.Manager,
|
||||||
deps.Repos,
|
deps.Repos,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
if deps.Cfg.AutoPull() {
|
if deps.Cfg.AutoPull() {
|
||||||
if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil {
|
if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil {
|
||||||
@ -89,10 +87,6 @@ func InstallCmd() *cli.Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := utils.ExitIfCantDropCapsToAlrUser(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
err = builder.InstallPkgs(
|
err = builder.InstallPkgs(
|
||||||
ctx,
|
ctx,
|
||||||
&build.BuildArgs{
|
&build.BuildArgs{
|
||||||
@ -101,7 +95,7 @@ func InstallCmd() *cli.Command {
|
|||||||
Interactive: c.Bool("interactive"),
|
Interactive: c.Bool("interactive"),
|
||||||
},
|
},
|
||||||
Info: deps.Info,
|
Info: deps.Info,
|
||||||
PkgFormat_: build.GetPkgFormat(mgr),
|
PkgFormat_: build.GetPkgFormat(deps.Manager),
|
||||||
},
|
},
|
||||||
args.Slice(),
|
args.Slice(),
|
||||||
)
|
)
|
||||||
|
@ -160,8 +160,8 @@ func (b *AppBuilder) WithManager() *AppBuilder {
|
|||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
mgr := manager.Detect()
|
b.deps.Manager = manager.Detect()
|
||||||
if mgr == nil {
|
if b.deps.Manager == nil {
|
||||||
b.err = cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
b.err = cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package logger
|
|||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
chLog "github.com/charmbracelet/log"
|
chLog "github.com/charmbracelet/log"
|
||||||
"github.com/hashicorp/go-hclog"
|
"github.com/hashicorp/go-hclog"
|
||||||
@ -55,7 +56,18 @@ func (a *HCLoggerAdapter) Log(level hclog.Level, msg string, args ...interface{}
|
|||||||
filteredArgs = append(filteredArgs, args[i], args[i+1])
|
filteredArgs = append(filteredArgs, args[i], args[i+1])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
a.logger.l.Log(hclogLevelTochLog(level), msg, filteredArgs...)
|
|
||||||
|
/*
|
||||||
|
* Start ugly hacks
|
||||||
|
*/
|
||||||
|
var chLogLevel chLog.Level
|
||||||
|
if msg == "plugin process exited" || strings.HasPrefix(msg, "[DEBUG] plugin") {
|
||||||
|
chLogLevel = chLog.DebugLevel
|
||||||
|
} else {
|
||||||
|
chLogLevel = hclogLevelTochLog(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
a.logger.l.Log(chLogLevel, msg, filteredArgs...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *HCLoggerAdapter) Trace(msg string, args ...interface{}) {
|
func (a *HCLoggerAdapter) Trace(msg string, args ...interface{}) {
|
||||||
|
@ -46,15 +46,15 @@ msgstr ""
|
|||||||
msgid "Nothing to build"
|
msgid "Nothing to build"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:199
|
#: build.go:201
|
||||||
msgid "Error building package"
|
msgid "Error building package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:206
|
#: build.go:208
|
||||||
msgid "Error moving the package"
|
msgid "Error moving the package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: build.go:210
|
#: build.go:212
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -158,31 +158,31 @@ 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:63 install.go:172 install.go:222
|
#: install.go:86
|
||||||
msgid "Unable to detect a supported package manager on the system"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: install.go:88
|
|
||||||
msgid "Error pulling repositories"
|
msgid "Error pulling repositories"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:109
|
#: install.go:103
|
||||||
msgid "Error parsing os release"
|
msgid "Error parsing os release"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:154
|
#: install.go:148
|
||||||
msgid "Remove an installed package"
|
msgid "Remove an installed package"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:176
|
#: install.go:166 install.go:216
|
||||||
|
msgid "Unable to detect a supported package manager on the system"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: install.go:170
|
||||||
msgid "Error listing installed packages"
|
msgid "Error listing installed packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:217
|
#: install.go:211
|
||||||
msgid "Command remove expected at least 1 argument, got %d"
|
msgid "Command remove expected at least 1 argument, got %d"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: install.go:230
|
#: install.go:224
|
||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -311,15 +311,15 @@ msgstr ""
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:87
|
#: internal/utils/cmd.go:79
|
||||||
msgid "Error dropping capabilities"
|
msgid "Error dropping capabilities"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:94
|
#: internal/utils/cmd.go:86
|
||||||
msgid "You need to be root to perform this action"
|
msgid "You need to be root to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:136
|
#: internal/utils/cmd.go:128
|
||||||
msgid "You need to be a %s member to perform this action"
|
msgid "You need to be a %s member to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -507,18 +507,14 @@ msgstr ""
|
|||||||
msgid "Error executing template"
|
msgid "Error executing template"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:48
|
#: upgrade.go:50
|
||||||
msgid "Upgrade all installed packages"
|
msgid "Upgrade all installed packages"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:100
|
#: upgrade.go:99 upgrade.go:116
|
||||||
msgid "Error pulling repos"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: upgrade.go:106 upgrade.go:123
|
|
||||||
msgid "Error checking for updates"
|
msgid "Error checking for updates"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: upgrade.go:126
|
#: upgrade.go:119
|
||||||
msgid "There is nothing to do."
|
msgid "There is nothing to do."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -54,15 +54,15 @@ msgstr "Пакет не найден"
|
|||||||
msgid "Nothing to build"
|
msgid "Nothing to build"
|
||||||
msgstr "Исполнение build()"
|
msgstr "Исполнение build()"
|
||||||
|
|
||||||
#: build.go:199
|
#: build.go:201
|
||||||
msgid "Error building package"
|
msgid "Error building package"
|
||||||
msgstr "Ошибка при сборке пакета"
|
msgstr "Ошибка при сборке пакета"
|
||||||
|
|
||||||
#: build.go:206
|
#: build.go:208
|
||||||
msgid "Error moving the package"
|
msgid "Error moving the package"
|
||||||
msgstr "Ошибка при перемещении пакета"
|
msgstr "Ошибка при перемещении пакета"
|
||||||
|
|
||||||
#: build.go:210
|
#: build.go:212
|
||||||
msgid "Done"
|
msgid "Done"
|
||||||
msgstr "Сделано"
|
msgstr "Сделано"
|
||||||
|
|
||||||
@ -171,31 +171,31 @@ 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:63 install.go:172 install.go:222
|
#: install.go:86
|
||||||
msgid "Unable to detect a supported package manager on the system"
|
|
||||||
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
|
|
||||||
|
|
||||||
#: install.go:88
|
|
||||||
msgid "Error pulling repositories"
|
msgid "Error pulling repositories"
|
||||||
msgstr "Ошибка при извлечении репозиториев"
|
msgstr "Ошибка при извлечении репозиториев"
|
||||||
|
|
||||||
#: install.go:109
|
#: install.go:103
|
||||||
msgid "Error parsing os release"
|
msgid "Error parsing os release"
|
||||||
msgstr "Ошибка при разборе файла выпуска операционной системы"
|
msgstr "Ошибка при разборе файла выпуска операционной системы"
|
||||||
|
|
||||||
#: install.go:154
|
#: install.go:148
|
||||||
msgid "Remove an installed package"
|
msgid "Remove an installed package"
|
||||||
msgstr "Удалить установленный пакет"
|
msgstr "Удалить установленный пакет"
|
||||||
|
|
||||||
#: install.go:176
|
#: install.go:166 install.go:216
|
||||||
|
msgid "Unable to detect a supported package manager on the system"
|
||||||
|
msgstr "Не удалось обнаружить поддерживаемый менеджер пакетов в системе"
|
||||||
|
|
||||||
|
#: install.go:170
|
||||||
msgid "Error listing installed packages"
|
msgid "Error listing installed packages"
|
||||||
msgstr "Ошибка при составлении списка установленных пакетов"
|
msgstr "Ошибка при составлении списка установленных пакетов"
|
||||||
|
|
||||||
#: install.go:217
|
#: install.go:211
|
||||||
msgid "Command remove expected at least 1 argument, got %d"
|
msgid "Command remove expected at least 1 argument, got %d"
|
||||||
msgstr "Для команды remove ожидался хотя бы 1 аргумент, получено %d"
|
msgstr "Для команды remove ожидался хотя бы 1 аргумент, получено %d"
|
||||||
|
|
||||||
#: install.go:230
|
#: install.go:224
|
||||||
msgid "Error removing packages"
|
msgid "Error removing packages"
|
||||||
msgstr "Ошибка при удалении пакетов"
|
msgstr "Ошибка при удалении пакетов"
|
||||||
|
|
||||||
@ -326,16 +326,16 @@ msgstr "%s %s загружается — %s/с\n"
|
|||||||
msgid "ERROR"
|
msgid "ERROR"
|
||||||
msgstr "ОШИБКА"
|
msgstr "ОШИБКА"
|
||||||
|
|
||||||
#: internal/utils/cmd.go:87
|
#: internal/utils/cmd.go:79
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid "Error dropping capabilities"
|
msgid "Error dropping capabilities"
|
||||||
msgstr "Ошибка при открытии базы данных"
|
msgstr "Ошибка при открытии базы данных"
|
||||||
|
|
||||||
#: internal/utils/cmd.go:94
|
#: internal/utils/cmd.go:86
|
||||||
msgid "You need to be root to perform this action"
|
msgid "You need to be root to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: internal/utils/cmd.go:136
|
#: internal/utils/cmd.go:128
|
||||||
msgid "You need to be a %s member to perform this action"
|
msgid "You need to be a %s member to perform this action"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -533,22 +533,21 @@ msgstr "Ошибка при разборе шаблона"
|
|||||||
msgid "Error executing template"
|
msgid "Error executing template"
|
||||||
msgstr "Ошибка при выполнении шаблона"
|
msgstr "Ошибка при выполнении шаблона"
|
||||||
|
|
||||||
#: upgrade.go:48
|
#: upgrade.go:50
|
||||||
msgid "Upgrade all installed packages"
|
msgid "Upgrade all installed packages"
|
||||||
msgstr "Обновить все установленные пакеты"
|
msgstr "Обновить все установленные пакеты"
|
||||||
|
|
||||||
#: upgrade.go:100
|
#: upgrade.go:99 upgrade.go:116
|
||||||
msgid "Error pulling repos"
|
|
||||||
msgstr "Ошибка при извлечении репозиториев"
|
|
||||||
|
|
||||||
#: upgrade.go:106 upgrade.go:123
|
|
||||||
msgid "Error checking for updates"
|
msgid "Error checking for updates"
|
||||||
msgstr "Ошибка при проверке обновлений"
|
msgstr "Ошибка при проверке обновлений"
|
||||||
|
|
||||||
#: upgrade.go:126
|
#: upgrade.go:119
|
||||||
msgid "There is nothing to do."
|
msgid "There is nothing to do."
|
||||||
msgstr "Здесь нечего делать."
|
msgstr "Здесь нечего делать."
|
||||||
|
|
||||||
|
#~ msgid "Error pulling repos"
|
||||||
|
#~ msgstr "Ошибка при извлечении репозиториев"
|
||||||
|
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
#~ msgid "Error getting current executable"
|
#~ msgid "Error getting current executable"
|
||||||
#~ msgstr "Ошибка при получении рабочего каталога"
|
#~ msgstr "Ошибка при получении рабочего каталога"
|
||||||
|
@ -70,15 +70,7 @@ func DropCapsToAlrUser() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
newUid := syscall.Getuid()
|
return EnuseIsAlrUser()
|
||||||
if newUid != uid {
|
|
||||||
return errors.New("new uid don't matches requested")
|
|
||||||
}
|
|
||||||
newGid := syscall.Getgid()
|
|
||||||
if newGid != gid {
|
|
||||||
return errors.New("new gid don't matches requested")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExitIfCantDropCapsToAlrUser() cli.ExitCoder {
|
func ExitIfCantDropCapsToAlrUser() cli.ExitCoder {
|
||||||
|
@ -18,6 +18,8 @@ package build
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
"sync"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
"gitea.plemya-x.ru/Plemya-x/ALR/pkg/manager"
|
||||||
@ -25,28 +27,48 @@ import (
|
|||||||
|
|
||||||
func NewMainBuilder(
|
func NewMainBuilder(
|
||||||
cfg Config,
|
cfg Config,
|
||||||
|
mgr manager.Manager,
|
||||||
repos PackageFinder,
|
repos PackageFinder,
|
||||||
) (*Builder, error) {
|
) (*Builder, func(), error) {
|
||||||
installerExecutor, err := GetSafeInstaller()
|
var err error
|
||||||
|
|
||||||
|
var safeInstallerClose, safeScriptExecutorClose func()
|
||||||
|
|
||||||
|
var cleanupOnce sync.Once
|
||||||
|
cleanup := func() {
|
||||||
|
cleanupOnce.Do(func() {
|
||||||
|
if safeScriptExecutorClose != nil {
|
||||||
|
safeScriptExecutorClose()
|
||||||
|
}
|
||||||
|
if safeInstallerClose != nil {
|
||||||
|
safeInstallerClose()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
slog.Debug("close executors")
|
||||||
|
cleanup()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
installerExecutor, safeInstallerClose, err := GetSafeInstaller()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("i will panic GetSafeInstaller", "err", err)
|
return nil, nil, err
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// It is very important!
|
// It is very important!
|
||||||
// See https://stackoverflow.com/questions/47296408/cannot-open-uid-map-for-writing-from-an-app-with-cap-setuid-capability-set
|
// See https://stackoverflow.com/questions/47296408/cannot-open-uid-map-for-writing-from-an-app-with-cap-setuid-capability-set
|
||||||
if err := utils.NoNewPrivs(); err != nil {
|
if err = utils.NoNewPrivs(); err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
s, err := GetSafeScriptExecutor()
|
s, safeScriptExecutorClose, err := GetSafeScriptExecutor()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("i will panic GetSafeScriptExecutor", "err", err)
|
return nil, nil, err
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mgr := manager.Detect()
|
|
||||||
|
|
||||||
builder := &Builder{
|
builder := &Builder{
|
||||||
scriptExecutor: s,
|
scriptExecutor: s,
|
||||||
cacheExecutor: &Cache{
|
cacheExecutor: &Cache{
|
||||||
@ -68,5 +90,7 @@ func NewMainBuilder(
|
|||||||
repos: repos,
|
repos: repos,
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder, nil
|
slog.Warn("uid", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
||||||
|
|
||||||
|
return builder, cleanup, nil
|
||||||
}
|
}
|
||||||
|
@ -18,10 +18,12 @@ package build
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/rpc"
|
"net/rpc"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
@ -217,10 +219,12 @@ var pluginMap = map[string]plugin.Plugin{
|
|||||||
"installer": &InstallerPlugin{},
|
"installer": &InstallerPlugin{},
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSafeScriptExecutor() (ScriptExecutor, error) {
|
func GetSafeScriptExecutor() (ScriptExecutor, func(), error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
executable, err := os.Executable()
|
executable, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := exec.Command(executable, "_internal-safe-script-executor")
|
cmd := exec.Command(executable, "_internal-safe-script-executor")
|
||||||
@ -233,7 +237,7 @@ func GetSafeScriptExecutor() (ScriptExecutor, error) {
|
|||||||
}
|
}
|
||||||
uid, gid, err := utils.GetUidGidAlrUser()
|
uid, gid, err := utils.GetUidGidAlrUser()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
cmd.SysProcAttr = &syscall.SysProcAttr{
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||||
Credential: &syscall.Credential{
|
Credential: &syscall.Credential{
|
||||||
@ -254,14 +258,33 @@ func GetSafeScriptExecutor() (ScriptExecutor, error) {
|
|||||||
})
|
})
|
||||||
rpcClient, err := client.Client()
|
rpcClient, err := client.Client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Info("1")
|
return nil, nil, err
|
||||||
return nil, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
raw1, err := rpcClient.Dispense("script-executor")
|
var cleanupOnce sync.Once
|
||||||
|
cleanup := func() {
|
||||||
|
cleanupOnce.Do(func() {
|
||||||
|
client.Kill()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
slog.Debug("close script-executor")
|
||||||
|
cleanup()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
raw, err := rpcClient.Dispense("script-executor")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return raw1.(ScriptExecutor), nil
|
executor, ok := raw.(ScriptExecutor)
|
||||||
|
if !ok {
|
||||||
|
err = fmt.Errorf("dispensed object is not a ScriptExecutor (got %T)", raw)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return executor, cleanup, nil
|
||||||
}
|
}
|
||||||
|
@ -17,15 +17,18 @@
|
|||||||
package build
|
package build
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/rpc"
|
"net/rpc"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/hashicorp/go-plugin"
|
"github.com/hashicorp/go-plugin"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||||
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type InstallerPlugin struct {
|
type InstallerPlugin struct {
|
||||||
@ -80,10 +83,12 @@ func (p *InstallerPlugin) Server(*plugin.MuxBroker) (interface{}, error) {
|
|||||||
return &InstallerRPCServer{Impl: p.Impl}, nil
|
return &InstallerRPCServer{Impl: p.Impl}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSafeInstaller() (InstallerExecutor, error) {
|
func GetSafeInstaller() (InstallerExecutor, func(), error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
executable, err := os.Executable()
|
executable, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
cmd := exec.Command(executable, "_internal-installer")
|
cmd := exec.Command(executable, "_internal-installer")
|
||||||
cmd.Env = append(os.Environ(),
|
cmd.Env = append(os.Environ(),
|
||||||
@ -94,6 +99,16 @@ func GetSafeInstaller() (InstallerExecutor, error) {
|
|||||||
"ALR_LOG_LEVEL=DEBUG",
|
"ALR_LOG_LEVEL=DEBUG",
|
||||||
"XDG_SESSION_CLASS=user",
|
"XDG_SESSION_CLASS=user",
|
||||||
)
|
)
|
||||||
|
uid, gid, err := utils.GetUidGidAlrUser()
|
||||||
|
if err != nil {
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
cmd.SysProcAttr = &syscall.SysProcAttr{
|
||||||
|
Credential: &syscall.Credential{
|
||||||
|
Uid: uint32(uid),
|
||||||
|
Gid: uint32(gid),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
slog.Debug("safe installer setup", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
||||||
|
|
||||||
@ -110,13 +125,33 @@ func GetSafeInstaller() (InstallerExecutor, error) {
|
|||||||
})
|
})
|
||||||
rpcClient, err := client.Client()
|
rpcClient, err := client.Client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
raw1, err := rpcClient.Dispense("installer")
|
var cleanupOnce sync.Once
|
||||||
|
cleanup := func() {
|
||||||
|
cleanupOnce.Do(func() {
|
||||||
|
client.Kill()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
slog.Debug("close installer")
|
||||||
|
cleanup()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
raw, err := rpcClient.Dispense("installer")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return raw1.(InstallerExecutor), nil
|
executor, ok := raw.(InstallerExecutor)
|
||||||
|
if !ok {
|
||||||
|
err = fmt.Errorf("dispensed object is not a ScriptExecutor (got %T)", raw)
|
||||||
|
return nil, nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return executor, cleanup, nil
|
||||||
}
|
}
|
||||||
|
59
upgrade.go
59
upgrade.go
@ -23,6 +23,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
"github.com/leonelquinteros/gotext"
|
"github.com/leonelquinteros/gotext"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
@ -30,6 +31,7 @@ import (
|
|||||||
"golang.org/x/exp/maps"
|
"golang.org/x/exp/maps"
|
||||||
|
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils"
|
||||||
|
appbuilder "gitea.plemya-x.ru/Plemya-x/ALR/internal/cliutils/app_builder"
|
||||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
"gitea.plemya-x.ru/Plemya-x/ALR/internal/config"
|
||||||
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"
|
||||||
@ -55,53 +57,44 @@ func UpgradeCmd() *cli.Command {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Action: func(c *cli.Context) error {
|
Action: func(c *cli.Context) error {
|
||||||
err := utils.DropCapsToAlrUser()
|
if err := utils.ExitIfNotRoot(); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error dropping capabilities"), err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := c.Context
|
ctx := c.Context
|
||||||
|
|
||||||
cfg := config.New()
|
deps, err := appbuilder.
|
||||||
err = cfg.Load()
|
New(ctx).
|
||||||
|
WithConfig().
|
||||||
|
WithDB().
|
||||||
|
WithReposNoPull().
|
||||||
|
WithDistroInfo().
|
||||||
|
WithManager().
|
||||||
|
Build()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error loading config"), err)
|
return err
|
||||||
}
|
}
|
||||||
|
defer deps.Defer()
|
||||||
|
|
||||||
db := database.New(cfg)
|
builder, cleanup, err := build.NewMainBuilder(
|
||||||
rs := repos.New(cfg, db)
|
deps.Cfg,
|
||||||
err = db.Init(ctx)
|
deps.Manager,
|
||||||
if err != nil {
|
deps.Repos,
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error initialization database"), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
builder, err := build.NewMainBuilder(
|
|
||||||
cfg,
|
|
||||||
rs,
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
defer cleanup()
|
||||||
|
|
||||||
info, err := distro.ParseOSRelease(ctx)
|
slog.Warn("", "uid", syscall.Getuid(), "gid", syscall.Getgid())
|
||||||
slog.Debug("ParseOSRelease", "err", err)
|
|
||||||
if err != nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error parsing os-release file"), err)
|
|
||||||
}
|
|
||||||
|
|
||||||
mgr := manager.Detect()
|
if deps.Cfg.AutoPull() {
|
||||||
if mgr == nil {
|
if err := deps.Repos.Pull(ctx, deps.Cfg.Repos()); err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Unable to detect a supported package manager on the system"), nil)
|
return cliutils.FormatCliExit(gotext.Get("Error pulling repositories"), err)
|
||||||
}
|
|
||||||
|
|
||||||
if cfg.AutoPull() {
|
|
||||||
err = rs.Pull(ctx, cfg.Repos())
|
|
||||||
if err != nil {
|
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error pulling repos"), err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updates, err := checkForUpdates(ctx, mgr, cfg, db, rs, info)
|
updates, err := checkForUpdates(ctx, deps.Manager, deps.Cfg, deps.DB, deps.Repos, deps.Info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cliutils.FormatCliExit(gotext.Get("Error checking for updates"), err)
|
return cliutils.FormatCliExit(gotext.Get("Error checking for updates"), err)
|
||||||
}
|
}
|
||||||
@ -114,8 +107,8 @@ func UpgradeCmd() *cli.Command {
|
|||||||
Clean: c.Bool("clean"),
|
Clean: c.Bool("clean"),
|
||||||
Interactive: c.Bool("interactive"),
|
Interactive: c.Bool("interactive"),
|
||||||
},
|
},
|
||||||
Info: info,
|
Info: deps.Info,
|
||||||
PkgFormat_: build.GetPkgFormat(mgr),
|
PkgFormat_: build.GetPkgFormat(deps.Manager),
|
||||||
},
|
},
|
||||||
updates,
|
updates,
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user