summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--commits.go6
-rw-r--r--config.go41
-rwxr-xr-xexamples/create_spool_message.sh30
-rw-r--r--examples/scorsh_example.cfg29
-rw-r--r--examples/worker1/allowed_users.asc62
-rw-r--r--examples/worker1/allowed_users.pgpbin0 -> 3073 bytes
-rw-r--r--examples/worker1/worker1.cfg24
-rw-r--r--examples/worker2/allowed_users.asc62
-rw-r--r--examples/worker2/allowed_users.pgpbin0 -> 3073 bytes
-rw-r--r--examples/worker2/worker2.cfg14
-rw-r--r--sandpit/test_parse_message.go44
-rw-r--r--sandpit/test_regexp.go26
-rw-r--r--sandpit/test_worker_cfg.go63
-rw-r--r--scorsh.cfg48
-rw-r--r--scorsh.go39
-rw-r--r--spooler.go42
-rw-r--r--types.go86
-rw-r--r--workers.go46
18 files changed, 537 insertions, 125 deletions
diff --git a/commits.go b/commits.go
index d69cc2b..7703273 100644
--- a/commits.go
+++ b/commits.go
@@ -53,9 +53,9 @@ func walk_commits(msg SCORSHmsg, w *SCORSHworker) error {
fmt.Printf("Inside parse_commits\n")
- reponame := msg.repo
- old_rev := msg.old_rev
- new_rev := msg.new_rev
+ reponame := msg.Repo
+ old_rev := msg.Old_rev
+ new_rev := msg.New_rev
repo, err := git.OpenRepository(reponame)
if err != nil {
diff --git a/config.go b/config.go
index 112b158..38ce531 100644
--- a/config.go
+++ b/config.go
@@ -1,7 +1,6 @@
package main
import (
- "bytes"
"fmt"
"github.com/go-yaml/yaml"
"io"
@@ -41,7 +40,7 @@ func ReadGlobalConfig(fname string) *SCORSHmaster {
}
if cfg.LogPrefix != "" {
- log.SetPrefix(cfg.LogPrefix)
+ log.SetPrefix(cfg.LogPrefix+ " ")
}
// If the user has not set a spooldir, crash loudly
@@ -54,46 +53,10 @@ func ReadGlobalConfig(fname string) *SCORSHmaster {
// Check if the user wants to redirect the logs to a file
// If we got so far, then there is some sort of config in cfg
+ log.Printf("----- Starting SCORSH -----\n")
log.Printf("Successfully read config from %s\n", fname)
return cfg
}
-func (cfg *SCORSHmaster) 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()
-}
diff --git a/examples/create_spool_message.sh b/examples/create_spool_message.sh
new file mode 100755
index 0000000..22c5839
--- /dev/null
+++ b/examples/create_spool_message.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+
+
+##function
+write_message(){
+
+ orev=${3:-"a1b2c3d4e5f6"}
+ nrev=${4:-"9a8b7c6d5e4f"}
+
+
+ cat <<EOF
+---
+m_id: 123456
+m_repo: $1
+m_branch: $2
+m_oldrev: $orev
+m_newrev: $nrev
+...
+EOF
+
+}
+
+
+if [ $# -le 1 ]; then
+ echo "Usage: $0 <repo> <branch> [<oldrev> [<newrev]]"
+ exit 1
+fi
+
+write_message $@
diff --git a/examples/scorsh_example.cfg b/examples/scorsh_example.cfg
new file mode 100644
index 0000000..91bd413
--- /dev/null
+++ b/examples/scorsh_example.cfg
@@ -0,0 +1,29 @@
+---
+s_spooldir: "./spool"
+s_logfile: "./scorsh.log"
+s_logprefix: "[scorsh]"
+
+s_workers:
+ [
+ {
+ w_name: worker1,
+ w_repos: [".*:.*"], # All branches in all repos
+ w_folder: ./worker1,
+ w_logfile: ./worker1/worker1.log,
+ w_tagfile: "./worker1/worker1.cfg",
+ w_keyrings: [
+ "./worker1/allowed_users.asc"
+ ]
+ },
+ {
+ w_name: worker2,
+ w_repos: [".*:master"], # Branch master in all repos
+ w_folder: ./worker2,
+ w_logfile: ./worker2/worker2.log,
+ w_tagfile: "./worker2/worker2.cfg",
+ w_keyrings: [
+ "./worker2/allowed_users.asc"
+ ]
+ }
+]
+...
diff --git a/examples/worker1/allowed_users.asc b/examples/worker1/allowed_users.asc
new file mode 100644
index 0000000..38bee5a
--- /dev/null
+++ b/examples/worker1/allowed_users.asc
@@ -0,0 +1,62 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=aSn2
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/examples/worker1/allowed_users.pgp b/examples/worker1/allowed_users.pgp
new file mode 100644
index 0000000..c083709
--- /dev/null
+++ b/examples/worker1/allowed_users.pgp
Binary files differ
diff --git a/examples/worker1/worker1.cfg b/examples/worker1/worker1.cfg
new file mode 100644
index 0000000..233afdd
--- /dev/null
+++ b/examples/worker1/worker1.cfg
@@ -0,0 +1,24 @@
+#
+# This is the typical worker configuration file. The file should be
+# called "worker_config.cfg", and will be placed inside the worker
+# directory. It defines the tags understood by the worker, with the
+# corresponding list of commands
+#
+#
+
+
+---
+w_tags:
+ [
+ {
+ t_name: "LOG",
+ t_keyrings: ["allowed_users.asc"],
+ t_commands: [
+ {
+ c_url: "file:///home/katolaz/bin/scorsh_script.sh"
+## c_hash: "12da324fb76s924acbce"
+ }
+ ]
+ }
+ ]
+... \ No newline at end of file
diff --git a/examples/worker2/allowed_users.asc b/examples/worker2/allowed_users.asc
new file mode 100644
index 0000000..38bee5a
--- /dev/null
+++ b/examples/worker2/allowed_users.asc
@@ -0,0 +1,62 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=aSn2
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/examples/worker2/allowed_users.pgp b/examples/worker2/allowed_users.pgp
new file mode 100644
index 0000000..c083709
--- /dev/null
+++ b/examples/worker2/allowed_users.pgp
Binary files differ
diff --git a/examples/worker2/worker2.cfg b/examples/worker2/worker2.cfg
new file mode 100644
index 0000000..5624cb0
--- /dev/null
+++ b/examples/worker2/worker2.cfg
@@ -0,0 +1,14 @@
+---
+w_tags:
+ [
+ {
+ t_name: "DEPLOY",
+ t_keyrings: ["allowed_users.asc"],
+ t_commands: [
+ {
+ c_url: "file:///home/katolaz/bin/deploy.sh"
+ }
+ ]
+ }
+ ]
+... \ No newline at end of file
diff --git a/sandpit/test_parse_message.go b/sandpit/test_parse_message.go
new file mode 100644
index 0000000..f60f03c
--- /dev/null
+++ b/sandpit/test_parse_message.go
@@ -0,0 +1,44 @@
+package main
+
+import(
+ "fmt"
+ "github.com/go-yaml/yaml"
+ "io/ioutil"
+ "log"
+ "os"
+)
+
+
+var orig_msg= `
+---
+m_id: 123456
+m_repo: master
+m_branch: test_branch
+m_oldrev: a1b2c3d4e5f6
+m_newrev: 9a8b7c6d5e4f
+...
+
+`
+
+
+func main(){
+
+ var msg *SCORSHmsg
+ msg = new(SCORSHmsg)
+
+
+ fname := "spool/test_2"
+
+ data, err := ioutil.ReadFile(fname)
+ if err != nil {
+ log.Printf("Unable to open file: %s\n", fname)
+ os.Exit(1)
+ }
+ err = yaml.Unmarshal([]byte(data), msg)
+ if err != nil{
+ log.Printf("Error parsing message: %s", err)
+ }
+
+ fmt.Printf("%s\n", msg)
+
+}
diff --git a/sandpit/test_regexp.go b/sandpit/test_regexp.go
new file mode 100644
index 0000000..5ae1d88
--- /dev/null
+++ b/sandpit/test_regexp.go
@@ -0,0 +1,26 @@
+package main
+
+import(
+ "regexp"
+ "log"
+)
+
+
+func main (){
+
+ pattern := ".*"
+ str := "my_string"
+
+ matched, err := regexp.MatchString(pattern, str)
+
+ if err != nil {
+ log.Fatal("Error matching string: ", err)
+ }
+
+ if matched {
+ log.Printf("Yes! '%s' matched '%s'\n", str, pattern)
+ } else {
+ log.Printf("Bad luck!\n")
+ }
+
+}
diff --git a/sandpit/test_worker_cfg.go b/sandpit/test_worker_cfg.go
new file mode 100644
index 0000000..b8bc891
--- /dev/null
+++ b/sandpit/test_worker_cfg.go
@@ -0,0 +1,63 @@
+package main
+
+import(
+ "fmt"
+ "github.com/go-yaml/yaml"
+ "log"
+ "strings"
+)
+
+
+var worker_cfg = `
+---
+w_tags:
+ [
+ {
+ t_name: "BUILD",
+ t_keyrings: ["build_keyring.asc", "general_keyring.asc"],
+ t_commands: [
+ {
+ c_url: "file:///home/user/bin/script.sh $1 $2",
+ c_hash: "12da324fb76s924acbce"
+ },
+ {
+ c_url: "http://my.server.net/call.pl?branch=$1"
+ }
+ ]
+ },
+ {
+ t_name: "PUBLISH",
+ t_keyrings: ["web_developers.asc"],
+ t_commands: [
+ {
+ c_url: "file:///usr/local/bin/publish.py $repo $branch",
+ c_hash: "3234567898765432345678"
+ }
+ ]
+ }
+ ]
+...
+
+`
+
+
+func main(){
+
+ var w *SCORSHworker
+ w = new(SCORSHworker)
+
+
+ sep := "\n---\n"
+
+ idx := strings.Index(worker_cfg, sep)
+
+ err := yaml.Unmarshal([]byte(worker_cfg[idx:]), w)
+
+
+ if err != nil{
+ log.Printf("Error parsing message: %s", err)
+ }
+
+ fmt.Printf("%s\n", w)
+
+}
diff --git a/scorsh.cfg b/scorsh.cfg
index 6fe4afc..91bd413 100644
--- a/scorsh.cfg
+++ b/scorsh.cfg
@@ -6,42 +6,24 @@ 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_name: worker1,
+ w_repos: [".*:.*"], # All branches in all repos
+ w_folder: ./worker1,
+ w_logfile: ./worker1/worker1.log,
+ w_tagfile: "./worker1/worker1.cfg",
w_keyrings: [
- "./catchall/catchall_keyring.asc"
+ "./worker1/allowed_users.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: [
- "./ascii/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_name: worker2,
+ w_repos: [".*:master"], # Branch master in all repos
+ w_folder: ./worker2,
+ w_logfile: ./worker2/worker2.log,
+ w_tagfile: "./worker2/worker2.cfg",
w_keyrings: [
- "./ascii/ascii_keyring.asc",
- "./ascii/ascii_proposed_keyring.asc",
- "./ascii/ascii_proposed_updates_keyring.asc"
- ],
- }
- ]
+ "./worker2/allowed_users.asc"
+ ]
+ }
+]
...
diff --git a/scorsh.go b/scorsh.go
index dceb6d7..0fb91a8 100644
--- a/scorsh.go
+++ b/scorsh.go
@@ -6,7 +6,20 @@ import (
"log"
)
+// manage debugging messages
+const debug debugging = true
+
+type debugging bool
+
+
+func (d debugging) log(format string, args ...interface{}){
+ if d {
+ log.Printf(format, args...)
+ }
+}
+
+///////////
var conf_file = flag.String("c", "./scorsh.cfg", "Configuration file for SCORSH")
@@ -37,9 +50,10 @@ func FindMatchingWorkers(master *SCORSHmaster, msg *SCORSHmsg) []*SCORSHworker {
var ret []*SCORSHworker
- for _,w := range master.Workers {
- if w.Matches(msg.repo, msg.branch) {
- ret = append(ret, &w)
+ for idx,w := range master.Workers {
+ if w.Matches(msg.Repo, msg.Branch) {
+ debug.log("--- Worker: %s matches %s:%s\n", w.Name, msg.Repo, msg.Branch)
+ ret = append(ret, &(master.Workers[idx]))
}
}
return ret
@@ -55,12 +69,19 @@ func Master(master *SCORSHmaster) {
matching_workers = make([]*SCORSHworker, len(master.Workers))
+ log.Println("[master] Master started ")
+
for {
select {
// - receive stuff from the spooler
case push_msg = <- master.Spooler:
+
+ debug.log("[master] received message: %s\n", push_msg)
+
// - lookup the repos map for matching workers
matching_workers = FindMatchingWorkers(master, &push_msg)
+ debug.log("[master] matching workers: %s\n", matching_workers)
+
// add the message to PendingMsg
//...
// - dispatch the message to all the matching workers
@@ -75,11 +96,14 @@ func Master(master *SCORSHmaster) {
func InitMaster() *SCORSHmaster {
master := ReadGlobalConfig(*conf_file)
+
master.Repos = make(map[string][]*SCORSHworker)
master.WorkingMsg = make(map[string]int)
// This is the mutex-channel on which we receive acks from workers
master.StatusChan = make(chan SCORSHmsg, 1)
+ master.Spooler = make(chan SCORSHmsg, 1)
+
err_workers := StartWorkers(master)
if err_workers != nil {
@@ -90,9 +114,7 @@ func InitMaster() *SCORSHmaster {
err_spooler := StartSpooler(master)
if err_spooler != nil {
log.Fatal("Error starting spooler: ", err_spooler)
- } else {
- log.Println("Spooler started correctly")
- }
+ }
return master
}
@@ -101,8 +123,11 @@ func InitMaster() *SCORSHmaster {
func main() {
flag.Parse()
-
+
master := InitMaster()
go Master(master)
+
+ <- master.StatusChan
+
}
diff --git a/spooler.go b/spooler.go
index e11b980..9b4fc1c 100644
--- a/spooler.go
+++ b/spooler.go
@@ -1,40 +1,59 @@
package main
import (
+ "fmt"
"github.com/fsnotify/fsnotify"
+ "github.com/go-yaml/yaml"
+ "io/ioutil"
"log"
- "os"
- "fmt"
+// "time"
)
// parse a request file and return a SCORSHmessage
-func parse_request(fname string) (SCORSHmsg, error) {
+func parse_request(fname string, msg *SCORSHmsg) error {
- var ret SCORSHmsg
- _, err := os.Open(fname)
+
+ debug.log("[parse_request] message at start: %s\n", msg)
+
+ data, err := ioutil.ReadFile(fname)
if err != nil {
log.Printf("Unable to open file: %s\n", fname)
- return ret, SCORSHerr(SCORSH_ERR_NO_FILE)
+ return SCORSHerr(SCORSH_ERR_NO_FILE)
}
- // FIXME: Fill in the ret structure
+ debug.log("[parse_request] file contains: \n%s\n", data)
+
+ debug.log("[parse_request] reading message from file: %s\n", fname)
- return ret, nil
+ err = yaml.Unmarshal([]byte(data), msg)
+ if err != nil {
+ return fmt.Errorf("Error parsing message: %s", err)
+ }
+ debug.log("[parse_request] got message: %s\n", msg)
+ return nil
}
func spooler(watcher *fsnotify.Watcher, worker chan SCORSHmsg) {
+
+ log.Println("Spooler started correctly")
+
+ var msg *SCORSHmsg
+ msg = new(SCORSHmsg)
for {
select {
case event := <-watcher.Events:
- if event.Op == fsnotify.Create {
- msg, err := parse_request(event.Name)
+ if event.Op == fsnotify.Write {
+ //time.Sleep(1000 * time.Millisecond)
+ debug.log("[spooler] new file %s detected\n", event.Name)
+ err := parse_request(event.Name, msg)
if err != nil {
log.Printf("Invalid packet received. [%s]\n", err)
}
- worker <- msg
+ debug.log("[spooler] read message: %s\n", msg)
+ worker <- *msg
}
case err := <-watcher.Errors:
log.Println("error:", err)
@@ -59,5 +78,4 @@ func StartSpooler(master *SCORSHmaster) error {
go spooler(watcher, master.Spooler)
return nil
-
}
diff --git a/types.go b/types.go
index 3ccb6cc..6b5a384 100644
--- a/types.go
+++ b/types.go
@@ -1,6 +1,7 @@
package main
import (
+ "bytes"
"golang.org/x/crypto/openpgp"
)
@@ -15,11 +16,11 @@ const (
// the SCORSHmsg type represents messages received from the spool and
// sent to workers
type SCORSHmsg struct {
- name string
- repo string
- branch string
- old_rev string
- new_rev string
+ Name string `yaml:"m_id"`
+ Repo string `yaml:"m_repo"`
+ Branch string `yaml:"m_branch"`
+ Old_rev string `yaml:"m_oldrev"`
+ New_rev string `yaml:"m_newrev"`
}
type SCORSHcmd struct {
@@ -35,17 +36,17 @@ type SCORSHtag struct {
// Configuration of a worker
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"`
+ 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"`
+ Tags []SCORSHtag `yaml:"w_tags"`
}
// State of a worker
type SCORSHworker_state struct {
- Tags []SCORSHtag `yaml:"w_tags"`
Keys map[string]openpgp.KeyRing
MsgChan chan SCORSHmsg
StatusChan chan SCORSHmsg
@@ -55,7 +56,7 @@ type SCORSHworker_state struct {
// worker
type SCORSHworker struct {
SCORSHworker_cfg `yaml:",inline"`
- SCORSHworker_state `yaml:",inline"`
+ SCORSHworker_state
}
// Configuration of the master
@@ -80,3 +81,62 @@ type SCORSHmaster struct {
SCORSHmaster_cfg `yaml:",inline"`
SCORSHmaster_state
}
+
+
+
+func (cfg *SCORSHmaster) 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()
+}
+
+
+func (msg *SCORSHmsg) String() string {
+
+ var buff bytes.Buffer
+ buff.WriteString("\nName: ")
+ buff.WriteString(msg.Name)
+ buff.WriteString("\nRepo: ")
+ buff.WriteString(msg.Repo)
+ buff.WriteString("\nBranch: ")
+ buff.WriteString(msg.Branch)
+ buff.WriteString("\nOld_rev: ")
+ buff.WriteString(msg.Old_rev)
+ buff.WriteString("\nNew_rev: ")
+ buff.WriteString(msg.New_rev)
+ return buff.String()
+
+}
+
diff --git a/workers.go b/workers.go
index d5462c1..694a0e9 100644
--- a/workers.go
+++ b/workers.go
@@ -19,6 +19,8 @@ func (worker *SCORSHworker) Matches(repo, branch string) bool {
branch_pattern := parts[1]
repo_match, _ := regexp.MatchString(repo_pattern, repo)
branch_match, _ := regexp.MatchString(branch_pattern, branch)
+ debug.log("[worker.Matches] repo_match: %s\n", repo_match)
+ debug.log("[worker.Matches] branch_match: %s\n", branch_match)
if repo_match && branch_match {
return true
}
@@ -59,34 +61,40 @@ func (w *SCORSHworker) LoadTags() error {
w_tags, err := ioutil.ReadFile(w.Tagfile)
if err != nil{
- log.Printf("[worker:%s] Cannot read worker config: ", w.Name, err)
- return err
+ return fmt.Errorf("Cannot read worker config: %s", err)
}
+
- err = yaml.Unmarshal(w_tags, w.Tags)
+ err = yaml.Unmarshal(w_tags, w)
+ //err = yaml.Unmarshal(w_tags, tags)
if err != nil {
- log.Printf("[worker:%s] Error while reading tags: ", w.Name, err)
- return err
+ return fmt.Errorf("Error while reading tags: %s", err)
}
-
return nil
}
-// FIXME--- STILL UNDER HEAVY WORK...
-func SCORSHWorker(w *SCORSHworker) {
+// FIXME--- still needs some work...
+func Worker(w *SCORSHworker) {
+ var msg SCORSHmsg
+
+ log.Printf("[worker: %s] Started\n", w.Name)
+ w.StatusChan <- msg
+
// This is the main worker loop
for {
select {
- case msg := <-w.MsgChan:
+ case msg = <-w.MsgChan:
+ debug.log("[worker: %s] received message %s\n", w.Name, msg.Name)
// process message
- err := walk_commits(msg, w)
- if err != nil {
- log.Printf("[worker: %s] error in walk_commits: %s", err)
- }
+ // err := walk_commits(msg, w)
+ // if err != nil {
+ // log.Printf("[worker: %s] error in walk_commits: %s", err)
+ // }
+ log.Printf("[worker: %s] Received message: ", w.Name, msg)
}
}
}
@@ -99,7 +107,9 @@ func StartWorkers(master *SCORSHmaster) error {
// We should now start each worker
- for w:=1; w<num_workers; w++ {
+ log.Printf("num_workers: %d\n", num_workers)
+
+ for w:=0; w<num_workers; w++ {
worker := & (master.Workers[w])
// Set the Status and Msg channels
@@ -108,21 +118,21 @@ func StartWorkers(master *SCORSHmaster) error {
// Load worker keyrings
err := worker.LoadKeyrings()
if err != nil {
- log.Printf("[worker: %s] Unable to load keyrings (Exiting): %s\n", worker.Name, err)
close(worker.MsgChan)
- return err
+ return fmt.Errorf("[Starting worker: %s] Unable to load keyrings: %s\n", worker.Name, err)
}
// Load worker tags from worker.Tagfile
err = worker.LoadTags()
if err != nil {
- log.Printf("[worker: %s] Unable to load tags (Exiting): %s\n", worker.Name, err)
close(worker.MsgChan)
- return err
+ return fmt.Errorf("[Starting worker: %s] Unable to load tags: %s\n", worker.Name, err)
}
// Add the repos definitions to the map master.Repos
for _, repo_name := range worker.Repos {
master.Repos[repo_name] = append(master.Repos[repo_name], worker)
}
+ go Worker(worker)
+ <- master.StatusChan
}
return nil
}