forked from Plemya-x/ALR
wip
This commit is contained in:
@@ -17,15 +17,18 @@
|
||||
package build
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net/rpc"
|
||||
"os"
|
||||
"os/exec"
|
||||
"sync"
|
||||
"syscall"
|
||||
|
||||
"github.com/hashicorp/go-plugin"
|
||||
|
||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/logger"
|
||||
"gitea.plemya-x.ru/Plemya-x/ALR/internal/utils"
|
||||
)
|
||||
|
||||
type InstallerPlugin struct {
|
||||
@@ -80,10 +83,12 @@ func (p *InstallerPlugin) Server(*plugin.MuxBroker) (interface{}, error) {
|
||||
return &InstallerRPCServer{Impl: p.Impl}, nil
|
||||
}
|
||||
|
||||
func GetSafeInstaller() (InstallerExecutor, error) {
|
||||
func GetSafeInstaller() (InstallerExecutor, func(), error) {
|
||||
var err error
|
||||
|
||||
executable, err := os.Executable()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, err
|
||||
}
|
||||
cmd := exec.Command(executable, "_internal-installer")
|
||||
cmd.Env = append(os.Environ(),
|
||||
@@ -94,6 +99,16 @@ func GetSafeInstaller() (InstallerExecutor, error) {
|
||||
"ALR_LOG_LEVEL=DEBUG",
|
||||
"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())
|
||||
|
||||
@@ -110,13 +125,33 @@ func GetSafeInstaller() (InstallerExecutor, error) {
|
||||
})
|
||||
rpcClient, err := client.Client()
|
||||
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 {
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user