From 0ef0d7e685bd2fbe57bd0351e36649e971cc9a93 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Thu, 5 Jul 2018 16:33:37 -0700 Subject: [PATCH] pkg/certs: On windows watch for directory changes to load certs (#6128) This PR fixes an issue when configuring Minio TLS on windows --- pkg/certs/certs.go | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/pkg/certs/certs.go b/pkg/certs/certs.go index bd438dc4d..b374318f5 100644 --- a/pkg/certs/certs.go +++ b/pkg/certs/certs.go @@ -18,6 +18,7 @@ package certs import ( "crypto/tls" + "path/filepath" "sync" "github.com/rjeczalik/notify" @@ -74,11 +75,14 @@ func (c *Certs) watch() (err error) { } }() - if err = notify.Watch(c.certFile, c.e, eventWrite...); err != nil { + // Windows doesn't allow for watching file changes but instead allows + // for directory changes only, while we can still watch for changes + // on files on other platforms. Watch parent directory on all platforms + // for simplicity. + if err = notify.Watch(filepath.Dir(c.certFile), c.e, eventWrite...); err != nil { return err } - - if err = notify.Watch(c.keyFile, c.e, eventWrite...); err != nil { + if err = notify.Watch(filepath.Dir(c.keyFile), c.e, eventWrite...); err != nil { return err } c.Lock() @@ -93,16 +97,21 @@ func (c *Certs) watch() (err error) { func (c *Certs) run() { for event := range c.e { + base := filepath.Base(event.Path()) if isWriteEvent(event.Event()) { - cert, err := c.loadCert(c.certFile, c.keyFile) - if err != nil { - // ignore the error continue to use - // old certificates. - continue + certChanged := base == filepath.Base(c.certFile) + keyChanged := base == filepath.Base(c.keyFile) + if certChanged || keyChanged { + cert, err := c.loadCert(c.certFile, c.keyFile) + if err != nil { + // ignore the error continue to use + // old certificates. + continue + } + c.Lock() + c.cert = cert + c.Unlock() } - c.Lock() - c.cert = cert - c.Unlock() } } }