mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 07:57:21 +08:00
feat: 备份优化
This commit is contained in:
@@ -32,7 +32,7 @@ func NewSFTP(config SFTPConfig) (Storage, error) {
|
||||
if config.Timeout == 0 {
|
||||
config.Timeout = 30 * time.Second
|
||||
}
|
||||
config.BasePath = strings.Trim(config.BasePath, "/")
|
||||
config.BasePath = strings.TrimSuffix(config.BasePath, "/")
|
||||
|
||||
if config.Username == "" || (config.Password == "" && config.PrivateKey == "") {
|
||||
return nil, fmt.Errorf("username and either password or private key must be provided")
|
||||
@@ -139,6 +139,11 @@ func (s *SFTP) List(path string) ([]string, error) {
|
||||
}
|
||||
defer cleanup()
|
||||
|
||||
// 确保基础路径存在
|
||||
if s.config.BasePath != "" {
|
||||
_ = client.MkdirAll(s.config.BasePath)
|
||||
}
|
||||
|
||||
remotePath := s.getRemotePath(path)
|
||||
entries, err := client.ReadDir(remotePath)
|
||||
if err != nil {
|
||||
|
||||
@@ -27,7 +27,7 @@ func NewWebDav(config WebDavConfig) (Storage, error) {
|
||||
if config.Timeout == 0 {
|
||||
config.Timeout = 30 * time.Second
|
||||
}
|
||||
config.BasePath = strings.Trim(config.BasePath, "/")
|
||||
config.BasePath = strings.TrimSuffix(config.BasePath, "/")
|
||||
|
||||
client := gowebdav.NewClient(config.URL, config.Username, config.Password)
|
||||
client.SetTimeout(config.Timeout)
|
||||
|
||||
@@ -21,6 +21,11 @@ const styleOptions = [
|
||||
{ label: 'Path', value: 'path' }
|
||||
]
|
||||
|
||||
const sftpAuthOptions = [
|
||||
{ label: $gettext('Password'), value: 'password' },
|
||||
{ label: $gettext('Private Key'), value: 'private_key' }
|
||||
]
|
||||
|
||||
const defaultModel = {
|
||||
type: 's3',
|
||||
name: '',
|
||||
@@ -33,8 +38,10 @@ const defaultModel = {
|
||||
bucket: '',
|
||||
host: '',
|
||||
port: 22,
|
||||
user: '',
|
||||
username: '',
|
||||
password: '',
|
||||
private_key: '',
|
||||
auth_type: 'password',
|
||||
path: ''
|
||||
}
|
||||
}
|
||||
@@ -275,11 +282,18 @@ onMounted(() => {
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Username')" required>
|
||||
<n-input
|
||||
v-model:value="createModel.info.user"
|
||||
v-model:value="createModel.info.username"
|
||||
:placeholder="$gettext('Enter username')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Password')" required>
|
||||
<n-form-item :label="$gettext('Auth Type')" required>
|
||||
<n-select v-model:value="createModel.info.auth_type" :options="sftpAuthOptions" />
|
||||
</n-form-item>
|
||||
<n-form-item
|
||||
v-if="createModel.info.auth_type === 'password'"
|
||||
:label="$gettext('Password')"
|
||||
required
|
||||
>
|
||||
<n-input
|
||||
v-model:value="createModel.info.password"
|
||||
type="password"
|
||||
@@ -287,6 +301,18 @@ onMounted(() => {
|
||||
:placeholder="$gettext('Enter password')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item
|
||||
v-if="createModel.info.auth_type === 'private_key'"
|
||||
:label="$gettext('Private Key')"
|
||||
required
|
||||
>
|
||||
<n-input
|
||||
v-model:value="createModel.info.private_key"
|
||||
type="textarea"
|
||||
:rows="5"
|
||||
:placeholder="$gettext('Enter private key')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Path')" required>
|
||||
<n-input
|
||||
v-model:value="createModel.info.path"
|
||||
@@ -305,7 +331,7 @@ onMounted(() => {
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Username')" required>
|
||||
<n-input
|
||||
v-model:value="createModel.info.user"
|
||||
v-model:value="createModel.info.username"
|
||||
:placeholder="$gettext('Enter username')"
|
||||
/>
|
||||
</n-form-item>
|
||||
@@ -406,9 +432,19 @@ onMounted(() => {
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Username')" required>
|
||||
<n-input v-model:value="editModel.info.user" :placeholder="$gettext('Enter username')" />
|
||||
<n-input
|
||||
v-model:value="editModel.info.username"
|
||||
:placeholder="$gettext('Enter username')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Password')" required>
|
||||
<n-form-item :label="$gettext('Auth Type')" required>
|
||||
<n-select v-model:value="editModel.info.auth_type" :options="sftpAuthOptions" />
|
||||
</n-form-item>
|
||||
<n-form-item
|
||||
v-if="editModel.info.auth_type === 'password'"
|
||||
:label="$gettext('Password')"
|
||||
required
|
||||
>
|
||||
<n-input
|
||||
v-model:value="editModel.info.password"
|
||||
type="password"
|
||||
@@ -416,6 +452,18 @@ onMounted(() => {
|
||||
:placeholder="$gettext('Enter password')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item
|
||||
v-if="editModel.info.auth_type === 'private_key'"
|
||||
:label="$gettext('Private Key')"
|
||||
required
|
||||
>
|
||||
<n-input
|
||||
v-model:value="editModel.info.private_key"
|
||||
type="textarea"
|
||||
:rows="5"
|
||||
:placeholder="$gettext('Enter private key')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Path')" required>
|
||||
<n-input
|
||||
v-model:value="editModel.info.path"
|
||||
@@ -433,7 +481,10 @@ onMounted(() => {
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Username')" required>
|
||||
<n-input v-model:value="editModel.info.user" :placeholder="$gettext('Enter username')" />
|
||||
<n-input
|
||||
v-model:value="editModel.info.username"
|
||||
:placeholder="$gettext('Enter username')"
|
||||
/>
|
||||
</n-form-item>
|
||||
<n-form-item :label="$gettext('Password')" required>
|
||||
<n-input
|
||||
|
||||
Reference in New Issue
Block a user