|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"Victorique/vtqe/httpserver"
|
|
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
|
|
|
|
"syscall"
|
|
|
|
|
|
|
|
|
|
"b612.me/starlog"
|
|
|
|
|
|
|
|
|
|
"b612.me/staros"
|
|
|
|
|
|
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var httpPort, httpIP, httpPath, httpBasicAuth, httpCertKey, logPath, httpIndexFile string
|
|
|
|
|
var doUpload, daemon, httpStopMime bool
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpPort, "port", "p", "80", "监听端口")
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpIP, "ip", "i", "0.0.0.0", "监听ip")
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpPath, "folder", "f", "./", "本地文件地址")
|
|
|
|
|
httpcmd.Flags().BoolVarP(&doUpload, "upload", "u", false, "是否开启文件上传")
|
|
|
|
|
httpcmd.Flags().BoolVarP(&daemon, "daemon", "d", false, "以后台进程运行")
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpBasicAuth, "auth", "a", "", "HTTP BASIC AUTH认证(用户名:密码)")
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpIndexFile, "index", "n", "", "Index文件名,如index.html")
|
|
|
|
|
httpcmd.Flags().StringVarP(&logPath, "log", "l", "", "log地址")
|
|
|
|
|
httpcmd.Flags().StringVarP(&httpCertKey, "cert", "c", "", "TLS证书路径,用:分割证书与密钥")
|
|
|
|
|
httpcmd.Flags().BoolVarP(&httpStopMime, "disablemime", "m", false, "停止解析MIME,全部按下载文件处理")
|
|
|
|
|
httpcmd.Flags().Bool("daeapplied", false, "")
|
|
|
|
|
httpcmd.Flags().MarkHidden("daeapplied")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// httpCmd represents the http command
|
|
|
|
|
var httpcmd = &cobra.Command{
|
|
|
|
|
Use: "http",
|
|
|
|
|
Short: "HTTP文件服务器",
|
|
|
|
|
Long: `HTTP文件服务器`,
|
|
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
|
|
apply, _ := cmd.Flags().GetBool("daeapplied")
|
|
|
|
|
if daemon && !apply {
|
|
|
|
|
nArgs := append(os.Args[1:], "--daeapplied")
|
|
|
|
|
pid, err := staros.Daemon(os.Args[0], nArgs...)
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Criticalln("Daemon Error:", err)
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
starlog.StdPrintf([]starlog.Attr{starlog.FgGreen}, "Success,PID=%v\n", pid)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
err := run()
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Http Server Closed by Errors")
|
|
|
|
|
os.Exit(4)
|
|
|
|
|
}
|
|
|
|
|
starlog.Infoln("Http Server Closed Normally")
|
|
|
|
|
return
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func run() error {
|
|
|
|
|
if logPath != "" {
|
|
|
|
|
if !staros.Exists(logPath) {
|
|
|
|
|
err := starlog.SetLogFile(logPath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Create LogFile Failed:", err)
|
|
|
|
|
os.Exit(2)
|
|
|
|
|
}
|
|
|
|
|
defer starlog.Close()
|
|
|
|
|
} else {
|
|
|
|
|
logFp, err := os.OpenFile(logPath, os.O_WRONLY|os.O_APPEND, 0755)
|
|
|
|
|
if err != nil {
|
|
|
|
|
starlog.Errorln("Create LogFile Failed:", err)
|
|
|
|
|
os.Exit(2)
|
|
|
|
|
}
|
|
|
|
|
defer logFp.Close()
|
|
|
|
|
starlog.Std.SwitchOut(logFp)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
stopChan := make(chan os.Signal, 1)
|
|
|
|
|
overChan := make(chan error)
|
|
|
|
|
signal.Notify(stopChan, syscall.SIGINT, syscall.SIGKILL)
|
|
|
|
|
go func(stop chan<- error) {
|
|
|
|
|
err := httpserver.RunHttpServer(httpIP, httpPort, httpBasicAuth, httpPath, httpCertKey, vtqe_version, httpIndexFile, doUpload, httpStopMime)
|
|
|
|
|
stop <- err
|
|
|
|
|
}(overChan)
|
|
|
|
|
select {
|
|
|
|
|
case <-stopChan:
|
|
|
|
|
return nil
|
|
|
|
|
case err := <-overChan:
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|