|
|
|
import { Writer } from 'clitastic'
|
|
|
|
|
|
|
|
import { config, VERBOSE } from './autorestic'
|
|
|
|
import { getEnvFromBackend } from './backend'
|
|
|
|
import { Locations, Location } from './types'
|
|
|
|
import {
|
|
|
|
exec,
|
|
|
|
ConfigError,
|
|
|
|
pathRelativeToConfigFile,
|
|
|
|
getFlagsFromLocation,
|
|
|
|
makeArrayIfIsNot,
|
|
|
|
execPlain,
|
|
|
|
MeasureDuration, fill,
|
|
|
|
} from './utils'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const backupSingle = (name: string, to: string, location: Location) => {
|
|
|
|
if (!config) throw ConfigError
|
|
|
|
const delta = new MeasureDuration()
|
|
|
|
const writer = new Writer(name + to.blue + ' : ' + 'Backing up... ⏳')
|
|
|
|
|
|
|
|
const backend = config.backends[to]
|
|
|
|
const path = pathRelativeToConfigFile(location.from)
|
|
|
|
|
|
|
|
const cmd = exec(
|
|
|
|
'restic',
|
|
|
|
['backup', path, ...getFlagsFromLocation(location, 'backup')],
|
|
|
|
{ env: getEnvFromBackend(backend) },
|
|
|
|
)
|
|
|
|
|
|
|
|
if (VERBOSE) console.log(cmd.out, cmd.err)
|
|
|
|
writer.done(`${name}${to.blue} : ${'Done ✓'.green} (${delta.finished(true)})`)
|
|
|
|
}
|
|
|
|
|
|
|
|
export const backupLocation = (name: string, location: Location) => {
|
|
|
|
const display = name.yellow + ' ▶ '
|
|
|
|
const filler = fill(name.length + 3)
|
|
|
|
let first = true
|
|
|
|
|
|
|
|
if (location.hooks && location.hooks.before)
|
|
|
|
for (const command of makeArrayIfIsNot(location.hooks.before)) {
|
|
|
|
const cmd = execPlain(command)
|
|
|
|
if (cmd) console.log(cmd.out, cmd.err)
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const t of makeArrayIfIsNot(location.to)) {
|
|
|
|
backupSingle(first ? display : filler, t, location)
|
|
|
|
if (first) first = false
|
|
|
|
}
|
|
|
|
|
|
|
|
if (location.hooks && location.hooks.after)
|
|
|
|
for (const command of makeArrayIfIsNot(location.hooks.after)) {
|
|
|
|
const cmd = execPlain(command)
|
|
|
|
if (cmd) console.log(cmd.out, cmd.err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const backupAll = (locations?: Locations) => {
|
|
|
|
if (!locations) {
|
|
|
|
if (!config) throw ConfigError
|
|
|
|
locations = config.locations
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('\nBacking Up'.underline.grey)
|
|
|
|
for (const [name, location] of Object.entries(locations))
|
|
|
|
backupLocation(name, location)
|
|
|
|
}
|