func (m *Master) setupSecureProxy(user, privateKeyfile, publicKeyfile string) { // Sync loop to ensure that the SSH key has been installed. go util.Until(func() { if m.installSSHKey == nil { glog.Error("Won't attempt to install ssh key: installSSHKey function is nil") return } key, err := util.ParsePublicKeyFromFile(publicKeyfile) if err != nil { glog.Errorf("Failed to load public key: %v", err) return } keyData, err := util.EncodeSSHKey(key) if err != nil { glog.Errorf("Failed to encode public key: %v", err) return } if err := m.installSSHKey(user, keyData); err != nil { glog.Errorf("Failed to install ssh key: %v", err) } }, 5*time.Minute, util.NeverStop) // Sync loop for tunnels // TODO: switch this to watch. go util.Until(func() { if err := m.loadTunnels(user, privateKeyfile); err != nil { glog.Errorf("Failed to load SSH Tunnels: %v", err) } if m.tunnels != nil && m.tunnels.Len() != 0 { // Sleep for 10 seconds if we have some tunnels. // TODO (cjcullen): tunnels can lag behind actually existing nodes. time.Sleep(9 * time.Second) } }, 1*time.Second, util.NeverStop) // Refresh loop for tunnels // TODO: could make this more controller-ish go util.Until(func() { time.Sleep(5 * time.Minute) if err := m.refreshTunnels(user, privateKeyfile); err != nil { glog.Errorf("Failed to refresh SSH Tunnels: %v", err) } }, 0*time.Second, util.NeverStop) }
func (c *SSHTunneler) installSSHKeySyncLoop(user, publicKeyfile string) { go util.Until(func() { if c.InstallSSHKey == nil { glog.Error("Won't attempt to install ssh key: InstallSSHKey function is nil") return } key, err := util.ParsePublicKeyFromFile(publicKeyfile) if err != nil { glog.Errorf("Failed to load public key: %v", err) return } keyData, err := util.EncodeSSHKey(key) if err != nil { glog.Errorf("Failed to encode public key: %v", err) return } if err := c.InstallSSHKey(user, keyData); err != nil { glog.Errorf("Failed to install ssh key: %v", err) } }, 5*time.Minute, c.stopChan) }