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