diff options
Diffstat (limited to 'src/helsinki.at/rhimportd/ctrlWatchDir.go')
-rw-r--r-- | src/helsinki.at/rhimportd/ctrlWatchDir.go | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/src/helsinki.at/rhimportd/ctrlWatchDir.go b/src/helsinki.at/rhimportd/ctrlWatchDir.go deleted file mode 100644 index 6f84c15..0000000 --- a/src/helsinki.at/rhimportd/ctrlWatchDir.go +++ /dev/null @@ -1,219 +0,0 @@ -// -// rhimportd -// -// The Radio Helsinki Rivendell Import Daemon -// -// -// Copyright (C) 2015-2016 Christian Pointner <equinox@helsinki.at> -// -// This file is part of rhimportd. -// -// rhimportd is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// any later version. -// -// rhimportd is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with rhimportd. If not, see <http://www.gnu.org/licenses/>. -// - -package main - -import ( - "encoding/json" - "fmt" - "helsinki.at/rhimport" - "net/http" - "os" - "path/filepath" - "strings" - "time" -) - -type watchDirRequestData struct { - UserName string `json:"LOGIN_NAME"` - ShowId uint `json:"SHOW_ID"` - ClearShowCarts bool `json:"CLEAR_SHOW_CARTS"` - MusicPoolGroup string `json:"MUSIC_POOL_GROUP"` - Cart uint `json:"CART_NUMBER"` - ClearCart bool `json:"CLEAR_CART"` - Cut uint `json:"CUT_NUMBER"` - Channels uint `json:"CHANNELS"` - NormalizationLevel int `json:"NORMALIZATION_LEVEL"` - AutotrimLevel int `json:"AUTOTRIM_LEVEL"` - UseMetaData bool `json:"USE_METADATA"` - SourceUri string `json:"SOURCE_URI"` -} - -func newWatchDirRequestData(conf *rhimport.Config) *watchDirRequestData { - rd := new(watchDirRequestData) - rd.UserName = "" - rd.ShowId = 0 - rd.ClearShowCarts = false - rd.MusicPoolGroup = "" - rd.Cart = 0 - rd.ClearCart = false - rd.Cut = 0 - rd.Channels = conf.ImportParamDefaults.Channels - rd.NormalizationLevel = conf.ImportParamDefaults.NormalizationLevel - rd.AutotrimLevel = conf.ImportParamDefaults.AutotrimLevel - rd.UseMetaData = conf.ImportParamDefaults.UseMetaData - rd.SourceUri = "" - - return rd -} - -type watchDirResponseData struct { - ResponseCode int `json:"REPONSE_CODE"` - ErrorString string `json:"ERROR_STRING"` - Cart uint `json:"CART_NUMBER"` - Cut uint `json:"CUT_NUMBER"` -} - -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 watchDirErrorResponse(filename string, code int, errStr string) { - watchDirWriteResponse(filename, &watchDirResponseData{code, errStr, 0, 0}) -} - -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(req) - reqdata := newWatchDirRequestData(conf) - if jsonerr := decoder.Decode(reqdata); jsonerr != nil { - err = fmt.Errorf("Error parsing JSON response: %s", jsonerr) - return - } - - ctx = rhimport.NewContext(conf, rddb) - ctx.UserName = reqdata.UserName - ctx.Trusted = true - ctx.ShowId = reqdata.ShowId - ctx.ClearShowCarts = reqdata.ClearShowCarts - ctx.GroupName = reqdata.MusicPoolGroup - ctx.Cart = reqdata.Cart - ctx.ClearCart = reqdata.ClearCart - ctx.Cut = reqdata.Cut - ctx.Channels = reqdata.Channels - ctx.NormalizationLevel = reqdata.NormalizationLevel - ctx.AutotrimLevel = reqdata.AutotrimLevel - ctx.UseMetaData = reqdata.UseMetaData - ctx.SourceUri = reqdata.SourceUri - return -} - -func watchDirHandler(conf *rhimport.Config, rddb *rhimport.RdDbChan, ctx *rhimport.Context, filename string) { - rhdl.Printf("WatchDirHandler: request for '%s'", filename) - - var err error - if err = ctx.SanityCheck(); err != nil { - watchDirErrorResponse(filename, http.StatusBadRequest, err.Error()) - return - } - - var res *rhimport.Result - if res, err = rhimport.FetchFile(ctx); err != nil { - watchDirErrorResponse(filename, http.StatusInternalServerError, err.Error()) - return - } - if res.ResponseCode != http.StatusOK { - watchDirErrorResponse(filename, res.ResponseCode, res.ErrorString) - return - } - - if res, err = rhimport.ImportFile(ctx); err != nil { - watchDirErrorResponse(filename, http.StatusInternalServerError, err.Error()) - return - } - if res.ResponseCode == http.StatusOK { - rhl.Println("ImportFile succesfully imported", ctx.SourceFile) - } else { - rhl.Println("ImportFile import of", ctx.SourceFile, "was unsuccesful") - } - - watchDirResponse(filename, res) - return -} - -func watchDirRun(dir *os.File, conf *rhimport.Config, rddb *rhimport.RdDbChan) { - rhl.Printf("watch-dir-ctrl: watching for files in %s", dir.Name()) - for { - var err error - if _, err = dir.Seek(0, 0); err != nil { - rhl.Printf("watch-dir-ctrl: reading directory contents failed: %s", err) - return - } - - var names []string - if names, err = dir.Readdirnames(0); err != nil { - rhl.Printf("watch-dir-ctrl: reading directory contents failed: %s", err) - return - } - - 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) - } -} - -func StartWatchDir(dirname string, conf *rhimport.Config, rddb *rhimport.RdDbChan) { - for { - time.Sleep(5 * time.Second) - dir, err := os.Open(dirname) - if err != nil { - rhl.Printf("watch-dir-ctrl: %s", err) - continue - } - if i, err := dir.Stat(); err != nil { - rhl.Printf("watch-dir-ctrl: %s", err) - continue - } else { - if !i.IsDir() { - rhl.Printf("watch-dir-ctrl: %s is not a directory", dirname) - continue - } - } - watchDirRun(dir, conf, rddb) - } -} |