diff --git a/machinery/main.go b/machinery/main.go index 366a376..4bba8ef 100644 --- a/machinery/main.go +++ b/machinery/main.go @@ -66,7 +66,7 @@ func main() { flag.Parse() timezone, _ := time.LoadLocation("CET") - log.Log.Init(timezone) + log.Log.Init(configDirectory, timezone) switch action { @@ -102,11 +102,11 @@ func main() { // Check the folder permissions, it might be that we do not have permissions to write // recordings, update the configuration or save snapshots. - utils.CheckDataDirectoryPermissions() + utils.CheckDataDirectoryPermissions(configDirectory) // Set timezone timezone, _ := time.LoadLocation(configuration.Config.Timezone) - log.Log.Init(timezone) + log.Log.Init(configDirectory, timezone) // Check if we have a device Key or not, if not // we will generate one. diff --git a/machinery/src/capture/main.go b/machinery/src/capture/main.go index 2b52144..82ca5d2 100644 --- a/machinery/src/capture/main.go +++ b/machinery/src/capture/main.go @@ -17,7 +17,7 @@ import ( "github.com/kerberos-io/joy4/av" ) -func CleanupRecordingDirectory(configuration *models.Configuration) { +func CleanupRecordingDirectory(configDirectory string, configuration *models.Configuration) { autoClean := configuration.Config.AutoClean if autoClean == "true" { maxSize := configuration.Config.MaxDirectorySize @@ -25,7 +25,7 @@ func CleanupRecordingDirectory(configuration *models.Configuration) { maxSize = 300 } // Total size of the recording directory. - recordingsDirectory := "./data/recordings" + recordingsDirectory := configDirectory + "/data/recordings" size, err := utils.DirSize(recordingsDirectory) if err == nil { sizeInMB := size / 1000 / 1000 @@ -51,7 +51,7 @@ func CleanupRecordingDirectory(configuration *models.Configuration) { } } -func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration, communication *models.Communication, streams []av.CodecData) { +func HandleRecordStream(queue *pubsub.Queue, configDirectory string, configuration *models.Configuration, communication *models.Communication, streams []av.CodecData) { config := configuration.Config @@ -134,13 +134,13 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration } // Create a symbol link. - fc, _ := os.Create("./data/cloud/" + name) + fc, _ := os.Create(configDirectory + "/data/cloud/" + name) fc.Close() recordingStatus = "idle" // Clean up the recording directory if necessary. - CleanupRecordingDirectory(configuration) + CleanupRecordingDirectory(configDirectory, configuration) } // If not yet started and a keyframe, let's make a recording @@ -192,7 +192,7 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration "769" name = s + ".mp4" - fullName = "./data/recordings/" + name + fullName = configDirectory + "/data/recordings/" + name // Running... log.Log.Info("Recording started") @@ -259,7 +259,7 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration } // Create a symbol link. - fc, _ := os.Create("./data/cloud/" + name) + fc, _ := os.Create(configDirectory + "/data/cloud/" + name) fc.Close() recordingStatus = "idle" @@ -315,7 +315,7 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration "769" name := s + ".mp4" - fullName := "./data/recordings/" + name + fullName := configDirectory + "/data/recordings/" + name // Running... log.Log.Info("HandleRecordStream: Recording started") @@ -406,11 +406,11 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration } // Create a symbol linc. - fc, _ := os.Create("./data/cloud/" + name) + fc, _ := os.Create(configDirectory + "/data/cloud/" + name) fc.Close() // Clean up the recording directory if necessary. - CleanupRecordingDirectory(configuration) + CleanupRecordingDirectory(configDirectory, configuration) } } diff --git a/machinery/src/cloud/Cloud.go b/machinery/src/cloud/Cloud.go index c4e8322..0bb6ae4 100644 --- a/machinery/src/cloud/Cloud.go +++ b/machinery/src/cloud/Cloud.go @@ -32,8 +32,8 @@ import ( "github.com/kerberos-io/agent/machinery/src/webrtc" ) -func PendingUpload() { - ff, err := utils.ReadDirectory("./data/cloud/") +func PendingUpload(configDirectory string) { + ff, err := utils.ReadDirectory(configDirectory + "/data/cloud/") if err == nil { for _, f := range ff { log.Log.Info(f.Name()) @@ -41,12 +41,12 @@ func PendingUpload() { } } -func HandleUpload(configuration *models.Configuration, communication *models.Communication) { +func HandleUpload(configDirectory string, configuration *models.Configuration, communication *models.Communication) { log.Log.Debug("HandleUpload: started") config := configuration.Config - watchDirectory := "./data/cloud/" + watchDirectory := configDirectory + "/data/cloud/" if config.Offline == "true" { log.Log.Debug("HandleUpload: stopping as Offline is enabled.") @@ -122,7 +122,7 @@ func HandleUpload(configuration *models.Configuration, communication *models.Com // Check if we need to remove the original recording // removeAfterUpload is set to false by default if config.RemoveAfterUpload == "true" { - err := os.Remove("./data/recordings/" + fileName) + err := os.Remove(configDirectory + "/data/recordings/" + fileName) if err != nil { log.Log.Error("HandleUpload: " + err.Error()) } @@ -614,7 +614,7 @@ func VerifyHub(c *gin.Context) { // @Summary Will verify the persistence. // @Description Will verify the persistence. // @Success 200 {object} models.APIResponse -func VerifyPersistence(c *gin.Context) { +func VerifyPersistence(c *gin.Context, configDirectory string) { var config models.Config err := c.BindJSON(&config) @@ -636,7 +636,7 @@ func VerifyPersistence(c *gin.Context) { } else { // Open test-480p.mp4 - file, err := os.Open("./data/test-480p.mp4") + file, err := os.Open(configDirectory + "/data/test-480p.mp4") if err != nil { msg := "VerifyPersistence: error reading test-480p.mp4: " + err.Error() log.Log.Error(msg) @@ -741,7 +741,7 @@ func VerifyPersistence(c *gin.Context) { "_6-967003_" + config.Name + "_200-200-400-400_24_769.mp4" // Open test-480p.mp4 - file, err := os.Open("./data/test-480p.mp4") + file, err := os.Open(configDirectory + "/test-480p.mp4") if err != nil { msg := "VerifyPersistence: error reading test-480p.mp4: " + err.Error() log.Log.Error(msg) diff --git a/machinery/src/components/Config.go b/machinery/src/components/Config.go index dd58a4b..6495352 100644 --- a/machinery/src/components/Config.go +++ b/machinery/src/components/Config.go @@ -20,14 +20,14 @@ import ( "go.mongodb.org/mongo-driver/bson" ) -func GetImageFromFilePath() (image.Image, error) { - snapshotDirectory := "./data/snapshots" +func GetImageFromFilePath(configDirectory string) (image.Image, error) { + snapshotDirectory := configDirectory + "/data/snapshots" files, err := ioutil.ReadDir(snapshotDirectory) if err == nil && len(files) > 1 { sort.Slice(files, func(i, j int) bool { return files[i].ModTime().Before(files[j].ModTime()) }) - filePath := "./data/snapshots/" + files[1].Name() + filePath := configDirectory + "/data/snapshots/" + files[1].Name() f, err := os.Open(filePath) if err != nil { return nil, err @@ -44,7 +44,7 @@ func GetImageFromFilePath() (image.Image, error) { // selected language, and if the installation was completed or not. func ReadUserConfig(configDirectory string) (userConfig models.User) { for { - jsonFile, err := os.Open("./data/config/user.json") + jsonFile, err := os.Open(configDirectory + "/data/config/user.json") if err != nil { log.Log.Error("Config file is not found " + configDirectory + "/data/config/user.json, trying again in 5s: " + err.Error()) time.Sleep(5 * time.Second) diff --git a/machinery/src/components/Kerberos.go b/machinery/src/components/Kerberos.go index 290f6dd..d00acd2 100644 --- a/machinery/src/components/Kerberos.go +++ b/machinery/src/components/Kerberos.go @@ -260,10 +260,10 @@ func RunAgent(configDirectory string, configuration *models.Configuration, commu } // Handle recording, will write an mp4 to disk. - go capture.HandleRecordStream(queue, configuration, communication, streams) + go capture.HandleRecordStream(queue, configDirectory, configuration, communication, streams) // Handle Upload to cloud provider (Kerberos Hub, Kerberos Vault and others) - go cloud.HandleUpload(configuration, communication) + go cloud.HandleUpload(configDirectory, configuration, communication) // Handle ONVIF actions go onvif.HandleONVIFActions(configuration, communication) diff --git a/machinery/src/log/main.go b/machinery/src/log/main.go index d34b7fc..11c562e 100644 --- a/machinery/src/log/main.go +++ b/machinery/src/log/main.go @@ -21,7 +21,7 @@ var Log = Logging{ var gologging = logging.MustGetLogger("gologger") -func ConfigureGoLogging(timezone *time.Location) { +func ConfigureGoLogging(configDirectory string, timezone *time.Location) { // Logging var format = logging.MustStringFormatter( `%{color}%{time:15:04:05.000} %{shortfunc} ▶ %{level:.4s} %{id:03x}%{color:reset} %{message}`, @@ -32,7 +32,7 @@ func ConfigureGoLogging(timezone *time.Location) { stdBackend := logging.NewLogBackend(os.Stderr, "", 0) stdBackendLeveled := logging.NewBackendFormatter(stdBackend, format) fileBackend := logging.NewLogBackend(&lumberjack.Logger{ - Filename: "./data/log/machinery.txt", + Filename: configDirectory + "/data/log/machinery.txt", MaxSize: 2, // megabytes Compress: true, // disabled by default }, "", 0) @@ -75,10 +75,10 @@ type Logging struct { Level string } -func (self *Logging) Init(timezone *time.Location) { +func (self *Logging) Init(configDirectory string, timezone *time.Location) { switch self.Logger { case "go-logging": - ConfigureGoLogging(timezone) + ConfigureGoLogging(configDirectory, timezone) case "logrus": ConfigureLogrus(timezone) default: diff --git a/machinery/src/routers/http/Routes.go b/machinery/src/routers/http/Routes.go index b5d4adb..b728a52 100644 --- a/machinery/src/routers/http/Routes.go +++ b/machinery/src/routers/http/Routes.go @@ -78,7 +78,7 @@ func AddRoutes(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware, configDirect } // The total number of recordings stored in the directory. - recordingDirectory := "./data/recordings" + recordingDirectory := configDirectory + "/data/recordings" numberOfRecordings := utils.NumberOfMP4sInDirectory(recordingDirectory) // All days stored in this agent. @@ -115,7 +115,7 @@ func AddRoutes(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware, configDirect if eventFilter.NumberOfElements == 0 { eventFilter.NumberOfElements = 10 } - recordingDirectory := "./data/recordings" + recordingDirectory := configDirectory + "/data/recordings" files, err := utils.ReadDirectory(recordingDirectory) if err == nil { events := utils.GetSortedDirectory(files) @@ -137,7 +137,7 @@ func AddRoutes(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware, configDirect }) api.GET("/days", func(c *gin.Context) { - recordingDirectory := "./data/recordings" + recordingDirectory := configDirectory + "/data/recordings" files, err := utils.ReadDirectory(recordingDirectory) if err == nil { events := utils.GetSortedDirectory(files) @@ -205,7 +205,7 @@ func AddRoutes(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware, configDirect }) api.POST("/persistence/verify", func(c *gin.Context) { - cloud.VerifyPersistence(c) + cloud.VerifyPersistence(c, configDirectory) }) // Streaming handler @@ -215,7 +215,7 @@ func AddRoutes(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware, configDirect // We will only send an image once per second. time.Sleep(time.Second * 1) log.Log.Info("AddRoutes (/stream): reading from MJPEG stream") - img, err := components.GetImageFromFilePath() + img, err := components.GetImageFromFilePath(configDirectory) return img, err } h := components.StartMotionJPEG(imageFunction, 80) diff --git a/machinery/src/routers/http/Server.go b/machinery/src/routers/http/Server.go index 74622f9..7f5ba2c 100644 --- a/machinery/src/routers/http/Server.go +++ b/machinery/src/routers/http/Server.go @@ -76,7 +76,9 @@ func StartServer(configDirectory string, configuration *models.Configuration, co r.Use(static.Serve("/media", static.LocalFile(configDirectory+"/www", true))) r.Use(static.Serve("/settings", static.LocalFile(configDirectory+"/www", true))) r.Use(static.Serve("/login", static.LocalFile(configDirectory+"/www", true))) - r.Handle("GET", "/file/*filepath", Files) + r.Handle("GET", "/file/*filepath", func(c *gin.Context) { + Files(c, configDirectory) + }) // Run the api on port err = r.Run(":" + configuration.Port) @@ -85,8 +87,8 @@ func StartServer(configDirectory string, configuration *models.Configuration, co } } -func Files(c *gin.Context) { +func Files(c *gin.Context, configDirectory string) { c.Header("Access-Control-Allow-Origin", "*") c.Header("Content-Type", "video/mp4") - c.File("./data/recordings" + c.Param("filepath")) + c.File(configDirectory + "/data/recordings" + c.Param("filepath")) } diff --git a/machinery/src/utils/main.go b/machinery/src/utils/main.go index 8fa4f44..3a68670 100644 --- a/machinery/src/utils/main.go +++ b/machinery/src/utils/main.go @@ -110,15 +110,15 @@ func CountDigits(i int64) (count int) { return count } -func CheckDataDirectoryPermissions() error { - recordingsDirectory := "./data/recordings" - configDirectory := "./data/config" - snapshotsDirectory := "./data/snapshots" - cloudDirectory := "./data/cloud" +func CheckDataDirectoryPermissions(configDirectory string) error { + recordingsDirectory := configDirectory + "/data/recordings" + configurationDirectory := configDirectory + "/data/config" + snapshotsDirectory := configDirectory + "/data/snapshots" + cloudDirectory := configDirectory + "/data/cloud" err := CheckDirectoryPermissions(recordingsDirectory) if err == nil { - err = CheckDirectoryPermissions(configDirectory) + err = CheckDirectoryPermissions(configurationDirectory) if err == nil { err = CheckDirectoryPermissions(snapshotsDirectory) if err == nil {