From d5b7b59fc0920300d0316daa8abc3e56381e1de3 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 28 Jun 2023 13:19:42 +0200 Subject: [PATCH] creating server structure and env config on server startup if not exists --- example.env | 10 --- grouptasks_lang_log_messages.json | 9 ++ main.go | 112 +++++++++++++++++++++++++ modules/config/config.go | 30 +++++-- modules/grouptasks/grouptasks.go | 42 ++++------ modules/logger/logger.go | 5 ++ routers/router/api/v1/logger/logger.go | 17 +--- routers/router/api/v1/user/avatar.go | 6 +- routers/router/router.go | 3 +- socketserver/hub.go | 2 +- system_lang_log_messages.json | 2 +- 11 files changed, 178 insertions(+), 60 deletions(-) delete mode 100644 example.env diff --git a/example.env b/example.env deleted file mode 100644 index f8aaf9e..0000000 --- a/example.env +++ /dev/null @@ -1,10 +0,0 @@ -DEBUG=false -COLORIZED_OUTPUT=false -HOST=127.0.0.1 -PORT=3000 - -# MariaDB -MARIADB_HOSTNAME=localhost -MARIADB_PORT=8080 -MARIADB_USERNAME=test -MARIADB_PASSWORD=test \ No newline at end of file diff --git a/grouptasks_lang_log_messages.json b/grouptasks_lang_log_messages.json index 99a6d9c..4bb6ff8 100644 --- a/grouptasks_lang_log_messages.json +++ b/grouptasks_lang_log_messages.json @@ -52,5 +52,14 @@ "message": "Step %taskStepId% of %groupTaskId% status set to %status%" } ] + }, + { + "id": 6, + "languages": [ + { + "lang": "en", + "message": "--------- SERVER has started ---------" + } + ] } ] \ No newline at end of file diff --git a/main.go b/main.go index 596c13b..ccd24da 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,9 @@ package main import ( + "encoding/json" + "fmt" + "io/ioutil" "janex/admin-dashboard-backend/modules/config" "janex/admin-dashboard-backend/modules/database" "janex/admin-dashboard-backend/modules/grouptasks" @@ -10,16 +13,24 @@ import ( "janex/admin-dashboard-backend/modules/utils" "janex/admin-dashboard-backend/routers/router" "janex/admin-dashboard-backend/socketserver" + "os" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" flogger "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/websocket/v2" + "github.com/rs/zerolog/log" ) func init() { + createEnvConfigFileIfotExists() + config.LoadConfig() logger.InitLogger() + + createServerDirectoriesIfotExists() + createLogLanguageFilesIfNotExist() + utils.ValidatorInit() logger.InitLanguageLogMessages() systempermissions.InitSystemPermissions() @@ -79,3 +90,104 @@ func main() { app.Listen(config.Cfg.Host + ":" + config.Cfg.Port) } + +func createEnvConfigFileIfotExists() { + content := `DEBUG=false +COLORIZED_OUTPUT=true +HOST=127.0.0.1 +PORT=8080 + +# Folder paths +FOLDER_GROUPTASKS_GROUPS=./groupTasks/groups/ +FOLDER_GROUPTASKS_RUNNINGTASKS=./groupTasks/runningTasks/ + +FOLDER_LOGS_GROUPTASKS=./logs/grouptasks/ +FOLDER_LOGS_SYSTEM=./logs/system/ + +FOLDER_PUBLIC_STATIC=./public/ + +# Log language configurations +LOG_LANGUAGE_GROUPTASKS=./grouptasks_lang_log_messages.json +LOG_LANGUAGE_SYSTEM=./system_lang_log_messages.json + +# MariaDB +MARIADB_HOSTNAME=127.0.0.1 +MARIADB_PORT=3306 +MARIADB_USERNAME=db_user +MARIADB_PASSWORD=db_password +MARIADB_DATABASE_NAME=db_database_name` + + if _, err := os.Stat(".env"); os.IsNotExist(err) { + err := ioutil.WriteFile(".env", []byte(content), 0644) + + if err != nil { + panic("Failed to create .env file, err: " + err.Error()) + } + + fmt.Println("Config .env was created. Please configure and start the server again.") + os.Exit(1) + } +} + +func createServerDirectoriesIfotExists() { + cfg := config.Cfg.FolderPaths + + paths := []string{ + cfg.GroupTasksGroups, + cfg.GroupTasksRunningTasks, + cfg.LogsGroupTasks, + cfg.LogsSystem, + cfg.PublicStatic + "avatars/", + cfg.PublicStatic + "grouptasks/", + cfg.PublicStatic + "sounds/"} + + for _, path := range paths { + _, err := os.Stat(path) + + if os.IsNotExist(err) { + if err := os.MkdirAll(path, os.ModePerm); err != nil { + log.Error().Msgf("Failed to create server directory: %s", err.Error()) + continue + } + + log.Info().Msgf("Created server directory: %s", path) + } + } +} + +func createLogLanguageFilesIfNotExist() { + cfg := config.Cfg + + files := []string{cfg.LogLanguageGroupTasks, cfg.LogLanguageSystem} + + for _, filename := range files { + _, err := os.Stat(filename) + + if os.IsNotExist(err) { + file, err := os.Create(filename) + + if err != nil { + log.Error().Msgf("Failed to create log language file %s", err.Error()) + continue + } + + defer file.Close() + + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + + data := []structs.LanguageLogMessages{{ + Id: 0, + Languages: []structs.LanguageLogMessagesLanguage{ + {Lang: "en", Message: "Your message"}, + }}} + + if err := encoder.Encode(data); err != nil { + log.Error().Msgf("Failed to write default language log messages into file %s", filename) + continue + } + + log.Info().Msgf("Create log language file %s", filename) + } + } +} diff --git a/modules/config/config.go b/modules/config/config.go index 7956388..54a25bc 100644 --- a/modules/config/config.go +++ b/modules/config/config.go @@ -9,11 +9,22 @@ import ( var Cfg Config type Config struct { - Debug bool - ColorizedOutput bool - Host string - Port string - MariaDB MariaDB + Debug bool + ColorizedOutput bool + Host string + Port string + FolderPaths FolderPaths + MariaDB MariaDB + LogLanguageGroupTasks string + LogLanguageSystem string +} + +type FolderPaths struct { + GroupTasksGroups string + GroupTasksRunningTasks string + LogsGroupTasks string + LogsSystem string + PublicStatic string } type MariaDB struct { @@ -32,6 +43,15 @@ func LoadConfig() { ColorizedOutput: os.Getenv("COLORIZED_OUTPUT") == "true", Host: os.Getenv("HOST"), Port: os.Getenv("PORT"), + FolderPaths: FolderPaths{ + GroupTasksGroups: os.Getenv("FOLDER_GROUPTASKS_GROUPS"), + GroupTasksRunningTasks: os.Getenv("FOLDER_GROUPTASKS_RUNNINGTASKS"), + LogsGroupTasks: os.Getenv("FOLDER_LOGS_GROUPTASKS"), + LogsSystem: os.Getenv("FOLDER_LOGS_SYSTEM"), + PublicStatic: os.Getenv("FOLDER_PUBLIC_STATIC"), + }, + LogLanguageGroupTasks: os.Getenv("LOG_LANGUAGE_GROUPTASKS"), + LogLanguageSystem: os.Getenv("LOG_LANGUAGE_SYSTEM"), MariaDB: MariaDB{ Hostname: os.Getenv("MARIADB_HOSTNAME"), Port: os.Getenv("MARIADB_PORT"), diff --git a/modules/grouptasks/grouptasks.go b/modules/grouptasks/grouptasks.go index a6b1bfe..09f294a 100644 --- a/modules/grouptasks/grouptasks.go +++ b/modules/grouptasks/grouptasks.go @@ -6,6 +6,7 @@ import ( "fmt" "io/ioutil" "janex/admin-dashboard-backend/modules/cache" + "janex/admin-dashboard-backend/modules/config" "janex/admin-dashboard-backend/modules/database" "janex/admin-dashboard-backend/modules/logger" "janex/admin-dashboard-backend/modules/structs" @@ -23,15 +24,8 @@ import ( "github.com/rs/zerolog/log" ) -var ( - rootPath = "./groupTasks/" - groupsPath = rootPath + "groups/" - runningTasksPath = rootPath + "runningTasks/" - publicPath = "./public/grouptasks/" -) - func LoadGroups(category string) { - entries, err := os.ReadDir(groupsPath) + entries, err := os.ReadDir(config.Cfg.FolderPaths.GroupTasksGroups) if err != nil { llog.Fatal(err) @@ -45,7 +39,7 @@ func LoadGroups(category string) { var updatedGroups []structs.Group for _, entry := range entries { - files, err := os.ReadDir(groupsPath + entry.Name()) + files, err := os.ReadDir(config.Cfg.FolderPaths.GroupTasksGroups + entry.Name()) if err != nil { log.Error().Msg("Failed to read groups directory files, error: " + err.Error()) @@ -54,7 +48,7 @@ func LoadGroups(category string) { for _, file := range files { if file.Name() == "index.json" { - content, err := os.ReadFile(groupsPath + entry.Name() + "/index.json") + content, err := os.ReadFile(config.Cfg.FolderPaths.GroupTasksGroups + entry.Name() + "/index.json") if err != nil { log.Error().Msg("Failed to read file content, error: " + err.Error()) @@ -202,13 +196,13 @@ func RunGroupTask(args RunGroupTaskArgs) { } // create running task folder - if _, err := os.Stat(runningTasksPath + groupTaskStep.GroupTasksId); errors.Is(err, os.ErrNotExist) { - if err := os.Mkdir(runningTasksPath+groupTaskStep.GroupTasksId, os.ModePerm); err != nil { + if _, err := os.Stat(config.Cfg.FolderPaths.GroupTasksRunningTasks + groupTaskStep.GroupTasksId); errors.Is(err, os.ErrNotExist) { + if err := os.Mkdir(config.Cfg.FolderPaths.GroupTasksRunningTasks+groupTaskStep.GroupTasksId, os.ModePerm); err != nil { log.Error().Msgf("Error creating running tasks folder %s", err.Error()) } // copy scripts to group tasks folder - err := filepath.Walk(groupsPath+categoryGroup.Id, func(path string, info os.FileInfo, err error) error { + err := filepath.Walk(config.Cfg.FolderPaths.GroupTasksGroups+categoryGroup.Id, func(path string, info os.FileInfo, err error) error { if err != nil { log.Error().Msgf("Error walk %s", err.Error()) return err @@ -221,7 +215,7 @@ func RunGroupTask(args RunGroupTaskArgs) { log.Error().Msgf("Error reading file %s", err.Error()) } - err = ioutil.WriteFile(runningTasksPath+groupTaskStep.GroupTasksId+"/"+info.Name(), bytesRead, 0644) + err = ioutil.WriteFile(config.Cfg.FolderPaths.GroupTasksRunningTasks+groupTaskStep.GroupTasksId+"/"+info.Name(), bytesRead, 0644) if err != nil { log.Error().Msgf("Error writing file %s", err.Error()) @@ -240,7 +234,7 @@ func RunGroupTask(args RunGroupTaskArgs) { cmd := exec.Command("python3", commandArgs...) //cmd.Dir = "/home/alex/Documents/coding/projects/janex/admin-dashboard/backend/groupTasks/groups/production1/" // path needs to be set here as the python scripts will use the path as base path to create files for example - cmd.Dir = runningTasksPath + groupTaskStep.GroupTasksId + "/" + cmd.Dir = config.Cfg.FolderPaths.GroupTasksRunningTasks + groupTaskStep.GroupTasksId + "/" out, err := cmd.CombinedOutput() // execute script @@ -290,7 +284,7 @@ func RunGroupTask(args RunGroupTaskArgs) { // looking for files which are created by the scripts var foundFiles []FoundFile - if err = filepath.Walk(runningTasksPath+groupTaskStep.GroupTasksId+"/", func(path string, info os.FileInfo, err error) error { + if err = filepath.Walk(config.Cfg.FolderPaths.GroupTasksRunningTasks+groupTaskStep.GroupTasksId+"/", func(path string, info os.FileInfo, err error) error { if err != nil { log.Error().Msgf("Error walk %s", err.Error()) return err @@ -307,15 +301,15 @@ func RunGroupTask(args RunGroupTaskArgs) { if len(foundFiles) > 0 { // creating folder for the old files which can be used by the python scripts for the next steps - if _, err := os.Stat(runningTasksPath + groupTaskStep.GroupTasksId + "/oldFiles"); errors.Is(err, os.ErrNotExist) { - if err := os.Mkdir(runningTasksPath+groupTaskStep.GroupTasksId+"/oldFiles", os.ModePerm); err != nil { + if _, err := os.Stat(config.Cfg.FolderPaths.GroupTasksRunningTasks + groupTaskStep.GroupTasksId + "/oldFiles"); errors.Is(err, os.ErrNotExist) { + if err := os.Mkdir(config.Cfg.FolderPaths.GroupTasksRunningTasks+groupTaskStep.GroupTasksId+"/oldFiles", os.ModePerm); err != nil { log.Error().Msgf("Error creating old files folder %s", err.Error()) } } // copy files to public directory to access it via web ui - if _, err := os.Stat(publicPath + groupTaskStep.GroupTasksId); errors.Is(err, os.ErrNotExist) { - if err := os.Mkdir(publicPath+groupTaskStep.GroupTasksId, os.ModePerm); err != nil { + if _, err := os.Stat(config.Cfg.FolderPaths.PublicStatic + "grouptasks/" + groupTaskStep.GroupTasksId); errors.Is(err, os.ErrNotExist) { + if err := os.Mkdir(config.Cfg.FolderPaths.PublicStatic+"grouptasks/"+groupTaskStep.GroupTasksId, os.ModePerm); err != nil { log.Error().Msgf("Error creating task public folder %s", err.Error()) } } @@ -329,7 +323,7 @@ func RunGroupTask(args RunGroupTaskArgs) { log.Error().Msgf("Error reading file %s", err.Error()) } - err = ioutil.WriteFile(runningTasksPath+groupTaskStep.GroupTasksId+"/oldFiles/"+foundFile.FileName, bytesRead, 0644) + err = ioutil.WriteFile(config.Cfg.FolderPaths.GroupTasksRunningTasks+groupTaskStep.GroupTasksId+"/oldFiles/"+foundFile.FileName, bytesRead, 0644) if err != nil { log.Error().Msgf("Error writing file %s", err.Error()) @@ -337,13 +331,13 @@ func RunGroupTask(args RunGroupTaskArgs) { systemFileName := uuid.New().String() + filepath.Ext(foundFile.FileName) - err = ioutil.WriteFile(publicPath+groupTaskStep.GroupTasksId+"/"+systemFileName, bytesRead, 0644) + err = ioutil.WriteFile(config.Cfg.FolderPaths.PublicStatic+"grouptasks/"+groupTaskStep.GroupTasksId+"/"+systemFileName, bytesRead, 0644) if err != nil { log.Error().Msgf("Error writing file %s", err.Error()) } - err = os.Remove(runningTasksPath + groupTaskStep.GroupTasksId + "/" + foundFile.FileName) + err = os.Remove(config.Cfg.FolderPaths.GroupTasksRunningTasks + groupTaskStep.GroupTasksId + "/" + foundFile.FileName) if err != nil { log.Error().Msgf("Failed to delete created file by task %s", err.Error()) @@ -403,7 +397,7 @@ func RunGroupTask(args RunGroupTaskArgs) { EndedAt: time.Now(), }) - if err = os.RemoveAll(runningTasksPath + groupTaskStep.GroupTasksId + "/"); err != nil { + if err = os.RemoveAll(config.Cfg.FolderPaths.GroupTasksRunningTasks + groupTaskStep.GroupTasksId + "/"); err != nil { log.Error().Msgf("Failed to delete running task folder %s", err.Error()) } diff --git a/modules/logger/logger.go b/modules/logger/logger.go index 94a9d47..d51305f 100644 --- a/modules/logger/logger.go +++ b/modules/logger/logger.go @@ -188,6 +188,11 @@ func InitLanguageLogMessages() { Id: 8, Type: utils.LogTypeInfo, }) + + AddGroupTasksLog(structs.LogMessage{ + Id: 6, + Type: utils.LogTypeInfo, + }) } func readLanguageLogMessages(systemLogs bool) { diff --git a/routers/router/api/v1/logger/logger.go b/routers/router/api/v1/logger/logger.go index d03a12b..c0da636 100644 --- a/routers/router/api/v1/logger/logger.go +++ b/routers/router/api/v1/logger/logger.go @@ -21,7 +21,7 @@ func GetSystemLog(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusUnauthorized) } - logType := "GroupTasks" + logType := "Group Tasks" if t == "s" { logType = "System" @@ -31,18 +31,9 @@ func GetSystemLog(c *fiber.Ctx) error { Id: 17, Type: utils.LogTypeInfo, Messages: []structs.LogData{ - { - Type: "userId", - Value: c.Locals("userId").(string), - }, - { - Type: "logType", - Value: logType, - }, - { - Type: "logDate", - Value: date, - }, + {Type: "userId", Value: c.Locals("userId").(string)}, + {Type: "logType", Value: logType}, + {Type: "logDate", Value: date}, }, }) diff --git a/routers/router/api/v1/user/avatar.go b/routers/router/api/v1/user/avatar.go index 37c8f40..ba7cbf6 100644 --- a/routers/router/api/v1/user/avatar.go +++ b/routers/router/api/v1/user/avatar.go @@ -24,7 +24,6 @@ func UpdateAvatar(c *fiber.Ctx) error { } if fileHeader.Size > utils.MaxAvatarSize { - log.Error().Msg("User Avatar file size limit exceeded") return c.SendStatus(fiber.StatusRequestEntityTooLarge) } @@ -55,10 +54,7 @@ func UpdateAvatar(c *fiber.Ctx) error { Id: 21, Type: utils.LogTypeInfo, Messages: []structs.LogData{ - { - Type: "userId", - Value: user.Id, - }, + {Type: "userId", Value: user.Id}, }, }) diff --git a/routers/router/router.go b/routers/router/router.go index 6f2f648..b458bf0 100644 --- a/routers/router/router.go +++ b/routers/router/router.go @@ -1,6 +1,7 @@ package router import ( + "janex/admin-dashboard-backend/modules/config" "janex/admin-dashboard-backend/modules/database" "janex/admin-dashboard-backend/modules/structs" "janex/admin-dashboard-backend/modules/utils" @@ -28,7 +29,7 @@ func SetupRoutes(app *fiber.App) { l := v1.Group("/log") l.Get("/", userSessionValidation, log.GetSystemLog) - app.Static("/", "./public") + app.Static("/", config.Cfg.FolderPaths.PublicStatic) } func userSessionValidation(c *fiber.Ctx) error { diff --git a/socketserver/hub.go b/socketserver/hub.go index 82d4b11..0c18d29 100644 --- a/socketserver/hub.go +++ b/socketserver/hub.go @@ -101,7 +101,7 @@ func RunHub() { continue } - log.Info().Msgf("Received message: %v %v", receivedMessage, receivedMessage.Cmd) + log.Debug().Msgf("Received message: %v %v", receivedMessage, receivedMessage.Cmd) switch receivedMessage.Cmd { case utils.ReceivedCmdStartGroupTasks: diff --git a/system_lang_log_messages.json b/system_lang_log_messages.json index e8c054a..f3cb594 100644 --- a/system_lang_log_messages.json +++ b/system_lang_log_messages.json @@ -76,7 +76,7 @@ "languages": [ { "lang": "en", - "message": "SERVER has started" + "message": "--------- SERVER has started ---------" } ] },