diff --git a/cmd/main.go b/cmd/main.go index f49ff27..d1bbc6d 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -7,8 +7,8 @@ import ( "os/signal" "syscall" - "github.com/mrhid6/keymanager/agent/internal/config" - agentsync "github.com/mrhid6/keymanager/agent/internal/sync" + "github.com/mrhid6/vantage/agent/internal/config" + agentsync "github.com/mrhid6/vantage/agent/internal/sync" ) var Version = "dev" @@ -32,7 +32,7 @@ func main() { ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) defer stop() - log.Printf("keymanager-agent %s starting (server=%s, poll=%s)", Version, cfg.ServerURL, cfg.PollInterval) + log.Printf("vantage-agent %s starting (server=%s, poll=%s)", Version, cfg.ServerURL, cfg.PollInterval) if err := agentsync.Run(ctx, cfg, Version); err != nil { log.Fatalf("agent error: %v", err) } diff --git a/go.mod b/go.mod index 321268f..b2d64ed 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/mrhid6/keymanager/agent +module github.com/mrhid6/vantage/agent go 1.26 diff --git a/internal/config/config.go b/internal/config/config.go index 47d0ba8..ad72da7 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,7 +7,7 @@ import ( "gopkg.in/yaml.v3" ) -const ConfigPath = "/etc/keymanager/config.yaml" +const ConfigPath = "/etc/vantage/config.yaml" type Config struct { ServerURL string `yaml:"server_url"` @@ -38,7 +38,7 @@ func Save(cfg *Config) error { if err != nil { return err } - if err := os.MkdirAll("/etc/keymanager", 0700); err != nil { + if err := os.MkdirAll("/etc/vantage", 0700); err != nil { return err } return os.WriteFile(ConfigPath, data, 0600) diff --git a/internal/grpc/client.go b/internal/grpc/client.go index 7a44926..db3910c 100644 --- a/internal/grpc/client.go +++ b/internal/grpc/client.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/mrhid6/keymanager/agent/internal/grpc/pb" + "github.com/mrhid6/vantage/agent/internal/grpc/pb" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" @@ -19,7 +19,7 @@ func init() { type Client struct { conn *grpc.ClientConn - client pb.KeyManagerClient + client pb.VantageClient } func New(serverURL string, useTLS bool) (*Client, error) { @@ -48,7 +48,7 @@ func New(serverURL string, useTLS bool) (*Client, error) { return &Client{ conn: conn, - client: pb.NewKeyManagerClient(conn), + client: pb.NewVantageClient(conn), }, nil } @@ -107,6 +107,6 @@ func (c *Client) UploadGeneratedKey(serverID, agentToken, publicKey, privateKey, // CommandStream opens a long-lived bidirectional stream for server-pushed commands. // The caller controls the stream lifetime via ctx. -func (c *Client) CommandStream(ctx context.Context) (pb.KeyManager_CommandStreamClient, error) { +func (c *Client) CommandStream(ctx context.Context) (pb.Vantage_CommandStreamClient, error) { return c.client.CommandStream(ctx) } diff --git a/internal/grpc/pb/keymanager.pb.go b/internal/grpc/pb/vantage.pb.go similarity index 74% rename from internal/grpc/pb/keymanager.pb.go rename to internal/grpc/pb/vantage.pb.go index da52687..ee3b194 100644 --- a/internal/grpc/pb/keymanager.pb.go +++ b/internal/grpc/pb/vantage.pb.go @@ -1,4 +1,4 @@ -// Hand-written gRPC bindings for keymanager.proto (agent side, JSON codec). +// Hand-written gRPC bindings for vantage.proto (agent side, JSON codec). package pb @@ -87,21 +87,21 @@ type CommandResult struct { // CommandStream client-side interface -type KeyManager_CommandStreamClient interface { +type Vantage_CommandStreamClient interface { Send(*AgentMessage) error Recv() (*ServerCommand, error) grpc.ClientStream } -type keyManagerCommandStreamClient struct { +type vantageCommandStreamClient struct { grpc.ClientStream } -func (c *keyManagerCommandStreamClient) Send(m *AgentMessage) error { +func (c *vantageCommandStreamClient) Send(m *AgentMessage) error { return c.ClientStream.SendMsg(m) } -func (c *keyManagerCommandStreamClient) Recv() (*ServerCommand, error) { +func (c *vantageCommandStreamClient) Recv() (*ServerCommand, error) { m := new(ServerCommand) if err := c.ClientStream.RecvMsg(m); err != nil { return nil, err @@ -111,7 +111,7 @@ func (c *keyManagerCommandStreamClient) Recv() (*ServerCommand, error) { // CommandStream server-side interface (included for completeness) -type KeyManager_CommandStreamServer interface { +type Vantage_CommandStreamServer interface { Send(*ServerCommand) error Recv() (*AgentMessage, error) grpc.ServerStream @@ -133,22 +133,22 @@ func (s *keyManagerCommandStreamServer) Recv() (*AgentMessage, error) { return m, nil } -type KeyManagerClient interface { +type VantageClient interface { Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) SyncKeys(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*SyncResponse, error) UploadGeneratedKey(ctx context.Context, in *UploadKeyRequest, opts ...grpc.CallOption) (*UploadKeyResponse, error) - CommandStream(ctx context.Context, opts ...grpc.CallOption) (KeyManager_CommandStreamClient, error) + CommandStream(ctx context.Context, opts ...grpc.CallOption) (Vantage_CommandStreamClient, error) } -type UnimplementedKeyManagerServer struct{} +type UnimplementedVantageServer struct{} -func (UnimplementedKeyManagerServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { +func (UnimplementedVantageServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "not implemented") } -func (UnimplementedKeyManagerServer) SyncKeys(context.Context, *SyncRequest) (*SyncResponse, error) { +func (UnimplementedVantageServer) SyncKeys(context.Context, *SyncRequest) (*SyncResponse, error) { return nil, status.Errorf(codes.Unimplemented, "not implemented") } -func (UnimplementedKeyManagerServer) UploadGeneratedKey(context.Context, *UploadKeyRequest) (*UploadKeyResponse, error) { +func (UnimplementedVantageServer) UploadGeneratedKey(context.Context, *UploadKeyRequest) (*UploadKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "not implemented") } @@ -156,13 +156,13 @@ type keyManagerClient struct { cc grpc.ClientConnInterface } -func NewKeyManagerClient(cc grpc.ClientConnInterface) KeyManagerClient { +func NewVantageClient(cc grpc.ClientConnInterface) VantageClient { return &keyManagerClient{cc} } func (c *keyManagerClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) { out := new(RegisterResponse) - if err := c.cc.Invoke(ctx, "/keymanager.v1.KeyManager/Register", in, out, opts...); err != nil { + if err := c.cc.Invoke(ctx, "/vantage.v1.Vantage/Register", in, out, opts...); err != nil { return nil, err } return out, nil @@ -170,7 +170,7 @@ func (c *keyManagerClient) Register(ctx context.Context, in *RegisterRequest, op func (c *keyManagerClient) SyncKeys(ctx context.Context, in *SyncRequest, opts ...grpc.CallOption) (*SyncResponse, error) { out := new(SyncResponse) - if err := c.cc.Invoke(ctx, "/keymanager.v1.KeyManager/SyncKeys", in, out, opts...); err != nil { + if err := c.cc.Invoke(ctx, "/vantage.v1.Vantage/SyncKeys", in, out, opts...); err != nil { return nil, err } return out, nil @@ -178,17 +178,17 @@ func (c *keyManagerClient) SyncKeys(ctx context.Context, in *SyncRequest, opts . func (c *keyManagerClient) UploadGeneratedKey(ctx context.Context, in *UploadKeyRequest, opts ...grpc.CallOption) (*UploadKeyResponse, error) { out := new(UploadKeyResponse) - if err := c.cc.Invoke(ctx, "/keymanager.v1.KeyManager/UploadGeneratedKey", in, out, opts...); err != nil { + if err := c.cc.Invoke(ctx, "/vantage.v1.Vantage/UploadGeneratedKey", in, out, opts...); err != nil { return nil, err } return out, nil } -func (c *keyManagerClient) CommandStream(ctx context.Context, opts ...grpc.CallOption) (KeyManager_CommandStreamClient, error) { +func (c *keyManagerClient) CommandStream(ctx context.Context, opts ...grpc.CallOption) (Vantage_CommandStreamClient, error) { desc := &grpc.StreamDesc{StreamName: "CommandStream", ServerStreams: true, ClientStreams: true} - stream, err := c.cc.NewStream(ctx, desc, "/keymanager.v1.KeyManager/CommandStream", opts...) + stream, err := c.cc.NewStream(ctx, desc, "/vantage.v1.Vantage/CommandStream", opts...) if err != nil { return nil, err } - return &keyManagerCommandStreamClient{stream}, nil + return &vantageCommandStreamClient{stream}, nil } diff --git a/internal/keys/keys.go b/internal/keys/keys.go index 56ed6c4..1e01ae2 100644 --- a/internal/keys/keys.go +++ b/internal/keys/keys.go @@ -12,8 +12,8 @@ import ( const authorizedKeysPath = "/root/.ssh/authorized_keys" const sshConfigPath = "/root/.ssh/config" -const managedConfigPath = "/root/.ssh/keymanager.conf" -const includeDirective = "Include /root/.ssh/keymanager.conf" +const managedConfigPath = "/root/.ssh/vantage.conf" +const includeDirective = "Include /root/.ssh/vantage.conf" func ReadAuthorizedKeys() ([]string, error) { data, err := os.ReadFile(authorizedKeysPath) @@ -140,7 +140,7 @@ func GenerateKeyPair(keyPath string, opts KeyGenOptions) (string, error) { } // AddSSHIdentity writes an IdentityFile entry for keyPath into the managed -// keymanager.conf include file, and ensures ~/.ssh/config includes it. +// vantage.conf include file, and ensures ~/.ssh/config includes it. func AddSSHIdentity(keyPath string) error { if err := os.MkdirAll(filepath.Dir(sshConfigPath), 0700); err != nil { return fmt.Errorf("mkdir .ssh: %w", err) @@ -204,7 +204,7 @@ func RemoveSSHIdentity(keyPath string) error { return nil } -// ensureIncludeDirective adds "Include /root/.ssh/keymanager.conf" to the top +// ensureIncludeDirective adds "Include /root/.ssh/vantage.conf" to the top // of ~/.ssh/config if it is not already present. The Include must appear before // any Host stanzas to be effective for all connections. func ensureIncludeDirective() error { diff --git a/internal/sync/sync.go b/internal/sync/sync.go index 8985891..b16e693 100644 --- a/internal/sync/sync.go +++ b/internal/sync/sync.go @@ -15,10 +15,10 @@ import ( "strings" "time" - "github.com/mrhid6/keymanager/agent/internal/config" - grpcclient "github.com/mrhid6/keymanager/agent/internal/grpc" - "github.com/mrhid6/keymanager/agent/internal/grpc/pb" - "github.com/mrhid6/keymanager/agent/internal/keys" + "github.com/mrhid6/vantage/agent/internal/config" + grpcclient "github.com/mrhid6/vantage/agent/internal/grpc" + "github.com/mrhid6/vantage/agent/internal/grpc/pb" + "github.com/mrhid6/vantage/agent/internal/keys" ) func Run(ctx context.Context, cfg *config.Config, version string) error { @@ -178,7 +178,7 @@ func connectAndHandleStream(ctx context.Context, cfg *config.Config) error { func handleDeleteKey(cmd *pb.ServerCommand) { label := cmd.DeleteKey.Label - keyPath := fmt.Sprintf("/root/.ssh/keymanager_%s", strings.ReplaceAll(label, " ", "_")) + keyPath := fmt.Sprintf("/root/.ssh/vantage_%s", strings.ReplaceAll(label, " ", "_")) if err := keys.RemoveSSHIdentity(keyPath); err != nil { log.Printf("remove ssh identity failed (cmd=%s): %v", cmd.CommandId, err) @@ -196,13 +196,13 @@ func handleUpdateAgent(cmd *pb.ServerCommand) { u := cmd.UpdateAgent arch := runtime.GOARCH // "amd64" or "arm64" tag := "agent%2Fv" + u.Version - binaryURL := fmt.Sprintf("%s/mrhid6/keymanager/releases/download/%s/keymanager-agent-linux-%s", u.GiteaBaseURL, tag, arch) - checksumURL := fmt.Sprintf("%s/mrhid6/keymanager/releases/download/%s/checksums.txt", u.GiteaBaseURL, tag) + binaryURL := fmt.Sprintf("%s/mrhid6/vantage/releases/download/%s/vantage-agent-linux-%s", u.GiteaBaseURL, tag, arch) + checksumURL := fmt.Sprintf("%s/mrhid6/vantage/releases/download/%s/checksums.txt", u.GiteaBaseURL, tag) log.Printf("updating agent to v%s from %s (cmd=%s)", u.Version, u.GiteaBaseURL, cmd.CommandId) // Download binary - tmpBin := "/tmp/keymanager-agent-update" + tmpBin := "/tmp/vantage-agent-update" if err := downloadFile(binaryURL, tmpBin); err != nil { log.Printf("update download failed (cmd=%s): %v", cmd.CommandId, err) return @@ -214,7 +214,7 @@ func handleUpdateAgent(cmd *pb.ServerCommand) { log.Printf("update checksum fetch failed (cmd=%s): %v", cmd.CommandId, err) return } - if err := verifyChecksum(tmpBin, fmt.Sprintf("keymanager-agent-linux-%s", arch), checksumData); err != nil { + if err := verifyChecksum(tmpBin, fmt.Sprintf("vantage-agent-linux-%s", arch), checksumData); err != nil { log.Printf("update checksum mismatch (cmd=%s): %v", cmd.CommandId, err) os.Remove(tmpBin) return @@ -224,13 +224,13 @@ func handleUpdateAgent(cmd *pb.ServerCommand) { log.Printf("update chmod failed (cmd=%s): %v", cmd.CommandId, err) return } - if err := os.Rename(tmpBin, "/usr/local/bin/keymanager-agent"); err != nil { + if err := os.Rename(tmpBin, "/usr/local/bin/vantage-agent"); err != nil { log.Printf("update replace binary failed (cmd=%s): %v", cmd.CommandId, err) return } log.Printf("agent binary replaced, restarting service (cmd=%s)", cmd.CommandId) - exec.Command("systemctl", "restart", "keymanager-agent").Run() + exec.Command("systemctl", "restart", "vantage-agent").Run() } func downloadFile(url, dest string) error { @@ -290,7 +290,7 @@ func verifyChecksum(filePath, filename string, checksumData []byte) error { func handleGenerateKey(cfg *config.Config, cmd *pb.ServerCommand) { g := cmd.GenerateKey label := g.Label - keyPath := fmt.Sprintf("/root/.ssh/keymanager_%s", strings.ReplaceAll(label, " ", "_")) + keyPath := fmt.Sprintf("/root/.ssh/vantage_%s", strings.ReplaceAll(label, " ", "_")) opts := keys.KeyGenOptions{ KeyType: g.KeyType, @@ -352,7 +352,7 @@ func GenerateAndUpload(cfg *config.Config, label string) error { } defer client.Close() - keyPath := fmt.Sprintf("/root/.ssh/keymanager_%s", strings.ReplaceAll(label, " ", "_")) + keyPath := fmt.Sprintf("/root/.ssh/vantage_%s", strings.ReplaceAll(label, " ", "_")) pubKey, err := keys.GenerateKeyPair(keyPath, keys.KeyGenOptions{Comment: label}) if err != nil { return err