add system subcommands

parent a0099789
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"ximperconf/create" "ximperconf/create"
"ximperconf/hyprland" "ximperconf/hyprland"
"ximperconf/repo" "ximperconf/repo"
"ximperconf/system"
"github.com/urfave/cli/v3" "github.com/urfave/cli/v3"
) )
...@@ -26,6 +27,7 @@ func main() { ...@@ -26,6 +27,7 @@ func main() {
repo.CommandList(), repo.CommandList(),
create.CommandList(), create.CommandList(),
hyprland.CommandList(), hyprland.CommandList(),
system.CommandList(),
{ {
Name: "help", Name: "help",
Aliases: []string{"h"}, Aliases: []string{"h"},
......
package system
import (
"fmt"
"ximperconf/config"
"context"
"github.com/urfave/cli/v3"
)
func CommandList() *cli.Command {
return &cli.Command{
Name: "system",
Hidden: !config.Env.IsRoot,
Usage: "System Management",
Before: func(ctx context.Context, command *cli.Command) (context.Context, error) {
if !config.Env.IsRoot {
fmt.Printf("Эта команда требует root.\n")
return nil, fmt.Errorf("")
}
return ctx, nil
},
Commands: []*cli.Command{
{
Name: "fix-grub-resolution",
Usage: "Fix GRUB resolution",
Action: SystemGrubFixResolutionCommand,
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "update",
Usage: "Automatically run update-grub after fixing",
Aliases: []string{"u"},
Value: false,
},
&cli.BoolFlag{
Name: "verbose",
Usage: "Enable verbose output",
Aliases: []string{"V"},
Value: false,
},
},
},
},
}
}
package system
import (
"context"
"fmt"
"os"
"os/exec"
"strings"
"github.com/urfave/cli/v3"
)
var (
grubFile = "/etc/default/grub"
grub_gfxmode = "3840x2160,3200x1800,2560x1440,1920x1080,auto"
)
func SystemGrubFixResolution(autoUpdate, verbose bool) error {
content, err := os.ReadFile(grubFile)
if err != nil {
return fmt.Errorf("не удалось прочитать %s: %w", grubFile, err)
}
lines := strings.Split(string(content), "\n")
found := false
changed := false
oldValue := ""
for i, line := range lines {
if strings.HasPrefix(line, "GRUB_GFXMODE=") {
found = true
oldValue = strings.Trim(strings.SplitN(line, "=", 2)[1], `"`)
if oldValue == "" || oldValue == "auto" {
lines[i] = fmt.Sprintf(`GRUB_GFXMODE="%s"`, grub_gfxmode)
changed = true
}
break
}
}
if !found {
lines = append(lines, fmt.Sprintf(`GRUB_GFXMODE="%s"`, grub_gfxmode))
changed = true
oldValue = "<empty>"
}
if !changed {
return fmt.Errorf("GRUB_GFXMODE уже установлен: %s", oldValue)
}
newContent := strings.Join(lines, "\n")
if err := os.WriteFile(grubFile, []byte(newContent), 0644); err != nil {
return fmt.Errorf("не удалось записать %s: %w", grubFile, err)
}
if verbose {
fmt.Printf("GRUB_GFXMODE: %s → %s\n", oldValue, grub_gfxmode)
}
if autoUpdate {
cmd := exec.Command("update-grub")
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("ошибка при выполнении update-grub: %v (%s)", err, out)
}
if verbose {
fmt.Println("Лог update-grub:\n", string(out))
}
}
return nil
}
func SystemGrubFixResolutionCommand(ctx context.Context, cmd *cli.Command) error {
autoUpdate := cmd.Bool("update")
verbose := cmd.Bool("verbose")
if err := SystemGrubFixResolution(autoUpdate, verbose); err != nil {
fmt.Println(err)
return err
}
if !verbose {
fmt.Println("GRUB_GFXMODE исправлен успешно.")
}
if autoUpdate && !verbose {
fmt.Println("Выполнен update-grub.")
}
return nil
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment