You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmd.go 2.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package cmd
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "crypto/x509"
  6. "fmt"
  7. "os"
  8. "path/filepath"
  9. "github.com/spf13/cobra"
  10. "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api"
  11. cliapi "gitlink.org.cn/cloudream/jcs-pub/client/sdk/api/v1"
  12. )
  13. const (
  14. defaultCAFileName = "ca_cert.pem"
  15. defaultCertFileName = "client_cert.pem"
  16. defaultKeyFileName = "client_key.pem"
  17. )
  18. var RootCmd = cobra.Command{}
  19. type CommandContext struct {
  20. Client *cliapi.Client
  21. RootCA *x509.CertPool
  22. Cert tls.Certificate
  23. }
  24. func GetCmdCtx(cmd *cobra.Command) *CommandContext {
  25. return cmd.Context().Value("cmdCtx").(*CommandContext)
  26. }
  27. func RootExecute() {
  28. var ca string
  29. var cert string
  30. var key string
  31. var endpoint string
  32. RootCmd.Flags().StringVar(&ca, "ca", "", "CA certificate file path")
  33. RootCmd.Flags().StringVar(&cert, "cert", "", "client certificate file path")
  34. RootCmd.Flags().StringVar(&key, "key", "", "client key file path")
  35. RootCmd.Flags().StringVarP(&endpoint, "endpoint", "e", "", "API endpoint")
  36. RootCmd.MarkFlagsRequiredTogether("ca", "cert", "key")
  37. if ca == "" {
  38. certDir := searchCertDir()
  39. if certDir == "" {
  40. fmt.Printf("cert files not found, please specify --ca, --cert and --key\n")
  41. os.Exit(1)
  42. }
  43. ca = filepath.Join(certDir, defaultCAFileName)
  44. cert = filepath.Join(certDir, defaultCertFileName)
  45. key = filepath.Join(certDir, defaultKeyFileName)
  46. }
  47. rootCAPool := x509.NewCertPool()
  48. rootCAPem, err := os.ReadFile(ca)
  49. if err != nil {
  50. fmt.Printf("reading CA file: %v\n", err)
  51. os.Exit(1)
  52. }
  53. if !rootCAPool.AppendCertsFromPEM(rootCAPem) {
  54. fmt.Printf("parsing CA failed")
  55. os.Exit(1)
  56. }
  57. clientCert, err := tls.LoadX509KeyPair(cert, key)
  58. if err != nil {
  59. fmt.Printf("loading client cert/key: %v\n", err)
  60. os.Exit(1)
  61. }
  62. if endpoint == "" {
  63. endpoint = "https://127.0.0.1:7890"
  64. }
  65. cli := cliapi.NewClient(api.Config{
  66. EndPoint: endpoint,
  67. RootCA: rootCAPool,
  68. Cert: clientCert,
  69. })
  70. RootCmd.ExecuteContext(context.WithValue(context.Background(), "cmdCtx", &CommandContext{
  71. Client: cli,
  72. RootCA: rootCAPool,
  73. Cert: clientCert,
  74. }))
  75. }
  76. func searchCertDir() string {
  77. execPath, err := os.Executable()
  78. if err == nil {
  79. execDir := filepath.Dir(execPath)
  80. ca, err := os.Stat(filepath.Join(execDir, defaultCAFileName))
  81. if err == nil && !ca.IsDir() {
  82. return execDir
  83. }
  84. }
  85. workDir, err := os.Getwd()
  86. if err == nil {
  87. ca, err := os.Stat(filepath.Join(workDir, defaultCAFileName))
  88. if err == nil && !ca.IsDir() {
  89. return workDir
  90. }
  91. }
  92. return ""
  93. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。