Prechádzať zdrojové kódy

Added Samba auto install

TC pushbot 5 4 rokov pred
rodič
commit
870605ab2e
2 zmenil súbory, kde vykonal 135 pridanie a 5 odobranie
  1. 126 0
      apt/apt.go
  2. 9 5
      main.go

+ 126 - 0
apt/apt.go

@@ -0,0 +1,126 @@
+package apt
+
+
+import (
+	"os/exec"
+	"runtime"
+	"net/http"
+	"errors"
+	"encoding/json"
+	"strings"
+	"log"
+	"os"
+)
+
+/*
+	Pacakge management tool for Linux OS with APT
+
+	ONLY USABLE under Linux environment
+*/
+
+type AptPackageManager struct{
+	AllowAutoInstall bool
+}
+
+func NewPackageManager(autoInstall bool) *AptPackageManager{
+	return &AptPackageManager{
+		AllowAutoInstall: autoInstall,
+	}
+}
+
+//Install the given package if not exists. Set mustComply to true for "panic on failed to install"
+func (a *AptPackageManager)InstallIfNotExists(pkgname string, mustComply bool) error{
+	//Clear the pkgname
+	pkgname = strings.ReplaceAll(pkgname, "&","")
+	pkgname = strings.ReplaceAll(pkgname, "|","")
+	
+	if runtime.GOOS == "windows" {
+		//Check if the command already exists in windows path paramters.
+		cmd := exec.Command("where", pkgname, "2>", "nul")
+		_, err := cmd.CombinedOutput()
+		if err != nil{
+			return errors.New("Package " + pkgname + " not found in Windows %PATH%.")
+		}
+		return nil
+	}
+
+	if (a.AllowAutoInstall == false){
+		return errors.New("Package auto install is disabled")
+	}
+
+	cmd := exec.Command("whereis", pkgname)
+	out, err := cmd.CombinedOutput()
+	if err != nil{
+		return err
+	}
+
+	packageInfo := strings.Split(strings.TrimSpace(string(out)), ":")
+	//log.Println(packageInfo)
+	if (len(packageInfo) > 1 && packageInfo[1] != ""){
+		return nil
+	}else{
+		//Package not installed. Install if now if running in sudo mode
+		log.Println("Installing package " + pkgname + "...")
+		cmd := exec.Command("apt-get", "install", "-y", pkgname)
+		cmd.Stdout = os.Stdout
+		cmd.Stderr = os.Stderr
+		err := cmd.Run()
+		if err != nil{
+			if (mustComply){
+				//Panic and terminate server process
+				log.Println("Installation failed on package: " + pkgname, string(out))
+				os.Exit(0)
+			}else{
+				log.Println("Installation failed on package: " + pkgname)
+				log.Println(string(out))
+			}
+			return err
+		}
+		return nil
+	}
+
+	return nil
+}
+
+
+func HandlePackageListRequest(w http.ResponseWriter, r *http.Request){
+	if runtime.GOOS == "windows" {
+		w.Header().Set("Content-Type", "application/json")
+		w.Write([]byte("{\"error\":\"" + "Function disabled on Windows" + "\"}"))
+		return
+	}
+	cmd := exec.Command("apt", "list", "--installed")
+	out, err := cmd.CombinedOutput()
+	if err != nil{
+		w.Header().Set("Content-Type", "application/json")
+		w.Write([]byte("{\"error\":\"" + err.Error() + "\"}"))
+		return
+	}
+
+	results := [][]string{}
+	//Parse the output string
+	installedPackages := strings.Split(string(out), "\n")
+	for _, thisPackage := range installedPackages{
+		if len(thisPackage) > 0{
+			packageInfo := strings.Split(thisPackage, "/")
+			packageName := packageInfo[0]
+			if len(packageInfo) >= 2{
+				packageVersion := strings.Split(packageInfo[1], ",")[1]
+				if (packageVersion[:3] == "now"){
+					packageVersion = packageVersion[4:]
+				}
+				if (strings.Contains(packageVersion, "[installed") && packageVersion[len(packageVersion) - 1:] != "]"){
+					packageVersion = packageVersion + ",automatic]"
+				}
+
+				results = append(results, []string{packageName, packageVersion})
+			}
+		}
+	}
+
+	jsonString, _ := json.Marshal(results);
+	w.Header().Set("Content-Type", "application/json")
+	w.Write(jsonString)
+	return
+}
+

+ 9 - 5
main.go

@@ -8,6 +8,8 @@ import (
 	"os/signal"
 	"syscall"
 
+	"git.arozos.com/ArSamba/apt"
+
 	"git.arozos.com/ArSamba/aroz"
 )
 
@@ -42,6 +44,10 @@ func main() {
 		InitFWSize:  []int{350, 560},
 	})
 
+	//Install samba if it is not installed
+	pm := apt.NewPackageManager(true)
+	pm.InstallIfNotExists("samba", true)
+
 	//Register the standard web services urls
 	fs := http.FileServer(http.Dir("./web"))
 	http.HandleFunc("/create", handleNewUser)
@@ -60,11 +66,9 @@ func main() {
 }
 
 func handleGetStatus(w http.ResponseWriter, r *http.Request) {
-	username, err := mv(r, "username", false)
-	if err != nil {
-		sendErrorResponse(w, "Invalid username given")
-		return
-	}
+	//Get username from request
+	username, _ := handler.GetUserInfoFromRequest(w, r)
+
 	//Check if the user has already in samba user
 	log.Println("Checking User Status", username)