added global configuration system (config.go)

pull/1/head
KatolaZ 8 years ago
parent d0afee5def
commit 3b752dc02e
  1. 112
      config.go
  2. 53
      scorsh.cfg
  3. 39
      scorsh.go

@ -0,0 +1,112 @@
package main
import (
"bytes"
"fmt"
"github.com/go-yaml/yaml"
"io"
"io/ioutil"
"log"
"os"
)
type SCORSHWorker_cfg struct {
Name string `yaml:"w_name"`
Repos []string `yaml:"w_repos"`
Folder string `yaml:"w_folder"`
Logfile string `yaml:"w_logfile"`
Tagfile string `yaml:"w_tagfile"`
Keyrings []string `yaml:"w_keyrings"`
}
type SCORSHcfg struct {
Spooldir string `yaml:"s_spooldir"`
Logfile string `yaml:"s_logfile"`
LogPrefix string `yaml:"s_logprefix"`
Workers []SCORSHWorker_cfg `yaml:"s_workers"`
}
// Read a configuration from fname or die
func ReadConfig(fname string) *SCORSHcfg {
data, err := ioutil.ReadFile(fname)
if err != nil {
log.Fatal("Error while reading file: ", err)
}
var cfg *SCORSHcfg
cfg = new(SCORSHcfg)
// Unmarshal the YAML configuration file into a SCORSHcfg structure
err = yaml.Unmarshal(data, cfg)
if err != nil {
log.Fatal("Error while reading configuration: ", err)
}
fmt.Printf("%s", cfg)
// If the user has not set a spooldir, crash loudly
if cfg.Spooldir == "" {
log.Fatal("No spooldir defined in ", fname, ". Exiting\n")
}
// Check if the user has set a custom logprefix
if cfg.LogPrefix != "" {
log.SetPrefix(cfg.LogPrefix)
}
// Check if the user wants to redirect the logs to a file
if cfg.Logfile != "" {
f, err := os.Open(cfg.Logfile)
if err != nil {
log.SetOutput(io.Writer(f))
} else {
log.Printf("Error opening logfile: \n", err)
}
}
// If we got so far, then there is some sort of config in cfg
log.Printf("Successfully read config from %s\n", fname)
return cfg
}
func (cfg *SCORSHcfg) String() string {
var buff bytes.Buffer
buff.WriteString("spooldir: ")
buff.WriteString(cfg.Spooldir)
buff.WriteString("\nlogfile: ")
buff.WriteString(cfg.Logfile)
buff.WriteString("\nlogprefix: ")
buff.WriteString(cfg.LogPrefix)
buff.WriteString("\nWorkers: \n")
for _, w := range cfg.Workers {
buff.WriteString("---\n name: ")
buff.WriteString(w.Name)
buff.WriteString("\n repos: ")
for _, r := range w.Repos {
buff.WriteString("\n ")
buff.WriteString(r)
}
buff.WriteString("\n folder: ")
buff.WriteString(w.Folder)
buff.WriteString("\n logfile: ")
buff.WriteString(w.Logfile)
buff.WriteString("\n tagfile: ")
buff.WriteString(w.Tagfile)
buff.WriteString("\n keyrings: ")
for _, k := range w.Keyrings {
buff.WriteString("\n ")
buff.WriteString(k)
}
buff.WriteString("\n...\n")
}
return buff.String()
}

@ -0,0 +1,53 @@
#
# This is a typical scorsh configuration. We declare here the list of
# workers, with the corresponding repo/branches regular expressions
# and the associated folder
#
---
s_spooldir: "/var/spool/scorsh"
s_logfile: "/var/log/scorsh/scorsh.log"
s_logprefix: "[scorsh]"
s_workers:
[
{
w_name: catchall,
w_repos: ["*:*"], # All branches in all repos
w_folder: ./catchall,
w_logfile: ./catchall/catchall.log,
w_tagfile: "./catchall/tags.cfg",
w_keyrings: [
"./catchall/catchall_keyring.asc"
]
},
{
w_name: ascii,
w_repos: ["*:suites/ascii", # branch "suites/ascii" in all the repos
"*:suites/ascii-updates",
"*:suites/ascii-security"
],
w_folder: ./ascii,
w_logfile: ./worker_ascii.log,
w_tagfile: "./ascii/tags.cfg",
w_keyrings: [
"./${w_folder}/ascii_keyring.asc"
]
},
{
w_name: ascii-side-branches ,
w_repos: [
"*:suites/ascii-proposed",
"*:suites/ascii-proposed-updates"
],
w_folder: ./ascii-side-branches,
w_logfile: ./worker_ascii_side_branches.log,
w_tagfile: "./ascii-side-branches/tags.cfg",
w_keyrings: [
"./${w_folder}/ascii_keyring.asc",
"./${w_folder}/ascii_proposed_keyring.asc",
"./${w_folder}/ascii_proposed_updates_keyring.asc"
],
}
]
...

@ -2,9 +2,7 @@ package main
import ( import (
"errors" "errors"
"golang.org/x/crypto/openpgp"
"log" "log"
"os"
"flag" "flag"
) )
@ -57,46 +55,13 @@ func SCORSHErr(err int) error {
} }
func SCORSHWorker(keyring string, c_msg chan SCORSHmsg, c_status chan int) {
// read the worker configuration file
// Open the keyring file
f, err := os.Open(keyring)
defer f.Close()
if err != nil {
log.Printf("[worker] cannot open file %s\n", keyring)
c_status <- SCORSH_ERR_NO_FILE
return
}
// load the keyring
kr, err := openpgp.ReadArmoredKeyRing(f)
if err != nil {
log.Printf("[worker] cannot open keyring %s\n", keyring)
log.Printf("%s\n", err)
c_status <- SCORSH_ERR_KEYRING
return
}
// wait for messages from the c_msg channel
msg := <-c_msg
// process message
ret := walk_commits(msg, kr)
c_status <- ret
}
func main() { func main() {
flag.Parse() flag.Parse()
cfg := ReadConfig(*conf_file)
log.Printf("%s\n", cfg)
} }

Loading…
Cancel
Save