Skip to content

Commit 5d3b6a5

Browse files
committed
commands: add system service commands
1 parent 8b5e240 commit 5d3b6a5

File tree

10 files changed

+774
-23
lines changed

10 files changed

+774
-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: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,21 @@ 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) {
100115
const (
101116
verboseName = "verbose"
@@ -112,9 +127,12 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
112127
}
113128
return nil
114129
})
130+
}
131+
132+
func bindDaemonFlags(flagSet *flag.FlagSet, options *daemonOptions) {
115133
const serverUsage = "listening socket `maddr`" +
116134
"\ncan be specified multiple times and/or comma separated"
117-
flagSetFunc(flagSet, serverFlagName, serverUsage, do,
135+
flagSetFunc(flagSet, serverFlagName, serverUsage, options,
118136
func(value []multiaddr.Multiaddr, settings *daemonSettings) error {
119137
settings.serverMaddrs = append(settings.serverMaddrs, value...)
120138
return nil
@@ -129,7 +147,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
129147
exitName = exitAfterFlagName
130148
exitUsage = "check every `interval` (e.g. \"30s\") and shutdown the daemon if its idle"
131149
)
132-
flagSetFunc(flagSet, exitName, exitUsage, do,
150+
flagSetFunc(flagSet, exitName, exitUsage, options,
133151
func(value time.Duration, settings *daemonSettings) error {
134152
settings.exitInterval = value
135153
return nil
@@ -138,7 +156,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
138156
uidName = apiFlagPrefix + "uid"
139157
uidUsage = "file owner's `uid`"
140158
)
141-
flagSetFunc(flagSet, uidName, uidUsage, do,
159+
flagSetFunc(flagSet, uidName, uidUsage, options,
142160
func(value p9.UID, settings *daemonSettings) error {
143161
settings.nineIDs.uid = value
144162
return nil
@@ -149,7 +167,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
149167
gidName = apiFlagPrefix + "gid"
150168
gidUsage = "file owner's `gid`"
151169
)
152-
flagSetFunc(flagSet, gidName, gidUsage, do,
170+
flagSetFunc(flagSet, gidName, gidUsage, options,
153171
func(value p9.GID, settings *daemonSettings) error {
154172
settings.nineIDs.gid = value
155173
return nil
@@ -161,7 +179,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
161179
permissionsUsage = "`permissions` to use when creating service files"
162180
)
163181
apiPermissions := fs.FileMode(apiPermissionsDefault)
164-
flagSetFunc(flagSet, permissionsName, permissionsUsage, do,
182+
flagSetFunc(flagSet, permissionsName, permissionsUsage, options,
165183
func(value string, settings *daemonSettings) error {
166184
permissions, err := parsePOSIXPermissions(apiPermissions, value)
167185
if err != nil {
@@ -176,13 +194,7 @@ func (do *daemonOptions) BindFlags(flagSet *flag.FlagSet) {
176194
}
177195

178196
func (do daemonOptions) make() (daemonSettings, error) {
179-
settings := daemonSettings{
180-
nineIDs: nineIDs{
181-
uid: apiUIDDefault,
182-
gid: apiGIDDefault,
183-
},
184-
permissions: apiPermissionsDefault,
185-
}
197+
settings := makeDaemonSettings()
186198
if err := generic.ApplyOptions(&settings, do...); err != nil {
187199
return daemonSettings{}, err
188200
}
@@ -199,26 +211,28 @@ func (do daemonOptions) make() (daemonSettings, error) {
199211
return settings, nil
200212
}
201213

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)
214+
func makeDaemonSettings() daemonSettings {
215+
return daemonSettings{
216+
nineIDs: nineIDs{
217+
uid: apiUIDDefault,
218+
gid: apiGIDDefault,
219+
},
220+
permissions: apiPermissionsDefault,
221+
}
212222
}
213223

214224
func daemonExecute(ctx context.Context, options ...daemonOption) error {
215225
settings, err := daemonOptions(options).make()
216226
if err != nil {
217227
return err
218228
}
229+
return daemonRun(ctx, &settings)
230+
}
231+
232+
func daemonRun(ctx context.Context, settings *daemonSettings) error {
219233
dCtx, cancel := context.WithCancel(ctx)
220234
defer cancel()
221-
system, err := newSystem(dCtx, &settings)
235+
system, err := newSystem(dCtx, settings)
222236
if err != nil {
223237
return err
224238
}

0 commit comments

Comments
 (0)