feat: installer syscheck + prompt (wip)
This commit is contained in:
		| @@ -19,29 +19,75 @@ var logo = ` | |||||||
|                    |__/ |                    |__/ | ||||||
| ` | ` | ||||||
|  |  | ||||||
|  | var finish = ` | ||||||
|  | >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> | ||||||
|  | |                                                   | | ||||||
|  | |    Open http://localhost:3000/ in your browser    | | ||||||
|  | |    to complete the installation!                  | | ||||||
|  | |                                                   | | ||||||
|  | <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< | ||||||
|  | ` | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| 	fmt.Println(chalk.Yellow.Color(logo)) | 	fmt.Println(chalk.Yellow.Color(logo)) | ||||||
| 	fmt.Println(chalk.Bold.TextStyle("Installer for Wiki.js 2.x")) | 	fmt.Println(chalk.Bold.TextStyle("Installer for Wiki.js 2.x")) | ||||||
| 	fmt.Printf("for %s-%s\n\n", runtime.GOOS, runtime.GOARCH) | 	fmt.Printf("%s-%s\n\n", runtime.GOOS, runtime.GOARCH) | ||||||
|  |  | ||||||
|  | 	// Check system requirements | ||||||
|  |  | ||||||
|  | 	fmt.Println(chalk.Bold.TextStyle("Verifying system requirements...")) | ||||||
|  | 	CheckNodeJs() | ||||||
|  | 	CheckRAM() | ||||||
|  | 	fmt.Println(chalk.Bold.TextStyle("\nSetup")) | ||||||
|  |  | ||||||
| 	// Prompt for build to install | 	// Prompt for build to install | ||||||
|  |  | ||||||
| 	prompt := promptui.Select{ | 	promptBuild := promptui.Select{ | ||||||
| 		Label: "Select Build to install", | 		Label: "Select Build to install", | ||||||
| 		Items: []string{"Stable", "Dev"}, | 		Items: []string{"Stable", "Dev"}, | ||||||
|  | 		Templates: &promptui.SelectTemplates{ | ||||||
|  | 			Help:     " ", | ||||||
|  | 			Selected: chalk.Green.Color("✔") + " Build: {{ . }}", | ||||||
|  | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	_, result, err := prompt.Run() | 	_, _, err := promptBuild.Run() | ||||||
|  |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		fmt.Printf("Prompt failed %v\n", err) | 		fmt.Printf("Prompt failed %v\n", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	fmt.Printf("You choose %q\n", result) | 	// Choose database driver | ||||||
|  |  | ||||||
|  | 	promptDB := promptui.Select{ | ||||||
|  | 		Label: "Select database driver", | ||||||
|  | 		Items: []string{"MariaDB", "MySQL", "MS SQL Server", "PostgreSQL", "SQLite"}, | ||||||
|  | 		Templates: &promptui.SelectTemplates{ | ||||||
|  | 			Help:     " ", | ||||||
|  | 			Selected: chalk.Green.Color("✔") + " Database Driver: {{ . }}", | ||||||
|  | 		}, | ||||||
|  | 		Size: 10, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_, _, err = promptDB.Run() | ||||||
|  |  | ||||||
|  | 	// Port | ||||||
|  |  | ||||||
|  | 	promptPort := promptui.Prompt{ | ||||||
|  | 		Label:   "Port", | ||||||
|  | 		Default: "3000", | ||||||
|  | 		Templates: &promptui.PromptTemplates{ | ||||||
|  | 			Success: chalk.Green.Color("✔") + " Port: {{ . }}", | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	_, err = promptPort.Run() | ||||||
|  |  | ||||||
| 	// Download archives... | 	// Download archives... | ||||||
|  |  | ||||||
|  | 	fmt.Println(chalk.Bold.TextStyle("\nDownloading packages...")) | ||||||
|  |  | ||||||
| 	uiprogress.Start() | 	uiprogress.Start() | ||||||
| 	bar := uiprogress.AddBar(100) | 	bar := uiprogress.AddBar(100) | ||||||
|  |  | ||||||
| @@ -51,4 +97,6 @@ func main() { | |||||||
| 	for bar.Incr() { | 	for bar.Incr() { | ||||||
| 		time.Sleep(time.Millisecond * 20) | 		time.Sleep(time.Millisecond * 20) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Println("\n" + chalk.Yellow.Color(finish)) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										54
									
								
								dev/installer/syscheck.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								dev/installer/syscheck.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | package main | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"log" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  |  | ||||||
|  | 	"github.com/blang/semver" | ||||||
|  | 	"github.com/pbnjay/memory" | ||||||
|  | 	"github.com/ttacon/chalk" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const nodejsSemverRange = ">=8.11.3 <10.0.0" | ||||||
|  | const ramMin = 768 | ||||||
|  |  | ||||||
|  | // CheckNodeJs checks if Node.js is installed and has minimal supported version | ||||||
|  | func CheckNodeJs() bool { | ||||||
|  | 	cmd := exec.Command("node", "-v") | ||||||
|  | 	cmdOutput, err := cmd.CombinedOutput() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal(err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	validRange := semver.MustParseRange(nodejsSemverRange) | ||||||
|  | 	nodeVersion, err := semver.ParseTolerant(string(cmdOutput[:])) | ||||||
|  | 	if !validRange(nodeVersion) { | ||||||
|  | 		fmt.Printf(chalk.Red.Color("Error: Installed Node.js version is not supported! %s"), nodejsSemverRange) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Printf(chalk.Green.Color("✔")+" Node.js %s: OK\n", nodeVersion.String()) | ||||||
|  |  | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CheckRAM checks if system total RAM meets requirements | ||||||
|  | func CheckRAM() bool { | ||||||
|  | 	var totalRAM = memory.TotalMemory() / 1024 / 1024 | ||||||
|  | 	if totalRAM < ramMin { | ||||||
|  | 		fmt.Printf(chalk.Red.Color("Error: System does not meet RAM requirements. %s MB minimum."), ramMin) | ||||||
|  | 		os.Exit(1) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Printf(chalk.Green.Color("✔")+" Total System RAM %d MB: OK\n", totalRAM) | ||||||
|  |  | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CheckNetworkAccess checks if download server can be reached | ||||||
|  | func CheckNetworkAccess() bool { | ||||||
|  | 	// TODO | ||||||
|  | 	return true | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user