From 7bc88328d460a9f669d9ee86713b729528ddee12 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Tue, 31 Oct 2023 11:09:01 +0800 Subject: [PATCH] fix: reload failure from upf --- features/mml/mml.go | 189 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 154 insertions(+), 35 deletions(-) diff --git a/features/mml/mml.go b/features/mml/mml.go index 229aee0a..5947d5a8 100644 --- a/features/mml/mml.go +++ b/features/mml/mml.go @@ -121,51 +121,170 @@ func PostMMLToNF(w http.ResponseWriter, r *http.Request) { services.ResponseWithJson(w, http.StatusOK, response) return } + defer conn.Close() - loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) - n, err = conn.Write([]byte(loginStr)) - if err != nil { - log.Errorf("Error: %s", err.Error()) - return - } - - time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) - - n, err = conn.Read(buf[0:]) - if err != nil { - log.Errorf("Error: %s", err.Error()) - return - } - log.Debug(string(buf[0:n])) - - body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) - if err != nil { - log.Error("io.ReadAll is failed:", err) - services.ResponseNotFound404UriNotExist(w, r) - return - } - log.Debug("Body:", string(body)) - - mmlRequest := new(MMLRequest) - _ = json.Unmarshal(body, mmlRequest) - - for _, mml := range mmlRequest.MML { - mmlCommand := fmt.Sprintf("%s\n", mml) - log.Debug("mml command:", mmlCommand) - _, err = conn.Write([]byte(mmlCommand)) + conn.SetDeadline(time.Now().Add(10 * time.Second)) + switch strings.ToLower(neType) { + case "upf": + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) if err != nil { - log.Errorf("Error: %s", err.Error()) + log.Error("io.ReadAll is failed:", err) + services.ResponseNotFound404UriNotExist(w, r) return } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Debug(string(buf[0:n])) + + // loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + // _, err = conn.Write([]byte(loginStr)) + // if err != nil { + // log.Error("Failed to write:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Write([]byte(config.GetYamlConfig().MML.User + "\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Debug(string(buf[0:n])) + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + n, err = conn.Write([]byte(config.GetYamlConfig().MML.Password + "\n")) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Debug(string(buf[0:n])) + + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Debug(string(buf[0:n])) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\n", mml) + log.Debug("mml command:", mmlCommand) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + // n, err = conn.Read(buf[0:]) + // if err != nil { + // log.Error("Failed to read:", err) + // mmlResult = append(mmlResult, err.Error()) + // response := Response{mmlResult} + // services.ResponseWithJson(w, http.StatusOK, response) + // return + // } + // log.Trace(string(buf[0 : n-len(neType)-2])) + // mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) + + // can't read buffer from upf telnet server, so return ok always + mmlResult = append(mmlResult, "COMMAND OK\n") + } + default: + loginStr := fmt.Sprintf("%s\n%s\n", config.GetYamlConfig().MML.User, config.GetYamlConfig().MML.Password) + _, err = conn.Write([]byte(loginStr)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) n, err = conn.Read(buf[0:]) if err != nil { - log.Errorf("Error: %s", err.Error()) + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) return } - log.Debug(string(buf[0 : n-len(neType)-2])) - mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) + log.Trace(string(buf[0:n])) + + body, err := io.ReadAll(io.LimitReader(r.Body, global.RequestBodyMaxLen)) + if err != nil { + log.Error("Failed to ReadAll:", err) + services.ResponseNotFound404UriNotExist(w, r) + return + } + log.Trace("Body:", string(body)) + + mmlRequest := new(MMLRequest) + _ = json.Unmarshal(body, mmlRequest) + + for _, mml := range mmlRequest.MML { + mmlCommand := fmt.Sprintf("%s\n", mml) + _, err = conn.Write([]byte(mmlCommand)) + if err != nil { + log.Error("Failed to write:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + time.Sleep(time.Millisecond * TIME_DELAY_AFTER_WRITE) + + n, err = conn.Read(buf[0:]) + if err != nil { + log.Error("Failed to read:", err) + mmlResult = append(mmlResult, err.Error()) + response := Response{mmlResult} + services.ResponseWithJson(w, http.StatusOK, response) + return + } + log.Trace(string(buf[0 : n-len(neType)-2])) + mmlResult = append(mmlResult, string(buf[0:n-len(neType)-2])) + } } }