diff --git a/pkg/login-validator/cmd/login.go b/pkg/login-validator/cmd/login.go index e8fe8ea..b0302d0 100644 --- a/pkg/login-validator/cmd/login.go +++ b/pkg/login-validator/cmd/login.go @@ -155,13 +155,28 @@ func (l loginChecker) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } - if err := l.registerUser(lu.Username, r.RemoteAddr); err != nil { + // Find corresponding MAC + var fname string + spl := strings.SplitN(remoteAddr, ":", 2) + if ip := net.ParseIP(spl[0]); ip == nil { + return errors.New("Unable to parse given IPv4: " + spl[0]) + } else if arptable, err := ARPAnalyze(); err != nil { + return err + } else if arpent := ARPContainsIP(arptable, ip); arpent == nil { + return errors.New("Unable to find MAC in ARP table") + } else { + fname = fmt.Sprintf("%02x-%02x-%02x-%02x-%02x-%02x-%02x", arpent.HWType, arpent.HWAddress[0], arpent.HWAddress[1], arpent.HWAddress[2], arpent.HWAddress[3], arpent.HWAddress[4], arpent.HWAddress[5]) + } + + // Register the user remotely + if err := l.registerUser(lu.Username, r.RemoteAddr, fname); err != nil { log.Println("Error on remote registration:", err) http.Error(w, "Internal server error. Please retry in a few minutes", http.StatusInternalServerError) return } - if err := l.lateLoginAction(lu.Username, r.RemoteAddr); err != nil { + // Generate PXE file + if err := l.lateLoginAction(lu.Username, r.RemoteAddr, fname); err != nil { log.Println("Error on late login action:", err) http.Error(w, "Internal server error. Please retry in a few minutes", http.StatusInternalServerError) return @@ -171,8 +186,8 @@ func (l loginChecker) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, "Success", http.StatusOK) } -func (l loginChecker) registerUser(username, remoteAddr string) error { - bts, err := json.Marshal(map[string]interface{}{"login": username}) +func (l loginChecker) registerUser(username, remoteAddr, mac string) error { + bts, err := json.Marshal(map[string]interface{}{"login": username, "ip": remoteAddr, "mac": mac}) if err != nil { return nil } @@ -197,20 +212,7 @@ func (l loginChecker) registerUser(username, remoteAddr string) error { } } -func (l loginChecker) lateLoginAction(username, remoteAddr string) error { - // Find corresponding MAC - var fname string - spl := strings.SplitN(remoteAddr, ":", 2) - if ip := net.ParseIP(spl[0]); ip == nil { - return errors.New("Unable to parse given IPv4: " + spl[0]) - } else if arptable, err := ARPAnalyze(); err != nil { - return err - } else if arpent := ARPContainsIP(arptable, ip); arpent == nil { - return errors.New("Unable to find MAC in ARP table") - } else { - fname = fmt.Sprintf("%02x-%02x-%02x-%02x-%02x-%02x-%02x", arpent.HWType, arpent.HWAddress[0], arpent.HWAddress[1], arpent.HWAddress[2], arpent.HWAddress[3], arpent.HWAddress[4], arpent.HWAddress[5]) - } - +func (l loginChecker) lateLoginAction(username, remoteAddr, fname string) error { if tpl, err := ioutil.ReadFile(path.Join(tftpDir, "pxelinux.cfg", "tpl")); err != nil { log.Println("Unable to open tpl: ", err) } else if file, err := os.OpenFile(path.Join(tftpDir, "pxelinux.cfg", fname), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(0644)); err != nil {