113 lines
4.3 KiB
Go
113 lines
4.3 KiB
Go
package SQL
|
|
|
|
import (
|
|
"database/sql"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"github.com/google/uuid"
|
|
"os"
|
|
"scabiosa/Logging"
|
|
"scabiosa/Tools"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type MariaDBConnector struct {
|
|
Address string
|
|
Port uint16
|
|
Database string
|
|
DbUser string
|
|
DbPassword string
|
|
}
|
|
|
|
func GetMariaDBInstance(sqlConfig Tools.SQLConfig) MariaDBConnector {
|
|
var mariadb MariaDBConnector
|
|
|
|
mariadb.Address = sqlConfig.SqlAddress
|
|
mariadb.Port = sqlConfig.SqlPort
|
|
mariadb.Database = sqlConfig.Database
|
|
mariadb.DbUser = sqlConfig.DbUser
|
|
mariadb.DbPassword = sqlConfig.DbPassword
|
|
|
|
return mariadb
|
|
}
|
|
|
|
func (mariadb MariaDBConnector) checkIfEventLogTableExist(db *sql.DB) bool {
|
|
rows, _ := db.Query("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'EventLog';", mariadb.Database)
|
|
return rows.Next()
|
|
}
|
|
|
|
func (mariadb MariaDBConnector) checkIfBackupTableExist(db *sql.DB) bool {
|
|
rows, _ := db.Query("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'Backups';", mariadb.Database)
|
|
return rows.Next()
|
|
}
|
|
|
|
func (mariadb MariaDBConnector) checkIfBackupEntryExist(db *sql.DB, backupName string, hostname string) bool {
|
|
rows, _ := db.Query("SELECT * FROM `"+mariadb.Database+"`.Backups WHERE Hostname = ? AND BackupName = ?;", hostname, backupName)
|
|
return rows.Next()
|
|
}
|
|
|
|
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 {
|
|
logger.Fatal(err)
|
|
}
|
|
return db
|
|
}
|
|
|
|
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);"
|
|
|
|
db := createMariaDBConnection(mariadb)
|
|
|
|
if !mariadb.checkIfBackupTableExist(db) {
|
|
_, err := db.Exec(backupSQL)
|
|
if err != nil {
|
|
logger.Fatal(err)
|
|
}
|
|
}
|
|
|
|
if !mariadb.checkIfEventLogTableExist(db) {
|
|
_, err := db.Exec(eventLogSQL)
|
|
if err != nil {
|
|
logger.Fatal(err)
|
|
}
|
|
}
|
|
|
|
_ = db.Close()
|
|
}
|
|
|
|
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 {
|
|
logger.Fatal(err)
|
|
}
|
|
|
|
}
|
|
|
|
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 mariadb.checkIfBackupEntryExist(db, 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)
|
|
if err != nil {
|
|
logger.Fatal(err)
|
|
}
|
|
}
|
|
}
|