想找一个自动备份博客数据库的程序,然而并没有找到合适的.那就自己写一个吧,也不麻烦...
Package.swift文件
// swift-tools-version:3.1
import PackageDescription
let package = Package(
name: "MySQLBackup",
targets: [],
dependencies: [
.Package(url: "https://github.com/PerfectlySoft/PerfectLib.git", majorVersion: 2),
.Package(url: "https://github.com/PerfectlySoft/Perfect-SMTP.git", majorVersion: 1)
]
)
runProc.swift文件
import PerfectLib
import Foundation
#if os(Linux)
import SwiftGlibc
#else
import Darwin
#endif
func runProc(_ cmd: String, args: [String], read: ((String) -> ())? = nil) throws {
try runProc(cmd, args: args, envs: [String : String](), read: read)
}
// shortcut to execute something on the commandline
// i.e.
// let _ = try runProc("git", args: ["clone","--depth","1","https://github.com/PerfectlySoft/PerfectDocs.git","PerfectDocsSource"], read: true)
func runProc(_ cmd: String, args: [String], envs: [String:String], read: ((String) -> ())? = nil) throws {
// Set up environmental variables
// Note that the PATH, HOME and LANG vars are specifically configured.
// HOME will be set to the runtime user's home directory
var ienvs = [("PATH", "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local"),
("HOME", ProcessInfo.processInfo.environment["HOME"]!),
("LANG", "en_CA.UTF-8")]
// Additional environmental variables can be added here.
// This allows for situations like AWS where credentials can be specified as ENV Vars.
for e in envs {
ienvs.append(e)
}
// Building the command with arguments a s a correctly formatted string
var newCmd = "'\(cmd)\'"
for n in 0..<args.count {
newCmd.append(" ${\(n)}")
}
// Execute the command.
// For more information see https://www.perfect.org/docs/sysProcess.html
let proc = try SysProcess("/bin/bash", args: ["--login", "-c", newCmd] + args, env: ienvs)
// Reading the result of the command
if let read = read {
while true {
do {
guard let s = try proc.stdout?.readSomeBytes(count: 1024) , s.count > 0 else {
break
}
let str = UTF8Encoding.encode(bytes: s)
read(str)
} catch PerfectLib.PerfectError.fileError(let code, _) {
if code != EINTR {
break
}
}
}
}
let res = try proc.wait(hang: true)
if res != 0 {
let s = try proc.stderr?.readString()
throw PerfectError.systemError(Int32(res), s!)
}
}
main.swift文件
//mysqldump -uroot -pJxt51921100% tokendemo > /Users/Adrift/Desktop/tokendemo.sql
//swift build -c release & ./.build/release/MySQLBackup
import PerfectLib
import Foundation
import PerfectSMTP
let dbUsername = "root"
let dbPassword = "Jxt51921100%"
let dbName = "perfect_testing"
let clientUrl = "smtps://smtp.qq.com"
let clientUsername = "[email protected]"
let clientPassword = "xxxxxxxx"
let fromName = "发抖喵小咪"
let fromAddress = "[email protected]"
let toName = "发抖喵小咪"
let toAddress = "[email protected]"
var content = ""
var wait = true
do {
try runProc("mysqldump", args: ["-u\(dbUsername) -p\(dbPassword) \(dbName)"]) { (str) in
content.append(str)
}
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let dateStr = formatter.string(from: Date())
let path = "/Users/Adrift/Desktop/\(dateStr).sql"
let manager = FileManager()
let data = content.data(using: String.Encoding.utf8)!
let created = manager.createFile(atPath: path, contents: content.data(using: String.Encoding.utf8)!, attributes: nil)
let client = SMTPClient(url: clientUrl, username: clientUsername, password: clientPassword)
let from = Recipient(name: fromName, address: fromAddress)
let to = Recipient(name: toName, address: toAddress)
var email = EMail(client: client)
email.subject = "博客数据库备份 \(dateStr)"
email.from = from
email.to.append(to)
email.text = "博客数据库备份"
email.attachments.append(path)
try email.send(completion: { (code, header, body) in
print(code)
print(header.utf8)
print(body.utf8)
wait = false
})
while wait {
sleep(1)
}
} catch {
print(error)
}
print("done!")
然而,Swift运行的系统环境需要Ubuntu,so 晚上回去重装一下博客系统吧...
--EOF--