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 }