mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-25 16:25:16 +00:00
split files to make routes smaller
This commit is contained in:
parent
5f84c847c1
commit
0cb2a3c452
37
pkg/server/envvars.go
Normal file
37
pkg/server/envvars.go
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/c9s/bbgo/pkg/bbgo"
|
||||||
|
)
|
||||||
|
|
||||||
|
func collectSessionEnvVars(sessions map[string]*bbgo.ExchangeSession) (envVars map[string]string, err error) {
|
||||||
|
envVars = make(map[string]string)
|
||||||
|
|
||||||
|
for _, session := range sessions {
|
||||||
|
if len(session.Key) == 0 && len(session.Secret) == 0 {
|
||||||
|
err = fmt.Errorf("session %s key & secret is not empty", session.Name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(session.EnvVarPrefix) > 0 {
|
||||||
|
envVars[session.EnvVarPrefix+"_API_KEY"] = session.Key
|
||||||
|
envVars[session.EnvVarPrefix+"_API_SECRET"] = session.Secret
|
||||||
|
} else if len(session.Name) > 0 {
|
||||||
|
sn := strings.ToUpper(session.Name)
|
||||||
|
envVars[sn+"_API_KEY"] = session.Key
|
||||||
|
envVars[sn+"_API_SECRET"] = session.Secret
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("session %s name or env var prefix is not defined", session.Name)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset key and secret so that we won't marshal them to the config file
|
||||||
|
session.Key = ""
|
||||||
|
session.Secret = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
45
pkg/server/ping.go
Normal file
45
pkg/server/ping.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func pingUntil(ctx context.Context, baseURL string, callback func()) {
|
||||||
|
pingURL := baseURL + "/api/ping"
|
||||||
|
timeout := time.NewTimer(time.Minute)
|
||||||
|
|
||||||
|
ticker := time.NewTicker(time.Second)
|
||||||
|
defer ticker.Stop()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
|
||||||
|
case <-timeout.C:
|
||||||
|
logrus.Warnf("ping hits 1 minute timeout")
|
||||||
|
return
|
||||||
|
|
||||||
|
case <-ctx.Done():
|
||||||
|
return
|
||||||
|
|
||||||
|
case <-ticker.C:
|
||||||
|
var response map[string]interface{}
|
||||||
|
var err = getJSON(pingURL, &response)
|
||||||
|
if err == nil {
|
||||||
|
go callback()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func pingAndOpenURL(ctx context.Context, baseURL string) {
|
||||||
|
setupURL := baseURL + "/setup"
|
||||||
|
go pingUntil(ctx, baseURL, func() {
|
||||||
|
if err := openURL(setupURL); err != nil {
|
||||||
|
logrus.WithError(err).Errorf("can not call open command to open the web page")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
23
pkg/server/pkger.go
Normal file
23
pkg/server/pkger.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/markbates/pkger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Server) pkgerHandler(c *gin.Context) {
|
||||||
|
fs := pkger.Dir("/frontend/out")
|
||||||
|
|
||||||
|
// redirect to .html page if the page exists
|
||||||
|
if pageRoutePattern.MatchString(c.Request.URL.Path) {
|
||||||
|
|
||||||
|
_, err := pkger.Stat("/frontend/out/" + c.Request.URL.Path + ".html")
|
||||||
|
if err == nil {
|
||||||
|
c.Request.URL.Path += ".html"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
http.FileServer(fs).ServeHTTP(c.Writer, c.Request)
|
||||||
|
}
|
|
@ -2,23 +2,18 @@ package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gin-contrib/cors"
|
"github.com/gin-contrib/cors"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"github.com/markbates/pkger"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/bbgo"
|
"github.com/c9s/bbgo/pkg/bbgo"
|
||||||
|
@ -466,21 +461,6 @@ func (s *Server) setupSaveConfig(c *gin.Context) {
|
||||||
|
|
||||||
var pageRoutePattern = regexp.MustCompile("/[a-z]+$")
|
var pageRoutePattern = regexp.MustCompile("/[a-z]+$")
|
||||||
|
|
||||||
func (s *Server) pkgerHandler(c *gin.Context) {
|
|
||||||
fs := pkger.Dir("/frontend/out")
|
|
||||||
|
|
||||||
// redirect to .html page if the page exists
|
|
||||||
if pageRoutePattern.MatchString(c.Request.URL.Path) {
|
|
||||||
|
|
||||||
_, err := pkger.Stat("/frontend/out/" + c.Request.URL.Path + ".html")
|
|
||||||
if err == nil {
|
|
||||||
c.Request.URL.Path += ".html"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
http.FileServer(fs).ServeHTTP(c.Writer, c.Request)
|
|
||||||
}
|
|
||||||
|
|
||||||
func moveFileToBackup(filename string) error {
|
func moveFileToBackup(filename string) error {
|
||||||
stat, err := os.Stat(filename)
|
stat, err := os.Stat(filename)
|
||||||
|
|
||||||
|
@ -494,35 +474,6 @@ func moveFileToBackup(filename string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func collectSessionEnvVars(sessions map[string]*bbgo.ExchangeSession) (envVars map[string]string, err error) {
|
|
||||||
envVars = make(map[string]string)
|
|
||||||
|
|
||||||
for _, session := range sessions {
|
|
||||||
if len(session.Key) == 0 && len(session.Secret) == 0 {
|
|
||||||
err = fmt.Errorf("session %s key & secret is not empty", session.Name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(session.EnvVarPrefix) > 0 {
|
|
||||||
envVars[session.EnvVarPrefix+"_API_KEY"] = session.Key
|
|
||||||
envVars[session.EnvVarPrefix+"_API_SECRET"] = session.Secret
|
|
||||||
} else if len(session.Name) > 0 {
|
|
||||||
sn := strings.ToUpper(session.Name)
|
|
||||||
envVars[sn+"_API_KEY"] = session.Key
|
|
||||||
envVars[sn+"_API_SECRET"] = session.Secret
|
|
||||||
} else {
|
|
||||||
err = fmt.Errorf("session %s name or env var prefix is not defined", session.Name)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// reset key and secret so that we won't marshal them to the config file
|
|
||||||
session.Key = ""
|
|
||||||
session.Secret = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Server) tradingVolume(c *gin.Context) {
|
func (s *Server) tradingVolume(c *gin.Context) {
|
||||||
if s.Environ.TradeService == nil {
|
if s.Environ.TradeService == nil {
|
||||||
c.JSON(http.StatusInternalServerError, gin.H{"error": "database is not configured"})
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "database is not configured"})
|
||||||
|
@ -575,96 +526,6 @@ func (s *Server) tradingVolume(c *gin.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func getJSON(url string, data interface{}) error {
|
|
||||||
var client = &http.Client{Timeout: 500 * time.Millisecond}
|
|
||||||
r, err := client.Get(url)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
defer r.Body.Close()
|
|
||||||
|
|
||||||
return json.NewDecoder(r.Body).Decode(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func openURL(url string) error {
|
|
||||||
cmd := exec.Command("open", url)
|
|
||||||
return cmd.Start()
|
|
||||||
}
|
|
||||||
|
|
||||||
func pingUntil(ctx context.Context, baseURL string, callback func()) {
|
|
||||||
pingURL := baseURL + "/api/ping"
|
|
||||||
timeout := time.NewTimer(time.Minute)
|
|
||||||
|
|
||||||
ticker := time.NewTicker(time.Second)
|
|
||||||
defer ticker.Stop()
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
|
|
||||||
case <-timeout.C:
|
|
||||||
logrus.Warnf("ping hits 1 minute timeout")
|
|
||||||
return
|
|
||||||
|
|
||||||
case <-ctx.Done():
|
|
||||||
return
|
|
||||||
|
|
||||||
case <-ticker.C:
|
|
||||||
var response map[string]interface{}
|
|
||||||
var err = getJSON(pingURL, &response)
|
|
||||||
if err == nil {
|
|
||||||
go callback()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func pingAndOpenURL(ctx context.Context, baseURL string) {
|
|
||||||
setupURL := baseURL + "/setup"
|
|
||||||
go pingUntil(ctx, baseURL, func() {
|
|
||||||
if err := openURL(setupURL); err != nil {
|
|
||||||
logrus.WithError(err).Errorf("can not call open command to open the web page")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func filterStrings(slice []string, needle string) (ns []string) {
|
|
||||||
for _, str := range slice {
|
|
||||||
if str == needle {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
ns = append(ns, str)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ns
|
|
||||||
}
|
|
||||||
|
|
||||||
func openBrowser(ctx context.Context, bind string) {
|
|
||||||
if runtime.GOOS == "darwin" {
|
|
||||||
baseURL := "http://" + bind
|
|
||||||
go pingAndOpenURL(ctx, baseURL)
|
|
||||||
} else {
|
|
||||||
logrus.Warnf("%s is not supported for opening browser automatically", runtime.GOOS)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func resolveBind(a []string) string {
|
|
||||||
switch len(a) {
|
|
||||||
case 0:
|
|
||||||
return DefaultBindAddress
|
|
||||||
|
|
||||||
case 1:
|
|
||||||
return a[0]
|
|
||||||
|
|
||||||
default:
|
|
||||||
panic("too many parameters for binding")
|
|
||||||
}
|
|
||||||
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
func newServer(r http.Handler, bind string) *http.Server {
|
func newServer(r http.Handler, bind string) *http.Server {
|
||||||
return &http.Server{
|
return &http.Server{
|
||||||
Addr: bind,
|
Addr: bind,
|
||||||
|
|
65
pkg/server/utils.go
Normal file
65
pkg/server/utils.go
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"net/http"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getJSON(url string, data interface{}) error {
|
||||||
|
var client = &http.Client{Timeout: 500 * time.Millisecond}
|
||||||
|
r, err := client.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer r.Body.Close()
|
||||||
|
|
||||||
|
return json.NewDecoder(r.Body).Decode(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func openURL(url string) error {
|
||||||
|
cmd := exec.Command("open", url)
|
||||||
|
return cmd.Start()
|
||||||
|
}
|
||||||
|
|
||||||
|
func filterStrings(slice []string, needle string) (ns []string) {
|
||||||
|
for _, str := range slice {
|
||||||
|
if str == needle {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ns = append(ns, str)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ns
|
||||||
|
}
|
||||||
|
|
||||||
|
func openBrowser(ctx context.Context, bind string) {
|
||||||
|
if runtime.GOOS == "darwin" {
|
||||||
|
baseURL := "http://" + bind
|
||||||
|
go pingAndOpenURL(ctx, baseURL)
|
||||||
|
} else {
|
||||||
|
logrus.Warnf("%s is not supported for opening browser automatically", runtime.GOOS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveBind(a []string) string {
|
||||||
|
switch len(a) {
|
||||||
|
case 0:
|
||||||
|
return DefaultBindAddress
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
return a[0]
|
||||||
|
|
||||||
|
default:
|
||||||
|
panic("too many parameters for binding")
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user