|
@@ -0,0 +1,168 @@
|
|
|
+package self_check
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "os"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/0xJacky/Nginx-UI/internal/nginx"
|
|
|
+ "github.com/spf13/cast"
|
|
|
+ "github.com/tufanbarisyildirim/gonginx/config"
|
|
|
+ "github.com/tufanbarisyildirim/gonginx/dumper"
|
|
|
+ "github.com/tufanbarisyildirim/gonginx/parser"
|
|
|
+)
|
|
|
+
|
|
|
+// CheckNginxConfIncludeSites checks if nginx.conf include sites-enabled
|
|
|
+func CheckNginxConfIncludeSites() error {
|
|
|
+ path := nginx.GetConfEntryPath()
|
|
|
+
|
|
|
+ content, err := os.ReadFile(path)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToReadNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // parse nginx.conf
|
|
|
+ p := parser.NewStringParser(string(content), parser.WithSkipValidDirectivesErr())
|
|
|
+ c, err := p.Parse()
|
|
|
+ if err != nil {
|
|
|
+ return ErrParseNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // find http block
|
|
|
+ for _, v := range c.Block.Directives {
|
|
|
+ if v.GetName() == "http" {
|
|
|
+ // find include sites-enabled
|
|
|
+ for _, directive := range v.GetBlock().GetDirectives() {
|
|
|
+ if directive.GetName() == "include" && len(directive.GetParameters()) > 0 &&
|
|
|
+ directive.GetParameters()[0] == nginx.GetConfPath("sites-enabled/*") {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ErrNginxConfNotIncludeSitesEnabled
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return ErrNginxConfNoHttpBlock
|
|
|
+}
|
|
|
+
|
|
|
+// CheckNginxConfIncludeStreams checks if nginx.conf include streams-enabled
|
|
|
+func CheckNginxConfIncludeStreams() error {
|
|
|
+ path := nginx.GetConfEntryPath()
|
|
|
+
|
|
|
+ content, err := os.ReadFile(path)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToReadNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // parse nginx.conf
|
|
|
+ p := parser.NewStringParser(string(content), parser.WithSkipValidDirectivesErr())
|
|
|
+ c, err := p.Parse()
|
|
|
+ if err != nil {
|
|
|
+ return ErrParseNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // find http block
|
|
|
+ for _, v := range c.Block.Directives {
|
|
|
+ if v.GetName() == "stream" {
|
|
|
+ // find include sites-enabled
|
|
|
+ for _, directive := range v.GetBlock().GetDirectives() {
|
|
|
+ if directive.GetName() == "include" && len(directive.GetParameters()) > 0 &&
|
|
|
+ directive.GetParameters()[0] == nginx.GetConfPath("streams-enabled/*") {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ErrNginxConfNotIncludeStreamEnabled
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return ErrorNginxConfNoStreamBlock
|
|
|
+}
|
|
|
+
|
|
|
+// FixNginxConfIncludeSites attempts to fix nginx.conf include sites-enabled
|
|
|
+func FixNginxConfIncludeSites() error {
|
|
|
+ path := nginx.GetConfEntryPath()
|
|
|
+
|
|
|
+ content, err := os.ReadFile(path)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToReadNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // create a backup file (+.bak.timestamp)
|
|
|
+ backupPath := path + ".bak." + cast.ToString(time.Now().Unix())
|
|
|
+ err = os.WriteFile(backupPath, content, 0644)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToCreateBackup
|
|
|
+ }
|
|
|
+
|
|
|
+ // parse nginx.conf
|
|
|
+ p := parser.NewStringParser(string(content), parser.WithSkipValidDirectivesErr())
|
|
|
+ c, err := p.Parse()
|
|
|
+ if err != nil {
|
|
|
+ return ErrParseNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // find http block
|
|
|
+ for _, v := range c.Block.Directives {
|
|
|
+ if v.GetName() == "http" {
|
|
|
+ // add include sites-enabled/* to http block
|
|
|
+ includeDirective := &config.Directive{
|
|
|
+ Name: "include",
|
|
|
+ Parameters: []string{nginx.GetConfPath("sites-enabled/*")},
|
|
|
+ }
|
|
|
+
|
|
|
+ realBlock := v.GetBlock().(*config.HTTP)
|
|
|
+ realBlock.Directives = append(realBlock.Directives, includeDirective)
|
|
|
+
|
|
|
+ // write to file
|
|
|
+ return os.WriteFile(path, []byte(dumper.DumpBlock(c.Block, dumper.IndentedStyle)), 0644)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // if no http block, append http block with include sites-enabled/*
|
|
|
+ content = append(content, []byte(fmt.Sprintf("\nhttp {\n\tinclude %s;\n}\n", nginx.GetConfPath("sites-enabled/*")))...)
|
|
|
+ return os.WriteFile(path, content, 0644)
|
|
|
+}
|
|
|
+
|
|
|
+// FixNginxConfIncludeStreams attempts to fix nginx.conf include streams-enabled
|
|
|
+func FixNginxConfIncludeStreams() error {
|
|
|
+ path := nginx.GetConfEntryPath()
|
|
|
+
|
|
|
+ content, err := os.ReadFile(path)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToReadNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // create a backup file (+.bak.timestamp)
|
|
|
+ backupPath := path + ".bak." + cast.ToString(time.Now().Unix())
|
|
|
+ err = os.WriteFile(backupPath, content, 0644)
|
|
|
+ if err != nil {
|
|
|
+ return ErrFailedToCreateBackup
|
|
|
+ }
|
|
|
+
|
|
|
+ // parse nginx.conf
|
|
|
+ p := parser.NewStringParser(string(content), parser.WithSkipValidDirectivesErr())
|
|
|
+ c, err := p.Parse()
|
|
|
+ if err != nil {
|
|
|
+ return ErrParseNginxConf
|
|
|
+ }
|
|
|
+
|
|
|
+ // find stream block
|
|
|
+ for _, v := range c.Block.Directives {
|
|
|
+ if v.GetName() == "stream" {
|
|
|
+ // add include streams-enabled/* to stream block
|
|
|
+ includeDirective := &config.Directive{
|
|
|
+ Name: "include",
|
|
|
+ Parameters: []string{nginx.GetConfPath("streams-enabled/*")},
|
|
|
+ }
|
|
|
+ realBlock := v.GetBlock().(*config.Block)
|
|
|
+ realBlock.Directives = append(realBlock.Directives, includeDirective)
|
|
|
+
|
|
|
+ // write to file
|
|
|
+ return os.WriteFile(path, []byte(dumper.DumpBlock(c.Block, dumper.IndentedStyle)), 0644)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // if no stream block, append stream block with include streams-enabled/*
|
|
|
+ content = append(content, []byte(fmt.Sprintf("\nstream {\n\tinclude %s;\n}\n", nginx.GetConfPath("streams-enabled/*")))...)
|
|
|
+ return os.WriteFile(path, content, 0644)
|
|
|
+}
|