mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-10-08 22:46:51 +08:00
fix: 面板设置增加数字范围限制
This commit is contained in:
parent
1b862253bd
commit
220d329d8e
7 changed files with 58 additions and 40 deletions
|
@ -124,15 +124,15 @@ func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate) error {
|
||||||
backupDockerDir := fmt.Sprintf("%s/docker", rootDir)
|
backupDockerDir := fmt.Sprintf("%s/docker", rootDir)
|
||||||
_ = os.MkdirAll(backupDockerDir, os.ModePerm)
|
_ = os.MkdirAll(backupDockerDir, os.ModePerm)
|
||||||
|
|
||||||
|
_ = settingRepo.Update("SystemStatus", "Snapshoting")
|
||||||
snap := model.Snapshot{
|
snap := model.Snapshot{
|
||||||
Name: fmt.Sprintf("1panel_%s_%s", versionItem.Value, timeNow),
|
Name: fmt.Sprintf("1panel_%s_%s", versionItem.Value, timeNow),
|
||||||
Description: req.Description,
|
Description: req.Description,
|
||||||
From: req.From,
|
From: req.From,
|
||||||
Version: versionItem.Value,
|
Version: versionItem.Value,
|
||||||
Status: constant.StatusWaiting,
|
Status: constant.StatusSuccess,
|
||||||
}
|
}
|
||||||
_ = snapshotRepo.Create(&snap)
|
_ = snapshotRepo.Create(&snap)
|
||||||
_ = settingRepo.Update("SystemStatus", "Snapshoting")
|
|
||||||
go func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
_ = os.RemoveAll(rootDir)
|
_ = os.RemoveAll(rootDir)
|
||||||
|
@ -153,7 +153,6 @@ func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate) error {
|
||||||
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
_, _ = cmd.Exec("systemctl restart docker")
|
|
||||||
|
|
||||||
if err := u.handlePanelBinary(fileOp, "snapshot", "", backupPanelDir+"/1panel"); err != nil {
|
if err := u.handlePanelBinary(fileOp, "snapshot", "", backupPanelDir+"/1panel"); err != nil {
|
||||||
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
||||||
|
@ -177,6 +176,7 @@ func (u *SnapshotService) SnapshotCreate(req dto.SnapshotCreate) error {
|
||||||
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
updateSnapshotStatus(snap.ID, constant.StatusFailed, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
_, _ = cmd.Exec("systemctl restart docker")
|
||||||
|
|
||||||
snapJson := SnapshotJson{
|
snapJson := SnapshotJson{
|
||||||
BaseDir: global.CONF.BaseDir,
|
BaseDir: global.CONF.BaseDir,
|
||||||
|
@ -664,11 +664,9 @@ func (u *SnapshotService) handlePanelDatas(snapID uint, fileOp files.FileOp, ope
|
||||||
exclusionRules += ("." + strings.ReplaceAll(dockerDir, source, "") + ";")
|
exclusionRules += ("." + strings.ReplaceAll(dockerDir, source, "") + ";")
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = snapshotRepo.Update(snapID, map[string]interface{}{"status": constant.StatusSuccess})
|
|
||||||
if err := u.handleTar(source, target, "1panel_data.tar.gz", exclusionRules); err != nil {
|
if err := u.handleTar(source, target, "1panel_data.tar.gz", exclusionRules); err != nil {
|
||||||
return fmt.Errorf("backup panel data failed, err: %v", err)
|
return fmt.Errorf("backup panel data failed, err: %v", err)
|
||||||
}
|
}
|
||||||
_ = snapshotRepo.Update(snapID, map[string]interface{}{"status": constant.StatusWaiting})
|
|
||||||
case "recover":
|
case "recover":
|
||||||
exclusionRules := "./tmp/;./cache;"
|
exclusionRules := "./tmp/;./cache;"
|
||||||
if strings.Contains(backupDir, target) {
|
if strings.Contains(backupDir, target) {
|
||||||
|
@ -852,9 +850,9 @@ func (u *SnapshotService) handleTar(sourceDir, targetDir, name, exclusionRules s
|
||||||
exStr += exclude
|
exStr += exclude
|
||||||
}
|
}
|
||||||
|
|
||||||
ss := fmt.Sprintf("tar --warning=no-file-changed -zcf %s %s -C %s .", targetDir+"/"+name, exStr, sourceDir)
|
commands := fmt.Sprintf("tar -zcf %s %s -C %s .", targetDir+"/"+name, exStr, sourceDir)
|
||||||
global.LOG.Debug(ss)
|
global.LOG.Debug(commands)
|
||||||
stdout, err := cmd.Exec(ss)
|
stdout, err := cmd.Exec(commands)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.LOG.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err)
|
global.LOG.Errorf("do handle tar failed, stdout: %s, err: %v", stdout, err)
|
||||||
return errors.New(stdout)
|
return errors.New(stdout)
|
||||||
|
@ -868,10 +866,13 @@ func (u *SnapshotService) handleUnTar(sourceDir, targetDir string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stdout, err := cmd.Exec(fmt.Sprintf("tar zxf %s -C %s .", sourceDir, targetDir))
|
|
||||||
|
commands := fmt.Sprintf("tar -zxf %s -C %s .", sourceDir, targetDir)
|
||||||
|
global.LOG.Debug(commands)
|
||||||
|
stdout, err := cmd.Exec(commands)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
global.LOG.Errorf("do handle untar failed, stdout: %s, err: %v", stdout, err)
|
global.LOG.Errorf("do handle untar failed, stdout: %s, err: %v", stdout, err)
|
||||||
return errors.New(string(stdout))
|
return errors.New(stdout)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,7 @@ export default {
|
||||||
fileExist: 'The file already exists in the current folder. Repeat uploading is not supported!',
|
fileExist: 'The file already exists in the current folder. Repeat uploading is not supported!',
|
||||||
fileNameErr:
|
fileNameErr:
|
||||||
'You can upload only files whose name contains 1 to 50 characters, including English, Chinese, digits, or periods (.-_)',
|
'You can upload only files whose name contains 1 to 50 characters, including English, Chinese, digits, or periods (.-_)',
|
||||||
|
comfimNoNull: 'Make sure the value {0} is not empty',
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
firstLogin: 'First login, please create an initial administrator user!',
|
firstLogin: 'First login, please create an initial administrator user!',
|
||||||
|
|
|
@ -101,6 +101,7 @@ export default {
|
||||||
unSupportSize: '上传文件超过 {0}M,请确认!',
|
unSupportSize: '上传文件超过 {0}M,请确认!',
|
||||||
fileExist: '当前文件夹已存在该文件,不支持重复上传!',
|
fileExist: '当前文件夹已存在该文件,不支持重复上传!',
|
||||||
fileNameErr: '仅支持上传名称包含英文、中文、数字或者 .-_ ,长度 1-50 位的文件',
|
fileNameErr: '仅支持上传名称包含英文、中文、数字或者 .-_ ,长度 1-50 位的文件',
|
||||||
|
comfimNoNull: '请确认 {0} 值不为空',
|
||||||
},
|
},
|
||||||
login: {
|
login: {
|
||||||
firstLogin: '首次登录,请创建初始管理员用户!',
|
firstLogin: '首次登录,请创建初始管理员用户!',
|
||||||
|
|
|
@ -72,14 +72,14 @@
|
||||||
v-if="dialogData.rowData!.type !== '' && hasBucket(dialogData.rowData!.type)"
|
v-if="dialogData.rowData!.type !== '' && hasBucket(dialogData.rowData!.type)"
|
||||||
label="Bucket"
|
label="Bucket"
|
||||||
prop="bucket"
|
prop="bucket"
|
||||||
:rules="Rules.requiredSelect"
|
|
||||||
>
|
>
|
||||||
<el-select style="width: 80%" v-model="dialogData.rowData!.bucket">
|
<el-select style="width: 80%" @change="errBuckets = false" v-model="dialogData.rowData!.bucket">
|
||||||
<el-option v-for="item in buckets" :key="item" :value="item" />
|
<el-option v-for="item in buckets" :key="item" :value="item" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-button style="width: 20%" plain @click="getBuckets">
|
<el-button style="width: 20%" plain @click="getBuckets(formRef)">
|
||||||
{{ $t('setting.loadBucket') }}
|
{{ $t('setting.loadBucket') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<span v-if="errBuckets" class="input-error">{{ $t('commons.rule.requiredSelect') }}</span>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<div v-if="dialogData.rowData!.type === 'SFTP'">
|
<div v-if="dialogData.rowData!.type === 'SFTP'">
|
||||||
<el-form-item :label="$t('setting.address')" prop="varsJson.address" :rules="Rules.ip">
|
<el-form-item :label="$t('setting.address')" prop="varsJson.address" :rules="Rules.ip">
|
||||||
|
@ -139,6 +139,7 @@ const loading = ref(false);
|
||||||
type FormInstance = InstanceType<typeof ElForm>;
|
type FormInstance = InstanceType<typeof ElForm>;
|
||||||
const formRef = ref<FormInstance>();
|
const formRef = ref<FormInstance>();
|
||||||
const buckets = ref();
|
const buckets = ref();
|
||||||
|
const errBuckets = ref();
|
||||||
|
|
||||||
const endpoints = ref('http');
|
const endpoints = ref('http');
|
||||||
|
|
||||||
|
@ -181,33 +182,41 @@ function hasBucket(val: string) {
|
||||||
return val === 'OSS' || val === 'S3' || val === 'MINIO';
|
return val === 'OSS' || val === 'S3' || val === 'MINIO';
|
||||||
}
|
}
|
||||||
|
|
||||||
const getBuckets = async () => {
|
const getBuckets = async (formEl: FormInstance | undefined) => {
|
||||||
loading.value = true;
|
if (!formEl) return;
|
||||||
let item = deepCopy(dialogData.value.rowData!.varsJson);
|
formEl.validate(async (valid) => {
|
||||||
if (dialogData.value.rowData!.type === 'MINIO') {
|
if (!valid) return;
|
||||||
dialogData.value.rowData!.varsJson['endpointItem'] = dialogData.value
|
loading.value = true;
|
||||||
.rowData!.varsJson['endpointItem'].replace('https://', '')
|
let item = deepCopy(dialogData.value.rowData!.varsJson);
|
||||||
.replace('http://', '');
|
if (dialogData.value.rowData!.type === 'MINIO') {
|
||||||
item['endpoint'] = endpoints.value + '://' + dialogData.value.rowData!.varsJson['endpointItem'];
|
dialogData.value.rowData!.varsJson['endpointItem'] = dialogData.value
|
||||||
item['endpointItem'] = undefined;
|
.rowData!.varsJson['endpointItem'].replace('https://', '')
|
||||||
}
|
.replace('http://', '');
|
||||||
listBucket({
|
item['endpoint'] = endpoints.value + '://' + dialogData.value.rowData!.varsJson['endpointItem'];
|
||||||
type: dialogData.value.rowData!.type,
|
item['endpointItem'] = undefined;
|
||||||
vars: JSON.stringify(item),
|
}
|
||||||
accessKey: dialogData.value.rowData!.accessKey,
|
listBucket({
|
||||||
credential: dialogData.value.rowData!.credential,
|
type: dialogData.value.rowData!.type,
|
||||||
})
|
vars: JSON.stringify(item),
|
||||||
.then((res) => {
|
accessKey: dialogData.value.rowData!.accessKey,
|
||||||
loading.value = false;
|
credential: dialogData.value.rowData!.credential,
|
||||||
buckets.value = res.data;
|
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.then((res) => {
|
||||||
buckets.value = [];
|
loading.value = false;
|
||||||
loading.value = false;
|
buckets.value = res.data;
|
||||||
});
|
})
|
||||||
|
.catch(() => {
|
||||||
|
buckets.value = [];
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSubmit = async (formEl: FormInstance | undefined) => {
|
const onSubmit = async (formEl: FormInstance | undefined) => {
|
||||||
|
if (!dialogData.value.rowData.bucket) {
|
||||||
|
errBuckets.value = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!formEl) return;
|
if (!formEl) return;
|
||||||
formEl.validate(async (valid) => {
|
formEl.validate(async (valid) => {
|
||||||
if (!valid) return;
|
if (!valid) return;
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item
|
<el-form-item
|
||||||
:label="$t('setting.storeDays')"
|
:label="$t('setting.storeDays')"
|
||||||
:rules="Rules.number"
|
:rules="[Rules.number, checkNumberRange(1, 30)]"
|
||||||
prop="monitorStoreDays"
|
prop="monitorStoreDays"
|
||||||
>
|
>
|
||||||
<el-input clearable v-model.number="form.monitorStoreDays">
|
<el-input clearable v-model.number="form.monitorStoreDays">
|
||||||
|
@ -51,7 +51,7 @@ import { FormInstance } from 'element-plus';
|
||||||
import LayoutContent from '@/layout/layout-content.vue';
|
import LayoutContent from '@/layout/layout-content.vue';
|
||||||
import { cleanMonitors, getSettingInfo, updateSetting } from '@/api/modules/setting';
|
import { cleanMonitors, getSettingInfo, updateSetting } from '@/api/modules/setting';
|
||||||
import { useDeleteData } from '@/hooks/use-delete-data';
|
import { useDeleteData } from '@/hooks/use-delete-data';
|
||||||
import { Rules } from '@/global/form-rules';
|
import { Rules, checkNumberRange } from '@/global/form-rules';
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
import { MsgSuccess } from '@/utils/message';
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,9 @@
|
||||||
>
|
>
|
||||||
{{ $t('commons.button.sync') }}
|
{{ $t('commons.button.sync') }}
|
||||||
</el-button>
|
</el-button>
|
||||||
<span v-show="show">{{ count }} {{ $t('setting.second') }}</span>
|
<div style="width: 45px" v-show="show">
|
||||||
|
<span>{{ count }} {{ $t('setting.second') }}</span>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
|
@ -141,7 +141,7 @@ import { updateSetting, getMFA, bindMFA, getSettingInfo, updatePort } from '@/ap
|
||||||
import i18n from '@/lang';
|
import i18n from '@/lang';
|
||||||
import { Rules } from '@/global/form-rules';
|
import { Rules } from '@/global/form-rules';
|
||||||
import { dateFormatSimple } from '@/utils/util';
|
import { dateFormatSimple } from '@/utils/util';
|
||||||
import { MsgSuccess } from '@/utils/message';
|
import { MsgError, MsgSuccess } from '@/utils/message';
|
||||||
|
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
const form = reactive({
|
const form = reactive({
|
||||||
|
@ -264,6 +264,10 @@ const handleClose = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const onBind = async () => {
|
const onBind = async () => {
|
||||||
|
if (!mfaCode.value) {
|
||||||
|
MsgError(i18n.global.t('commons.msg.comfimNoNull', ['code']));
|
||||||
|
return;
|
||||||
|
}
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
await bindMFA({ code: mfaCode.value, secret: otp.secret })
|
await bindMFA({ code: mfaCode.value, secret: otp.secret })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
|
Loading…
Add table
Reference in a new issue