Files
zrok/agent/sharePrivate.go
T

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
}
}