package main import ( "database/sql" "flag" "log" "net/http" "strings" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" "github.com/pelletier/go-toml" ) var ( configPath = flag.String("config", "dim.conf", "path to the config file") ) type ( Config struct { Listen string `toml:"listen"` DB struct { Type string `toml:"type"` Connection string `toml:"conn"` } `toml:"db"` Debug bool `toml:"debug_mode"` } ) func main() { flag.Parse() cfg := Config{} raw, err := toml.LoadFile(*configPath) if err != nil { log.Fatalf("could not load config file '%s': %s", *configPath, err) return } if err := raw.Unmarshal(&cfg); err != nil { log.Fatalf("could not parse config file '%s': %s", *configPath, err) return } if cfg.DB.Type != "mysql" && cfg.DB.Type != "postgres" { log.Fatalf( "unknown database type '%s' in config '%s'. Allowed is 'mysql' and 'postgres'", cfg.DB.Type, *configPath, ) return } if strings.Trim(cfg.DB.Connection, " \t\n\r") == "" { log.Fatalf("no database connection string in config '%s' set", *configPath) return } db, err := sql.Open(cfg.DB.Type, cfg.DB.Connection) if err != nil { log.Fatalf("could not open database connection: %s", err) return } s, err := NewServer(db, cfg.Debug) if err != nil { log.Fatalf("could not create server instance: %s", err) return } s.Register("layer3domain_create", layer3DomainCreate) s.Register("layer3domain_list", layer3DomainList) s.Register("layer3domain_get_attr", layer3DomainGetAttr) s.Register("layer3domain_set_attr", layer3DomainSetAttr) s.Register("ipblock_create", containerCreate) s.Register("ipblock_remove", containerDelete) s.Register("ipblock_list", containerList) s.Register("ipblock_set_attr", containerSetAttr) s.Register("ipblock_get_attr", containerGetAttr) s.Register("ippool_create", PoolCreate) s.Register("ippool_delete", PoolDelete) s.Register("ippool_list", PoolList) s.Register("ippool_get_attr", PoolGetAttr) s.Register("ippool_set_attr", PoolSetAttr) s.Register("zone_create", zoneCreate) s.Register("zone_list", zoneList) http.HandleFunc("/dim", s.Handle) log.Fatal(http.ListenAndServe(cfg.Listen, nil)) }