mirror of
https://github.com/tuna/tunasync.git
synced 2025-06-15 14:12:47 +00:00
commit
24bdfe5b33
5
.gitignore
vendored
5
.gitignore
vendored
@ -1,4 +1 @@
|
|||||||
*.swp
|
/build
|
||||||
*~
|
|
||||||
/*.cov
|
|
||||||
node_modules
|
|
||||||
|
@ -8,6 +8,8 @@ function die() {
|
|||||||
|
|
||||||
export GOPATH=`pwd`:$GOPATH
|
export GOPATH=`pwd`:$GOPATH
|
||||||
|
|
||||||
|
make
|
||||||
|
|
||||||
# Initialize profile.cov
|
# Initialize profile.cov
|
||||||
echo "mode: count" > profile.cov
|
echo "mode: count" > profile.cov
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ go:
|
|||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- sudo apt-get install cgroup-bin
|
- sudo apt-get install cgroup-bin
|
||||||
|
- go get github.com/smartystreets/goconvey
|
||||||
- go get golang.org/x/tools/cmd/cover
|
- go get golang.org/x/tools/cmd/cover
|
||||||
- go get -v github.com/mattn/goveralls
|
- go get -v github.com/mattn/goveralls
|
||||||
|
|
||||||
|
16
Makefile
Normal file
16
Makefile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
LDFLAGS="-X main.buildstamp=`date -u '+%s'` -X main.githash=`git rev-parse HEAD`"
|
||||||
|
|
||||||
|
all: get tunasync tunasynctl
|
||||||
|
|
||||||
|
get:
|
||||||
|
go get ./cmd/tunasync
|
||||||
|
go get ./cmd/tunasynctl
|
||||||
|
|
||||||
|
build:
|
||||||
|
mkdir -p build
|
||||||
|
|
||||||
|
tunasync: build
|
||||||
|
go build -o build/tunasync -ldflags ${LDFLAGS} github.com/tuna/tunasync/cmd/tunasync
|
||||||
|
|
||||||
|
tunasynctl: build
|
||||||
|
go build -o build/tunasynctl -ldflags ${LDFLAGS} github.com/tuna/tunasync/cmd/tunasynctl
|
@ -1,8 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"strconv"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -16,6 +18,11 @@ import (
|
|||||||
"github.com/tuna/tunasync/worker"
|
"github.com/tuna/tunasync/worker"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
buildstamp = ""
|
||||||
|
githash = "No githash provided"
|
||||||
|
)
|
||||||
|
|
||||||
var logger = logging.MustGetLogger("tunasync")
|
var logger = logging.MustGetLogger("tunasync")
|
||||||
|
|
||||||
func startManager(c *cli.Context) {
|
func startManager(c *cli.Context) {
|
||||||
@ -99,6 +106,28 @@ func startWorker(c *cli.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
cli.VersionPrinter = func(c *cli.Context) {
|
||||||
|
var builddate string
|
||||||
|
if buildstamp == "" {
|
||||||
|
builddate = "No build date provided"
|
||||||
|
} else {
|
||||||
|
ts, err := strconv.Atoi(buildstamp)
|
||||||
|
if err != nil {
|
||||||
|
builddate = "No build date provided"
|
||||||
|
} else {
|
||||||
|
t := time.Unix(int64(ts), 0)
|
||||||
|
builddate = t.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf(
|
||||||
|
"Version: %s\n"+
|
||||||
|
"Git Hash: %s\n"+
|
||||||
|
"Build Date: %s\n",
|
||||||
|
c.App.Version, githash, builddate,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.EnableBashCompletion = true
|
app.EnableBashCompletion = true
|
||||||
app.Version = "0.1"
|
app.Version = "0.1"
|
||||||
|
@ -6,7 +6,9 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/BurntSushi/toml"
|
"github.com/BurntSushi/toml"
|
||||||
"github.com/codegangsta/cli"
|
"github.com/codegangsta/cli"
|
||||||
@ -15,6 +17,11 @@ import (
|
|||||||
tunasync "github.com/tuna/tunasync/internal"
|
tunasync "github.com/tuna/tunasync/internal"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
buildstamp = ""
|
||||||
|
githash = "No githash provided"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
listJobsPath = "/jobs"
|
listJobsPath = "/jobs"
|
||||||
listWorkersPath = "/workers"
|
listWorkersPath = "/workers"
|
||||||
@ -225,7 +232,61 @@ func cmdJob(cmd tunasync.CmdVerb) cli.ActionFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cmdWorker(cmd tunasync.CmdVerb) cli.ActionFunc {
|
||||||
|
return func(c *cli.Context) error {
|
||||||
|
cmd := tunasync.ClientCmd{
|
||||||
|
Cmd: cmd,
|
||||||
|
WorkerID: c.String("worker"),
|
||||||
|
}
|
||||||
|
resp, err := tunasync.PostJSON(baseURL+cmdPath, cmd, client)
|
||||||
|
if err != nil {
|
||||||
|
return cli.NewExitError(
|
||||||
|
fmt.Sprintf("Failed to correctly send command: %s",
|
||||||
|
err.Error()),
|
||||||
|
1)
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusOK {
|
||||||
|
body, err := ioutil.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return cli.NewExitError(
|
||||||
|
fmt.Sprintf("Failed to parse response: %s", err.Error()),
|
||||||
|
1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return cli.NewExitError(fmt.Sprintf("Failed to correctly send"+
|
||||||
|
" command: HTTP status code is not 200: %s", body),
|
||||||
|
1)
|
||||||
|
}
|
||||||
|
logger.Info("Succesfully send command")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
cli.VersionPrinter = func(c *cli.Context) {
|
||||||
|
var builddate string
|
||||||
|
if buildstamp == "" {
|
||||||
|
builddate = "No build date provided"
|
||||||
|
} else {
|
||||||
|
ts, err := strconv.Atoi(buildstamp)
|
||||||
|
if err != nil {
|
||||||
|
builddate = "No build date provided"
|
||||||
|
} else {
|
||||||
|
t := time.Unix(int64(ts), 0)
|
||||||
|
builddate = t.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf(
|
||||||
|
"Version: %s\n"+
|
||||||
|
"Git Hash: %s\n"+
|
||||||
|
"Build Date: %s\n",
|
||||||
|
c.App.Version, githash, builddate,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
app := cli.NewApp()
|
app := cli.NewApp()
|
||||||
app.EnableBashCompletion = true
|
app.EnableBashCompletion = true
|
||||||
app.Version = "0.1"
|
app.Version = "0.1"
|
||||||
@ -304,6 +365,12 @@ func main() {
|
|||||||
Flags: append(commonFlags, cmdFlags...),
|
Flags: append(commonFlags, cmdFlags...),
|
||||||
Action: initializeWrapper(cmdJob(tunasync.CmdRestart)),
|
Action: initializeWrapper(cmdJob(tunasync.CmdRestart)),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "reload",
|
||||||
|
Usage: "Tell worker to reload configurations",
|
||||||
|
Flags: append(commonFlags, cmdFlags...),
|
||||||
|
Action: initializeWrapper(cmdWorker(tunasync.CmdReload)),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
Name: "ping",
|
Name: "ping",
|
||||||
Flags: append(commonFlags, cmdFlags...),
|
Flags: append(commonFlags, cmdFlags...),
|
||||||
|
@ -35,6 +35,7 @@ const (
|
|||||||
CmdDisable // disable the job (stops goroutine)
|
CmdDisable // disable the job (stops goroutine)
|
||||||
CmdRestart // restart syncing
|
CmdRestart // restart syncing
|
||||||
CmdPing // ensure the goroutine is alive
|
CmdPing // ensure the goroutine is alive
|
||||||
|
CmdReload // reload mirror config
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c CmdVerb) String() string {
|
func (c CmdVerb) String() string {
|
||||||
@ -49,6 +50,8 @@ func (c CmdVerb) String() string {
|
|||||||
return "restart"
|
return "restart"
|
||||||
case CmdPing:
|
case CmdPing:
|
||||||
return "ping"
|
return "ping"
|
||||||
|
case CmdReload:
|
||||||
|
return "reload"
|
||||||
}
|
}
|
||||||
return "unknown"
|
return "unknown"
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,9 @@ package worker
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
"sync"
|
"sync"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
@ -185,16 +187,32 @@ func (w *Worker) makeHTTPServer() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.Noticef("Received command: %v", cmd)
|
||||||
|
|
||||||
|
if cmd.MirrorID == "" {
|
||||||
|
// worker-level commands
|
||||||
|
switch cmd.Cmd {
|
||||||
|
case CmdReload:
|
||||||
|
// send myself a SIGHUP
|
||||||
|
pid := os.Getpid()
|
||||||
|
syscall.Kill(pid, syscall.SIGHUP)
|
||||||
|
default:
|
||||||
|
c.JSON(http.StatusNotAcceptable, gin.H{"msg": "Invalid Command"})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// job level comands
|
||||||
job, ok := w.jobs[cmd.MirrorID]
|
job, ok := w.jobs[cmd.MirrorID]
|
||||||
if !ok {
|
if !ok {
|
||||||
c.JSON(http.StatusNotFound, gin.H{"msg": fmt.Sprintf("Mirror ``%s'' not found", cmd.MirrorID)})
|
c.JSON(http.StatusNotFound, gin.H{"msg": fmt.Sprintf("Mirror ``%s'' not found", cmd.MirrorID)})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Noticef("Received command: %v", cmd)
|
|
||||||
// No matter what command, the existing job
|
// No matter what command, the existing job
|
||||||
// schedule should be flushed
|
// schedule should be flushed
|
||||||
w.schedule.Remove(job.Name())
|
w.schedule.Remove(job.Name())
|
||||||
|
|
||||||
// if job disabled, start them first
|
// if job disabled, start them first
|
||||||
switch cmd.Cmd {
|
switch cmd.Cmd {
|
||||||
case CmdStart, CmdRestart:
|
case CmdStart, CmdRestart:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user