refactor(SQL): Now has seperate config

This commit is contained in:
netbenix 2021-12-31 17:20:47 +01:00
parent c0f93788fb
commit 67af246a61
3 changed files with 132 additions and 66 deletions

View file

@ -12,70 +12,76 @@ import (
) )
type MariaDBConnector struct { type MariaDBConnector struct {
Address string Address string
Port uint16 Port uint16
Database string Database string
DbUser string DbUser string
DbPassword string DbPassword string
} }
func GetMariaDBInstance(config Tools.Config) MariaDBConnector { func GetMariaDBInstance(sqlConfig Tools.SQLConfig) MariaDBConnector {
var mariadb MariaDBConnector var mariadb MariaDBConnector
mariadb.Address = config.SQLConfig.SqlAddress mariadb.Address = sqlConfig.SqlAddress
mariadb.Port = config.SQLConfig.SqlPort mariadb.Port = sqlConfig.SqlPort
mariadb.Database = config.SQLConfig.Database mariadb.Database = sqlConfig.Database
mariadb.DbUser = config.SQLConfig.DbUser mariadb.DbUser = sqlConfig.DbUser
mariadb.DbPassword = config.SQLConfig.DbPassword mariadb.DbPassword = sqlConfig.DbPassword
return mariadb return mariadb
} }
func checkIfEventLogTableExist(db *sql.DB, mariadb MariaDBConnector) bool { 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) 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 return true
} }
func checkIfBackupTableExist(db *sql.DB, mariadb MariaDBConnector) bool { 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) 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 return true
} }
func checkIfBackupEntryExist(db *sql.DB, mariadb MariaDBConnector, backupName string, hostname string) bool { 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) rows, _ := db.Query("SELECT * FROM `"+mariadb.Database+"`.Backups WHERE Hostname = ? AND BackupName = ?;", hostname, backupName)
if !rows.Next(){ return false; } if !rows.Next() {
return false
}
return true return true
} }
func createMariaDBConnection(mariadb MariaDBConnector) *sql.DB{ func createMariaDBConnection(mariadb MariaDBConnector) *sql.DB {
logger := Logging.DetailedLogger("MariaDB", "createConnection") logger := Logging.DetailedLogger("MariaDB", "createConnection")
db, err := sql.Open("mysql", mariadb.DbUser + ":" + mariadb.DbPassword + "@(" + mariadb.Address + ":" +strconv.Itoa(int(mariadb.Port))+ ")/" + mariadb.Database) db, err := sql.Open("mysql", mariadb.DbUser+":"+mariadb.DbPassword+"@("+mariadb.Address+":"+strconv.Itoa(int(mariadb.Port))+")/"+mariadb.Database)
if err != nil{ if err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
return db return db
} }
func (mariadb MariaDBConnector) createDefaultTables(){ func (mariadb MariaDBConnector) createDefaultTables() {
logger := Logging.DetailedLogger("MariaDB", "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);" 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);" 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) db := createMariaDBConnection(mariadb)
if !checkIfBackupTableExist(db, mariadb){ if !checkIfBackupTableExist(db, mariadb) {
_, err := db.Exec(backupSQL) _, err := db.Exec(backupSQL)
if err != nil{ if err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
} }
if !checkIfEventLogTableExist(db, mariadb){ if !checkIfEventLogTableExist(db, mariadb) {
_, err := db.Exec(eventLogSQL) _, err := db.Exec(eventLogSQL)
if err != nil{ if err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
} }
@ -83,34 +89,34 @@ func (mariadb MariaDBConnector) createDefaultTables(){
_ = db.Close() _ = 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") logger := Logging.DetailedLogger("MariaDB", "newLogEntry")
db := createMariaDBConnection(mariadb) db := createMariaDBConnection(mariadb)
hostname, _ := os.Hostname() 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) _, 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{ if err != nil {
logger.Fatal(err) 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") logger := Logging.DetailedLogger("MariaDB", "newBackupEntry")
db := createMariaDBConnection(mariadb) db := createMariaDBConnection(mariadb)
hostname, _ := os.Hostname() hostname, _ := os.Hostname()
if checkIfBackupEntryExist(db, mariadb, backupName, 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) _, 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 { if err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
} else { } 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 { if err != nil {
logger.Fatal(err) logger.Fatal(err)
} }
} }
} }

View file

@ -12,35 +12,40 @@ type SQLService interface {
newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string) newBackupEntry(backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string)
} }
func CreateDefaultTables(sqlService SQLService){ func CreateDefaultTables(sqlService SQLService) {
config := Tools.GetConfig() sqlConfig := Tools.GetSQLConfig()
if config.SQLConfig.EnableSQL{ if sqlConfig.EnableSQL {
sqlService.createDefaultTables() sqlService.createDefaultTables()
} }
} }
func NewLogEntry(sqlService SQLService, uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time){ func NewLogEntry(sqlService SQLService, uuid uuid.UUID, logType LogType, backupName string, stage SQLStage, storageType RemoteStorageType, description string, timestamp time.Time) {
config := Tools.GetConfig() sqlConfig := Tools.GetSQLConfig()
if config.SQLConfig.EnableSQL{ if sqlConfig.EnableSQL {
sqlService.newLogEntry(uuid, logType, backupName, stage, storageType, description, timestamp) 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){ func NewBackupEntry(sqlService SQLService, backupName string, lastBackup time.Time, localBackup bool, filePath string, storageType RemoteStorageType, remotePath string, localPath string) {
config := Tools.GetConfig() sqlConfig := Tools.GetSQLConfig()
if config.SQLConfig.EnableSQL{ if sqlConfig.EnableSQL {
sqlService.newBackupEntry(backupName, lastBackup, localBackup, filePath, storageType, remotePath, localPath) sqlService.newBackupEntry(backupName, lastBackup, localBackup, filePath, storageType, remotePath, localPath)
} }
} }
func GetSQLInstance() SQLService{ func GetSQLInstance() SQLService {
config := Tools.GetConfig() sqlConfig := Tools.GetSQLConfig()
if !config.SQLConfig.EnableSQL { return nil } if !sqlConfig.EnableSQL {
return nil
}
switch config.SQLConfig.SqlType { switch sqlConfig.SqlType {
case "mariadb": {return GetMariaDBInstance(config)} case "mariadb":
{
return GetMariaDBInstance(sqlConfig)
}
} }
return nil return nil
} }

View file

@ -2,24 +2,28 @@ package Tools
import ( import (
"encoding/json" "encoding/json"
"fmt"
"os" "os"
"scabiosa/Logging" "scabiosa/Logging"
) )
type Config struct { type SQLConfig struct {
SQLConfig struct { EnableSQL bool `json:"enableSQL"`
EnableSQL bool `json:"enableSQL"` SqlType string `json:"sqlType"`
SqlType string `json:"sqlType"` SqlAddress string `json:"sql-address"`
SqlAddress string `json:"sql-address"` SqlPort uint16 `json:"sql-port"`
SqlPort uint16 `json:"sql-port"` Database string `json:"database"`
Database string `json:"database"` DbUser string `json:"db-user"`
DbUser string `json:"db-user"` DbPassword string `json:"db-password"`
DbPassword string `json:"db-password"` }
} `json:"sqlConfig"`
type AzureConfig struct { type AzureConfig struct {
FileshareName string `json:"fileshareName"` FileshareName string `json:"fileshareName"`
StorageAccountName string `json:"storageAccountName"` StorageAccountName string `json:"storageAccountName"`
StorageAccountKey string `json:"storageAccountKey"` StorageAccountKey string `json:"storageAccountKey"`
}
type Config struct {
FolderToBackup []struct { FolderToBackup []struct {
BackupName string `json:"backupName"` BackupName string `json:"backupName"`
FolderPath string `json:"folderPath"` FolderPath string `json:"folderPath"`
@ -40,6 +44,16 @@ func readConfig() []byte {
return file 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() { func CheckIfConfigExists() {
logger := Logging.DetailedLogger("ConfigHandler", "CheckIfConfigExists") logger := Logging.DetailedLogger("ConfigHandler", "CheckIfConfigExists")
@ -48,27 +62,68 @@ func CheckIfConfigExists() {
if fileErr != nil { if fileErr != nil {
logger.Fatal(fileErr) logger.Fatal(fileErr)
} }
generateDefaultConfig() fmt.Printf("No configs detected. Please use 'scabiosa generate-config'\n")
os.Exit(0)
} }
} }
func generateDefaultConfig() { func GenerateBaseConfig() {
logger := Logging.DetailedLogger("ConfigHandler", "GenerateDefaultConfig") logger := Logging.DetailedLogger("ConfigHandler", "GenerateBaseConfig")
var baseConfig Config
var config Config conf, err := json.MarshalIndent(baseConfig, "", "\t")
var conf []byte if err != nil {
logger.Fatal(err)
conf, err := json.MarshalIndent(config, "", "\t") }
//conf, err := json.Marshal(config) for _, s := range baseConfig.FolderToBackup {
s.BackupName = ""
}
err = os.WriteFile("config/config.json", conf, 0775)
if err != nil { if err != nil {
logger.Fatal(err) 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 { if err != nil {
logger.Fatal(err) 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 { func GetConfig() Config {