mirror of
https://gh.catmak.name/https://github.com/mihomo-party-org/mihomo-party
synced 2025-12-27 21:20:29 +08:00
104 lines
2.8 KiB
TypeScript
104 lines
2.8 KiB
TypeScript
import { getAppConfig } from '../config'
|
|
import dayjs from 'dayjs'
|
|
import AdmZip from 'adm-zip'
|
|
import {
|
|
appConfigPath,
|
|
controledMihomoConfigPath,
|
|
dataDir,
|
|
overrideConfigPath,
|
|
overrideDir,
|
|
profileConfigPath,
|
|
profilesDir,
|
|
subStoreDir,
|
|
themesDir
|
|
} from '../utils/dirs'
|
|
|
|
export async function webdavBackup(): Promise<boolean> {
|
|
const { createClient } = await import('webdav/dist/node/index.js')
|
|
const {
|
|
webdavUrl = '',
|
|
webdavUsername = '',
|
|
webdavPassword = '',
|
|
webdavDir = 'mihomo-party'
|
|
} = await getAppConfig()
|
|
const zip = new AdmZip()
|
|
|
|
zip.addLocalFile(appConfigPath())
|
|
zip.addLocalFile(controledMihomoConfigPath())
|
|
zip.addLocalFile(profileConfigPath())
|
|
zip.addLocalFile(overrideConfigPath())
|
|
zip.addLocalFolder(themesDir(), 'themes')
|
|
zip.addLocalFolder(profilesDir(), 'profiles')
|
|
zip.addLocalFolder(overrideDir(), 'override')
|
|
zip.addLocalFolder(subStoreDir(), 'substore')
|
|
const date = new Date()
|
|
const zipFileName = `${process.platform}_${dayjs(date).format('YYYY-MM-DD_HH-mm-ss')}.zip`
|
|
|
|
const client = createClient(webdavUrl, {
|
|
username: webdavUsername,
|
|
password: webdavPassword
|
|
})
|
|
try {
|
|
await client.createDirectory(webdavDir)
|
|
} catch {
|
|
// ignore
|
|
}
|
|
|
|
return await client.putFileContents(`${webdavDir}/${zipFileName}`, zip.toBuffer())
|
|
}
|
|
|
|
export async function webdavRestore(filename: string): Promise<void> {
|
|
const { createClient } = await import('webdav/dist/node/index.js')
|
|
const {
|
|
webdavUrl = '',
|
|
webdavUsername = '',
|
|
webdavPassword = '',
|
|
webdavDir = 'mihomo-party'
|
|
} = await getAppConfig()
|
|
|
|
const client = createClient(webdavUrl, {
|
|
username: webdavUsername,
|
|
password: webdavPassword
|
|
})
|
|
const zipData = await client.getFileContents(`${webdavDir}/${filename}`)
|
|
const zip = new AdmZip(zipData as Buffer)
|
|
zip.extractAllTo(dataDir(), true)
|
|
}
|
|
|
|
export async function listWebdavBackups(): Promise<string[]> {
|
|
const { createClient } = await import('webdav/dist/node/index.js')
|
|
const {
|
|
webdavUrl = '',
|
|
webdavUsername = '',
|
|
webdavPassword = '',
|
|
webdavDir = 'mihomo-party'
|
|
} = await getAppConfig()
|
|
|
|
const client = createClient(webdavUrl, {
|
|
username: webdavUsername,
|
|
password: webdavPassword
|
|
})
|
|
const files = await client.getDirectoryContents(webdavDir, { glob: '*.zip' })
|
|
if (Array.isArray(files)) {
|
|
return files.map((file) => file.basename)
|
|
} else {
|
|
return files.data.map((file) => file.basename)
|
|
}
|
|
}
|
|
|
|
export async function webdavDelete(filename: string): Promise<void> {
|
|
const { createClient } = await import('webdav/dist/node/index.js')
|
|
const {
|
|
webdavUrl = '',
|
|
webdavUsername = '',
|
|
webdavPassword = '',
|
|
webdavDir = 'mihomo-party'
|
|
} = await getAppConfig()
|
|
|
|
const client = createClient(webdavUrl, {
|
|
username: webdavUsername,
|
|
password: webdavPassword
|
|
})
|
|
await client.deleteFile(`${webdavDir}/${filename}`)
|
|
}
|