@@ -2,6 +2,7 @@ package store
22
33import (
44 "fmt"
5+ "time"
56
67 "github.com/dgraph-io/badger/v3"
78 "github.com/golang/protobuf/proto"
@@ -50,6 +51,23 @@ func (s *Store) ListAgentByNetwork(networkName string) ([]*Agent, error) {
5051 return s .listAgentByNetwork (txn , networkName )
5152}
5253
54+ func (s Store ) RenewCertForAgents () error {
55+ txn := s .db .NewTransaction (true )
56+ defer txn .Discard ()
57+
58+ err := s .renewCertForAgents (txn )
59+ if err != nil {
60+ return fmt .Errorf ("failed to new certificates for agents" )
61+ }
62+
63+ err = txn .Commit ()
64+ if err != nil {
65+ return fmt .Errorf ("failed to add enrollment token: %s" , err )
66+ }
67+
68+ return nil
69+ }
70+
5371func (s * Store ) isAgentEnrolled (txn * badger.Txn , fingerprint []byte ) bool {
5472 return exists (txn , prefix_agent , fingerprint )
5573}
@@ -136,3 +154,50 @@ func (s *Store) deleteAgent(txn *badger.Txn, fingerprint []byte) error {
136154 }
137155 return nil
138156}
157+
158+ func (s Store ) renewCertForAgents (txn * badger.Txn ) error {
159+ renewThreshold := 7 * 24 * time .Hour
160+
161+ opts := badger .DefaultIteratorOptions
162+ opts .PrefetchSize = 10
163+ opts .Prefix = prefix_agent
164+ it := txn .NewIterator (opts )
165+ defer it .Close ()
166+
167+ for it .Seek (prefix_agent ); it .ValidForPrefix (prefix_agent ); it .Next () {
168+ item := it .Item ()
169+ err := item .Value (func (v []byte ) error {
170+ agent := & Agent {}
171+ if err := proto .Unmarshal (v , agent ); err != nil {
172+ s .l .WithError (err ).Error ("Failed to parse agent" )
173+ return nil
174+ }
175+
176+ untilExpires := time .Until (agent .ExpiresAt .AsTime ())
177+
178+ if untilExpires .Hours () < renewThreshold .Hours () {
179+ s .l .Debugf ("Renewing certificate for agent: %s %x" , agent .Name , agent .Fingerprint )
180+ ip , err := assignedIPToIPNet (agent .AssignedIP )
181+ if err != nil {
182+ return fmt .Errorf ("failed to parse ip of agent: %s" , err )
183+ }
184+
185+ agent , err = s .signCSR (txn , agent , ip )
186+ if err != nil {
187+ return fmt .Errorf ("failed to sign agent csr: %s" , err )
188+ }
189+
190+ agent , err = s .updateAgent (txn , agent )
191+ if err != nil {
192+ return fmt .Errorf ("failed to update agent as part of renewing agent cerfiticate: %s" , err )
193+ }
194+ }
195+
196+ return nil
197+ })
198+ if err != nil {
199+ return err
200+ }
201+ }
202+ return nil
203+ }
0 commit comments