diff --git a/api/sites/site.go b/api/sites/site.go
index 8e9e94ee..f112b276 100644
--- a/api/sites/site.go
+++ b/api/sites/site.go
@@ -28,11 +28,6 @@ func GetSite(c *gin.Context) {
return
}
- enabled := true
- if _, err := os.Stat(nginx.GetConfPath("sites-enabled", name)); os.IsNotExist(err) {
- enabled = false
- }
-
g := query.ChatGPTLog
chatgpt, err := g.Where(g.Name.Eq(path)).FirstOrCreate()
if err != nil {
@@ -63,15 +58,15 @@ func GetSite(c *gin.Context) {
return
}
- c.JSON(http.StatusOK, Site{
+ c.JSON(http.StatusOK, site.Site{
ModifiedAt: file.ModTime(),
Site: siteModel,
- Enabled: enabled,
Name: name,
Config: string(origContent),
AutoCert: certModel.AutoCert == model.AutoCertEnabled,
ChatGPTMessages: chatgpt.Content,
Filepath: path,
+ Status: site.GetSiteStatus(name),
})
return
}
@@ -96,10 +91,9 @@ func GetSite(c *gin.Context) {
}
}
- c.JSON(http.StatusOK, Site{
+ c.JSON(http.StatusOK, site.Site{
Site: siteModel,
ModifiedAt: file.ModTime(),
- Enabled: enabled,
Name: name,
Config: nginxConfig.FmtCode(),
Tokenized: nginxConfig,
@@ -107,6 +101,7 @@ func GetSite(c *gin.Context) {
CertInfo: certInfoMap,
ChatGPTMessages: chatgpt.Content,
Filepath: path,
+ Status: site.GetSiteStatus(name),
})
}
diff --git a/app/src/api/site.ts b/app/src/api/site.ts
index ab696947..b78b59c6 100644
--- a/app/src/api/site.ts
+++ b/app/src/api/site.ts
@@ -3,15 +3,16 @@ import type { ModelBase } from '@/api/curd'
import type { EnvGroup } from '@/api/env_group'
import type { NgxConfig } from '@/api/ngx'
import type { ChatComplicationMessage } from '@/api/openai'
-import type { PrivateKeyType } from '@/constants'
+import type { ConfigStatus, PrivateKeyType } from '@/constants'
import Curd from '@/api/curd'
import http from '@/lib/http'
+export type SiteStatus = ConfigStatus.Enabled | ConfigStatus.Disabled | ConfigStatus.Maintenance
+
export interface Site extends ModelBase {
modified_at: string
path: string
advanced: boolean
- enabled: boolean
name: string
filepath: string
config: string
@@ -23,7 +24,7 @@ export interface Site extends ModelBase {
env_group?: EnvGroup
sync_node_ids: number[]
urls?: string[]
- status: string
+ status: SiteStatus
}
export interface AutoCertRequest {
diff --git a/app/src/views/site/cert/Cert.vue b/app/src/views/site/cert/Cert.vue
index b8029301..b83b95db 100644
--- a/app/src/views/site/cert/Cert.vue
+++ b/app/src/views/site/cert/Cert.vue
@@ -1,6 +1,8 @@
@@ -54,9 +45,8 @@ function handleStatusChanged(event: { status: string, enabled: boolean }) {
diff --git a/app/src/views/site/site_edit/SiteEdit.vue b/app/src/views/site/site_edit/SiteEdit.vue
index a2372d70..ca158b88 100644
--- a/app/src/views/site/site_edit/SiteEdit.vue
+++ b/app/src/views/site/site_edit/SiteEdit.vue
@@ -2,7 +2,6 @@
import type { CertificateInfo } from '@/api/cert'
import type { NgxConfig } from '@/api/ngx'
import type { ChatComplicationMessage } from '@/api/openai'
-
import type { Site } from '@/api/site'
import type { CheckedType } from '@/types'
import config from '@/api/config'
@@ -11,6 +10,7 @@ import site from '@/api/site'
import CodeEditor from '@/components/CodeEditor/CodeEditor.vue'
import { ConfigHistory } from '@/components/ConfigHistory'
import FooterToolBar from '@/components/FooterToolbar/FooterToolBar.vue'
+import { ConfigStatus } from '@/constants'
import NgxConfigEditor from '@/views/site/ngx_conf/NgxConfigEditor.vue'
import RightSettings from '@/views/site/site_edit/RightSettings.vue'
import { HistoryOutlined } from '@ant-design/icons-vue'
@@ -30,7 +30,6 @@ const ngx_config: NgxConfig = reactive({
const certInfoMap: Ref> = ref({})
const autoCert = ref(false)
-const enabled = ref(false)
const filepath = ref('')
const configText = ref('')
const advanceModeRef = ref(false)
@@ -64,7 +63,6 @@ async function handleResponse(r: Site) {
filename.value = r.name
filepath.value = r.filepath
configText.value = r.config
- enabled.value = r.enabled
autoCert.value = r.auto_cert
historyChatgptRecord.value = r.chatgpt_messages
data.value = r
@@ -168,7 +166,6 @@ provide('save_config', save)
provide('configText', configText)
provide('ngx_config', ngx_config)
provide('history_chatgpt_record', historyChatgptRecord)
-provide('enabled', enabled)
provide('name', name)
provide('filepath', filepath)
provide('data', data)
@@ -187,17 +184,23 @@ provide('data', data)
{{ $gettext('Edit %{n}', { n: name }) }}
{{ $gettext('Enabled') }}
{{ $gettext('Disabled') }}
+
+ {{ $gettext('Maintenance') }}
+
@@ -260,7 +263,7 @@ provide('data', data)
diff --git a/app/src/views/site/site_list/columns.tsx b/app/src/views/site/site_list/columns.tsx
index e3f370a2..1b2ca5ae 100644
--- a/app/src/views/site/site_list/columns.tsx
+++ b/app/src/views/site/site_list/columns.tsx
@@ -1,3 +1,4 @@
+import type { SiteStatus } from '@/api/site'
import type {
CustomRender,
} from '@/components/StdDesign/StdDataDisplay/StdTableTransformer'
@@ -10,7 +11,7 @@ import {
import { input, select, selector } from '@/components/StdDesign/StdDataEntry'
import { ConfigStatus } from '@/constants'
import envGroupColumns from '@/views/environments/group/columns'
-import SiteStatusSegmented from '@/views/site/site_edit/components/SiteStatusSegmented.vue'
+import SiteStatusSegmented from '@/views/site/components/SiteStatusSegmented.vue'
import { Tag } from 'ant-design-vue'
const columns: Column[] = [{
@@ -98,9 +99,8 @@ const columns: Column[] = [{
// This will be handled by the component internal events
record.status = val
},
- 'onStatusChanged': ({ status, enabled }: { status: string, enabled: boolean }) => {
+ 'onStatusChanged': ({ status }: { status: SiteStatus }) => {
record.status = status
- record.enabled = enabled
},
})
},
diff --git a/internal/performance/perf_opt.go b/internal/performance/perf_opt.go
index 763eef83..45b0df5d 100644
--- a/internal/performance/perf_opt.go
+++ b/internal/performance/perf_opt.go
@@ -10,6 +10,7 @@ import (
"github.com/tufanbarisyildirim/gonginx/config"
"github.com/tufanbarisyildirim/gonginx/dumper"
"github.com/tufanbarisyildirim/gonginx/parser"
+ "github.com/uozi-tech/cosy/logger"
)
type ProxyCacheConfig struct {
@@ -189,7 +190,10 @@ func updateOrRemoveProxyCachePath(block config.IBlock, directives []config.IDire
// First parameter is the path (required)
if proxyCache.Path != "" {
params = append(params, config.Parameter{Value: proxyCache.Path})
- _ = os.MkdirAll(proxyCache.Path, 0755)
+ err := os.MkdirAll(proxyCache.Path, 0755)
+ if err != nil {
+ logger.Error("failed to create proxy cache path", err)
+ }
} else {
// No path specified, can't add the directive
return
diff --git a/internal/site/status.go b/internal/site/status.go
new file mode 100644
index 00000000..8fc16d89
--- /dev/null
+++ b/internal/site/status.go
@@ -0,0 +1,21 @@
+package site
+
+import (
+ "github.com/0xJacky/Nginx-UI/internal/helper"
+ "github.com/0xJacky/Nginx-UI/internal/nginx"
+)
+
+// GetSiteStatus returns the status of the site
+func GetSiteStatus(name string) SiteStatus {
+ enabledFilePath := nginx.GetConfPath("sites-enabled", name)
+ if helper.FileExists(enabledFilePath) {
+ return SiteStatusEnabled
+ }
+
+ mantainanceFilePath := nginx.GetConfPath("sites-enabled", name+MaintenanceSuffix)
+ if helper.FileExists(mantainanceFilePath) {
+ return SiteStatusMaintenance
+ }
+
+ return SiteStatusDisabled
+}
diff --git a/api/sites/type.go b/internal/site/type.go
similarity index 75%
rename from api/sites/type.go
rename to internal/site/type.go
index 4b8e3f11..75da1f71 100644
--- a/api/sites/type.go
+++ b/internal/site/type.go
@@ -1,18 +1,27 @@
-package sites
+package site
import (
+ "time"
+
"github.com/0xJacky/Nginx-UI/internal/cert"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/0xJacky/Nginx-UI/model"
"github.com/sashabaranov/go-openai"
- "time"
+)
+
+type SiteStatus string
+
+const (
+ SiteStatusEnabled SiteStatus = "enabled"
+ SiteStatusDisabled SiteStatus = "disabled"
+ SiteStatusMaintenance SiteStatus = "maintenance"
)
type Site struct {
*model.Site
Name string `json:"name"`
ModifiedAt time.Time `json:"modified_at"`
- Enabled bool `json:"enabled"`
+ Status SiteStatus `json:"status"`
Config string `json:"config"`
AutoCert bool `json:"auto_cert"`
ChatGPTMessages []openai.ChatCompletionMessage `json:"chatgpt_messages,omitempty"`