github.com/qiwihui/DBShield@v0.0.0-20171107092910-fb8553bed8ef/dbshield/dbshield.go (about) 1 /* 2 Package dbshield implements the database firewall functionality 3 */ 4 package dbshield 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "net" 10 "strconv" 11 12 "github.com/qiwihui/DBShield/dbshield/config" 13 "github.com/qiwihui/DBShield/dbshield/httpserver" 14 "github.com/qiwihui/DBShield/dbshield/logger" 15 ) 16 17 //Version of the library 18 var Version = "1.0.0-beta4-qiwihui" 19 20 var configFile string 21 22 //SetConfigFile of DBShield 23 func SetConfigFile(cf string) error { 24 configFile = cf 25 err := config.ParseConfig(configFile) 26 if err != nil { 27 return err 28 } 29 return postConfig() 30 } 31 32 //ShowConfig writes parsed config file as JSON to STDUT 33 func ShowConfig() error { 34 confJSON, err := json.MarshalIndent(config.Config, "", " ") 35 fmt.Println(string(confJSON)) 36 return err 37 } 38 39 //Purge local database 40 func Purge() error { 41 return config.Config.LocalDB.Purge() 42 } 43 44 //Patterns lists the captured patterns 45 func Patterns() (count int) { 46 return config.Config.LocalDB.Patterns() 47 } 48 49 //Abnormals detected querties 50 func Abnormals() (count int) { 51 return config.Config.LocalDB.Abnormals() 52 } 53 54 //RemovePattern deletes a pattern from captured patterns DB 55 func RemovePattern(pattern string) error { 56 return config.Config.LocalDB.DeletePattern([]byte(pattern)) 57 } 58 59 func postConfig() (err error) { 60 61 config.Config.DB, err = dbNameToStruct(config.Config.DBType) 62 if err != nil { 63 return err 64 } 65 66 tmpDBMS, _ := generateDBMS() 67 if config.Config.ListenPort == 0 { 68 config.Config.ListenPort = tmpDBMS.DefaultPort() 69 } 70 if config.Config.TargetPort == 0 { 71 config.Config.TargetPort = tmpDBMS.DefaultPort() 72 } 73 return 74 } 75 76 func mainListner() error { 77 if config.Config.HTTP { 78 proto := "http" 79 if config.Config.HTTPSSL { 80 proto = "https" 81 } 82 logger.Infof("Web interface on %s://%s/", proto, config.Config.HTTPAddr) 83 go httpserver.Serve() 84 } 85 serverAddr, _ := net.ResolveTCPAddr("tcp", config.Config.TargetIP+":"+strconv.Itoa(int(config.Config.TargetPort))) 86 l, err := net.Listen("tcp", config.Config.ListenIP+":"+strconv.Itoa(int(config.Config.ListenPort))) 87 if err != nil { 88 return err 89 } 90 // Close the listener when the application closes. 91 defer l.Close() 92 93 for { 94 // Listen for an incoming connection. 95 listenConn, err := l.Accept() 96 if err != nil { 97 logger.Warningf("Error accepting connection: %v", err) 98 continue 99 } 100 go handleClient(listenConn, serverAddr) 101 } 102 } 103 104 //Start the proxy 105 func Start() (err error) { 106 107 initLogging() 108 logger.Infof("Config file: %s", configFile) 109 logger.Infof("Listening: %s:%v", 110 config.Config.ListenIP, 111 config.Config.ListenPort) 112 logger.Infof("Backend: %s (%s:%v)", 113 config.Config.DBType, 114 config.Config.TargetIP, 115 config.Config.TargetPort) 116 logger.Infof("Local backend: %s", config.Config.LocalDbms) 117 logger.Infof("Protect: %v", !config.Config.Learning) 118 logger.Infof("Recording queries: %v", config.Config.LocalQueryRecord) 119 go mainListner() 120 signalHandler() 121 return nil 122 }