1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-03-16 18:54:43 +08:00

fix: 解决安装应用过程中出现的状态异常问题 (#4156)

This commit is contained in:
zhengkunwang 2024-03-11 20:34:08 +08:00 committed by GitHub
parent f9f68a975c
commit 0b66be7a3a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 309 additions and 253 deletions

View File

@ -749,8 +749,10 @@ func syncAppInstallStatus(appInstall *model.AppInstall) error {
switch { switch {
case count == 0: case count == 0:
appInstall.Status = constant.Error if appInstall.Status != constant.Error {
appInstall.Status = constant.SyncErr
appInstall.Message = buserr.WithName("ErrContainerNotFound", strings.Join(containerNames, ",")).Error() appInstall.Message = buserr.WithName("ErrContainerNotFound", strings.Join(containerNames, ",")).Error()
}
case exitedCount == total: case exitedCount == total:
appInstall.Status = constant.Stopped appInstall.Status = constant.Stopped
case runningCount == total: case runningCount == total:

View File

@ -13,6 +13,7 @@ const (
Syncing = "Syncing" Syncing = "Syncing"
SyncSuccess = "SyncSuccess" SyncSuccess = "SyncSuccess"
Paused = "Paused" Paused = "Paused"
SyncErr = "SyncErr"
ContainerPrefix = "1Panel-" ContainerPrefix = "1Panel-"

View File

@ -170,3 +170,5 @@ ErrBanAction: "Setting failed, the current {{ .name }} service is unavailable, p
#waf #waf
ErrScope: "Modification of this configuration is not supported" ErrScope: "Modification of this configuration is not supported"
ErrStateChange: "State modification failed" ErrStateChange: "State modification failed"
ErrRuleExist: "Rule is Exist"
ErrRuleNotExist: "Rule is not Exist"

View File

@ -171,3 +171,5 @@ ErrBanAction: "設置失敗,當前 {{ .name }} 服務不可用,請檢查後
#waf #waf
ErrScope: "不支援修改此配置" ErrScope: "不支援修改此配置"
ErrStateChange: "狀態修改失敗" ErrStateChange: "狀態修改失敗"
ErrRuleExist: "規則名稱已存在"
ErrRuleNotExist: "規則不存在"

View File

@ -170,3 +170,5 @@ ErrBanAction: "设置失败,当前 {{ .name }} 服务不可用,请检查后
#waf #waf
ErrScope: "不支持修改此配置" ErrScope: "不支持修改此配置"
ErrStateChange: "状态修改失败" ErrStateChange: "状态修改失败"
ErrRuleExist: "规则名称已存在"
ErrRuleNotExist: "规则不存在"

View File

@ -126,6 +126,21 @@ func (f FileOp) SaveFile(dst string, content string, mode fs.FileMode) error {
return nil return nil
} }
func (f FileOp) SaveFileWithByte(dst string, content []byte, mode fs.FileMode) error {
if !f.Stat(path.Dir(dst)) {
_ = f.CreateDir(path.Dir(dst), mode.Perm())
}
file, err := f.Fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode)
if err != nil {
return err
}
defer file.Close()
write := bufio.NewWriter(file)
_, _ = write.Write(content)
write.Flush()
return nil
}
func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error { func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error {
cmdStr := fmt.Sprintf(`chown %s:%s "%s"`, uid, gid, dst) cmdStr := fmt.Sprintf(`chown %s:%s "%s"`, uid, gid, dst)
if sub { if sub {

View File

@ -18,7 +18,7 @@
"echarts": "^5.3.0", "echarts": "^5.3.0",
"echarts-liquidfill": "^3.1.0", "echarts-liquidfill": "^3.1.0",
"element-plus": "^2.6.0", "element-plus": "^2.6.0",
"fit2cloud-ui-plus": "^1.0.9", "fit2cloud-ui-plus": "^1.1.3",
"js-base64": "^3.7.2", "js-base64": "^3.7.2",
"js-md5": "^0.7.3", "js-md5": "^0.7.3",
"md-editor-v3": "^2.7.2", "md-editor-v3": "^2.7.2",
@ -5282,9 +5282,9 @@
} }
}, },
"node_modules/fit2cloud-ui-plus": { "node_modules/fit2cloud-ui-plus": {
"version": "1.0.9", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/fit2cloud-ui-plus/-/fit2cloud-ui-plus-1.0.9.tgz", "resolved": "https://registry.npmmirror.com/fit2cloud-ui-plus/-/fit2cloud-ui-plus-1.1.3.tgz",
"integrity": "sha512-hsXJyR21RG07C/ghx1iQPzNoh6OE6uJvICeNY+8p5El4MG2Ji0j//gGKERdJwyH6H6MFkupMiPW7Z8uflnpSxw==", "integrity": "sha512-Zxp3gyzNxdsfQ6UjX8p1jmO5c++WU4l4A3OnLDseWqbuB1StR2sMfwg/Lh1yrmjBGHE5jLV5EttDcK+P/2LiIQ==",
"dependencies": { "dependencies": {
"@element-plus/icons-vue": "^1.1.4", "@element-plus/icons-vue": "^1.1.4",
"element-plus": "^2.3.3", "element-plus": "^2.3.3",

View File

@ -30,7 +30,7 @@
"echarts": "^5.3.0", "echarts": "^5.3.0",
"echarts-liquidfill": "^3.1.0", "echarts-liquidfill": "^3.1.0",
"element-plus": "^2.6.0", "element-plus": "^2.6.0",
"fit2cloud-ui-plus": "^1.0.9", "fit2cloud-ui-plus": "^1.1.3",
"js-base64": "^3.7.2", "js-base64": "^3.7.2",
"js-md5": "^0.7.3", "js-md5": "^0.7.3",
"md-editor-v3": "^2.7.2", "md-editor-v3": "^2.7.2",

View File

@ -36,7 +36,7 @@ const getType = (status: string) => {
case 'removing': case 'removing':
return 'warning'; return 'warning';
default: default:
return 'info'; return 'primary';
} }
}; };

View File

@ -51,6 +51,7 @@ const message = {
uninstall: 'Uninstall', uninstall: 'Uninstall',
fullscreen: 'Fullscreen', fullscreen: 'Fullscreen',
quitFullscreen: 'Quit Fullscreen', quitFullscreen: 'Quit Fullscreen',
update: 'Edit',
}, },
search: { search: {
timeStart: 'Time start', timeStart: 'Time start',
@ -246,6 +247,7 @@ const message = {
ready: 'normal', ready: 'normal',
applying: 'Applying', applying: 'Applying',
applyerror: 'Failure', applyerror: 'Failure',
syncerr: 'Error',
}, },
units: { units: {
second: 'Second', second: 'Second',
@ -2144,8 +2146,9 @@ const message = {
statusCode: 'Status code', statusCode: 'Status code',
manage: 'Management', manage: 'Management',
}, },
},
xpack: { xpack: {
name: 'Professional Edition', name: 'Professional',
waf: { waf: {
name: 'WAF', name: 'WAF',
blackWhite: 'black and white list', blackWhite: 'black and white list',
@ -2212,11 +2215,18 @@ const message = {
ruleType: 'attack type', ruleType: 'attack type',
ipHelper: 'Please enter IP', ipHelper: 'Please enter IP',
attackLog: 'Attack Log', attackLog: 'Attack Log',
rule: 'Rule',
ipArr: 'IPV4 range',
ipStart: 'Start IP',
ipEnd: 'End IP',
ipv4: 'IPV4',
ipv6: 'IPV6',
}, },
monitor: { monitor: {
name: 'Website Monitoring', name: 'Website Monitor',
}, },
tamper: { tamper: {
tamper: 'Tamper',
tamperHelper1: tamperHelper1:
'One-click deployment type of website, it is recommended to enable the application directory anti-tampering function;', 'One-click deployment type of website, it is recommended to enable the application directory anti-tampering function;',
tamperHelper2: tamperHelper2:
@ -2264,7 +2274,6 @@ const message = {
reset: 'Reset', reset: 'Reset',
}, },
}, },
},
}; };
export default { export default {

View File

@ -51,6 +51,7 @@ const message = {
uninstall: '卸載', uninstall: '卸載',
fullscreen: '全屏', fullscreen: '全屏',
quitFullscreen: '退出全屏', quitFullscreen: '退出全屏',
update: '編輯',
}, },
search: { search: {
timeStart: '開始時間', timeStart: '開始時間',
@ -244,6 +245,7 @@ const message = {
ready: '正常', ready: '正常',
applying: '申請中', applying: '申請中',
applyerror: '失敗', applyerror: '失敗',
syncerr: '失敗',
}, },
units: { units: {
second: '秒', second: '秒',
@ -2002,6 +2004,7 @@ const message = {
statusCode: '狀態碼', statusCode: '狀態碼',
manage: '管理', manage: '管理',
}, },
},
xpack: { xpack: {
name: '專業版', name: '專業版',
waf: { waf: {
@ -2067,11 +2070,18 @@ const message = {
ruleType: '攻擊類型', ruleType: '攻擊類型',
ipHelper: '請輸入 IP', ipHelper: '請輸入 IP',
attackLog: '攻擊日誌', attackLog: '攻擊日誌',
rule: '規則',
ipArr: 'IPV4 範圍',
ipStart: '起始 IP',
ipEnd: '結束 IP',
ipv4: 'IPV4',
ipv6: 'IPV6',
}, },
monitor: { monitor: {
name: '網站監控', name: '網站監控',
}, },
tamper: { tamper: {
tamper: '防篡改',
tamperHelper1: '一鍵部署類型的網站建議啟用應用目錄防篡改功能', tamperHelper1: '一鍵部署類型的網站建議啟用應用目錄防篡改功能',
tamperHelper2: '如果在啟用防篡改功能後出現網站無法正常使用或備份恢復失敗的情況請先關閉防篡改功能', tamperHelper2: '如果在啟用防篡改功能後出現網站無法正常使用或備份恢復失敗的情況請先關閉防篡改功能',
tamperHelper3: tamperHelper3:
@ -2112,7 +2122,6 @@ const message = {
reset: '重置', reset: '重置',
}, },
}, },
},
}; };
export default { export default {
...fit2cloudTwLocale, ...fit2cloudTwLocale,

View File

@ -51,6 +51,7 @@ const message = {
uninstall: '卸载', uninstall: '卸载',
fullscreen: '全屏', fullscreen: '全屏',
quitFullscreen: '退出全屏', quitFullscreen: '退出全屏',
update: '编辑',
}, },
search: { search: {
timeStart: '开始时间', timeStart: '开始时间',
@ -244,6 +245,7 @@ const message = {
ready: '正常', ready: '正常',
applying: '申请中', applying: '申请中',
applyerror: '失败', applyerror: '失败',
syncerr: '失败',
}, },
units: { units: {
second: '秒', second: '秒',
@ -2068,6 +2070,12 @@ const message = {
ruleType: '攻击类型', ruleType: '攻击类型',
ipHelper: '请输入 IP', ipHelper: '请输入 IP',
attackLog: '攻击日志', attackLog: '攻击日志',
rule: '规则',
ipArr: 'IPV4 范围',
ipStart: '起始 IP',
ipEnd: '结束 IP',
ipv4: 'IPV4',
ipv6: 'IPV6',
}, },
monitor: { monitor: {
name: '网站监控', name: '网站监控',

View File

@ -418,3 +418,11 @@ html {
.p-w-200 { .p-w-200 {
width: 200px !important; width: 200px !important;
} }
.p-ml-20 {
margin-left: 20px !important;
}
.p-mt-20 {
margin-top: 20px !important;
}

View File

@ -160,9 +160,6 @@ html {
.el-dialog { .el-dialog {
.el-dialog__header { .el-dialog__header {
padding: 15px 20px;
margin: 0;
border-bottom: 1px solid #f0f0f0;
.el-dialog__title { .el-dialog__title {
font-size: 17px; font-size: 17px;
} }

View File

@ -195,7 +195,7 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('container.related')" min-width="200"> <el-table-column :label="$t('container.related')" min-width="200" prop="appName">
<template #default="{ row }"> <template #default="{ row }">
<div> <div>
<el-tooltip <el-tooltip
@ -288,6 +288,7 @@
:buttons="buttons" :buttons="buttons"
:label="$t('commons.table.operate')" :label="$t('commons.table.operate')"
:fixed="mobile ? false : 'right'" :fixed="mobile ? false : 'right'"
prop="operate"
/> />
</ComplexTable> </ComplexTable>
</template> </template>

View File

@ -1,6 +1,6 @@
<template> <template>
<div v-if="recordShow" v-loading="loading"> <div v-if="recordShow" v-loading="loading">
<div class="app-status" style="margin-top: 20px"> <div class="app-status p-mt-20">
<el-card> <el-card>
<div> <div>
<el-popover <el-popover
@ -17,7 +17,7 @@
</el-tag> </el-tag>
</template> </template>
</el-popover> </el-popover>
<el-tag v-if="dialogData.rowData.name.length < 15" style="float: left" effect="dark" type="success"> <el-tag v-if="dialogData.rowData.name.length < 15" class="float-left" effect="dark" type="success">
{{ $t('cronjob.' + dialogData.rowData.type) }} - {{ dialogData.rowData.name }} {{ $t('cronjob.' + dialogData.rowData.type) }} - {{ dialogData.rowData.name }}
</el-tag> </el-tag>
@ -73,7 +73,7 @@
></el-date-picker> ></el-date-picker>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="16">
<el-select @change="search()" v-model="searchInfo.status"> <el-select @change="search()" v-model="searchInfo.status" class="p-w-200">
<template #prefix>{{ $t('commons.table.status') }}</template> <template #prefix>{{ $t('commons.table.status') }}</template>
<el-option :label="$t('commons.table.all')" value="" /> <el-option :label="$t('commons.table.all')" value="" />
<el-option :label="$t('commons.status.success')" value="Success" /> <el-option :label="$t('commons.status.success')" value="Success" />

View File

@ -8,24 +8,24 @@
@opened="onOpen" @opened="onOpen"
:top="'5vh'" :top="'5vh'"
> >
<el-form :inline="true" :model="config"> <el-form :inline="true" :model="config" class="mt-1.5">
<el-form-item :label="$t('file.theme')"> <el-form-item :label="$t('file.theme')">
<el-select v-model="config.theme" @change="changeTheme()"> <el-select v-model="config.theme" @change="changeTheme()" class="p-w-200">
<el-option v-for="item in themes" :key="item.label" :value="item.value" :label="item.label" /> <el-option v-for="item in themes" :key="item.label" :value="item.value" :label="item.label" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('file.language')"> <el-form-item :label="$t('file.language')">
<el-select v-model="config.language" @change="changeLanguage()"> <el-select v-model="config.language" @change="changeLanguage()" class="p-w-200">
<el-option v-for="lang in Languages" :key="lang.label" :value="lang.label" :label="lang.label" /> <el-option v-for="lang in Languages" :key="lang.label" :value="lang.label" :label="lang.label" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('file.eol')"> <el-form-item :label="$t('file.eol')">
<el-select v-model="config.eol" @change="changeEOL()"> <el-select v-model="config.eol" @change="changeEOL()" class="p-w-200">
<el-option v-for="eol in eols" :key="eol.label" :value="eol.value" :label="eol.label" /> <el-option v-for="eol in eols" :key="eol.label" :value="eol.value" :label="eol.label" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :label="$t('file.wordWrap')"> <el-form-item :label="$t('file.wordWrap')">
<el-select v-model="config.wordWrap" @change="changeWarp()"> <el-select v-model="config.wordWrap" @change="changeWarp()" class="p-w-200">
<el-option :label="$t('commons.button.enable')" value="on"></el-option> <el-option :label="$t('commons.button.enable')" value="on"></el-option>
<el-option :label="$t('commons.button.disable')" value="off"></el-option> <el-option :label="$t('commons.button.disable')" value="off"></el-option>
</el-select> </el-select>

View File

@ -15,7 +15,7 @@
</el-button> </el-button>
</el-col> </el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8"> <el-col :xs="24" :sm="8" :md="8" :lg="8" :xl="8">
<div class="flx-align-center"> <div class="flex justify-end">
<TableSetting @search="search()" /> <TableSetting @search="search()" />
<TableSearch @search="search()" v-model:searchName="searchIP" /> <TableSearch @search="search()" v-model:searchName="searchIP" />
</div> </div>
@ -25,14 +25,14 @@
<template #search> <template #search>
<div class="flx-align-center"> <div class="flx-align-center">
<el-select v-model="searchStatus" @change="search()" clearable> <el-select v-model="searchStatus" @change="search()" clearable class="p-w-200">
<template #prefix>{{ $t('commons.table.status') }}</template> <template #prefix>{{ $t('commons.table.status') }}</template>
<el-option :label="$t('commons.table.all')" value=""></el-option> <el-option :label="$t('commons.table.all')" value=""></el-option>
<el-option :label="$t('commons.status.success')" value="Success"></el-option> <el-option :label="$t('commons.status.success')" value="Success"></el-option>
<el-option :label="$t('commons.status.failed')" value="Failed"></el-option> <el-option :label="$t('commons.status.failed')" value="Failed"></el-option>
</el-select> </el-select>
<el-button type="primary" plain @click="onClean()" style="margin-left: 10px"> <el-button type="primary" plain @click="onClean()" class="ml-2.5">
{{ $t('logs.deleteLogs') }} {{ $t('logs.deleteLogs') }}
</el-button> </el-button>
</div> </div>