2018-06-10 01:31:13 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"database/sql"
|
2018-06-10 01:47:57 +00:00
|
|
|
"fmt"
|
2018-06-10 01:31:13 +00:00
|
|
|
"github.com/GeertJohan/go.rice"
|
|
|
|
"github.com/go-yaml/yaml"
|
|
|
|
"github.com/gorilla/sessions"
|
2018-06-12 05:23:30 +00:00
|
|
|
"github.com/hunterlong/statup/plugin"
|
2018-06-10 01:31:13 +00:00
|
|
|
_ "github.com/lib/pq"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
|
|
"io/ioutil"
|
2018-06-11 07:49:41 +00:00
|
|
|
plg "plugin"
|
|
|
|
"strings"
|
2018-06-10 01:31:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2018-06-12 05:23:30 +00:00
|
|
|
db *sql.DB
|
|
|
|
configs *Config
|
|
|
|
core *Core
|
|
|
|
store *sessions.CookieStore
|
|
|
|
VERSION string
|
|
|
|
sqlBox *rice.Box
|
|
|
|
cssBox *rice.Box
|
|
|
|
jsBox *rice.Box
|
|
|
|
tmplBox *rice.Box
|
|
|
|
setupMode bool
|
2018-06-11 15:29:54 +00:00
|
|
|
allPlugins []plg.Plugin
|
2018-06-10 01:31:13 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type Config struct {
|
|
|
|
Connection string `yaml:"connection"`
|
|
|
|
Host string `yaml:"host"`
|
|
|
|
Database string `yaml:"database"`
|
|
|
|
User string `yaml:"user"`
|
|
|
|
Password string `yaml:"password"`
|
|
|
|
Port string `yaml:"port"`
|
|
|
|
Secret string `yaml:"secret"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
VERSION = "1.1.1"
|
2018-06-11 09:58:41 +00:00
|
|
|
fmt.Printf("Starting Statup v%v\n", VERSION)
|
2018-06-10 01:31:13 +00:00
|
|
|
RenderBoxes()
|
|
|
|
configs = LoadConfig()
|
|
|
|
if configs == nil {
|
|
|
|
fmt.Println("config.yml file not found - starting in setup mode")
|
|
|
|
setupMode = true
|
|
|
|
RunHTTPServer()
|
|
|
|
}
|
|
|
|
mainProcess()
|
|
|
|
}
|
|
|
|
|
|
|
|
func mainProcess() {
|
|
|
|
var err error
|
|
|
|
DbConnection()
|
|
|
|
core, err = SelectCore()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
go CheckServices()
|
|
|
|
if !setupMode {
|
2018-06-11 07:49:41 +00:00
|
|
|
LoadPlugins()
|
2018-06-10 01:31:13 +00:00
|
|
|
RunHTTPServer()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-11 09:58:41 +00:00
|
|
|
func ForEachPlugin() {
|
|
|
|
if len(core.Plugins) > 0 {
|
|
|
|
//for _, p := range core.Plugins {
|
|
|
|
// p.OnShutdown()
|
|
|
|
//}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-06-11 07:49:41 +00:00
|
|
|
func LoadPlugins() {
|
2018-06-11 09:58:41 +00:00
|
|
|
ForEachPlugin()
|
|
|
|
|
2018-06-11 07:49:41 +00:00
|
|
|
files, err := ioutil.ReadDir("./plugins")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Plugins directory was not found. Error: %v\n", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for _, f := range files {
|
|
|
|
ext := strings.Split(f.Name(), ".")
|
|
|
|
if len(ext) != 2 {
|
|
|
|
continue
|
|
|
|
}
|
2018-06-11 10:19:08 +00:00
|
|
|
if ext[1] != "so" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
plug, err := plg.Open("plugins/" + f.Name())
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("Plugin '%v' could not load correctly.\n", f.Name())
|
|
|
|
continue
|
2018-06-11 07:49:41 +00:00
|
|
|
}
|
2018-06-11 10:19:08 +00:00
|
|
|
symPlugin, err := plug.Lookup("Plugin")
|
|
|
|
var plugActions plugin.PluginActions
|
|
|
|
plugActions, ok := symPlugin.(plugin.PluginActions)
|
|
|
|
if !ok {
|
|
|
|
fmt.Printf("Plugin '%v' could not load correctly, error: %v\n", f.Name(), "unexpected type from module symbol")
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
//plugin := plugActions.Plugin()
|
|
|
|
//
|
|
|
|
//fmt.Println(plugin.OnLoad)
|
|
|
|
|
|
|
|
plugActions.OnLoad()
|
|
|
|
|
2018-06-11 15:29:54 +00:00
|
|
|
allPlugins = append(allPlugins, *plug)
|
2018-06-11 07:49:41 +00:00
|
|
|
}
|
|
|
|
fmt.Printf("Loaded %v Plugins\n", len(allPlugins))
|
2018-06-11 09:58:41 +00:00
|
|
|
|
|
|
|
ForEachPlugin()
|
2018-06-11 07:49:41 +00:00
|
|
|
}
|
|
|
|
|
2018-06-10 01:31:13 +00:00
|
|
|
func RenderBoxes() {
|
|
|
|
sqlBox = rice.MustFindBox("sql")
|
|
|
|
cssBox = rice.MustFindBox("html/css")
|
|
|
|
jsBox = rice.MustFindBox("html/js")
|
|
|
|
tmplBox = rice.MustFindBox("html/tmpl")
|
|
|
|
}
|
|
|
|
|
|
|
|
func LoadConfig() *Config {
|
|
|
|
var config Config
|
|
|
|
file, err := ioutil.ReadFile("config.yml")
|
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
yaml.Unmarshal(file, &config)
|
|
|
|
return &config
|
|
|
|
}
|
|
|
|
|
|
|
|
func HashPassword(password string) string {
|
|
|
|
bytes, _ := bcrypt.GenerateFromPassword([]byte(password), 14)
|
|
|
|
return string(bytes)
|
|
|
|
}
|