diff --git a/contrib/for-tests/netexec/.gitignore b/test/images/netexec/.gitignore similarity index 100% rename from contrib/for-tests/netexec/.gitignore rename to test/images/netexec/.gitignore diff --git a/contrib/for-tests/netexec/Dockerfile b/test/images/netexec/Dockerfile similarity index 74% rename from contrib/for-tests/netexec/Dockerfile rename to test/images/netexec/Dockerfile index b2eaa4d0c1..9c57cac415 100644 --- a/contrib/for-tests/netexec/Dockerfile +++ b/test/images/netexec/Dockerfile @@ -3,5 +3,9 @@ MAINTAINER Abhishek Shah "abshah@google.com" ADD netexec netexec ADD netexec.go netexec.go +EXPOSE 8080 +EXPOSE 8081 + +RUN mkdir /uploads ENTRYPOINT ["/netexec"] diff --git a/contrib/for-tests/netexec/Makefile b/test/images/netexec/Makefile similarity index 100% rename from contrib/for-tests/netexec/Makefile rename to test/images/netexec/Makefile diff --git a/contrib/for-tests/netexec/netexec.go b/test/images/netexec/netexec.go similarity index 84% rename from contrib/for-tests/netexec/netexec.go rename to test/images/netexec/netexec.go index cfca4a1297..7ab30be33e 100644 --- a/contrib/for-tests/netexec/netexec.go +++ b/test/images/netexec/netexec.go @@ -20,6 +20,7 @@ import ( "encoding/json" "flag" "fmt" + "io" "io/ioutil" "log" "net" @@ -58,6 +59,7 @@ func startHTTPServer(httpPort int) { http.HandleFunc("/shutdown", shutdownHandler) http.HandleFunc("/hostName", hostNameHandler) http.HandleFunc("/shell", shellHandler) + http.HandleFunc("/upload", uploadHandler) http.HandleFunc("/dial", dialHandler) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", httpPort), nil)) } @@ -191,6 +193,7 @@ func dialUDP(request string, remoteAddress *net.UDPAddr) (string, error) { func shellHandler(w http.ResponseWriter, r *http.Request) { log.Println(r.FormValue("shellCommand")) + log.Printf("%s %s %s\n", shellPath, "-c", r.FormValue("shellCommand")) cmdOut, err := exec.Command(shellPath, "-c", r.FormValue("shellCommand")).CombinedOutput() output := map[string]string{} if len(cmdOut) > 0 { @@ -207,6 +210,43 @@ func shellHandler(w http.ResponseWriter, r *http.Request) { } } +func uploadHandler(w http.ResponseWriter, r *http.Request) { + file, _, err := r.FormFile("file") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Unable to upload file.") + log.Printf("Unable to upload file: %s", err) + return + } + defer file.Close() + + f, err := ioutil.TempFile("/uploads", "upload") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Unable to open file for write.") + log.Printf("Unable to open file for write: %s", err) + return + } + defer f.Close() + if _, err = io.Copy(f, file); err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("Unable to write file.")) + log.Printf("Unable to write file: %s", err) + return + } + + UploadFile := f.Name() + if err := os.Chmod(UploadFile, 0700); err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Unable to chmod file.") + log.Printf("Unable to chmod file: %s", err) + return + } + log.Printf("Wrote upload to %s", UploadFile) + w.WriteHeader(http.StatusCreated) + fmt.Fprintf(w, UploadFile) +} + func hostNameHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, getHostName()) } diff --git a/test/images/netexec/pod.yaml b/test/images/netexec/pod.yaml new file mode 100644 index 0000000000..1f8782402a --- /dev/null +++ b/test/images/netexec/pod.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: netexec + labels: + app: netexec +spec: + containers: + - name: netexec + image: gcr.io/google_containers/netexec:1.1 + ports: + - containerPort: 8080 + - containerPort: 8081