main.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/exec"
  8. "path/filepath"
  9. "time"
  10. )
  11. /*
  12. ArozOS Launcher
  13. For auto update and future extension purpose
  14. Author: tobychui
  15. */
  16. const (
  17. launcherVersion = "2"
  18. restoreRetryCount = 3 //The number of retry before restore old version, if not working after restoreRetryCount + 1 launcher will exit
  19. )
  20. var (
  21. norestart bool = false
  22. )
  23. func main() {
  24. //Print basic information
  25. fmt.Println("[LAUNCHER] ArozOS Launcher ver " + launcherVersion)
  26. binaryName := autoDetectExecutable()
  27. fmt.Println("[LAUNCHER] Choosing binary executable: " + binaryName)
  28. //Check if updates exists. If yes, overwrite it
  29. updateIfExists(binaryName)
  30. //Check launch paramter for norestart
  31. for _, arg := range os.Args[1:] {
  32. if arg == "-h" || arg == "-help" {
  33. //help argument, do not restart
  34. norestart = true
  35. } else if arg == "-version" || arg == "-v" {
  36. //version argument, no restart
  37. norestart = true
  38. }
  39. }
  40. //Register the binary start path
  41. cmd := exec.Command(binaryName, os.Args[1:]...)
  42. cmd.Dir = filepath.Dir(binaryName)
  43. cmd.Stdout = os.Stdout
  44. cmd.Stderr = os.Stderr
  45. //Register the http server to notify ArozOS there is a launcher will handle the update
  46. go func() {
  47. http.HandleFunc("/chk", func(w http.ResponseWriter, r *http.Request) {
  48. w.Write([]byte("LauncherA v" + launcherVersion))
  49. fmt.Println("[LAUNCHER] CHK RECV - DONE")
  50. })
  51. http.ListenAndServe("127.0.0.1:25576", nil)
  52. }()
  53. retryCounter := 0
  54. //Start the cmd
  55. for {
  56. startTime := time.Now().Unix()
  57. err := cmd.Run()
  58. endTime := time.Now().Unix()
  59. if err != nil {
  60. panic(err)
  61. }
  62. if norestart {
  63. return
  64. }
  65. if endTime-startTime < 3 {
  66. //Less than 3 seconds, shd be crashed. Add to retry counter
  67. fmt.Println("[LAUNCHER] ArozOS Crashed. Restarting in 3 seconds... ")
  68. retryCounter++
  69. } else {
  70. fmt.Println("[LAUNCHER] ArozOS Exited. Restarting in 3 seconds... ")
  71. retryCounter = 0
  72. }
  73. time.Sleep(3 * time.Second)
  74. if retryCounter > restoreRetryCount+1 {
  75. //Fail to start. Exit program
  76. log.Fatal("Unable to start ArozOS. Exiting to OS")
  77. return
  78. } else if retryCounter > restoreRetryCount {
  79. //Restore from old version of the binary
  80. restoreOldArozOS()
  81. } else {
  82. updateIfExists(binaryName)
  83. }
  84. //Rebuild the start paramters
  85. cmd = exec.Command(binaryName, os.Args[1:]...)
  86. cmd.Stdout = os.Stdout
  87. cmd.Stderr = os.Stderr
  88. }
  89. }