func (ws *webServer) generateTemplateForMachine(templateName string, w http.ResponseWriter, r *http.Request) string { _, macStr := path.Split(r.URL.Path) mac, err := net.ParseMAC(macStr) if err != nil { http.Error(w, fmt.Sprintf(`Error while parsing the mac: %q`, err), 500) return "" } machine, exist := ws.ds.GetMachine(mac) if !exist { http.Error(w, "Machine not found", 500) return "" } cc, err := templating.ExecuteTemplateFolder( path.Join(ws.ds.WorkspacePath(), "config", templateName), machine, r.Host) if err != nil { http.Error(w, fmt.Sprintf(`Error while executing the template: %q`, err), 500) return "" } w.Header().Set("Content-Type", "text/plain") w.Write([]byte(cc)) return cc }
func (b *HTTPBooter) pxelinuxConfig(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") macStr := filepath.Base(r.URL.Path) errStr := fmt.Sprintf("%s requested a pxelinux config from URL %q, which does not include a correct MAC address", r.RemoteAddr, r.URL) if !strings.HasPrefix(macStr, "01-") { logging.Debug("HTTPBOOTER", errStr) http.Error(w, "Missing MAC address in request", http.StatusBadRequest) return } mac, err := net.ParseMAC(macStr[3:]) if err != nil { logging.Debug("HTTPBOOTER", errStr) http.Error(w, "Malformed MAC address in request", http.StatusBadRequest) return } machine, exist := b.datasource.GetMachine(mac) if !exist { logging.Debug("HTTPBOOTER", "Machine not found. mac=%s", mac) http.Error(w, "Machine not found", http.StatusNotFound) return } if _, _, err := net.SplitHostPort(r.Host); err != nil { r.Host = fmt.Sprintf("%s:%d", r.Host, b.listenAddr.Port) } coreOSVersion, _ := b.datasource.CoreOSVersion() KernelURL := "http://" + r.Host + "/f/" + coreOSVersion + "/kernel" InitrdURL := "http://" + r.Host + "/f/" + coreOSVersion + "/initrd" host, _, err := net.SplitHostPort(r.Host) if err != nil { logging.Log("HTTPBOOTER", "error in parsing host and port") http.Error(w, "error in parsing host and port", 500) return } params, err := templating.ExecuteTemplateFolder( path.Join(b.datasource.WorkspacePath(), "config", "bootparams"), machine, r.Host) if err != nil { logging.Log("HTTPBOOTER", `Error while executing the template: %q`, err) http.Error(w, fmt.Sprintf(`Error while executing the template: %q`, err), http.StatusInternalServerError) return } if err != nil { logging.Log("HTTPBOOTER", "error in bootparam template - %s", err.Error()) http.Error(w, "error in bootparam template", 500) return } params = strings.Replace(params, "\n", " ", -1) Cmdline := fmt.Sprintf( "cloud-config-url=http://%s:%d/t/cc/%s "+ "coreos.config.url=http://%s:%d/t/ig/%s %s", host, b.webPort, mac.String(), host, b.webPort, mac.String(), params) bootMessage := strings.Replace(b.bootMessageTemplate, "$MAC", macStr, -1) cfg := fmt.Sprintf(` SAY %s DEFAULT linux LABEL linux LINUX %s APPEND initrd=%s %s `, strings.Replace(bootMessage, "\n", "\nSAY ", -1), KernelURL, InitrdURL, Cmdline) w.Write([]byte(cfg)) logging.Log("HTTPBOOTER", "Sent pxelinux config to %s (%s)", mac, r.RemoteAddr) }
func (b *HTTPBooter) pxelinuxConfig(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") macStr := filepath.Base(r.URL.Path) errStr := fmt.Sprintf("%s requested a pxelinux config from URL %q, which does not include a correct MAC address", r.RemoteAddr, r.URL) if !strings.HasPrefix(macStr, "01-") { utils.LogAccess(r).WithField("where", "pxe.pxelinuxConfig").Debug(errStr) http.Error(w, "Missing MAC address in request", http.StatusBadRequest) return } mac, err := net.ParseMAC(macStr[3:]) if err != nil { utils.LogAccess(r).WithError(err).WithField("where", "pxe.pxelinuxConfig").Debug() http.Error(w, "Malformed MAC address in request", http.StatusBadRequest) return } machineInterface := b.datasource.MachineInterface(mac) _, err = machineInterface.Machine(false, nil) if err != nil { utils.LogAccess(r).WithError(err).WithField("where", "pxe.pxelinuxConfig").Debug( "Machine not found") http.Error(w, "Machine not found", http.StatusNotFound) return } if _, _, err := net.SplitHostPort(r.Host); err != nil { r.Host = fmt.Sprintf("%s:%d", r.Host, b.listenAddr.Port) } coreOSVersion, err := machineInterface.GetVariable(datasource.SpecialKeyCoreosVersion) if err != nil { utils.LogAccess(r).WithError(err).WithField("where", "pxe.pxelinuxConfig").Warn( "error in getting coreOSVersion") http.Error(w, "error in getting coreOSVersion", 500) return } KernelURL := "http://" + r.Host + "/f/" + coreOSVersion + "/kernel" InitrdURL := "http://" + r.Host + "/f/" + coreOSVersion + "/initrd" host, _, err := net.SplitHostPort(r.Host) if err != nil { utils.LogAccess(r).WithError(err).WithField("where", "pxe.pxelinuxConfig").Debug( "error in parsing host and port") http.Error(w, "error in parsing host and port", 500) return } params, err := templating.ExecuteTemplateFolder( path.Join(b.datasource.WorkspacePath(), "config", "bootparams"), b.datasource, machineInterface, r.Host) if err != nil { utils.LogAccess(r).WithError(err).WithField("where", "pxe.pxelinuxConfig").Warn( "error while executing the template") http.Error(w, fmt.Sprintf(`Error while executing the template: %q`, err), http.StatusInternalServerError) return } params = strings.Replace(params, "\n", " ", -1) Cmdline := fmt.Sprintf( "cloud-config-url=http://%s:%d/t/cc/%s "+ "coreos.config.url=http://%s:%d/t/ig/%s %s", host, b.webPort, mac.String(), host, b.webPort, mac.String(), params) bootMessage := strings.Replace(b.bootMessageTemplate, "$MAC", macStr, -1) cfg := fmt.Sprintf(` SAY %s DEFAULT linux LABEL linux LINUX %s APPEND initrd=%s %s `, strings.Replace(bootMessage, "\n", "\nSAY ", -1), KernelURL, InitrdURL, Cmdline) w.Write([]byte(cfg)) utils.LogAccess(r).WithField("where", "pxe.pxelinuxConfig").Info() }