132 lines
3.3 KiB
Go
132 lines
3.3 KiB
Go
|
package control
|
||
|
|
||
|
import (
|
||
|
"flag"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/BurntSushi/toml"
|
||
|
)
|
||
|
|
||
|
type Config struct {
|
||
|
DBName string
|
||
|
Description string
|
||
|
Domain string
|
||
|
KeyFile string
|
||
|
Link string
|
||
|
LogFile string
|
||
|
PicsDir string
|
||
|
Port string
|
||
|
RSSFile string
|
||
|
Title string
|
||
|
WebDir string
|
||
|
}
|
||
|
|
||
|
func newConfig() *Config {
|
||
|
return &Config{
|
||
|
DBName: "cpolis",
|
||
|
KeyFile: "/var/www/cpolis/cpolis.key",
|
||
|
LogFile: "/var/log/cpolis.log",
|
||
|
PicsDir: "/var/www/cpolis/pics",
|
||
|
RSSFile: "/var/www/cpolis/cpolis.rss",
|
||
|
WebDir: "/var/www/cpolis/web",
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (c *Config) readFile() error {
|
||
|
cfgFile, err := filepath.Abs(os.Getenv("HOME") + "/.config/cpolis/config.toml")
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error getting absolute path for config file: %v", err)
|
||
|
}
|
||
|
|
||
|
_, err = os.Stat(cfgFile)
|
||
|
if os.IsNotExist(err) {
|
||
|
fileStrings := strings.Split(cfgFile, "/")
|
||
|
|
||
|
dir := strings.Join(fileStrings[0:len(fileStrings)-1], "/")
|
||
|
if err = os.MkdirAll(dir, 0755); err != nil {
|
||
|
return fmt.Errorf("error creating config directory: %v", err)
|
||
|
}
|
||
|
|
||
|
fileName := fileStrings[len(fileStrings)-1]
|
||
|
file, err := os.Create(dir + "/" + fileName)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error creating config file: %v", err)
|
||
|
}
|
||
|
defer file.Close()
|
||
|
if err = file.Chmod(0644); err != nil {
|
||
|
return fmt.Errorf("error setting permissions for config file: %v", err)
|
||
|
}
|
||
|
} else {
|
||
|
_, err = toml.DecodeFile(cfgFile, c)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error reading config file: %v", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *Config) handleCliArgs() error {
|
||
|
var err error
|
||
|
port := 8080
|
||
|
|
||
|
flag.StringVar(&c.DBName, "db", c.DBName, "DB name")
|
||
|
flag.StringVar(&c.Description, "desc", c.Description, "Channel description")
|
||
|
flag.StringVar(&c.Domain, "domain", c.Domain, "domain name")
|
||
|
flag.StringVar(&c.KeyFile, "key", c.KeyFile, "key file")
|
||
|
flag.StringVar(&c.Link, "link", c.Link, "Channel Link")
|
||
|
flag.StringVar(&c.LogFile, "log", c.LogFile, "log file")
|
||
|
flag.StringVar(&c.PicsDir, "pics", c.PicsDir, "pictures directory")
|
||
|
flag.StringVar(&c.RSSFile, "rss", c.RSSFile, "RSS file")
|
||
|
flag.StringVar(&c.Title, "title", c.Title, "Channel title")
|
||
|
flag.StringVar(&c.WebDir, "web", c.WebDir, "web directory")
|
||
|
flag.IntVar(&port, "port", port, "port")
|
||
|
flag.Parse()
|
||
|
|
||
|
c.KeyFile, err = filepath.Abs(c.KeyFile)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error finding absolute path for key file: %v", err)
|
||
|
}
|
||
|
|
||
|
c.LogFile, err = filepath.Abs(c.LogFile)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error finding absolute path for log file: %v", err)
|
||
|
}
|
||
|
|
||
|
c.PicsDir, err = filepath.Abs(c.PicsDir)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error finding absolute path for pics dir: %v", err)
|
||
|
}
|
||
|
|
||
|
c.Port = fmt.Sprint(":", port)
|
||
|
|
||
|
c.RSSFile, err = filepath.Abs(c.RSSFile)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error finding absolute path for RSS file: %v", err)
|
||
|
}
|
||
|
|
||
|
c.WebDir, err = filepath.Abs(c.WebDir)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error finding absolute path for web dir: %v", err)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func HandleConfig() (*Config, error) {
|
||
|
config := newConfig()
|
||
|
|
||
|
if err := config.readFile(); err != nil {
|
||
|
return nil, fmt.Errorf("error reading config file: %v", err)
|
||
|
}
|
||
|
|
||
|
if err := config.handleCliArgs(); err != nil {
|
||
|
return nil, fmt.Errorf("error handling cli arguments: %v", err)
|
||
|
}
|
||
|
|
||
|
return config, nil
|
||
|
}
|