main.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "os/exec"
  7. "time"
  8. )
  9. /*
  10. ArozOS Launcher
  11. For auto update and future extension purpose
  12. Author: tobychui
  13. */
  14. const (
  15. launcherVersion = "1.0"
  16. )
  17. var (
  18. arozosRunning bool = false
  19. )
  20. func main() {
  21. //Print basic information
  22. fmt.Println("[LAUNCHER] ArozOS Launcher ver " + launcherVersion)
  23. binaryName := autoDetectExecutable()
  24. fmt.Println("[LAUNCHER] Choosing binary executable: " + binaryName)
  25. //Check if updates exists. If yes, overwrite it
  26. updateIfExists(binaryName)
  27. //Register the binary start path
  28. cmd := exec.Command(binaryName, os.Args[1:]...)
  29. cmd.Stdout = os.Stdout
  30. cmd.Stderr = os.Stderr
  31. //Register the http server to notify ArozOS there is a launcher will handle the update
  32. go func() {
  33. http.HandleFunc("/chk", func(w http.ResponseWriter, r *http.Request) {
  34. w.Write([]byte("LauncherA v" + launcherVersion))
  35. fmt.Println("[LAUNCHER] CHK RECV - DONE")
  36. })
  37. http.ListenAndServe("127.0.0.1:25576", nil)
  38. }()
  39. retryCounter := 0
  40. //Start the cmd
  41. for {
  42. startTime := time.Now().Unix()
  43. cmd.Run()
  44. endTime := time.Now().Unix()
  45. if endTime-startTime < 3 {
  46. //Less than 3 seconds, shd be crashed. Add to retry counter
  47. fmt.Println("[LAUNCHER] ArozOS Crashed. Restarting in 3 seconds... ")
  48. retryCounter++
  49. } else {
  50. fmt.Println("[LAUNCHER] ArozOS Exited. Restarting in 3 seconds... ")
  51. }
  52. time.Sleep(3 * time.Second)
  53. if retryCounter > 10 {
  54. //Restore from old version of the binary
  55. restoreOldArozOS()
  56. retryCounter = 0
  57. } else {
  58. updateIfExists(binaryName)
  59. }
  60. //Rebuild the start paramters
  61. cmd = exec.Command(binaryName, os.Args[1:]...)
  62. cmd.Stdout = os.Stdout
  63. cmd.Stderr = os.Stderr
  64. }
  65. }