Home > front end >  How do I generate a token with TTL 8h from the below golang function?
How do I generate a token with TTL 8h from the below golang function?

Time:01-14

I am new in programming and have no idea about using the the token generate client api function in the source code from my client side golang program. Looking for some advice. Thank you so much.

Source code package: https://pkg.go.dev/github.com/gravitational/teleport/api/client#Client.UpsertToken

Function Source Code:

func (c *Client) UpsertToken(ctx context.Context, token types.ProvisionToken) error {
    tokenV2, ok := token.(*types.ProvisionTokenV2)
    if !ok {
        return trace.BadParameter("invalid type %T", token)
    }
    _, err := c.grpc.UpsertToken(ctx, tokenV2, c.callOpts...)
    return trail.FromGRPC(err)
}

My code:
package main

import (
    "context"
    "crypto/tls"
    "fmt"
    "log"
    "os"
    "strings"
    "time"

    "github.com/gravitational/teleport/api/client"
    "github.com/gravitational/teleport/api/client/proto"
    "google.golang.org/grpc"
)

// Client is a gRPC Client that connects to a Teleport Auth server either
// locally or over ssh through a Teleport web proxy or tunnel proxy.
//
// This client can be used to cover a variety of Teleport use cases,
// such as programmatically handling access requests, integrating
// with external tools, or dynamically configuring Teleport.

type Client struct {
    // c contains configuration values for the client.
    //c Config
    // tlsConfig is the *tls.Config for a successfully connected client.
    tlsConfig *tls.Config
    // dialer is the ContextDialer for a successfully connected client.
    //dialer ContextDialer
    // conn is a grpc connection to the auth server.
    conn *grpc.ClientConn
    // grpc is the gRPC client specification for the auth server.
    grpc proto.AuthServiceClient
    // closedFlag is set to indicate that the connnection is closed.
    // It's a pointer to allow the Client struct to be copied.
    closedFlag *int32
    // callOpts configure calls made by this client.
    callOpts []grpc.CallOption
}

/*
type ProvisionToken interface {
    Resource
    // SetMetadata sets resource metatada
    SetMetadata(meta Metadata)
    // GetRoles returns a list of teleport roles
    // that will be granted to the user of the token
    // in the crendentials
    GetRoles() SystemRoles
    // SetRoles sets teleport roles
    SetRoles(SystemRoles)
    // GetAllowRules returns the list of allow rules
    GetAllowRules() []*TokenRule
    // GetAWSIIDTTL returns the TTL of EC2 IIDs
    GetAWSIIDTTL() Duration
    // V1 returns V1 version of the resource
    V2() *ProvisionTokenSpecV2
    // String returns user friendly representation of the resource
    String() string
}

type ProvisionTokenSpecV2 struct {
    // Roles is a list of roles associated with the token,
    // that will be converted to metadata in the SSH and X509
    // certificates issued to the user of the token
    Roles                []SystemRole `protobuf:"bytes,1,rep,name=Roles,proto3,casttype=SystemRole" json:"roles"`
    Allow                []*TokenRule `protobuf:"bytes,2,rep,name=allow,proto3" json:"allow,omitempty"`
    AWSIIDTTL            Duration     `protobuf:"varint,3,opt,name=AWSIIDTTL,proto3,casttype=Duration" json:"aws_iid_ttl,omitempty"`
    XXX_NoUnkeyedLiteral struct{}     `json:"-"`
    XXX_unrecognized     []byte       `json:"-"`
    XXX_sizecache        int32        `json:"-"`
}
*/

func main() {
    ctx := context.Background()
    args := os.Args[1:]
    nodeType := ""
    if len(args) > 0 {
        nodeType = args[0]
    }

    proxyAddress := os.Getenv("TELEPORT_PROXY")
    if len(proxyAddress) <= 0 {
        proxyAddress = "proxy.teleport.example.local:443"
    }

    clt, err := client.New(ctx, client.Config{
        Addrs: []string{
            "proxy.teleport.example.local:443",
            "proxy.teleport.example.local:3025",
            "proxy.teleport.example.local:3024",
            "proxy.teleport.example.local:3080",
        },
        Credentials: []client.Credentials{
            client.LoadProfile("", ""),
        },
    })

    if err != nil {
        log.Fatalf("failed to create client: %v", err)
    }

    defer clt.Close()
    ctx, err, token, err2 := clt.UpsertToken(ctx, token)
    if err || err2 != nil {
        log.Fatalf("failed to get tokens: %v", err)
    }
    now := time.Now()
    t := 0
    fmt.Printf("{\"tokens\": [")
    for a, b := range token {
        if strings.Contains(b.GetRoles(), b.Allow().String(), b.GetAWSIIDTTL(), nodeType) {
            if t >= 1 {
                fmt.Printf(",")
            } else {
                panic(err)
            }

            expiry := "never" //time.Now().Add(time.Hour * 8).Unix()
            _ = expiry

            if b.Expiry().Unix() > 0 {
                exptime := b.Expiry().Format(time.RFC822)
                expdur := b.Expiry().Sub(now).Round(time.Second)
                expiry = fmt.Sprintf("%s (%s)", exptime, expdur.String())
            }
            fmt.Printf("\"count\": \"\",", a)
            fmt.Printf(b.Roles(), b.GetAllowRules(), b.GetAWSIIDTTL(), b.GetMetadata().Labels)
        }
    }
}

Output: Syntax error instead of creating a token

CodePudding user response:

It's seems your code have many mistake. And, It's very obvious you are getting syntax error. I am sure you would have got the line number in the console where actually these syntax error has occurred.

Please understand the syntax of Golang and also how to call the functions and how many parameter should i pass to those functions.

There are few mistakes i would like to point out after reviewing your code.

//It shouldn't be like this
ctx, err, token, err2 := clt.UpsertToken(ctx, token)

//Instead it should be like this
 err := clt.UpsertToken(ctx, token)
//The return type of UpsertToken() method is error, you should use only one variable to receive this error.

strings.Contains() function takes two argument but you are passing four.

Refer this document for string.Contains()

You are assigning t := 0 and checking it with if condition inside for loop and never incremented.

Refer this document for fmt.Printf()

Refer this for function

Remove all the syntax error then only your code will run also cross check your logic.

If you want to see the example of syntax error then check here : https://go.dev/play/p/Hhu48UqlPRF

  •  Tags:  
  • Related