diff options
Diffstat (limited to 'src/helsinki.at/rhimportd')
-rw-r--r-- | src/helsinki.at/rhimportd/ctrlWatchDir.go | 74 |
1 files changed, 51 insertions, 23 deletions
diff --git a/src/helsinki.at/rhimportd/ctrlWatchDir.go b/src/helsinki.at/rhimportd/ctrlWatchDir.go index f4e3a54..6f84c15 100644 --- a/src/helsinki.at/rhimportd/ctrlWatchDir.go +++ b/src/helsinki.at/rhimportd/ctrlWatchDir.go @@ -30,6 +30,8 @@ import ( "helsinki.at/rhimport" "net/http" "os" + "path/filepath" + "strings" "time" ) @@ -73,21 +75,31 @@ type watchDirResponseData struct { Cut uint `json:"CUT_NUMBER"` } -func watchDirErrorResponse(code int, errStr string) { - encoder := json.NewEncoder(os.Stdout) - respdata := watchDirResponseData{code, errStr, 0, 0} - encoder.Encode(respdata) +func watchDirWriteResponse(filename string, resp *watchDirResponseData) { + file, err := os.OpenFile(filename, os.O_WRONLY|os.O_TRUNC, 0) + if err != nil { + rhl.Printf("watch-dir-ctrl: writing response failed: %s", err) + return + } + encoder := json.NewEncoder(file) + encoder.Encode(resp) + file.Close() + + dstname := strings.TrimSuffix(filename, ".running") + ".done" + os.Rename(filename, dstname) } -func watchDirResponse(result *rhimport.Result) { - encoder := json.NewEncoder(os.Stdout) - respdata := watchDirResponseData{result.ResponseCode, result.ErrorString, result.Cart, result.Cut} - encoder.Encode(respdata) +func watchDirErrorResponse(filename string, code int, errStr string) { + watchDirWriteResponse(filename, &watchDirResponseData{code, errStr, 0, 0}) } -func watchDirParseRequest(conf *rhimport.Config, rddb *rhimport.RdDbChan, filename string) (ctx *rhimport.Context, err error) { +func watchDirResponse(filename string, result *rhimport.Result) { + watchDirWriteResponse(filename, &watchDirResponseData{result.ResponseCode, result.ErrorString, result.Cart, result.Cut}) +} + +func watchDirParseRequest(conf *rhimport.Config, rddb *rhimport.RdDbChan, req *os.File) (ctx *rhimport.Context, err error) { - decoder := json.NewDecoder(os.Stdin) + decoder := json.NewDecoder(req) reqdata := newWatchDirRequestData(conf) if jsonerr := decoder.Decode(reqdata); jsonerr != nil { err = fmt.Errorf("Error parsing JSON response: %s", jsonerr) @@ -111,33 +123,27 @@ func watchDirParseRequest(conf *rhimport.Config, rddb *rhimport.RdDbChan, filena return } -func watchDirHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, filename string) { +func watchDirHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, ctx *rhimport.Context, filename string) { rhdl.Printf("WatchDirHandler: request for '%s'", filename) - var ctx *rhimport.Context var err error - if ctx, err = watchDirParseRequest(conf, rddb, filename); err != nil { - watchDirErrorResponse(http.StatusBadRequest, err.Error()) - return - } - if err = ctx.SanityCheck(); err != nil { - watchDirErrorResponse(http.StatusBadRequest, err.Error()) + watchDirErrorResponse(filename, http.StatusBadRequest, err.Error()) return } var res *rhimport.Result if res, err = rhimport.FetchFile(ctx); err != nil { - watchDirErrorResponse(http.StatusInternalServerError, err.Error()) + watchDirErrorResponse(filename, http.StatusInternalServerError, err.Error()) return } if res.ResponseCode != http.StatusOK { - watchDirErrorResponse(res.ResponseCode, res.ErrorString) + watchDirErrorResponse(filename, res.ResponseCode, res.ErrorString) return } if res, err = rhimport.ImportFile(ctx); err != nil { - watchDirErrorResponse(http.StatusInternalServerError, err.Error()) + watchDirErrorResponse(filename, http.StatusInternalServerError, err.Error()) return } if res.ResponseCode == http.StatusOK { @@ -146,7 +152,7 @@ func watchDirHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, filename st rhl.Println("ImportFile import of", ctx.SourceFile, "was unsuccesful") } - watchDirResponse(res) + watchDirResponse(filename, res) return } @@ -164,7 +170,29 @@ func watchDirRun(dir *os.File, conf *rhimport.Config, rddb *rhimport.RdDbChan) { rhl.Printf("watch-dir-ctrl: reading directory contents failed: %s", err) return } - rhdl.Printf("watch-dir-ctrl: got: %q", names) + + for _, name := range names { + if strings.HasSuffix(name, ".new") { + srcname := filepath.Join(dir.Name(), name) + + rhdl.Printf("watch-dir-ctrl: found new file %s", srcname) + var file *os.File + if file, err = os.Open(srcname); err != nil { + rhl.Printf("watch-dir-ctrl: error reading new file: %s", err) + continue + } + if ctx, err := watchDirParseRequest(conf, rddb, file); err == nil { + file.Close() + dstname := strings.TrimSuffix(srcname, ".new") + ".running" + os.Rename(srcname, dstname) + go watchDirHandler(conf, rddb, ctx, dstname) + } else { // ignoring files with json errors -> maybe the file has not been written completely + file.Close() + rhdl.Printf("watch-dir-ctrl: new file %s parser error: %s, ignoring for now", srcname, err) + } + } + } + time.Sleep(1 * time.Second) } } |