代码拉取完成,页面将自动刷新
同步操作将从 赵建辉/rttys 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
package main
import (
"crypto/md5"
"crypto/rand"
"encoding/binary"
"encoding/hex"
"flag"
"fmt"
"io"
"os"
"runtime"
"time"
"golang.org/x/crypto/ssh/terminal"
"github.com/kylelemons/go-gypsy/yaml"
"github.com/zhaojh329/rttys/version"
"github.com/howeyc/gopass"
"github.com/rifflock/lfshook"
log "github.com/sirupsen/logrus"
)
type RttysConfig struct {
addr string
sslCert string
sslKey string
username string
password string
token string
baseURL string
}
func init() {
if terminal.IsTerminal(int(os.Stdout.Fd())) {
return
}
log.AddHook(lfshook.NewHook("/var/log/rttys.log", &log.TextFormatter{}))
}
func main() {
cfg := parseConfig()
if os.Getuid() > 0 && cfg.username == "" {
log.Error("Operation not permitted. Please start as root or define Username and Password in configuration file")
os.Exit(1)
}
log.Info("Go Version: ", runtime.Version())
log.Info("Go OS/Arch: ", runtime.GOOS, "/", runtime.GOARCH)
log.Info("Rttys Version: ", version.Version())
log.Info("Git Commit: ", version.GitCommit())
log.Info("Build Time: ", version.BuildTime())
br := newBroker()
go br.run()
httpStart(br, cfg)
}
func genUniqueID(extra string) string {
buf := make([]byte, 20)
binary.BigEndian.PutUint32(buf, uint32(time.Now().Unix()))
io.ReadFull(rand.Reader, buf[4:])
h := md5.New()
h.Write(buf)
h.Write([]byte(extra))
return hex.EncodeToString(h.Sum(nil))
}
func setConfigOpt(yamlCfg *yaml.File, name string, opt *string) {
val, err := yamlCfg.Get(name)
if err != nil {
return
}
*opt = val
}
func parseConfig() *RttysConfig {
cfg := &RttysConfig{}
flag.StringVar(&cfg.addr, "addr", ":5912", "address to listen")
flag.StringVar(&cfg.sslCert, "ssl-cert", "./rttys.crt", "certFile Path")
flag.StringVar(&cfg.sslKey, "ssl-key", "./rttys.key", "keyFile Path")
flag.StringVar(&cfg.token, "token", "", "token to use")
flag.StringVar(&cfg.baseURL, "base-url", "/", "base url to serve on")
conf := flag.String("conf", "./rttys.conf", "config file to load")
genToken := flag.Bool("gen-token", false, "generate token")
flag.Parse()
if *genToken {
genTokenAndExit()
}
yamlCfg, err := yaml.ReadFile(*conf)
if err == nil {
setConfigOpt(yamlCfg, "addr", &cfg.addr)
setConfigOpt(yamlCfg, "ssl-cert", &cfg.sslCert)
setConfigOpt(yamlCfg, "ssl-key", &cfg.sslKey)
setConfigOpt(yamlCfg, "username", &cfg.username)
setConfigOpt(yamlCfg, "password", &cfg.password)
setConfigOpt(yamlCfg, "token", &cfg.token)
setConfigOpt(yamlCfg, "base-url", &cfg.baseURL)
}
return cfg
}
func genTokenAndExit() {
password, err := gopass.GetPasswdPrompt("Please set a password:", true, os.Stdin, os.Stdout)
if err != nil {
log.Fatal(err)
}
token := genUniqueID(string(password))
fmt.Println("Your token is:", token)
os.Exit(0)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。