mirror of
https://github.com/openziti/zrok.git
synced 2026-09-24 15:39:35 -05:00
98 lines
2.5 KiB
Go
98 lines
2.5 KiB
Go
package agent
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/michaelquigley/df/dl"
|
|
"github.com/openziti/zrok/v2/agent/agentGrpc"
|
|
"github.com/openziti/zrok/v2/agent/proctree"
|
|
"github.com/openziti/zrok/v2/cmd/zrok2/subordinate"
|
|
"github.com/openziti/zrok/v2/environment"
|
|
"github.com/openziti/zrok/v2/sdk/golang/sdk"
|
|
)
|
|
|
|
func (a *Agent) SharePrivate(req *SharePrivateRequest) (shareToken string, err error) {
|
|
root, err := environment.LoadRoot()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
if !root.IsEnabled() {
|
|
return "", errors.New("unable to load environment; did you 'zrok2 enable'?")
|
|
}
|
|
|
|
shr := &share{
|
|
shareMode: sdk.PrivateShareMode,
|
|
request: req,
|
|
sub: subordinate.NewMessageHandler(),
|
|
agent: a,
|
|
}
|
|
if req.PrivateShareToken == "" {
|
|
shr.backendMode = sdk.BackendMode(req.BackendMode)
|
|
}
|
|
shr.sub.MessageHandler = func(msg subordinate.Message) {
|
|
dl.Info(msg)
|
|
}
|
|
var bootErr error
|
|
bootHandler := NewShareBootHandler(shr, &bootErr)
|
|
shr.sub.BootHandler = bootHandler.HandleBoot
|
|
shr.sub.MalformedHandler = bootHandler.HandleMalformed
|
|
|
|
// build command using CommandBuilder
|
|
builder := NewSharePrivateCommand()
|
|
if req.PrivateShareToken == "" {
|
|
builder = builder.BackendMode(req.BackendMode)
|
|
}
|
|
shrCmd := builder.
|
|
ShareToken(req.PrivateShareToken).
|
|
Insecure(req.Insecure).
|
|
Open(!req.Closed).
|
|
AccessGrants(req.AccessGrants).
|
|
Target(req.Target).
|
|
Build()
|
|
|
|
// set share properties
|
|
shr.insecure = req.Insecure
|
|
shr.closed = req.Closed
|
|
shr.accessGrants = req.AccessGrants
|
|
shr.target = req.Target
|
|
|
|
dl.Infof("executing '%v'", shrCmd)
|
|
|
|
shr.process, err = proctree.StartChild(shr.sub.Tail, shrCmd...)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
<-shr.sub.BootComplete
|
|
|
|
if bootErr == nil {
|
|
go shr.monitor()
|
|
a.addShare <- shr
|
|
return shr.token, nil
|
|
|
|
} else {
|
|
if err := proctree.WaitChild(shr.process); err != nil {
|
|
dl.Errorf("error joining: %v", err)
|
|
}
|
|
return "", fmt.Errorf("unable to start share: %v", bootErr)
|
|
}
|
|
}
|
|
|
|
func (i *agentGrpcImpl) SharePrivate(_ context.Context, req *agentGrpc.SharePrivateRequest) (*agentGrpc.SharePrivateResponse, error) {
|
|
if shareToken, err := i.agent.SharePrivate(&SharePrivateRequest{
|
|
Target: req.Target,
|
|
PrivateShareToken: req.PrivateShareToken,
|
|
BackendMode: req.BackendMode,
|
|
Insecure: req.Insecure,
|
|
Closed: req.Closed,
|
|
AccessGrants: req.AccessGrants,
|
|
}); err == nil {
|
|
return &agentGrpc.SharePrivateResponse{Token: shareToken}, nil
|
|
} else {
|
|
return nil, err
|
|
}
|
|
}
|