github.com/drycc/workflow-cli@v1.5.3-0.20240322092846-d4ee25983af9/cmd/certs.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"strings"
     7  	"time"
     8  
     9  	drycc "github.com/drycc/controller-sdk-go"
    10  	"github.com/drycc/controller-sdk-go/certs"
    11  	dtime "github.com/drycc/controller-sdk-go/pkg/time"
    12  	"github.com/drycc/workflow-cli/settings"
    13  )
    14  
    15  const dateFormat = "2 Jan 2006"
    16  
    17  // CertsList lists certs registered with the controller.
    18  func (d *DryccCmd) CertsList(results int) error {
    19  	s, err := settings.Load(d.ConfigFile)
    20  
    21  	if err != nil {
    22  		return err
    23  	}
    24  
    25  	if results == defaultLimit {
    26  		results = s.Limit
    27  	}
    28  
    29  	certList, _, err := certs.List(s.Client, results)
    30  	if d.checkAPICompatibility(s.Client, err) != nil {
    31  		return err
    32  	}
    33  
    34  	if len(certList) == 0 {
    35  		d.Println("No certs")
    36  	} else {
    37  		table := d.getDefaultFormatTable([]string{"NAME", "COMMON-NAME", "EXPIRES", "SAN", "DOMAINS"})
    38  		for _, cert := range certList {
    39  			expires := safeGetString("")
    40  			if cert.Expires.Time != nil {
    41  				expires = cert.Expires.Format(dateFormat)
    42  			}
    43  			san := safeGetString(strings.Join(cert.SubjectAltName[:], ","))
    44  			if len(san) > 32 {
    45  				san = fmt.Sprintf("%s[...]", san[:32])
    46  			}
    47  			domains := safeGetString(strings.Join(cert.Domains[:], ","))
    48  			if len(domains) > 32 {
    49  				domains = fmt.Sprintf("%s[...]", domains[:32])
    50  			}
    51  			table.Append([]string{cert.Name, cert.CommonName, expires, san, domains})
    52  		}
    53  		table.Render()
    54  	}
    55  	return nil
    56  }
    57  
    58  // CertAdd adds a cert to the controller.
    59  func (d *DryccCmd) CertAdd(cert string, key string, name string) error {
    60  	s, err := settings.Load(d.ConfigFile)
    61  
    62  	if err != nil {
    63  		return err
    64  	}
    65  
    66  	d.Print("Adding SSL endpoint... ")
    67  	quit := progress(d.WOut)
    68  	err = d.doCertAdd(s.Client, cert, key, name)
    69  	quit <- true
    70  	<-quit
    71  
    72  	if err != nil {
    73  		return err
    74  	}
    75  
    76  	d.Println("done")
    77  	return nil
    78  }
    79  
    80  func (d *DryccCmd) doCertAdd(c *drycc.Client, cert string, key string, name string) error {
    81  	certFile, err := os.ReadFile(cert)
    82  	if err != nil {
    83  		return err
    84  	}
    85  
    86  	keyFile, err := os.ReadFile(key)
    87  	if err != nil {
    88  		return err
    89  	}
    90  
    91  	_, err = certs.New(c, string(certFile), string(keyFile), name)
    92  	return d.checkAPICompatibility(c, err)
    93  }
    94  
    95  // CertRemove deletes a cert from the controller.
    96  func (d *DryccCmd) CertRemove(name string) error {
    97  	s, err := settings.Load(d.ConfigFile)
    98  	if d.checkAPICompatibility(s.Client, err) != nil {
    99  		return err
   100  	}
   101  
   102  	d.Printf("Removing %s... ", name)
   103  	quit := progress(d.WOut)
   104  
   105  	err = certs.Delete(s.Client, name)
   106  	quit <- true
   107  	<-quit
   108  	if d.checkAPICompatibility(s.Client, err) != nil {
   109  		return err
   110  	}
   111  
   112  	d.Println("done")
   113  	return nil
   114  }
   115  
   116  // CertInfo gets info about certficiate
   117  func (d *DryccCmd) CertInfo(name string) error {
   118  	s, err := settings.Load(d.ConfigFile)
   119  	if err != nil {
   120  		return err
   121  	}
   122  	cert, err := certs.Get(s.Client, name)
   123  	if d.checkAPICompatibility(s.Client, err) != nil {
   124  		return err
   125  	}
   126  
   127  	table := d.getDefaultFormatTable([]string{})
   128  	table.Append([]string{"Name:", safeGetString(cert.Name)})
   129  	table.Append([]string{"Common Name(s):", safeGetString(cert.CommonName)})
   130  	table.Append([]string{"Expires At:", safeGetTime(cert.Expires, dateFormat)})
   131  	table.Append([]string{"Starts At:", safeGetTime(cert.Starts, dateFormat)})
   132  	table.Append([]string{"Fingerprint:", safeGetString(cert.Fingerprint)})
   133  	table.Append([]string{"Subject Alt Name:", safeGetString(strings.Join(cert.SubjectAltName[:], ","))})
   134  	table.Append([]string{"Issuer:", safeGetString(cert.Issuer)})
   135  	table.Append([]string{"Subject:", safeGetString(cert.Subject)})
   136  	table.Append([]string{""})
   137  	table.Append([]string{"Connected Domains:", safeGetString(strings.Join(cert.Domains[:], ","))})
   138  	table.Append([]string{"Owner:", safeGetString(cert.Owner)})
   139  	table.Append([]string{"Created:", safeGetTime(cert.Created, time.RFC3339)})
   140  	table.Append([]string{"Updated:", safeGetTime(cert.Updated, time.RFC3339)})
   141  	table.Render()
   142  	return nil
   143  }
   144  
   145  // CertAttach attaches a certificate to a domain
   146  func (d *DryccCmd) CertAttach(name, domain string) error {
   147  	s, err := settings.Load(d.ConfigFile)
   148  
   149  	if err != nil {
   150  		return err
   151  	}
   152  
   153  	d.Printf("Attaching certificate %s to domain %s... ", name, domain)
   154  	quit := progress(d.WOut)
   155  
   156  	err = certs.Attach(s.Client, name, domain)
   157  	quit <- true
   158  	<-quit
   159  	if d.checkAPICompatibility(s.Client, err) == nil {
   160  		d.Println("done")
   161  	}
   162  
   163  	return err
   164  }
   165  
   166  // CertDetach detaches a certificate from a domain
   167  func (d *DryccCmd) CertDetach(name, domain string) error {
   168  	s, err := settings.Load(d.ConfigFile)
   169  
   170  	if err != nil {
   171  		return err
   172  	}
   173  
   174  	d.Printf("Detaching certificate %s from domain %s... ", name, domain)
   175  	quit := progress(d.WOut)
   176  
   177  	err = certs.Detach(s.Client, name, domain)
   178  	quit <- true
   179  	<-quit
   180  	if d.checkAPICompatibility(s.Client, err) != nil {
   181  		return err
   182  	}
   183  
   184  	d.Println("done")
   185  	return nil
   186  }
   187  
   188  func safeGetTime(t dtime.Time, format string) string {
   189  	out := ""
   190  	if t.Time != nil {
   191  		out = t.Format(format)
   192  	}
   193  
   194  	return safeGetString(out)
   195  }