| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- package core
- import (
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "net"
- "net/http"
- "os"
- "regexp"
- "runtime"
- "strings"
- "time"
- "github.com/beego/beego/v2/adapter/httplib"
- "github.com/cdle/sillyplus/core/storage"
- "github.com/cdle/sillyplus/utils"
- )
- var version = compiled_at
- func GetVersion() (string, error) {
- v, e := httplib.Get("http://172.96.255.172:8765/api/version").String()
- if len(v) == 13 {
- if version != v && v != compiled_at {
- sillyGirl.Set("version", v)
- console.Log("发现更新,版本号", v)
- version = v
- }
- return v, e
- }
- return v, errors.New("版本获取失败")
- }
- func Init() {
- go func() {
- for {
- GetVersion()
- if version != compiled_at {
- break
- }
- time.Sleep(time.Minute * 5)
- }
- }()
- initLoc()
- sillyGirl = MakeBucket("sillyGirl")
- // utils.ReadYaml(utils.ExecPath+"/conf/", &Config, "https://raw.githubusercontent.com/cdle/sillyplus/main/conf/demo_config.yaml")
- initToHandleMessage()
- sillyGirl.Set("compiled_at", compiled_at)
- console.Log("编译版本: %s", compiled_at)
- initWeb()
- initCarry()
- sillyGirl.Set("started_at", time.Now().Format("2006-01-02 15:04:05"))
- var updates = 0
- storage.Watch(sillyGirl, "compiled_at", func(old, new, key string) *storage.Final {
- if old != new {
- if updates == 1 {
- return &storage.Final{
- Message: "升级中,请耐心等待...",
- }
- }
- updates++
- defer func() {
- updates--
- }()
- var transport *http.Transport
- instance, err := GetProxyTransport("https://raw.githubusercontent.com", "", nil)
- if err != nil {
- console.Error("升级代理错误:%s", err)
- return &storage.Final{
- Error: fmt.Errorf("升级代理错误::%s", err),
- }
- }
- if instance != nil {
- defer instance.Close()
- }
- if instance != nil {
- transport = &http.Transport{
- Dial: func(string, string) (net.Conn, error) {
- return instance, nil
- },
- MaxIdleConns: 100,
- IdleConnTimeout: 90 * time.Second,
- TLSHandshakeTimeout: 10 * time.Second,
- ExpectContinueTimeout: 1 * time.Second,
- }
- }
- var client = &http.Client{}
- if transport != nil {
- client.Transport = transport
- }
- var body io.Reader
- var data []byte
- var latest_version = ""
- var resp *http.Response
- var req *http.Request
- proxy := false
- qurl := "https://raw.githubusercontent.com/cdle/binary/main/compile_time.go"
- version, _ := GetVersion()
- if version != "" {
- console.Debug("正在从 github 获取版本号...")
- latest_version = version
- } else {
- console.Debug("正在从 cdle/binary 获取版本号...")
- req, _ = http.NewRequest("GET", qurl, strings.NewReader(""))
- resp, err = client.Do(req)
- if err != nil {
- console.Error("获取版本号错误:%s", err)
- // return &storage.Final{
- // Error: fmt.Errorf("貌似网络不太行啊:%s", err),
- // }
- goto PROXY
- }
- defer resp.Body.Close()
- data, _ = ioutil.ReadAll(resp.Body)
- latest_version = regexp.MustCompile(`\d{13}`).FindString(string(data))
- }
- if latest_version <= compiled_at {
- console.Debug("当前版本 %s 已是最新,无需升级", compiled_at)
- return &storage.Final{
- Message: fmt.Sprintf("当前版本 %s 已是最新,无需升级", compiled_at),
- }
- }
- client = &http.Client{
- Timeout: 30 * time.Second,
- }
- if transport != nil {
- client.Transport = transport
- }
- console.Debug("正在从 cdle/binary 获取最新版本 %s 编译文件...", latest_version)
- qurl = "https://raw.githubusercontent.com/cdle/binary/master/sillyGirl_" + runtime.GOOS + "_" + runtime.GOARCH + "_" + latest_version
- if runtime.GOOS == "windows" {
- qurl += ".exe"
- }
- req, _ = http.NewRequest("GET", qurl, strings.NewReader(""))
- resp, err = client.Do(req)
- if err != nil {
- console.Error("获取最新编译文件错误:%s", err)
- // return &storage.Final{
- // Error: fmt.Errorf("升级时貌似网络不太行啊:%v", err),
- // }
- goto PROXY
- }
- defer resp.Body.Close()
- body = resp.Body
- goto CREATE
- PROXY:
- //使用免费代理下载
- proxy = true
- console.Info("正在重新尝试下载...")
- qurl = "http://172.96.255.172:8765/api/download?version=" + compiled_at + "&goos=" + runtime.GOOS + "&goarch=" + runtime.GOARCH
- resp, err = http.Get(qurl)
- if err != nil {
- return &storage.Final{
- Error: fmt.Errorf("升级时貌似网络不太行啊"),
- }
- }
- defer resp.Body.Close()
- body = resp.Body
- switch resp.Header.Get("Result") {
- case "newest":
- return &storage.Final{
- Message: fmt.Sprintf("当前版本 %s 已是最新,无需升级", compiled_at),
- }
- case "fail":
- return &storage.Final{
- Error: fmt.Errorf("升级失败"),
- }
- case "ok":
- }
- CREATE:
- console.Debug("正在创建编译文件...")
- filename := utils.ExecPath + "/" + utils.ProcessName
- ready := ""
- if runtime.GOOS == "windows" {
- ready = strings.Replace(filename, ".exe", ".ready.exe", -1)
- } else {
- ready += ".ready"
- }
- f, err := os.OpenFile(ready, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
- if err != nil {
- console.Error("创建编译文件错误:%v", err)
- return &storage.Final{
- Error: fmt.Errorf("创建编译文件错误:%v", err),
- }
- }
- defer f.Close()
- i, err := io.Copy(f, body)
- if i < 2646140 || err != nil {
- if !proxy {
- goto PROXY
- }
- console.Error("创建编译文件错误:%v %v", i, err)
- return &storage.Final{
- Error: fmt.Errorf("创建编译文件错误:%v %v", i, err),
- }
- }
- if runtime.GOOS == "windows" {
- console.Log("正在准备重启...")
- go func() {
- time.Sleep(time.Second)
- utils.Daemon("ready")
- }()
- return &storage.Final{
- Message: "1秒重启升级!",
- }
- } else {
- console.Debug("正在删除旧程序错误...")
- if err = os.RemoveAll(filename); err != nil {
- plugins.Set2(key, "")
- console.Error("删除旧程序错误:%v", err)
- return &storage.Final{
- Error: fmt.Errorf("删除旧程序错误:%v", err),
- }
- }
- }
- console.Debug("正在移动新程序错误...")
- if err = os.Rename(ready, filename); err != nil {
- console.Error("移动新程序错误:%v", err)
- return &storage.Final{
- Error: fmt.Errorf("移动新程序错误:%v", err),
- }
- }
- go func() {
- console.Debug("正在重启...")
- time.Sleep(time.Second)
- utils.Daemon()
- }()
- return &storage.Final{
- Message: "升级成功,即将重启!",
- }
- }
- return nil
- })
- storage.Watch(sillyGirl, "started_at", func(old, new, key string) *storage.Final {
- if old != new {
- go func() {
- time.Sleep(time.Second)
- utils.Daemon()
- }()
- return &storage.Final{
- Message: "1秒重启!",
- }
- }
- return nil
- })
- api_key := sillyGirl.GetString("api_key")
- if api_key == "" {
- api_key := time.Now().UnixNano()
- sillyGirl.Set("api_key", api_key)
- }
- // if sillyplus.GetString("uuid") == "" {
- sillyGirl.Set("uuid", utils.GenUUID())
- // }
- httplib.SetDefaultSetting(httplib.BeegoHTTPSettings{
- ConnectTimeout: time.Second * 10,
- ReadWriteTimeout: time.Second * 10,
- UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
- })
- initPlugins()
- initReboot()
- initListenReply()
- // initPluginFile()
- initWebPluginList()
- go initPluginList()
- initPluginPublish()
- }
|