cmd/token.go (58 lines of code) (raw):
package cmd
import (
"crypto/rand"
"encoding/hex"
"fmt"
"github.com/spf13/cobra"
"os"
)
const (
DefaultTokenFile = "/var/run/kmstoken"
)
var tokenCmd = &cobra.Command{
Use: "token",
Short: "generate alibabacloud kms agent ssrf token",
Run: func(cmd *cobra.Command, args []string) {
var output string
if len(args) > 0 {
output = args[0]
}
if output == "" {
output = DefaultTokenFile
}
if fileExists(output) {
_, _ = fmt.Fprintf(os.Stderr, "ssrf token file already exist: %v\n", output)
return
}
token, err := generateToken(32)
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "genetate rrsf token error: %v\n", err)
os.Exit(1)
}
err = saveTokenToFile(token, output)
if err != nil {
_, _ = fmt.Fprintf(os.Stderr, "save rrsf token to file[%s] error: %v\n", output, err)
os.Exit(1)
}
},
}
func generateToken(length int) (string, error) {
bytes := make([]byte, length)
_, err := rand.Read(bytes)
if err != nil {
return "", err
}
return hex.EncodeToString(bytes), nil
}
func saveTokenToFile(content, filePath string) error {
file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640)
if err != nil {
return fmt.Errorf("create file error:%w", err)
}
defer file.Close()
_, err = file.WriteString(content)
if err != nil {
return fmt.Errorf("write file error:%w", err)
}
return nil
}