update_helpers.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package debtik
  2. import (
  3. _ "embed"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. )
  8. // Embed the helpers so an upgrade launched by a legacy updater also updates
  9. // its own tooling when the newly installed server starts.
  10. //
  11. //go:embed scripts/debtik-update
  12. var updateHelper []byte
  13. //go:embed scripts/release-version.py
  14. var versionHelper []byte
  15. //go:embed scripts/install-dependencies.sh
  16. var dependenciesHelper []byte
  17. // RefreshUpdateHelpers refreshes an existing installation, without creating one
  18. // when the server is run from a development checkout.
  19. func RefreshUpdateHelpers(dir string) error {
  20. if _, err := os.Stat(filepath.Join(dir, "debtik-update")); os.IsNotExist(err) {
  21. return nil
  22. } else if err != nil {
  23. return err
  24. }
  25. for _, helper := range []struct {
  26. name string
  27. data []byte
  28. }{
  29. {"debtik-update", updateHelper},
  30. {"debtik-release-version", versionHelper},
  31. {"debtik-install-dependencies", dependenciesHelper},
  32. } {
  33. if err := writeHelper(dir, helper.name, helper.data); err != nil {
  34. return err
  35. }
  36. }
  37. return nil
  38. }
  39. func writeHelper(dir, name string, data []byte) error {
  40. f, err := os.CreateTemp(dir, ".debtik-helper-*")
  41. if err != nil {
  42. return err
  43. }
  44. defer os.Remove(f.Name())
  45. if err = f.Chmod(0750); err == nil {
  46. _, err = f.Write(data)
  47. }
  48. if err == nil {
  49. err = f.Sync()
  50. }
  51. closeErr := f.Close()
  52. if err == nil {
  53. err = closeErr
  54. }
  55. if err == nil {
  56. err = os.Rename(f.Name(), filepath.Join(dir, name))
  57. }
  58. if err != nil {
  59. return fmt.Errorf("install %s: %w", name, err)
  60. }
  61. return nil
  62. }