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  }