// connection package ipmi import ( "fmt" "net" "strings" ) // Connection properties for a Client type Connection struct { Hostname string Username string Password string Path string Port int Interface string } func NewConnection(server string) *Connection { conn := &Connection{} inx1 := strings.Index(server, "@") inx2 := strings.Index(server, "(") inx3 := strings.Index(server, ")") connstr := server if inx1 > 0 { security := server[0:inx1] connstr = server[inx1+1 : len(server)] up := strings.Split(security, ":") 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 } // 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 }