1package api 2 3import ( 4 "context" 5 "encoding/json" 6 "errors" 7 "time" 8) 9 10func (c *Sys) Rotate() error { 11 r := c.c.NewRequest("POST", "/v1/sys/rotate") 12 13 ctx, cancelFunc := context.WithCancel(context.Background()) 14 defer cancelFunc() 15 resp, err := c.c.RawRequestWithContext(ctx, r) 16 if err == nil { 17 defer resp.Body.Close() 18 } 19 return err 20} 21 22func (c *Sys) KeyStatus() (*KeyStatus, error) { 23 r := c.c.NewRequest("GET", "/v1/sys/key-status") 24 25 ctx, cancelFunc := context.WithCancel(context.Background()) 26 defer cancelFunc() 27 resp, err := c.c.RawRequestWithContext(ctx, r) 28 if err != nil { 29 return nil, err 30 } 31 defer resp.Body.Close() 32 33 secret, err := ParseSecret(resp.Body) 34 if err != nil { 35 return nil, err 36 } 37 if secret == nil || secret.Data == nil { 38 return nil, errors.New("data from server response is empty") 39 } 40 41 var result KeyStatus 42 43 termRaw, ok := secret.Data["term"] 44 if !ok { 45 return nil, errors.New("term not found in response") 46 } 47 term, ok := termRaw.(json.Number) 48 if !ok { 49 return nil, errors.New("could not convert term to a number") 50 } 51 term64, err := term.Int64() 52 if err != nil { 53 return nil, err 54 } 55 result.Term = int(term64) 56 57 installTimeRaw, ok := secret.Data["install_time"] 58 if !ok { 59 return nil, errors.New("install_time not found in response") 60 } 61 installTimeStr, ok := installTimeRaw.(string) 62 if !ok { 63 return nil, errors.New("could not convert install_time to a string") 64 } 65 installTime, err := time.Parse(time.RFC3339Nano, installTimeStr) 66 if err != nil { 67 return nil, err 68 } 69 result.InstallTime = installTime 70 71 return &result, err 72} 73 74type KeyStatus struct { 75 Term int `json:"term"` 76 InstallTime time.Time `json:"install_time"` 77} 78