From 5ac37243d06e87ee81bc8e51fa10bf5082fe2212 Mon Sep 17 00:00:00 2001 From: tv Date: Sun, 18 Sep 2011 15:36:46 +0200 Subject: //hyper/process/main.go: gofmtized --- hyper/process/main.go | 92 +++++++++++++++++++++++++-------------------------- 1 file changed, 46 insertions(+), 46 deletions(-) (limited to 'hyper') diff --git a/hyper/process/main.go b/hyper/process/main.go index 5420f681..214dade9 100644 --- a/hyper/process/main.go +++ b/hyper/process/main.go @@ -10,68 +10,68 @@ import "bytes" import "hyper/process" -var proc = map[string] *hyper.Process{} +var proc = map[string]*hyper.Process{} // TODO Retrieve Process, Write, Kill [autokill], get exit code func RespondJSON(res http.ResponseWriter, v interface{}) os.Error { - content, err := json.Marshal(v) - if err == nil { - log.Printf("< %s", content) - res.Header().Set("Content-Type", "application/json; charset=\"utf-8\"") - res.WriteHeader(http.StatusOK) - res.Write(content) - } else { - log.Printf("%s while json.Marshal(%s)", err, v) - } - return err + content, err := json.Marshal(v) + if err == nil { + log.Printf("< %s", content) + res.Header().Set("Content-Type", "application/json; charset=\"utf-8\"") + res.WriteHeader(http.StatusOK) + res.Write(content) + } else { + log.Printf("%s while json.Marshal(%s)", err, v) + } + return err } func CreateProcessHandler(res http.ResponseWriter, req *http.Request) { - if p, err := hyper.NewProcess(req); err == nil { - id := p.Id() - proc[id] = p - RespondJSON(res, &map[string]string{ - "path": fmt.Sprintf("/proc/%s", id), - }) - } else { - log.Printf("%s", err) - res.WriteHeader(http.StatusInternalServerError) - } + if p, err := hyper.NewProcess(req); err == nil { + id := p.Id() + proc[id] = p + RespondJSON(res, &map[string]string{ + "path": fmt.Sprintf("/proc/%s", id), + }) + } else { + log.Printf("%s", err) + res.WriteHeader(http.StatusInternalServerError) + } } func RetrieveProcess(res http.ResponseWriter, req *http.Request) { - if p := proc[mux.Vars(req)["id"]]; p != nil { - RespondJSON(res, p) - } else { - res.WriteHeader(http.StatusNotFound) - } + if p := proc[mux.Vars(req)["id"]]; p != nil { + RespondJSON(res, p) + } else { + res.WriteHeader(http.StatusNotFound) + } } func FeedProcess(res http.ResponseWriter, req *http.Request) { - if p := proc[mux.Vars(req)["id"]]; p != nil { - body := make([]byte, 4096) - if _, err := req.Body.Read(body); err == nil { - body = bytes.TrimRight(body, string([]byte{0})) - p.Write(body) - //if err := p.Write(body); err == nil { - RespondJSON(res, true) - //} - } - } else { - res.WriteHeader(http.StatusNotFound) - } + if p := proc[mux.Vars(req)["id"]]; p != nil { + body := make([]byte, 4096) + if _, err := req.Body.Read(body); err == nil { + body = bytes.TrimRight(body, string([]byte{0})) + p.Write(body) + //if err := p.Write(body); err == nil { + RespondJSON(res, true) + //} + } + } else { + res.WriteHeader(http.StatusNotFound) + } } func main() { - // Gorilla - mux.HandleFunc("/proc", CreateProcessHandler).Methods("POST") - mux.HandleFunc("/proc/{id}", RetrieveProcess).Methods("GET") - mux.HandleFunc("/proc/{id}", FeedProcess).Methods("POST") + // Gorilla + mux.HandleFunc("/proc", CreateProcessHandler).Methods("POST") + mux.HandleFunc("/proc/{id}", RetrieveProcess).Methods("GET") + mux.HandleFunc("/proc/{id}", FeedProcess).Methods("POST") - err := http.ListenAndServe("0.0.0.0:8888", mux.DefaultRouter) - if err != nil { - log.Fatal("ListenAndServe: ", err.String()) - } + err := http.ListenAndServe("0.0.0.0:8888", mux.DefaultRouter) + if err != nil { + log.Fatal("ListenAndServe: ", err.String()) + } } -- cgit v1.2.3 From e1089de23a7e3b316e0c06b4e60c7f6e05d8d5dd Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 02:17:23 +0200 Subject: //hyper/process/spawn: initial commit --- hyper/process/spawn | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 hyper/process/spawn (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn new file mode 100755 index 00000000..a0043ec7 --- /dev/null +++ b/hyper/process/spawn @@ -0,0 +1,70 @@ +#! /bin/sh +# +# spawn [command [argument ...]] +# +spawn() { + set -euf + + # create and change working directory + wd=`mktemp -d` + defer rmdir $wd + cd $wd + + # create named pipes for the child process's stdio + mkfifo 0 1 2 + defer rm 0 1 2 + + # spawn child process + (exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 "$@") & + pid=$! + + # setup a trap to kill the child process if this (parent) process dies + defer kill $pid + + # write child process's pid + echo $pid >pid + defer rm pid + + # create dummy directory for easier debugging + mkdir -vp /tmp/dummy + ln -vsnf $wd/0 $wd/1 $wd/2 $wd/pid /tmp/dummy/ + defer rm -v /tmp/dummy/0 /tmp/dummy/1 /tmp/dummy/2 /tmp/dummy/pid + + # wait for the child process's + set +e + wait $pid + code=$? + set -e + + # the child is already dead + cancel kill $pid + + # return the same way wait did + (exit $code) +} + +# +# defer [command [argument ...]] +# +# Defer execution of a command. Deferred commands are executed in LIFO +# order immediately before the script terminates. See (golang's defer +# statement for more information how this should work). +# +defer() { + defer="$*${defer+ +$defer}" + trap "$defer" EXIT +} + +# +# cancel [command [argument ...]] +# +# Cancel a deferred command. The arguments have to match exactly a +# prior defer call or else chaos and mayhem shall haunt thee and shi- +# +cancel() { + defer="`echo "$defer" | grep -Fxv "$*"`" + trap "$defer" EXIT +} + +spawn "$@" -- cgit v1.2.3 From 08a6dc70d957912c864516ad705c7c724f363b73 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 03:05:14 +0200 Subject: //hyper/process/spawn: defer w/ dash-compat trap --- hyper/process/spawn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index a0043ec7..c2b829ca 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -53,7 +53,6 @@ spawn() { defer() { defer="$*${defer+ $defer}" - trap "$defer" EXIT } # @@ -64,7 +63,8 @@ $defer}" # cancel() { defer="`echo "$defer" | grep -Fxv "$*"`" - trap "$defer" EXIT } +# setup deferred execution and spawn command +trap 'eval "${defer-}"; defer=' EXIT INT spawn "$@" -- cgit v1.2.3 From b3a318886407c98b3e91df9173c2d9c2cf195de3 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 15:09:19 +0200 Subject: //hyper spawn: use well known //proc dir this commit also spawns the command in the current $PWD so spawn ls & co. are viable commands. this commit also sets up a trap for TERM, so dash behaves nicely, again. also we now've got more documentation and debug output [if called with sh -x]. --- hyper/process/spawn | 58 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 13 deletions(-) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index c2b829ca..95854c7d 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -1,34 +1,61 @@ #! /bin/sh # -# spawn [command [argument ...]] +# [sh -x] spawn [command [argument ...]] +# +# export id to create&destroy or reuse the working directory //proc/$id/. +# this feature is for debug only and marked as deprecated, so don't rely +# on it too hard. # spawn() { set -euf - # create and change working directory - wd=`mktemp -d` - defer rmdir $wd + # establish working subdirectory in //proc. we're mking only + # transient dirs, i.e. if we mkdir, then we also defer rmdir. + if test -n "${id-}"; then + : "using id=$id from env" + wd=$pd/$id + if ! test -d $wd; then + : "make transient $wd/" + mkdir $wd + defer rmdir $wd + elif ! test `ls $wd | wc -l` = 0; then + : "$wd/ is not empty!" + exit 23 + else + : "reuse existing $wd/" + fi + else + id=`cd $pd && mktemp -d XXXXXXXXXXXXXXXX` + wd=$pd/$id + defer rmdir $wd + : "made transient $wd/" + fi + + # change to //proc working directory + cwd="$PWD" cd $wd + #defer cd $cwd # no need for this, b/c at that time we're aldeady dead # create named pipes for the child process's stdio mkfifo 0 1 2 defer rm 0 1 2 # spawn child process - (exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 "$@") & + ( : "in $PWD/ spawn ${*-"nothing"}" + exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 + cd "$cwd" + exec "$@") & pid=$! # setup a trap to kill the child process if this (parent) process dies defer kill $pid - # write child process's pid + # store misc. info. + ln -snf $cwd cwd + echo $id >id + echo $$ >ppid echo $pid >pid - defer rm pid - - # create dummy directory for easier debugging - mkdir -vp /tmp/dummy - ln -vsnf $wd/0 $wd/1 $wd/2 $wd/pid /tmp/dummy/ - defer rm -v /tmp/dummy/0 /tmp/dummy/1 /tmp/dummy/2 /tmp/dummy/pid + defer rm cwd id pid ppid # wait for the child process's set +e @@ -65,6 +92,11 @@ cancel() { defer="`echo "$defer" | grep -Fxv "$*"`" } +# setup //proc directory +pd=/tmp/krebs/proc +mkdir -p $pd +test -w $pd + # setup deferred execution and spawn command -trap 'eval "${defer-}"; defer=' EXIT INT +trap 'eval "${defer-}"; defer=' EXIT INT TERM spawn "$@" -- cgit v1.2.3 From 549515312ac5442bb7b8984665e7a79aba862a3c Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 15:13:22 +0200 Subject: //hyper spawn: fix spawn-debug-output for dash --- hyper/process/spawn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index 95854c7d..f800a1bb 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -41,7 +41,7 @@ spawn() { defer rm 0 1 2 # spawn child process - ( : "in $PWD/ spawn ${*-"nothing"}" + ( : "in $PWD/ spawn ${*:-"nothing"}" exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 cd "$cwd" exec "$@") & -- cgit v1.2.3 From fa1e71f1376a4983251821c6b74275dd4b726b4e Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 15:33:00 +0200 Subject: //process spawn: rm crufty "s --- hyper/process/spawn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index f800a1bb..01ca2a04 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -41,7 +41,7 @@ spawn() { defer rm 0 1 2 # spawn child process - ( : "in $PWD/ spawn ${*:-"nothing"}" + ( : "in $PWD/ spawn ${*:-nothing}" exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 cd "$cwd" exec "$@") & -- cgit v1.2.3 From 8e30185619d6cdc8ec2cd5dd0f341ffabef2d563 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 15:37:26 +0200 Subject: //hyper spawn: defer cd, so Solaris's sh can rmdir --- hyper/process/spawn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index 01ca2a04..cf93eb6b 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -34,7 +34,7 @@ spawn() { # change to //proc working directory cwd="$PWD" cd $wd - #defer cd $cwd # no need for this, b/c at that time we're aldeady dead + defer cd $cwd # create named pipes for the child process's stdio mkfifo 0 1 2 -- cgit v1.2.3 From fcbb481cbd888d6ab66b09e649c754a012198e53 Mon Sep 17 00:00:00 2001 From: tv Date: Tue, 20 Sep 2011 15:45:30 +0200 Subject: //hyper spawn: set +x before rediring popes --- hyper/process/spawn | 1 + 1 file changed, 1 insertion(+) (limited to 'hyper') diff --git a/hyper/process/spawn b/hyper/process/spawn index cf93eb6b..65e94d86 100755 --- a/hyper/process/spawn +++ b/hyper/process/spawn @@ -42,6 +42,7 @@ spawn() { # spawn child process ( : "in $PWD/ spawn ${*:-nothing}" + set +x # disable debug output so we don't clobber 2 exec 0>&- 1>&- 2>&- 0<>0 1<>1 2<>2 cd "$cwd" exec "$@") & -- cgit v1.2.3