Skip to content

Commit a96850f

Browse files
committed
commands: add system service commands
1 parent 502f3e2 commit a96850f

File tree

10 files changed

+775
-23
lines changed

10 files changed

+775
-23
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ require (
1414
github.com/ipfs/go-ipld-format v0.5.0
1515
github.com/ipfs/kubo v0.21.0
1616
github.com/jaevor/go-nanoid v1.3.0
17+
github.com/kardianos/service v1.2.2
1718
github.com/mattn/go-colorable v0.1.4
1819
github.com/muesli/termenv v0.15.1
1920
github.com/multiformats/go-multiaddr v0.9.0
@@ -97,3 +98,5 @@ require (
9798
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
9899
lukechampine.com/blake3 v1.2.1 // indirect
99100
)
101+
102+
replace github.com/kardianos/service => github.com/djdv/service v1.2.1-0.20230705182121-36b49552050b

go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etly
3030
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
3131
github.com/djdv/p9 v0.2.1-0.20230601152255-7d74b92b80b0 h1:TmRbQZzEz+AbtudHs+4OtcggEd6mgbcf1UA3DdUMg/M=
3232
github.com/djdv/p9 v0.2.1-0.20230601152255-7d74b92b80b0/go.mod h1:TGzUXNk2SONYuJnhbmn6w308jdHeBqWwQUqr3yng5XQ=
33+
github.com/djdv/service v1.2.1-0.20230705182121-36b49552050b h1:yGeAxK6k9g1N0T33iw2yTlVNel7otQonAAyft46Z59U=
34+
github.com/djdv/service v1.2.1-0.20230705182121-36b49552050b/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
3335
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
3436
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
3537
github.com/facebookgo/atomicfile v0.0.0-20151019160806-2de1f203e7d5 h1:BBso6MBKW8ncyZLv37o+KNyy0HrrHgfnOaGQC2qvN+A=
@@ -342,6 +344,7 @@ golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5h
342344
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
343345
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
344346
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
347+
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
345348
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
346349
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
347350
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

internal/commands/daemon.go

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,23 @@ const (
9696
errShutdownDisposition = generic.ConstError("invalid shutdown disposition")
9797
)
9898

99+
// Daemon constructs the command which
100+
// hosts the file system service server.
101+
func Daemon() command.Command {
102+
const (
103+
name = daemonCommandName
104+
synopsis = "Host system services."
105+
)
106+
usage := header("File system service daemon.") +
107+
"\n\n" + synopsis
108+
return command.MakeVariadicCommand[daemonOptions](
109+
name, synopsis, usage, daemonExecute,
110+
command.WithSubcommands(Service()),
111+
)
112+
}
113+
99114
func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
115+
bindDaemonFlags(flagSet, do)
100116
userMaddrs, err := userServiceMaddrs()
101117
if err != nil {
102118
panic(err)
@@ -118,9 +134,12 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
118134
}
119135
return nil
120136
})
137+
}
138+
139+
func bindDaemonFlags(flagSet *flag.FlagSet, options *daemonOptions) {
121140
const serverUsage = "listening socket `maddr`" +
122141
"\ncan be specified multiple times and/or comma separated"
123-
flagSetFunc(flagSet, serverFlagName, serverUsage, do,
142+
flagSetFunc(flagSet, serverFlagName, serverUsage, options,
124143
func(value []multiaddr.Multiaddr, settings *daemonSettings) error {
125144
settings.serverMaddrs = append(settings.serverMaddrs, value...)
126145
return nil
@@ -129,7 +148,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
129148
exitName = exitAfterFlagName
130149
exitUsage = "check every `interval` (e.g. \"30s\") and shutdown the daemon if its idle"
131150
)
132-
flagSetFunc(flagSet, exitName, exitUsage, do,
151+
flagSetFunc(flagSet, exitName, exitUsage, options,
133152
func(value time.Duration, settings *daemonSettings) error {
134153
settings.exitInterval = value
135154
return nil
@@ -138,7 +157,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
138157
uidName = apiFlagPrefix + "uid"
139158
uidUsage = "file owner's `uid`"
140159
)
141-
flagSetFunc(flagSet, uidName, uidUsage, do,
160+
flagSetFunc(flagSet, uidName, uidUsage, options,
142161
func(value p9.UID, settings *daemonSettings) error {
143162
settings.nineIDs.uid = value
144163
return nil
@@ -149,7 +168,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
149168
gidName = apiFlagPrefix + "gid"
150169
gidUsage = "file owner's `gid`"
151170
)
152-
flagSetFunc(flagSet, gidName, gidUsage, do,
171+
flagSetFunc(flagSet, gidName, gidUsage, options,
153172
func(value p9.GID, settings *daemonSettings) error {
154173
settings.nineIDs.gid = value
155174
return nil
@@ -161,7 +180,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
161180
permissionsUsage = "`permissions` to use when creating service files"
162181
)
163182
apiPermissions := fs.FileMode(apiPermissionsDefault)
164-
flagSetFunc(flagSet, permissionsName, permissionsUsage, do,
183+
flagSetFunc(flagSet, permissionsName, permissionsUsage, options,
165184
func(value string, settings *daemonSettings) error {
166185
permissions, err := parsePOSIXPermissions(apiPermissions, value)
167186
if err != nil {
@@ -176,13 +195,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
176195
}
177196

178197
func (do daemonOptions) make() (daemonSettings, error) {
179-
settings := daemonSettings{
180-
nineIDs: nineIDs{
181-
uid: apiUIDDefault,
182-
gid: apiGIDDefault,
183-
},
184-
permissions: apiPermissionsDefault,
185-
}
198+
settings := makeDaemonSettings()
186199
if err := generic.ApplyOptions(&settings, do...); err != nil {
187200
return daemonSettings{}, err
188201
}
@@ -199,26 +212,28 @@ func (do daemonOptions) make() (daemonSettings, error) {
199212
return settings, nil
200213
}
201214

202-
// Daemon constructs the command which
203-
// hosts the file system service server.
204-
func Daemon() command.Command {
205-
const (
206-
name = daemonCommandName
207-
synopsis = "Host system services."
208-
)
209-
usage := header("File system service daemon.") +
210-
"\n\n" + synopsis
211-
return command.MakeVariadicCommand[daemonOptions](name, synopsis, usage, daemonExecute)
215+
func makeDaemonSettings() daemonSettings {
216+
return daemonSettings{
217+
nineIDs: nineIDs{
218+
uid: apiUIDDefault,
219+
gid: apiGIDDefault,
220+
},
221+
permissions: apiPermissionsDefault,
222+
}
212223
}
213224

214225
func daemonExecute(ctx context.Context, options ...daemonOption) error {
215226
settings, err := daemonOptions(options).make()
216227
if err != nil {
217228
return err
218229
}
230+
return daemonRun(ctx, &settings)
231+
}
232+
233+
func daemonRun(ctx context.Context, settings *daemonSettings) error {
219234
dCtx, cancel := context.WithCancel(ctx)
220235
defer cancel()
221-
system, err := newSystem(dCtx, &settings)
236+
system, err := newSystem(dCtx, settings)
222237
if err != nil {
223238
return err
224239
}

0 commit comments

Comments
 (0)