Skip to content

Commit a98f3d0

Browse files
committed
feat: weave initia start & weave initia stop
1 parent 9b7ca76 commit a98f3d0

File tree

7 files changed

+194
-30
lines changed

7 files changed

+194
-30
lines changed

cmd/init.go

+3-25
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import (
1111

1212
func InitCommand() *cobra.Command {
1313
initCmd := &cobra.Command{
14-
Use: "init",
15-
Long: "Init for initializing the weave CLI.",
14+
Use: "init",
15+
Short: "Init for initializing the weave CLI.",
16+
Long: "Init for initializing the weave CLI.",
1617
RunE: func(cmd *cobra.Command, args []string) error {
1718
if utils.IsFirstTimeSetup() {
1819
_, err := tea.NewProgram(models.NewExistingAppChecker()).Run()
@@ -31,26 +32,3 @@ func InitCommand() *cobra.Command {
3132

3233
return initCmd
3334
}
34-
35-
func InitiaInitCommand() *cobra.Command {
36-
initCmd := &cobra.Command{
37-
Use: "initia init",
38-
Long: "Init for initializing the initia CLI.",
39-
RunE: func(cmd *cobra.Command, args []string) error {
40-
if utils.IsFirstTimeSetup() {
41-
_, err := tea.NewProgram(models.NewExistingAppChecker()).Run()
42-
if err != nil {
43-
return err
44-
}
45-
}
46-
47-
_, err := tea.NewProgram(weaveinit.NewRunL1NodeNetworkSelect(weaveinit.NewRunL1NodeState())).Run()
48-
if err != nil {
49-
return err
50-
}
51-
return nil
52-
},
53-
}
54-
55-
return initCmd
56-
}

cmd/initia.go

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package cmd
2+
3+
import (
4+
tea "github.com/charmbracelet/bubbletea"
5+
"github.com/spf13/cobra"
6+
7+
"github.com/initia-labs/weave/models"
8+
"github.com/initia-labs/weave/models/weaveinit"
9+
"github.com/initia-labs/weave/utils"
10+
)
11+
12+
func InitiaCommand() *cobra.Command {
13+
cmd := &cobra.Command{
14+
Use: "initia",
15+
Short: "Initia subcommands",
16+
DisableFlagParsing: true,
17+
SuggestionsMinimumDistance: 2,
18+
}
19+
20+
cmd.AddCommand(
21+
initiaInitCommand(),
22+
initiaStartCommand(),
23+
initiaStopCommand(),
24+
initiaLogCommand(),
25+
)
26+
27+
return cmd
28+
}
29+
30+
func initiaInitCommand() *cobra.Command {
31+
initCmd := &cobra.Command{
32+
Use: "init",
33+
Short: "Init for initializing the initia CLI.",
34+
RunE: func(cmd *cobra.Command, args []string) error {
35+
if utils.IsFirstTimeSetup() {
36+
_, err := tea.NewProgram(models.NewExistingAppChecker()).Run()
37+
if err != nil {
38+
return err
39+
}
40+
}
41+
42+
_, err := tea.NewProgram(weaveinit.NewRunL1NodeNetworkSelect(weaveinit.NewRunL1NodeState())).Run()
43+
if err != nil {
44+
return err
45+
}
46+
return nil
47+
},
48+
}
49+
50+
return initCmd
51+
}
52+
53+
func initiaStartCommand() *cobra.Command {
54+
startCmd := &cobra.Command{
55+
Use: "start",
56+
Short: "Start the initiad full node application.",
57+
RunE: func(cmd *cobra.Command, args []string) error {
58+
err := utils.StartService(utils.GetRunL1NodeServiceName())
59+
if err != nil {
60+
return err
61+
}
62+
return nil
63+
},
64+
}
65+
66+
return startCmd
67+
}
68+
69+
func initiaStopCommand() *cobra.Command {
70+
startCmd := &cobra.Command{
71+
Use: "stop",
72+
Short: "Stop the initiad full node application.",
73+
RunE: func(cmd *cobra.Command, args []string) error {
74+
err := utils.StopService(utils.GetRunL1NodeServiceName())
75+
if err != nil {
76+
return err
77+
}
78+
return nil
79+
},
80+
}
81+
82+
return startCmd
83+
}
84+
85+
func initiaLogCommand() *cobra.Command {
86+
logCmd := &cobra.Command{
87+
Use: "log",
88+
Short: "Stream the logs of the initiad full node application.",
89+
RunE: func(cmd *cobra.Command, args []string) error {
90+
// TODO: Implement log streaming
91+
92+
return nil
93+
},
94+
}
95+
96+
return logCmd
97+
}

cmd/root.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func Execute() error {
4444
}
4545

4646
rootCmd.AddCommand(InitCommand())
47-
rootCmd.AddCommand(InitiaInitCommand())
47+
rootCmd.AddCommand(InitiaCommand())
4848

4949
return rootCmd.ExecuteContext(context.Background())
5050
}

models/weaveinit/run_l1_node.go

+4
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,10 @@ func initializeApp(state *RunL1NodeState) tea.Cmd {
822822
}
823823
}
824824

825+
if err = utils.CreateService(utils.GetRunL1NodeServiceName(), utils.GetDarwinRunL1NodePlist(state.initiadVersion)); err != nil {
826+
panic(fmt.Sprintf("failed to create service: %v", err))
827+
}
828+
825829
return utils.EndLoading{}
826830
}
827831
}

utils/constants.go

+3
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ const (
99
InitiaDirectory = ".initia"
1010
InitiaConfigDirectory = InitiaDirectory + "/config"
1111
InitiaDataDirectory = InitiaDirectory + "/data"
12+
13+
RunL1NodeDarwinServiceName = "com.initia.daemon"
14+
RunL1NodeLinuxServiceName = "initia.service"
1215
)

utils/logs.go

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
package utils

utils/service_manager.go

+85-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,57 @@ package utils
22

33
import (
44
"fmt"
5+
"os"
56
"os/exec"
7+
"path/filepath"
68
"runtime"
79
"strings"
810
)
911

12+
const DarwinRunL1NodeTemplate = `<?xml version="1.0" encoding="UTF-8"?>
13+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
14+
<plist version="1.0">
15+
<dict>
16+
<key>Label</key>
17+
<string>com.initia.daemon</string>
18+
19+
<key>ProgramArguments</key>
20+
<array>
21+
<string>%[1]s/initiad</string>
22+
<string>start</string>
23+
<string>--home=%[3]s</string>
24+
</array>
25+
26+
<key>RunAtLoad</key>
27+
<true/>
28+
29+
<key>KeepAlive</key>
30+
<true/>
31+
32+
<!-- Adding the environment variable -->
33+
<key>EnvironmentVariables</key>
34+
<dict>
35+
<key>HOME</key>
36+
<string>%[2]s</string>
37+
<key>DYLD_LIBRARY_PATH</key>
38+
<string>%[1]s</string>
39+
</dict>
40+
41+
<key>StandardOutPath</key>
42+
<string>/tmp/initia.stdout.log</string>
43+
44+
<key>StandardErrorPath</key>
45+
<string>/tmp/initia.stderr.log</string>
46+
47+
<key>HardResourceLimits</key>
48+
<dict>
49+
<key>NumberOfFiles</key>
50+
<integer>65535</integer>
51+
</dict>
52+
</dict>
53+
</plist>
54+
`
55+
1056
func CreateService(serviceName, serviceContent string) error {
1157
switch runtime.GOOS {
1258
case "linux":
@@ -48,8 +94,8 @@ func EnableService(serviceName string) error {
4894
}
4995

5096
func LoadService(serviceName string) error {
51-
cmd := exec.Command("sudo", "launchctl", "load", fmt.Sprintf("/Library/LaunchDaemons/%s.plist", serviceName))
52-
if err := cmd.Run(); err != nil {
97+
loadCmd := exec.Command("sudo", "launchctl", "load", fmt.Sprintf("/Library/LaunchDaemons/%s.plist", serviceName))
98+
if err := loadCmd.Run(); err != nil {
5399
return fmt.Errorf("failed to load service: %v", err)
54100
}
55101
return nil
@@ -64,10 +110,16 @@ func StartService(serviceName string) error {
64110
}
65111
return nil
66112
case "darwin":
67-
cmd := exec.Command("sudo", "launchctl", "load", fmt.Sprintf("/Library/LaunchDaemons/%s.plist", serviceName))
68-
if err := cmd.Run(); err != nil {
113+
loadCmd := exec.Command("sudo", "launchctl", "load", fmt.Sprintf("/Library/LaunchDaemons/%s.plist", serviceName))
114+
if err := loadCmd.Run(); err != nil {
115+
return fmt.Errorf("failed to load service: %v", err)
116+
}
117+
118+
startCmd := exec.Command("sudo", "launchctl", "start", serviceName)
119+
if err := startCmd.Run(); err != nil {
69120
return fmt.Errorf("failed to start service: %v", err)
70121
}
122+
71123
return nil
72124
default:
73125
return fmt.Errorf("unsupported operating system: %s", runtime.GOOS)
@@ -92,3 +144,32 @@ func StopService(serviceName string) error {
92144
return fmt.Errorf("unsupported operating system: %s", runtime.GOOS)
93145
}
94146
}
147+
148+
func GetRunL1NodeServiceName() string {
149+
switch runtime.GOOS {
150+
case "linux":
151+
return RunL1NodeLinuxServiceName
152+
case "darwin":
153+
return RunL1NodeDarwinServiceName
154+
default:
155+
panic(fmt.Errorf("unsupported operating system: %s", runtime.GOOS))
156+
}
157+
}
158+
159+
func GetDarwinRunL1NodePlist(version string) string {
160+
userHome, err := os.UserHomeDir()
161+
if err != nil {
162+
panic(fmt.Errorf("failed to get user home directory: %v", err))
163+
}
164+
weaveDataPath := filepath.Join(userHome, WeaveDataDirectory)
165+
binaryPath := filepath.Join(weaveDataPath, "initia@"+version)
166+
initiaHome := filepath.Join(userHome, InitiaDirectory)
167+
if err = os.Setenv("DYLD_LIBRARY_PATH", binaryPath); err != nil {
168+
panic(fmt.Errorf("failed to set DYLD_LIBRARY_PATH: %v", err))
169+
}
170+
if err = os.Setenv("HOME", userHome); err != nil {
171+
panic(fmt.Errorf("failed to set HOME: %v", err))
172+
}
173+
174+
return fmt.Sprintf(DarwinRunL1NodeTemplate, binaryPath, userHome, initiaHome)
175+
}

0 commit comments

Comments
 (0)