瀏覽代碼

Moved error handling, Autoremoval

Moved error handling to main, for all errors

Added `apt autoremove -y`, if `apt upgrade -y` mentions it
apollo 3 天之前
父節點
當前提交
7f7e7040d6
共有 1 個文件被更改,包括 58 次插入12 次删除
  1. 58 12
      aptgrade.go

+ 58 - 12
aptgrade.go

@@ -1,7 +1,9 @@
 package main
 
 import (
+	"errors"
 	"fmt"
+	"io"
 	"os"
 	"os/exec"
 	"strings"
@@ -9,26 +11,52 @@ import (
 )
 
 // Run the given command, showing output.
-func run_command(command []string) error {
+func run_command(command []string) (bool, error) {
 	fmt.Println(strings.Repeat("=", 64))
 	fmt.Println(command)
 	cmd := exec.Command(command[0], command[1:]...)
 	// Connections
-	cmd.Stdout = os.Stdout
+	stdout, err := cmd.StdoutPipe()
+	if err != nil {
+		return false, fmt.Errorf("Failed getting stdout pipe: %v", err)
+	}
+	var do_autoremove bool = false
+	go func() {
+		var (
+			buf  []byte = make([]byte, 1024)
+			read int
+			err  error
+			text string
+		)
+		for {
+			read, err = stdout.Read(buf)
+			if err != nil {
+				if errors.Is(err, os.ErrClosed) || errors.Is(err, io.EOF) {
+					return
+				}
+				fmt.Println("While reading:", err)
+				return
+			}
+			if read != 0 {
+				text = string(buf[0:read])
+				fmt.Print(text)
+				if strings.Contains(text, "autoremove") {
+					do_autoremove = true
+					return
+				}
+			}
+		}
+	}()
+
+	//cmd.Stdout = os.Stdout
 	cmd.Stderr = os.Stderr
 	cmd.Stdin = os.Stdin
 
 	cmd.SysProcAttr = &syscall.SysProcAttr{}
 	cmd.SysProcAttr.Credential = &syscall.Credential{Uid: 0, Gid: 0}
-	err := cmd.Run()
+	err = cmd.Run()
 	fmt.Println(strings.Repeat("=", 50))
-	if err != nil {
-		fmt.Println("Did you forget to:")
-		fmt.Println("  sudo chown root:root aptgrade")
-		fmt.Println("  sudo chmod a+s aptgrade")
-		fmt.Println("Command failed:", err)
-	}
-	return err
+	return do_autoremove, err
 }
 
 func main() {
@@ -37,7 +65,25 @@ func main() {
 		fmt.Println("This program requires SETUID.")
 		os.Exit(2)
 	}
-	run_command([]string{"/usr/bin/apt", "update"})
-	run_command([]string{"/usr/bin/apt", "upgrade", "-y"})
+	_, err := run_command([]string{"/usr/bin/apt", "update"})
+	if err != nil {
+		fmt.Println("Did you forget to:")
+		fmt.Println("  sudo chown root:root aptgrade")
+		fmt.Println("  sudo chmod a+s aptgrade")
+		fmt.Println("Command failed:", err)
+		os.Exit(2)
+	}
+	do_autoremove, err := run_command([]string{"/usr/bin/apt", "upgrade", "-y"})
+	if err != nil {
+		fmt.Println("Command failed:", err)
+		os.Exit(2)
+	}
+	if do_autoremove {
+		_, err = run_command([]string{"/usr/bin/apt", "autoremove", "-y"})
+		if err != nil {
+			fmt.Println("Command failed:", err)
+			os.Exit(2)
+		}
+	}
 	fmt.Println("Done")
 }