93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| package ipmi_sensor
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // Connection properties for a Client
 | |
| type Connection struct {
 | |
| 	Hostname  string
 | |
| 	Username  string
 | |
| 	Password  string
 | |
| 	Port      int
 | |
| 	Interface string
 | |
| 	Privilege string
 | |
| }
 | |
| 
 | |
| func NewConnection(server string, privilege string) *Connection {
 | |
| 	conn := &Connection{}
 | |
| 	conn.Privilege = privilege
 | |
| 	inx1 := strings.LastIndex(server, "@")
 | |
| 	inx2 := strings.Index(server, "(")
 | |
| 	inx3 := strings.Index(server, ")")
 | |
| 
 | |
| 	connstr := server
 | |
| 
 | |
| 	if inx1 > 0 {
 | |
| 		security := server[0:inx1]
 | |
| 		connstr = server[inx1+1:]
 | |
| 		up := strings.SplitN(security, ":", 2)
 | |
| 		conn.Username = up[0]
 | |
| 		conn.Password = up[1]
 | |
| 	}
 | |
| 
 | |
| 	if inx2 > 0 {
 | |
| 		inx2 = strings.Index(connstr, "(")
 | |
| 		inx3 = strings.Index(connstr, ")")
 | |
| 
 | |
| 		conn.Interface = connstr[0:inx2]
 | |
| 		conn.Hostname = connstr[inx2+1 : inx3]
 | |
| 	}
 | |
| 
 | |
| 	return conn
 | |
| }
 | |
| 
 | |
| func (t *Connection) options() []string {
 | |
| 	intf := t.Interface
 | |
| 	if intf == "" {
 | |
| 		intf = "lan"
 | |
| 	}
 | |
| 
 | |
| 	options := []string{
 | |
| 		"-H", t.Hostname,
 | |
| 		"-U", t.Username,
 | |
| 		"-P", t.Password,
 | |
| 		"-I", intf,
 | |
| 	}
 | |
| 
 | |
| 	if t.Port != 0 {
 | |
| 		options = append(options, "-p", strconv.Itoa(t.Port))
 | |
| 	}
 | |
| 	if t.Privilege != "" {
 | |
| 		options = append(options, "-L", t.Privilege)
 | |
| 	}
 | |
| 	return options
 | |
| }
 | |
| 
 | |
| // RemoteIP returns the remote (bmc) IP address of the Connection
 | |
| func (c *Connection) RemoteIP() string {
 | |
| 	if net.ParseIP(c.Hostname) == nil {
 | |
| 		addrs, err := net.LookupHost(c.Hostname)
 | |
| 		if err != nil && len(addrs) > 0 {
 | |
| 			return addrs[0]
 | |
| 		}
 | |
| 	}
 | |
| 	return c.Hostname
 | |
| }
 | |
| 
 | |
| // LocalIP returns the local (client) IP address of the Connection
 | |
| func (c *Connection) LocalIP() string {
 | |
| 	conn, err := net.Dial("udp", fmt.Sprintf("%s:%d", c.Hostname, c.Port))
 | |
| 	if err != nil {
 | |
| 		// don't bother returning an error, since this value will never
 | |
| 		// make it to the bmc if we can't connect to it.
 | |
| 		return c.Hostname
 | |
| 	}
 | |
| 	_ = conn.Close()
 | |
| 	host, _, _ := net.SplitHostPort(conn.LocalAddr().String())
 | |
| 	return host
 | |
| }
 |