func NewHTTPBooter(listenAddr net.TCPAddr, ldlinux []byte, ds datasource.DataSource, webPort int) (*HTTPBooter, error) { bootMessageVersionedTemplate := strings.Replace(bootMessageTemplate, "$VERSION", ds.SelfInfo().Version, -1) bootMessageVersionedTemplate = strings.Replace(bootMessageTemplate, "$HOST", ds.SelfInfo().IP.String(), -1) booter := &HTTPBooter{ listenAddr: listenAddr, ldlinux: ldlinux, datasource: ds, webPort: webPort, bootMessageTemplate: bootMessageVersionedTemplate, } return booter, nil }
// StartDHCP ListenAndServe for dhcp on port 67, binds on interface=ifName if it's // not empty func StartDHCP(ifName string, serverIP net.IP, datasource datasource.DataSource) error { handler := &Handler{ ifName: ifName, serverIP: serverIP, datasource: datasource, bootMessage: fmt.Sprintf("Blacksmith (%s)", datasource.SelfInfo().Version), } log.WithFields(log.Fields{ "where": "dhcp.StartDHCP", "action": "announce", }).Infof("Listening on %s:67 (interface: %s)", serverIP.String(), ifName) var err error if ifName != "" { err = dhcp4.ListenAndServeIf(ifName, handler) } else { err = dhcp4.ListenAndServe(handler) } // https://groups.google.com/forum/#!topic/coreos-user/Qbn3OdVtrZU if len(datasource.ClusterName()) > 50 { // 63 - 12(mac) - 1(.) log.WithField("where", "dhcp.StartDHCP").Warn( "Warning: ClusterName is too long. It may break the behaviour of the DHCP clients") } rand.Seed(time.Now().UTC().UnixNano()) return err }