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.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. var caPath string
  28. var certPath string
  29. var keyPath string
  30. var endpoint string
  31. func RootExecute() {
  32. RootCmd.PersistentFlags().StringVar(&caPath, "ca", "", "CA certificate file path")
  33. RootCmd.PersistentFlags().StringVar(&certPath, "cert", "", "client certificate file path")
  34. RootCmd.PersistentFlags().StringVar(&keyPath, "key", "", "client key file path")
  35. RootCmd.PersistentFlags().StringVar(&endpoint, "endpoint", "", "API endpoint")
  36. RootCmd.MarkFlagsRequiredTogether("ca", "cert", "key")
  37. RootCmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error {
  38. ctx := GetCmdCtx(cmd)
  39. if caPath == "" {
  40. certDir := searchCertDir()
  41. if certDir == "" {
  42. return fmt.Errorf("cert files not found, please specify --ca, --cert and --key")
  43. }
  44. caPath = filepath.Join(certDir, defaultCAFileName)
  45. certPath = filepath.Join(certDir, defaultCertFileName)
  46. keyPath = filepath.Join(certDir, defaultKeyFileName)
  47. }
  48. rootCAPool := x509.NewCertPool()
  49. rootCAPem, err := os.ReadFile(caPath)
  50. if err != nil {
  51. return fmt.Errorf("reading CA file: %v", err)
  52. }
  53. if !rootCAPool.AppendCertsFromPEM(rootCAPem) {
  54. return fmt.Errorf("parsing CA failed")
  55. }
  56. clientCert, err := tls.LoadX509KeyPair(certPath, keyPath)
  57. if err != nil {
  58. return fmt.Errorf("loading client cert/key: %v", err)
  59. }
  60. if endpoint == "" {
  61. endpoint = "https://127.0.0.1:7890"
  62. }
  63. cli := cliapi.NewClient(api.Config{
  64. EndPoint: endpoint,
  65. RootCA: rootCAPool,
  66. Cert: clientCert,
  67. })
  68. ctx.Cert = clientCert
  69. ctx.RootCA = rootCAPool
  70. ctx.Client = cli
  71. return nil
  72. }
  73. RootCmd.ExecuteContext(context.WithValue(context.Background(), "cmdCtx", &CommandContext{}))
  74. }
  75. func searchCertDir() string {
  76. execPath, err := os.Executable()
  77. if err == nil {
  78. execDir := filepath.Dir(execPath)
  79. ca, err := os.Stat(filepath.Join(execDir, defaultCAFileName))
  80. if err == nil && !ca.IsDir() {
  81. return execDir
  82. }
  83. }
  84. workDir, err := os.Getwd()
  85. if err == nil {
  86. ca, err := os.Stat(filepath.Join(workDir, defaultCAFileName))
  87. if err == nil && !ca.IsDir() {
  88. return workDir
  89. }
  90. }
  91. return ""
  92. }

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