|
1 | 1 | package system |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "fmt" |
| 5 | + "strings" |
| 6 | + |
4 | 7 | "github.com/spf13/cobra" |
5 | 8 |
|
6 | 9 | "github.com/bcmi-labs/orchestrator/cmd/arduino-app-cli/internal/servicelocator" |
| 10 | + "github.com/bcmi-labs/orchestrator/cmd/feedback" |
7 | 11 | "github.com/bcmi-labs/orchestrator/internal/orchestrator" |
8 | 12 | "github.com/bcmi-labs/orchestrator/internal/orchestrator/config" |
| 13 | + "github.com/bcmi-labs/orchestrator/internal/update" |
| 14 | + "github.com/bcmi-labs/orchestrator/internal/update/apt" |
| 15 | + "github.com/bcmi-labs/orchestrator/internal/update/arduino" |
9 | 16 | ) |
10 | 17 |
|
11 | 18 | func NewSystemCmd(cfg config.Configuration) *cobra.Command { |
12 | 19 | cmd := &cobra.Command{ |
13 | | - Use: "system", |
14 | | - Hidden: true, |
| 20 | + Use: "system", |
15 | 21 | } |
16 | 22 |
|
17 | 23 | cmd.AddCommand(newDownloadImage(cfg)) |
| 24 | + cmd.AddCommand(newUpdateCmd()) |
18 | 25 |
|
19 | 26 | return cmd |
20 | 27 | } |
21 | 28 |
|
22 | 29 | func newDownloadImage(cfg config.Configuration) *cobra.Command { |
23 | 30 | cmd := &cobra.Command{ |
24 | | - Use: "init", |
25 | | - Args: cobra.ExactArgs(0), |
| 31 | + Use: "init", |
| 32 | + Args: cobra.ExactArgs(0), |
| 33 | + Hidden: true, |
26 | 34 | RunE: func(cmd *cobra.Command, _ []string) error { |
27 | 35 | return orchestrator.SystemInit(cmd.Context(), cfg.UsedPythonImageTag, servicelocator.GetStaticStore()) |
28 | 36 | }, |
29 | 37 | } |
30 | 38 |
|
31 | 39 | return cmd |
32 | 40 | } |
| 41 | + |
| 42 | +func newUpdateCmd() *cobra.Command { |
| 43 | + var onlyArduino bool |
| 44 | + var forceYes bool |
| 45 | + cmd := &cobra.Command{ |
| 46 | + Use: "update", |
| 47 | + Args: cobra.ExactArgs(0), |
| 48 | + RunE: func(cmd *cobra.Command, _ []string) error { |
| 49 | + filterFunc := getFilterFunc(onlyArduino) |
| 50 | + |
| 51 | + updater := getUpdater() |
| 52 | + |
| 53 | + pkgs, err := updater.ListUpgradablePackages(cmd.Context(), filterFunc) |
| 54 | + if err != nil { |
| 55 | + return err |
| 56 | + } |
| 57 | + if len(pkgs) == 0 { |
| 58 | + feedback.Printf("No upgradable packages found.") |
| 59 | + return nil |
| 60 | + } |
| 61 | + |
| 62 | + feedback.Printf("Found %d upgradable packages:", len(pkgs)) |
| 63 | + for _, pkg := range pkgs { |
| 64 | + feedback.Printf("Package: %s, From: %s, To: %s", pkg.Name, pkg.FromVersion, pkg.ToVersion) |
| 65 | + } |
| 66 | + |
| 67 | + feedback.Printf("Do you want to upgrade these packages? (yes/no)") |
| 68 | + var yes bool |
| 69 | + if forceYes { |
| 70 | + yes = true |
| 71 | + } else { |
| 72 | + var yesInput string |
| 73 | + _, err := fmt.Scanf("%s\n", &yesInput) |
| 74 | + if err != nil { |
| 75 | + return err |
| 76 | + } |
| 77 | + yes = strings.ToLower(yesInput) == "yes" || strings.ToLower(yesInput) == "y" |
| 78 | + } |
| 79 | + |
| 80 | + if !yes { |
| 81 | + return nil |
| 82 | + } |
| 83 | + |
| 84 | + if err := updater.UpgradePackages(cmd.Context(), pkgs); err != nil { |
| 85 | + return err |
| 86 | + } |
| 87 | + |
| 88 | + events := updater.Subscribe() |
| 89 | + for event := range events { |
| 90 | + feedback.Printf("[%s] %s", event.Type.String(), event.Data) |
| 91 | + |
| 92 | + if event.Type == update.DoneEvent { |
| 93 | + break |
| 94 | + } |
| 95 | + } |
| 96 | + return nil |
| 97 | + }, |
| 98 | + } |
| 99 | + |
| 100 | + cmd.PersistentFlags().BoolVar(&onlyArduino, "only-arduino", false, "Check for all upgradable packages") |
| 101 | + cmd.PersistentFlags().BoolVar(&forceYes, "--yes", false, "Automatically confirm all prompts") |
| 102 | + |
| 103 | + return cmd |
| 104 | +} |
| 105 | + |
| 106 | +func getUpdater() *update.Manager { |
| 107 | + return update.NewManager( |
| 108 | + apt.New(), |
| 109 | + arduino.NewArduinoPlatformUpdater(), |
| 110 | + ) |
| 111 | +} |
| 112 | + |
| 113 | +func getFilterFunc(onlyArduino bool) func(p update.UpgradablePackage) bool { |
| 114 | + if onlyArduino { |
| 115 | + return func(p update.UpgradablePackage) bool { |
| 116 | + return strings.HasPrefix(p.Name, "arduino-") |
| 117 | + } |
| 118 | + } |
| 119 | + return func(p update.UpgradablePackage) bool { |
| 120 | + return true |
| 121 | + } |
| 122 | +} |
0 commit comments