Add client daemon repo, server, and cmd
The commands added are: boundary daemon start boundary daemon stop boundary daemon add-token boundary daemon status boundary search If these actions are performed on a platform that doesn't support sqlite natively in go an error is returned. Besides some hooks into the cmd package all the significant logic resides in internal/clientcache feat (cmds/authenticate): output the token name when storing token feat: update go-dbw which now uses pure go sqlite driver refact (base.Command): export FlagOutputCurlString Exporting FlagOutputCurlString allows other commands that embed the base.Command to access the flag as needed feat: add a cache Repository to manage cache storage feat: add a "cache" CLI command This new command will support both managing and searching the local CLI cache daemon. feat: start cache daemon as needed when issue CLI commands Move files to new directories and add persona table (#3526) * Add persona table and move files to new directories Client daemon now uses unix sockets and update pathing (#3535) * Add unix socket listen and dialers with file permissions applied * Update the pathing to match RFC Cache refreshing now uses all stored personas. (#3545) Updating headers for LLB files Decouple daemon and cache server (#3566) * Separate daemon from server * Add persona handler to daemon server (#3579) Moved search to use mql and added tests for the search command (#3589) * search uses hashicorp/mql Windows support for client side daemon (#3618) * exec.Command for background process * Log to stderr when in foreground and file always * Use pid files across platform for start and stop Requests with version info must match the daemon's version (#3640) * requests with version info must match daemons Update dependencies and breakout cgo/pure go sqlite drivers (#3657) upgrade go-dbw deps and add cgo build tags Enable graceful shutdown in windows (#3695) * Enable graceful shutdown in windows Co-authored-by: Jim <jlambert@hashicorp.com> Targets delete when a persona changes address or user id (#3673) * Handle cache refresh in repo Add sessions to the client side cache (#3682) * Add sessions to repository * Search command supports sessions * adding session related tests to db and refresh Change cache schema from personas to tokens+users (#3737) * Change from personas to tokens+users * Separate keyring tokens from auth tokens Add support for keyringless auth tokens (#3765) * Add support for keyringless auth tokens Remove expired auth tokens from cache (#3768) * Remove expired auth tokens from cache Complete the TODO of checking for inflight tx (#3779) Delete tokens that the controller says are invalid (#3782) fix search test with boundary token check (#3799) Collect resource info in repository_<resource>s.go (#3769) * Collect resource info in repository_<resource>s.go * Move search logic into the domain (#3794) Daemon and search restricted to supported platforms (#3801) * Daemon and search restricted to supported platforms Reorganize the clientcache packages (#3814) * Refactor for self contained domain logic * Put clientcache stuff under internal
This commit is contained in:
1 parent
6ba3676c37
commit
fba9d1cdf1
71 files changed
+8980
-972
No files matched your search
+38
-12
@@ -16,6 +16,7 @@ import (
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
@@ -57,7 +58,12 @@ type Config struct {
|
||||
// HttpClient.
|
||||
Addr string
|
||||
|
||||
// Token is the client token that reuslts from authentication and can be
|
||||
// Set when the Addr is a unix socket. The parsing of this field takes
|
||||
// a filename approach instead of a URL approach since parsing file names
|
||||
// as a URL may error out on some platforms.
|
||||
socketAddr string
|
||||
|
||||
// Token is the client token that results from authentication and can be
|
||||
// used to make calls into Boundary
|
||||
Token string
|
||||
|
||||
@@ -254,6 +260,16 @@ func (c *Config) ConfigureTLS() error {
|
||||
// This also removes any trailing "/v1"; we'll use that in our commands so we
|
||||
// don't require it from users.
|
||||
func (c *Config) setAddr(addr string) error {
|
||||
if strings.HasPrefix(addr, "unix://") {
|
||||
c.socketAddr = strings.TrimPrefix(addr, "unix://")
|
||||
c.socketAddr = filepath.Clean(c.socketAddr)
|
||||
|
||||
// Update the specified address to the cleaned up version
|
||||
c.Addr = fmt.Sprintf("unix://%s", c.socketAddr)
|
||||
return nil
|
||||
}
|
||||
c.socketAddr = ""
|
||||
|
||||
u, err := url.Parse(addr)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error parsing address: %w", err)
|
||||
@@ -582,6 +598,7 @@ func (c *Client) Clone() *Client {
|
||||
config := c.config
|
||||
|
||||
newConfig := &Config{
|
||||
socketAddr: config.socketAddr,
|
||||
Addr: config.Addr,
|
||||
Token: config.Token,
|
||||
RecoveryKmsWrapper: config.RecoveryKmsWrapper,
|
||||
@@ -645,31 +662,29 @@ func (c *Client) NewRequest(ctx context.Context, method, requestPath string, bod
|
||||
}
|
||||
|
||||
c.modifyLock.RLock()
|
||||
addr := c.config.Addr
|
||||
srvLookup := c.config.SRVLookup
|
||||
token := c.config.Token
|
||||
httpClient := c.config.HttpClient
|
||||
headers := copyHeaders(c.config.Headers)
|
||||
c.modifyLock.RUnlock()
|
||||
|
||||
u, err := url.Parse(addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if strings.HasPrefix(addr, "unix://") {
|
||||
socket := strings.TrimPrefix(addr, "unix://")
|
||||
var hostHeader string
|
||||
var u *url.URL
|
||||
switch {
|
||||
case c.config.socketAddr != "":
|
||||
transport := httpClient.Transport.(*http.Transport)
|
||||
transport.DialContext = func(context.Context, string, string) (net.Conn, error) {
|
||||
dialer := net.Dialer{}
|
||||
return dialer.DialContext(ctx, "unix", socket)
|
||||
return dialer.DialContext(ctx, "unix", c.config.socketAddr)
|
||||
}
|
||||
|
||||
// Since the address points to a unix domain socket, the scheme in the
|
||||
// *URL would be set to `unix`. The *URL in the client is expected to
|
||||
// be pointing to the protocol used in the application layer and not to
|
||||
// the transport layer. Hence, setting the fields accordingly.
|
||||
u = &url.URL{}
|
||||
u.Scheme = "http"
|
||||
u.Host = c.config.socketAddr
|
||||
u.Path = ""
|
||||
|
||||
// Go 1.21.0 introduced strict host header validation for clients.
|
||||
@@ -680,7 +695,17 @@ func (c *Client) NewRequest(ctx context.Context, method, requestPath string, bod
|
||||
// that isn't the actual unix domain socket address. Following
|
||||
// Docker's lead (https://github.com/moby/moby/pull/45942),
|
||||
// use a localhost TLD.
|
||||
u.Host = "api.boundary.localhost"
|
||||
hostHeader = "api.boundary.localhost"
|
||||
case c.config.Addr != "":
|
||||
addr := c.config.Addr
|
||||
var err error
|
||||
u, err = url.Parse(addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
hostHeader = u.Host
|
||||
default:
|
||||
return nil, errors.New("no valid address discovered")
|
||||
}
|
||||
|
||||
host := u.Host
|
||||
@@ -707,8 +732,9 @@ func (c *Client) NewRequest(ctx context.Context, method, requestPath string, bod
|
||||
Host: host,
|
||||
Path: path.Join(u.Path, "/v1/", requestPath),
|
||||
},
|
||||
Host: u.Host,
|
||||
Host: hostHeader,
|
||||
}
|
||||
|
||||
req.Header = headers
|
||||
req.Header.Set("authorization", "Bearer "+token)
|
||||
req.Header.Set("content-type", "application/json")
|
||||
|
||||
Reference in new issue
Block a user