218 lines
6.1 KiB
Go
218 lines
6.1 KiB
Go
package main
|
||
|
||
//nolint:staticcheck
|
||
import (
|
||
"fmt"
|
||
"io"
|
||
"log"
|
||
"net/http"
|
||
"os"
|
||
"strings"
|
||
"syscall"
|
||
"time"
|
||
|
||
"ciyon/web/admin/autotask"
|
||
c "ciyon/zciyon"
|
||
|
||
_ "github.com/go-sql-driver/mysql"
|
||
)
|
||
|
||
func main() {
|
||
//nohup ./zgo &
|
||
//nohup /data/go/ciyon/zgo > /dev/null 2>&1 &
|
||
c.CiyVars.Version = "1.0.2"
|
||
c.Clog("---=========================Ciyon=========================---")
|
||
c.Clog("Version:", c.CiyVars.Version, " WorkDir:", c.CiyWebDir)
|
||
//读取配置文件ini
|
||
|
||
ini, err3 := c.NewCiyINI("web.ini")
|
||
c.CiyVars.Ini = *ini
|
||
runmode := "dev"
|
||
logfile := "log/ciyon.log"
|
||
logtcp := ""
|
||
logfilelevel := 3
|
||
logtcplevel := 3
|
||
|
||
webmode := "http" //Web服务模式: http/fastcgi/unixsock
|
||
webipsk := ":4003" //Web监听端口: ip:port/unix:sockfile
|
||
webhttp2 := "" //启用HTTP2:配置监听端口,证书.crt,证书.key :443,w.crt,w.key
|
||
dbhost := "127.0.0.1"
|
||
dbport := "3306"
|
||
dbuser := "root"
|
||
dbpass := "wkxroot"
|
||
dbname := "techciyon"
|
||
dbmaxopenconn := 0
|
||
dbmaxidelconn := 0
|
||
dbmaxlifesec := 0
|
||
phphost := ""
|
||
tasksec := 5
|
||
mock := "" //支持file,建立本地文件夹
|
||
if err3 != nil {
|
||
ini.SetKey("main", "runmode", runmode)
|
||
ini.SetKey("main", "tasksec", tasksec)
|
||
ini.SetKey("log", "logfile", logfile)
|
||
ini.SetKey("log", "logtcp", logtcp)
|
||
ini.SetKey("log", "logfilelevel", logfilelevel)
|
||
ini.SetKey("log", "logtcplevel", logtcplevel)
|
||
|
||
ini.SetKey("web", "webmode", webmode)
|
||
ini.SetKey("web", "webipsk", webipsk)
|
||
ini.SetKey("web", "webhttp2", webhttp2)
|
||
ini.SetKey("db", "host", dbhost)
|
||
ini.SetKey("db", "post", dbport)
|
||
ini.SetKey("db", "user", dbuser)
|
||
ini.SetKey("db", "pass", dbpass)
|
||
ini.SetKey("db", "name", dbname)
|
||
ini.SetKey("db", "maxopenconn", dbmaxopenconn)
|
||
ini.SetKey("db", "maxidelconn", dbmaxidelconn)
|
||
ini.SetKey("db", "maxlifesec", dbmaxlifesec)
|
||
ini.SetKey("php", "host", phphost)
|
||
ini.SetKey("mock", "target", mock)
|
||
ini.Save()
|
||
} else {
|
||
runmode = ini.GetKey("main", "runmode", runmode)
|
||
if runmode == "prod" {
|
||
c.CiyRunMode = c.CIYRUN_PROD
|
||
} else {
|
||
c.CiyRunMode = c.CIYRUN_DEV
|
||
}
|
||
tasksec = ini.GetKeyint("main", "tasksec", tasksec)
|
||
logfile = ini.GetKey("log", "logfile", logfile)
|
||
logtcp = ini.GetKey("log", "logtcp", logtcp)
|
||
logfilelevel = ini.GetKeyint("log", "logfilelevel", logfilelevel)
|
||
logtcplevel = ini.GetKeyint("log", "logtcplevel", logtcplevel)
|
||
|
||
webmode = ini.GetKey("web", "webmode", webmode)
|
||
webipsk = ini.GetKey("web", "webipsk", webipsk)
|
||
webhttp2 = ini.GetKey("web", "webhttp2", webhttp2)
|
||
dbhost = ini.GetKey("db", "host", dbhost)
|
||
dbport = ini.GetKey("db", "post", dbport)
|
||
dbuser = ini.GetKey("db", "user", dbuser)
|
||
dbpass = ini.GetKey("db", "pass", dbpass)
|
||
dbname = ini.GetKey("db", "name", dbname)
|
||
dbmaxopenconn = ini.GetKeyint("db", "maxopenconn", dbmaxopenconn)
|
||
dbmaxidelconn = ini.GetKeyint("db", "maxidelconn", dbmaxidelconn)
|
||
dbmaxlifesec = ini.GetKeyint("db", "maxlifesec", dbmaxlifesec)
|
||
phphost = ini.GetKey("php", "host", phphost)
|
||
mock = ini.GetKey("mock", "target", mock)
|
||
}
|
||
c.Log = c.NewCiyLog(500)
|
||
c.Log.SupportStack(c.CiyVars.Version)
|
||
c.Log.InitFile(logfile, logfilelevel)
|
||
c.Log.InitTCP(logtcp, logtcplevel)
|
||
c.Log.Info("Ciyon", "Ciyon Start.")
|
||
go watchMe()
|
||
|
||
// Log.Debug("sdfs", "asfsdfasdf")
|
||
|
||
var err error
|
||
// CiyRouteDB, err = NewCiyDBRoute([]string{"root:wkxroot@tcp(localhost:3306)/zosa"}, 0, 0, 0) //main初始化一直开
|
||
// if err != nil {
|
||
// log.Fatal(err)
|
||
// }
|
||
c.CiyDB, err = c.NewCiyMysql(fmt.Sprintf("%s:%s@tcp(%s)/%s", dbuser, dbpass, dbhost+":"+dbport, dbname), dbmaxopenconn, dbmaxidelconn, dbmaxlifesec) //main初始化一直开着,程序结束才关
|
||
if err != nil {
|
||
log.Fatal(err)
|
||
}
|
||
|
||
web, err2 := c.NewCiyWebServer()
|
||
if err2 != nil {
|
||
log.Fatal(err2)
|
||
}
|
||
// web.SetExt(".html;.js")
|
||
// web.RouterStatic("/jscss/")
|
||
setWebRoute_adm(web)
|
||
//setWebRoute_work(web)
|
||
|
||
//内网php网站,端口8080,golang端口4003,nginx80/443将goc指向golang,golang根据情况转发给8080处理。
|
||
//将golang包放在网站根目录下。
|
||
web.SetPHP(phphost)
|
||
if mock == "file" {
|
||
web.SetMockFile() //在web/ud/mock目录下建立对应的json文件。
|
||
} else if mock != "" {
|
||
web.SetMockFn(func(w http.ResponseWriter, r *http.Request) error {
|
||
funname := r.URL.Path
|
||
funs := strings.Split(funname, ".")
|
||
if len(funs) < 2 {
|
||
return fmt.Errorf("func fmterr func=%v", funname)
|
||
}
|
||
csql := c.NewCiySQL(mock)
|
||
csql.Where("upath", funs[0])
|
||
csql.Where("ufunc", funs[1])
|
||
mockrow, _ := c.CiyDB.Getone(csql)
|
||
if mockrow == nil {
|
||
return fmt.Errorf("nofind mock func=%v", funname)
|
||
}
|
||
mockjson := c.Tostr(mockrow["mockjson"])
|
||
quest := r.URL.RawQuery
|
||
body, err := io.ReadAll(r.Body)
|
||
if err == nil && len(body) > 0 {
|
||
quest += "\n" + string(body)
|
||
}
|
||
if mockjson[0:7] == "http://" {
|
||
resp, err := http.Post(mockjson, "application/json", r.Body)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer resp.Body.Close()
|
||
w.Header().Set("Content-Type", resp.Header.Get("Content-Type"))
|
||
w.WriteHeader(resp.StatusCode)
|
||
io.Copy(w, resp.Body)
|
||
|
||
} else {
|
||
w.Write([]byte(mockjson))
|
||
}
|
||
updata := map[string]any{
|
||
"lastrequest": quest,
|
||
"lasttimes": c.Tostamp(),
|
||
}
|
||
csql = c.NewCiySQL(mock)
|
||
csql.Where("id", mockrow["id"])
|
||
c.CiyDB.Update(csql, updata)
|
||
return nil
|
||
})
|
||
}
|
||
|
||
if c.CiyRunMode == c.CIYRUN_DEV {
|
||
tasksec = 0
|
||
}
|
||
if tasksec > 0 {
|
||
go doautotask(tasksec)
|
||
}
|
||
|
||
go web.RunHTTP2(webhttp2)
|
||
web.Run(webmode, webipsk)
|
||
//web.WebRunCgi(7002)
|
||
//web.WebRunHTTP2(80, 443, "testgo.crt", "testgo.key")
|
||
//web.WebRunSock("ciyon.sock")
|
||
}
|
||
func watchMe() {
|
||
fmd5 := c.MD5file(os.Args[0])
|
||
for {
|
||
newfmd5 := c.MD5file(os.Args[0])
|
||
if newfmd5 != fmd5 {
|
||
c.Sleep(1)
|
||
fmt.Println("restarting:")
|
||
c.Log.Info("RESTART", "Restarting.."+newfmd5)
|
||
err := syscall.Exec(os.Args[0], os.Args, os.Environ())
|
||
if err != nil {
|
||
fmt.Println("restart fail:", err)
|
||
c.Log.Info("RESTART", "重启失败:"+err.Error())
|
||
c.Sleep(10)
|
||
continue
|
||
}
|
||
os.Exit(0)
|
||
return
|
||
}
|
||
c.Sleep(2)
|
||
continue
|
||
}
|
||
}
|
||
func doautotask(sec int) {
|
||
ticker := time.NewTicker(time.Duration(sec) * time.Second)
|
||
defer ticker.Stop()
|
||
for range ticker.C {
|
||
go autotask.Main()
|
||
}
|
||
}
|