c5_labsci/main.go
2026-01-27 00:52:00 +08:00

218 lines
6.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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网站端口8080golang端口4003nginx80/443将goc指向golanggolang根据情况转发给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()
}
}