github.com/mysteriumnetwork/node@v0.0.0-20240516044423-365054f76801/nat/upnp/loader.go (about)

     1  /*
     2   * Copyright (C) 2019 The "MysteriumNetwork/node" Authors.
     3   *
     4   * This program is free software: you can redistribute it and/or modify
     5   * it under the terms of the GNU General Public License as published by
     6   * the Free Software Foundation, either version 3 of the License, or
     7   * (at your option) any later version.
     8   *
     9   * This program is distributed in the hope that it will be useful,
    10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12   * GNU General Public License for more details.
    13   *
    14   * You should have received a copy of the GNU General Public License
    15   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    16   */
    17  
    18  package upnp
    19  
    20  import (
    21  	"sync"
    22  
    23  	"github.com/rs/zerolog/log"
    24  )
    25  
    26  // GatewayLoader fetches the gateways once and keeps them stored for further use
    27  type GatewayLoader struct {
    28  	gateways []GatewayDevice
    29  	once     sync.Once
    30  }
    31  
    32  // HumanReadable returns a human readable representation of the devices
    33  func (gl *GatewayLoader) HumanReadable() []map[string]string {
    34  	gl.once.Do(gl.load)
    35  	res := make([]map[string]string, 0)
    36  
    37  	for _, v := range gl.gateways {
    38  		res = append(res, v.ToMap())
    39  	}
    40  
    41  	return res
    42  }
    43  
    44  // Get returns the gateway devices
    45  func (gl *GatewayLoader) Get() []GatewayDevice {
    46  	gl.once.Do(gl.load)
    47  	return gl.gateways
    48  }
    49  
    50  func (gl *GatewayLoader) load() {
    51  	gateways, err := discoverGateways()
    52  	if err != nil {
    53  		log.Error().Err(err).Msg("error discovering UPnP devices: ")
    54  		return
    55  	}
    56  	gl.gateways = gateways
    57  	printGatewayInfo(gateways)
    58  }