diff --git a/SQL/MariaDBConnector.go b/SQL/MariaDBConnector.go index 864e338..55b14c9 100644 --- a/SQL/MariaDBConnector.go +++ b/SQL/MariaDBConnector.go @@ -12,70 +12,76 @@ import ( ) type MariaDBConnector struct { - Address string - Port uint16 - Database string - DbUser string + Address string + Port uint16 + Database string + DbUser string DbPassword string } -func GetMariaDBInstance(config Tools.Config) MariaDBConnector { +func GetMariaDBInstance(sqlConfig Tools.SQLConfig) MariaDBConnector { var mariadb MariaDBConnector - mariadb.Address = config.SQLConfig.SqlAddress - mariadb.Port = config.SQLConfig.SqlPort - mariadb.Database = config.SQLConfig.Database - mariadb.DbUser = config.SQLConfig.DbUser - mariadb.DbPassword = config.SQLConfig.DbPassword + mariadb.Address = sqlConfig.SqlAddress + mariadb.Port = sqlConfig.SqlPort + mariadb.Database = sqlConfig.Database + mariadb.DbUser = sqlConfig.DbUser + mariadb.DbPassword = sqlConfig.DbPassword return mariadb } func checkIfEventLogTableExist(db *sql.DB, mariadb MariaDBConnector) bool { rows, _ := db.Query("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'EventLog';", mariadb.Database) - if !rows.Next(){ return false } + if !rows.Next() { + return false + } return true } func checkIfBackupTableExist(db *sql.DB, mariadb MariaDBConnector) bool { rows, _ := db.Query("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'Backups';", mariadb.Database) - if !rows.Next(){ return false } + if !rows.Next() { + return false + } return true } func checkIfBackupEntryExist(db *sql.DB, mariadb MariaDBConnector, backupName string, hostname string) bool { - rows, _ := db.Query("SELECT * FROM `" + mariadb.Database + "`.Backups WHERE Hostname = ? AND BackupName = ?;", hostname, backupName) - if !rows.Next(){ return false; } + rows, _ := db.Query("SELECT * FROM `"+mariadb.Database+"`.Backups WHERE Hostname = ? AND BackupName = ?;", hostname, backupName) + if !rows.Next() { + return false + } return true } -func createMariaDBConnection(mariadb MariaDBConnector) *sql.DB{ +func createMariaDBConnection(mariadb MariaDBConnector) *sql.DB { logger := Logging.DetailedLogger("MariaDB", "createConnection") - db, err := sql.Open("mysql", mariadb.DbUser + ":" + mariadb.DbPassword + "@(" + mariadb.Address + ":" +strconv.Itoa(int(mariadb.Port))+ ")/" + mariadb.Database) - if err != nil{ + db, err := sql.Open("mysql", mariadb.DbUser+":"+mariadb.DbPassword+"@("+mariadb.Address+":"+strconv.Itoa(int(mariadb.Port))+")/"+mariadb.Database) + if err != nil { logger.Fatal(err) } return db } -func (mariadb MariaDBConnector) createDefaultTables(){ +func (mariadb MariaDBConnector) createDefaultTables() { logger := Logging.DetailedLogger("MariaDB", "createDefaultTables") - eventLogSQL := "create table `" + mariadb.Database +"`.EventLog(UUID text null, LogType enum ('INFO', 'WARNING', 'ERROR', 'FATAL') null, Hostname varchar(256) null,BackupName varchar(256) null, Stage enum ('COMPRESS', 'UPLOAD', 'DELETE TMP') null, RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null, Description text null, Timestamp datetime null);" - backupSQL := "create table `" + mariadb.Database +"`.Backups(UUID text null, Hostname varchar(256) null, BackupName varchar(256) null, LastBackup datetime null, LocalBackup tinyint(1) null, FilePath varchar(256) null, RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null, RemotePath varchar(256) null, LocalPath varchar(256) null);" + eventLogSQL := "create table `" + mariadb.Database + "`.EventLog(UUID text null, LogType enum ('INFO', 'WARNING', 'ERROR', 'FATAL') null, Hostname varchar(256) null,BackupName varchar(256) null, Stage enum ('COMPRESS', 'UPLOAD', 'DELETE TMP') null, RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null, Description text null, Timestamp datetime null);" + backupSQL := "create table `" + mariadb.Database + "`.Backups(UUID text null, Hostname varchar(256) null, BackupName varchar(256) null, LastBackup datetime null, LocalBackup tinyint(1) null, FilePath varchar(256) null, RemoteStorage enum ('AZURE-FILE', 'AZURE-BLOB', 'NONE') null, RemotePath varchar(256) null, LocalPath varchar(256) null);" db := createMariaDBConnection(mariadb) - if !checkIfBackupTableExist(db, mariadb){ + if !checkIfBackupTableExist(db, mariadb) { _, err := db.Exec(backupSQL) - if err != nil{ + if err != nil { logger.Fatal(err) } } - if !checkIfEventLogTableExist(db, mariadb){ + if !checkIfEventLogTableExist(db, mariadb) { _, err := db.Exec(eventLogSQL) - if err != nil{ + if err != nil { logger.Fatal(err) } } @@ -83,34 +89,34 @@ func (mariadb MariaDBConnector) createDefaultTables(){ _ = db.Close() } -func (mariadb MariaDBConnector) newLogEntry(uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time){ +func (mariadb MariaDBConnector) newLogEntry(uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time) { logger := Logging.DetailedLogger("MariaDB", "newLogEntry") db := createMariaDBConnection(mariadb) hostname, _ := os.Hostname() - _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.EventLog VALUES (?, ?, ?, ?, ?, ?, ?, ?);", uuid.String(), strconv.FormatInt(int64(logType), 10), hostname, backupName, stage, strconv.FormatInt(int64(storageType), 10), description ,timestamp) - if err != nil{ + _, err := db.Query("INSERT INTO `"+mariadb.Database+"`.EventLog VALUES (?, ?, ?, ?, ?, ?, ?, ?);", uuid.String(), strconv.FormatInt(int64(logType), 10), hostname, backupName, stage, strconv.FormatInt(int64(storageType), 10), description, timestamp) + if err != nil { logger.Fatal(err) } } -func (mariadb MariaDBConnector) newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string){ +func (mariadb MariaDBConnector) newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string) { logger := Logging.DetailedLogger("MariaDB", "newBackupEntry") db := createMariaDBConnection(mariadb) hostname, _ := os.Hostname() - if checkIfBackupEntryExist(db, mariadb, backupName, hostname){ - _, err := db.Query("UPDATE `" + mariadb.Database + "`.Backups SET LastBackup = ?, LocalBackup = ?, RemoteStorage = ?, RemotePath = ?, LocalPath = ? WHERE Hostname = ? AND BackupName = ?;",lastBackup, localBackup, strconv.FormatInt(int64(storageType), 10), remotePath, localPath, hostname, backupName) + if checkIfBackupEntryExist(db, mariadb, backupName, hostname) { + _, err := db.Query("UPDATE `"+mariadb.Database+"`.Backups SET LastBackup = ?, LocalBackup = ?, RemoteStorage = ?, RemotePath = ?, LocalPath = ? WHERE Hostname = ? AND BackupName = ?;", lastBackup, localBackup, strconv.FormatInt(int64(storageType), 10), remotePath, localPath, hostname, backupName) if err != nil { logger.Fatal(err) } } else { - _, err := db.Query("INSERT INTO `" + mariadb.Database + "`.Backups VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);", uuid.New(), hostname, backupName, lastBackup, localBackup, filePath, strconv.FormatInt(int64(storageType), 10), remotePath, localPath) + _, err := db.Query("INSERT INTO `"+mariadb.Database+"`.Backups VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);", uuid.New(), hostname, backupName, lastBackup, localBackup, filePath, strconv.FormatInt(int64(storageType), 10), remotePath, localPath) if err != nil { logger.Fatal(err) } } -} \ No newline at end of file +} diff --git a/SQL/SQLInterface.go b/SQL/SQLInterface.go index 8137b5c..fd03e1c 100644 --- a/SQL/SQLInterface.go +++ b/SQL/SQLInterface.go @@ -12,35 +12,40 @@ type SQLService interface { newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string) } -func CreateDefaultTables(sqlService SQLService){ - config := Tools.GetConfig() - if config.SQLConfig.EnableSQL{ +func CreateDefaultTables(sqlService SQLService) { + sqlConfig := Tools.GetSQLConfig() + if sqlConfig.EnableSQL { sqlService.createDefaultTables() } } -func NewLogEntry(sqlService SQLService, uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time){ - config := Tools.GetConfig() - if config.SQLConfig.EnableSQL{ +func NewLogEntry(sqlService SQLService, uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time) { + sqlConfig := Tools.GetSQLConfig() + if sqlConfig.EnableSQL { sqlService.newLogEntry(uuid, logType, backupName, stage, storageType, description, timestamp) } } -func NewBackupEntry(sqlService SQLService, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string){ - config := Tools.GetConfig() - if config.SQLConfig.EnableSQL{ +func NewBackupEntry(sqlService SQLService, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string) { + sqlConfig := Tools.GetSQLConfig() + if sqlConfig.EnableSQL { sqlService.newBackupEntry(backupName, lastBackup, localBackup, filePath, storageType, remotePath, localPath) } } -func GetSQLInstance() SQLService{ - config := Tools.GetConfig() +func GetSQLInstance() SQLService { + sqlConfig := Tools.GetSQLConfig() - if !config.SQLConfig.EnableSQL { return nil } + if !sqlConfig.EnableSQL { + return nil + } - switch config.SQLConfig.SqlType { - case "mariadb": {return GetMariaDBInstance(config)} + switch sqlConfig.SqlType { + case "mariadb": + { + return GetMariaDBInstance(sqlConfig) + } } return nil -} \ No newline at end of file +} diff --git a/Tools/Config.go b/Tools/Config.go index 5b70658..aa785f4 100644 --- a/Tools/Config.go +++ b/Tools/Config.go @@ -2,24 +2,28 @@ package Tools import ( "encoding/json" + "fmt" "os" "scabiosa/Logging" ) -type Config struct { - SQLConfig struct { - EnableSQL bool `json:"enableSQL"` - SqlType string `json:"sqlType"` - SqlAddress string `json:"sql-address"` - SqlPort uint16 `json:"sql-port"` - Database string `json:"database"` - DbUser string `json:"db-user"` - DbPassword string `json:"db-password"` - } `json:"sqlConfig"` +type SQLConfig struct { + EnableSQL bool `json:"enableSQL"` + SqlType string `json:"sqlType"` + SqlAddress string `json:"sql-address"` + SqlPort uint16 `json:"sql-port"` + Database string `json:"database"` + DbUser string `json:"db-user"` + DbPassword string `json:"db-password"` +} + type AzureConfig struct { FileshareName string `json:"fileshareName"` StorageAccountName string `json:"storageAccountName"` StorageAccountKey string `json:"storageAccountKey"` +} + +type Config struct { FolderToBackup []struct { BackupName string `json:"backupName"` FolderPath string `json:"folderPath"` @@ -40,6 +44,16 @@ func readConfig() []byte { return file } +func readSQLConfig() []byte { + logger := Logging.DetailedLogger("ConfigHandler", "readSQLConfig") + + file, err := os.ReadFile("config/sql-config.json") + if err != nil { + logger.Fatal(err) + } + return file +} + func CheckIfConfigExists() { logger := Logging.DetailedLogger("ConfigHandler", "CheckIfConfigExists") @@ -48,27 +62,68 @@ func CheckIfConfigExists() { if fileErr != nil { logger.Fatal(fileErr) } - generateDefaultConfig() + fmt.Printf("No configs detected. Please use 'scabiosa generate-config'\n") + os.Exit(0) } } -func generateDefaultConfig() { - logger := Logging.DetailedLogger("ConfigHandler", "GenerateDefaultConfig") +func GenerateBaseConfig() { + logger := Logging.DetailedLogger("ConfigHandler", "GenerateBaseConfig") + var baseConfig Config - var config Config - var conf []byte - - conf, err := json.MarshalIndent(config, "", "\t") - //conf, err := json.Marshal(config) + conf, err := json.MarshalIndent(baseConfig, "", "\t") + if err != nil { + logger.Fatal(err) + } + for _, s := range baseConfig.FolderToBackup { + s.BackupName = "" + } + err = os.WriteFile("config/config.json", conf, 0775) if err != nil { logger.Fatal(err) } - err = os.WriteFile("config/config.json", conf, 0755) +} + +func GenerateAzureConfig(azure AzureConfig) { + logger := Logging.DetailedLogger("ConfigHandler", "GenerateAzureConfig") + + conf, err := json.MarshalIndent(azure, "", "\t") if err != nil { logger.Fatal(err) } + err = os.WriteFile("config/azure.json", conf, 0775) + if err != nil { + logger.Fatal(err) + } +} + +func GenerateSQLConfig(sqlConfig SQLConfig) { + logger := Logging.DetailedLogger("ConfigHandler", "GenerateSQLConfig") + + conf, err := json.MarshalIndent(sqlConfig, "", "\t") + if err != nil { + logger.Fatal(err) + } + + err = os.WriteFile("config/sql-config.json", conf, 0775) + if err != nil { + logger.Fatal(err) + } + +} + +func GetSQLConfig() SQLConfig { + logger := Logging.DetailedLogger("ConfigHandler", "GetSQLConfig") + var sqlConfig SQLConfig + + err := json.Unmarshal(readSQLConfig(), &sqlConfig) + if err != nil { + logger.Fatal(err) + } + + return sqlConfig } func GetConfig() Config {