2014-04-26 09:18:56 +00:00
package DeviceDatabase
2014-10-19 17:19:11 +00:00
import (
2014-11-07 12:30:33 +00:00
"fmt"
2014-10-19 17:19:11 +00:00
"github.com/SommerEngineering/Ocean/ConfigurationDB"
"github.com/SommerEngineering/Ocean/Log"
LM "github.com/SommerEngineering/Ocean/Log/Meta"
"gopkg.in/mgo.v2"
2014-11-08 12:02:19 +00:00
"gopkg.in/mgo.v2/bson"
2015-06-21 18:20:27 +00:00
"os"
2014-11-07 12:30:33 +00:00
"strconv"
"strings"
"time"
2014-10-19 17:19:11 +00:00
)
2014-04-26 09:18:56 +00:00
2015-06-17 15:44:52 +00:00
// Init the database for the logging.
2014-04-26 09:18:56 +00:00
func initDatabase ( ) {
2015-06-21 18:20:27 +00:00
defer func ( ) {
if err := recover ( ) ; err != nil {
fmt . Printf ( "[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n" , err )
os . Exit ( 0 )
}
} ( )
2014-04-26 09:18:56 +00:00
Log . LogShort ( senderName , LM . CategorySYSTEM , LM . LevelINFO , LM . MessageNameINIT , ` Checking and init the logging database collection. ` )
defer Log . LogShort ( senderName , LM . CategorySYSTEM , LM . LevelINFO , LM . MessageNameINIT , ` Checking and init the logging database collection done. ` )
2015-06-17 15:44:52 +00:00
// Read the configuration values for the logging database:
2014-04-26 09:18:56 +00:00
databaseHost := ConfigurationDB . Read ( ` LogDBHost ` )
databaseDB := ConfigurationDB . Read ( ` LogDBDatabase ` )
databaseUsername := ConfigurationDB . Read ( ` LogDBUsername ` )
databasePassword := ConfigurationDB . Read ( ` LogDBPassword ` )
2015-06-17 15:44:52 +00:00
// Should the logging events at the database expire?
2014-11-07 12:30:33 +00:00
expire := strings . ToLower ( ConfigurationDB . Read ( ` LogDBEventsExpire ` ) ) == ` true `
2015-06-17 15:44:52 +00:00
// The default values for the TTL (time to live):
2014-11-08 12:02:19 +00:00
expireAfterDays := 21900 // 60 years ~ maximum of MongoDB
expireValue4DisabledFunction := 21900 // 60 years ~ maximum of MongoDB
2014-11-07 12:30:33 +00:00
2015-06-17 15:44:52 +00:00
// Try to read the configured value for the TTL:
2014-11-07 12:30:33 +00:00
if value , errValue := strconv . Atoi ( ConfigurationDB . Read ( ` LogDBEventsExpireAfterDays ` ) ) ; errValue != nil {
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelERROR , LM . SeverityMiddle , LM . ImpactUnknown , LM . MessageNameCONFIGURATION , ` It was not possible to read the configuration for the expire time of logging events. Log events will not expire any more. ` , errValue . Error ( ) )
expire = false
} else {
if expire {
Log . LogShort ( senderName , LM . CategorySYSTEM , LM . LevelINFO , LM . MessageNameCONFIGURATION , fmt . Sprintf ( "All logging events are expire after %d days." , value ) )
2014-11-08 12:02:19 +00:00
if value > expireValue4DisabledFunction {
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityLow , LM . ImpactLow , LM . MessageNameDATABASE , fmt . Sprintf ( "Cannot set the logging database's TTL to %d, because MongoDB does not allow more than %d (63 years). Use now the maximum instead." , value , expireValue4DisabledFunction ) )
} else {
expireAfterDays = value
}
2014-11-07 12:30:33 +00:00
}
}
2014-04-26 09:18:56 +00:00
// Connect to MongoDB:
if newSession , errDial := mgo . Dial ( databaseHost ) ; errDial != nil {
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelERROR , LM . SeverityUnknown , LM . ImpactUnknown , LM . MessageNameDATABASE , ` It was not possible to connect to the MongoDB host ` + databaseHost , errDial . Error ( ) )
2015-06-21 18:20:27 +00:00
fmt . Printf ( "[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n" , errDial . Error ( ) )
os . Exit ( 0 )
2014-04-26 09:18:56 +00:00
} else {
logDBSession = newSession
}
// Use the correct database:
logDB = logDBSession . DB ( databaseDB )
// Login:
if errLogin := logDB . Login ( databaseUsername , databasePassword ) ; errLogin != nil {
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelSECURITY , LM . SeverityUnknown , LM . ImpactUnknown , LM . MessageNameDATABASE , ` It was not possible to login the user ` + databaseUsername , errLogin . Error ( ) )
2015-06-21 18:20:27 +00:00
fmt . Printf ( "[Error] Was not able to connect to the logging database: %s. Please read https://github.com/SommerEngineering/Ocean.\n" , errLogin . Error ( ) )
os . Exit ( 0 )
2014-04-26 09:18:56 +00:00
}
// Get the collection:
logDBCollection = logDB . C ( ` Logbook ` )
//
// Take care about all the indexes:
//
2014-11-08 12:02:19 +00:00
expireAfterSeconds := expireAfterDays * 24 * 60 * 60
2014-04-26 09:18:56 +00:00
indexTimeUTC := mgo . Index { }
indexTimeUTC . Key = [ ] string { ` TimeUTC ` }
2014-11-08 12:02:19 +00:00
indexTimeUTC . ExpireAfter = time . Duration ( expireValue4DisabledFunction * 24 * 60 * 60 )
logDBCollection . EnsureIndex ( indexTimeUTC )
// Update the expire policy:
updateResult := TTLUpdateResult { }
updateCommand := bson . D {
{ ` collMod ` , ` Logbook ` } ,
{ ` index ` ,
bson . D {
{ ` keyPattern ` , bson . D { { ` TimeUTC ` , 1 } } } ,
{ ` expireAfterSeconds ` , expireAfterSeconds } ,
} ,
} ,
}
if errUpdate := logDB . Run ( updateCommand , & updateResult ) ; errUpdate != nil {
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityUnknown , LM . ImpactUnknown , LM . MessageNameDATABASE , ` Was not able to update the expire policy for the logging database. ` , errUpdate . Error ( ) )
2014-11-07 16:31:21 +00:00
} else {
2014-11-08 12:02:19 +00:00
Log . LogFull ( senderName , LM . CategorySYSTEM , LM . LevelWARN , LM . SeverityUnknown , LM . ImpactUnknown , LM . MessageNameDATABASE , fmt . Sprintf ( ` Update the expire policy for the logging database done. ` ) )
2014-11-07 12:30:33 +00:00
}
2015-06-17 15:44:52 +00:00
//
// Ensure that all necessary indexes are existing:
//
2014-04-26 09:18:56 +00:00
indexProject := mgo . Index { }
indexProject . Key = [ ] string { ` Project ` }
logDBCollection . EnsureIndex ( indexProject )
indexSender := mgo . Index { }
indexSender . Key = [ ] string { ` Sender ` }
logDBCollection . EnsureIndex ( indexSender )
indexCategory := mgo . Index { }
indexCategory . Key = [ ] string { ` Category ` }
logDBCollection . EnsureIndex ( indexCategory )
indexLevel := mgo . Index { }
indexLevel . Key = [ ] string { ` Level ` }
logDBCollection . EnsureIndex ( indexLevel )
indexSeverity := mgo . Index { }
indexSeverity . Key = [ ] string { ` Severity ` }
logDBCollection . EnsureIndex ( indexSeverity )
indexImpact := mgo . Index { }
indexImpact . Key = [ ] string { ` Impact ` }
logDBCollection . EnsureIndex ( indexImpact )
indexMessageName := mgo . Index { }
indexMessageName . Key = [ ] string { ` MessageName ` }
logDBCollection . EnsureIndex ( indexMessageName )
indexMessageDescription := mgo . Index { }
indexMessageDescription . Key = [ ] string { ` MessageDescription ` }
logDBCollection . EnsureIndex ( indexMessageDescription )
indexProjectTimeUTC := mgo . Index { }
indexProjectTimeUTC . Key = [ ] string { ` Project ` , ` TimeUTC ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTC )
indexProjectSender := mgo . Index { }
indexProjectSender . Key = [ ] string { ` Project ` , ` Sender ` }
logDBCollection . EnsureIndex ( indexProjectSender )
indexProjectCategory := mgo . Index { }
indexProjectCategory . Key = [ ] string { ` Project ` , ` Category ` }
logDBCollection . EnsureIndex ( indexProjectCategory )
indexProjectLevel := mgo . Index { }
indexProjectLevel . Key = [ ] string { ` Project ` , ` Level ` }
logDBCollection . EnsureIndex ( indexProjectLevel )
indexProjectSeverity := mgo . Index { }
indexProjectSeverity . Key = [ ] string { ` Project ` , ` Severity ` }
logDBCollection . EnsureIndex ( indexProjectSeverity )
indexProjectImpact := mgo . Index { }
indexProjectImpact . Key = [ ] string { ` Project ` , ` Impact ` }
logDBCollection . EnsureIndex ( indexProjectImpact )
indexProjectMessageName := mgo . Index { }
indexProjectMessageName . Key = [ ] string { ` Project ` , ` MessageName ` }
logDBCollection . EnsureIndex ( indexProjectMessageName )
indexProjectMessageDescription := mgo . Index { }
indexProjectMessageDescription . Key = [ ] string { ` Project ` , ` MessageDescription ` }
logDBCollection . EnsureIndex ( indexProjectMessageDescription )
indexProjectTimeUTCSender := mgo . Index { }
indexProjectTimeUTCSender . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` Sender ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCSender )
indexProjectTimeUTCCategory := mgo . Index { }
indexProjectTimeUTCCategory . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` Category ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCCategory )
indexProjectTimeUTCLevel := mgo . Index { }
indexProjectTimeUTCLevel . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` Level ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCLevel )
indexProjectTimeUTCSeverity := mgo . Index { }
indexProjectTimeUTCSeverity . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` Severity ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCSeverity )
indexProjectTimeUTCImpact := mgo . Index { }
indexProjectTimeUTCImpact . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` Impact ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCImpact )
indexProjectTimeUTCMessageName := mgo . Index { }
indexProjectTimeUTCMessageName . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` MessageName ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCMessageName )
indexProjectTimeUTCMessageDescription := mgo . Index { }
indexProjectTimeUTCMessageDescription . Key = [ ] string { ` Project ` , ` TimeUTC ` , ` MessageDescription ` }
logDBCollection . EnsureIndex ( indexProjectTimeUTCMessageDescription )
indexTimeUTCSender := mgo . Index { }
indexTimeUTCSender . Key = [ ] string { ` TimeUTC ` , ` Sender ` }
logDBCollection . EnsureIndex ( indexTimeUTCSender )
indexTimeUTCCategory := mgo . Index { }
indexTimeUTCCategory . Key = [ ] string { ` TimeUTC ` , ` Category ` }
logDBCollection . EnsureIndex ( indexTimeUTCCategory )
indexTimeUTCLevel := mgo . Index { }
indexTimeUTCLevel . Key = [ ] string { ` TimeUTC ` , ` Level ` }
logDBCollection . EnsureIndex ( indexTimeUTCLevel )
indexTimeUTCSeverity := mgo . Index { }
indexTimeUTCSeverity . Key = [ ] string { ` TimeUTC ` , ` Severity ` }
logDBCollection . EnsureIndex ( indexTimeUTCSeverity )
indexTimeUTCImpact := mgo . Index { }
indexTimeUTCImpact . Key = [ ] string { ` TimeUTC ` , ` Impact ` }
logDBCollection . EnsureIndex ( indexTimeUTCImpact )
indexTimeUTCMessageName := mgo . Index { }
indexTimeUTCMessageName . Key = [ ] string { ` TimeUTC ` , ` MessageName ` }
logDBCollection . EnsureIndex ( indexTimeUTCMessageName )
indexTimeUTCMessageDescription := mgo . Index { }
indexProjectTimeUTCMessageDescription . Key = [ ] string { ` TimeUTC ` , ` MessageDescription ` }
logDBCollection . EnsureIndex ( indexTimeUTCMessageDescription )
}