main.go 2.3 KB

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