Skript, mis teeb varukoopia WordPressi instantsist - Python
From ICO wiki
Jump to navigationJump to search
Argumendid
Skript on graafilise kasutajaliidesega ja ei vaja argumente.
Tulemus
Tehakse varukoopia MySQL baasi vastavatest tabelitest ja WP kataloogipuust. Tabeli nime prefiks ja muud parameetrid võetakse WP konfiguratsioonifailist. Kogu asi pakitakse kokku kujul wp-backup-<iso time format>.tar.gz
Skript
wp-backup.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
import tarfile
from datetime import datetime
from PyQt4.QtGui import QDialog, QPushButton, QGridLayout, QLabel, QCheckBox, QFormLayout, QCheckBox,\
QHBoxLayout, QVBoxLayout, QLineEdit, QWidget, QComboBox, QApplication, QMessageBox, \
QFileDialog
class MainView(QDialog):
def __init__(self, parent=None, args=[]):
QDialog.__init__(self, parent)
self.setWindowTitle("WP Backup")
self.browse = QPushButton("&Browse...")
self.goButton = QPushButton("&Go!")
self.mysqlUser = QLineEdit(self)
self.mysqlPass = QLineEdit(self)
self.mysqlDb = QLineEdit(self)
self.mysqlHost = QLineEdit(self)
self.tablePrefix = QLineEdit(self)
self.fileNameLabel = QLineEdit(self)
fileRowLayout = QHBoxLayout()
fileRowLayout.addWidget(self.fileNameLabel)
fileRowLayout.addWidget(self.browse)
layout = QFormLayout()
layout.addRow('Filename:', fileRowLayout)
layout.addRow('MySQL username:', self.mysqlUser)
layout.addRow('MySQL password:', self.mysqlPass)
layout.addRow('MySQL database:', self.mysqlDb)
layout.addRow('MySQL hostname:', self.mysqlHost)
layout.addRow('Table prefix:', self.tablePrefix)
layout.addRow(self.goButton)
self.setLayout(layout)
self.browse.clicked.connect(self.browseForConf)
self.goButton.clicked.connect(self.doBackup)
def browseForConf(self):
self.wpConfFile = QFileDialog.getOpenFileName(self, \
'Kus on wp-config.php?', \
'~/', \
'WP Config (wp-config.php);;All files(*.*)')
self.fileNameLabel.setText(self.wpConfFile)
self.parseConf()
def parseConf(self):
# Proovime ükshaaval muutujaid täita. Kui õnnestub, on kõik hästi.
# Vastasel juhul (kui ühtki parameetrit ei leia), anname vea.
# Kõigepealt eemaldame olemasoleva
self.mysqlUser.setText("")
self.mysqlPass.setText("")
self.mysqlDb.setText("")
self.mysqlHost.setText("")
self.tablePrefix.setText("")
fh = open(self.wpConfFile) # peab olema väärtustatud, muidu on jama
for line in fh:
if 'DB_USER' in line:
self.mysqlUser.setText(line.split("'")[3])
elif 'DB_PASSWORD' in line:
self.mysqlPass.setText(line.split("'")[3])
elif 'DB_NAME' in line:
self.mysqlDb.setText(line.split("'")[3])
elif 'DB_HOST' in line:
self.mysqlHost.setText(line.split("'")[3])
elif 'table_prefix' in line:
self.tablePrefix.setText(line.split("'")[1])
fh.close()
def doBackup(self):
# Teeme varundamise läbi vanade heade käsurea-tööriistade.
# Kui mõni parameeter puudu on, anname vea.
wpPath = os.path.dirname(str(self.fileNameLabel.text()))
mysqlUser = str(self.mysqlUser.text())
mysqlPass = str(self.mysqlPass.text())
mysqlDb = str(self.mysqlDb.text())
mysqlHost = str(self.mysqlHost.text())
tablePrefix = str(self.tablePrefix.text())
# Varukoopia failinimi
fileName = "wp-backup-"+datetime.now().isoformat()
print fileName
print wpPath
mysqlParams = []
if not mysqlUser.strip():
# Kui string on tühi, kuva veateade.
QMessageBox.warning(self,'Error',"MySQL username missing!")
return False
else:
mysqlParams.append("--user="+mysqlUser)
# password võib teoorias tühi ka olla
if mysqlPass.strip():
mysqlParams.append("--password="+mysqlPass)
if not mysqlHost.strip():
mysqlParams.append("--host=localhost")
else:
mysqlParams.append("--host="+mysqlHost)
if not mysqlDb.strip():
# Kui string on tühi, kuva veateade.
QMessageBox.warning(self,'Error',"MySQL database missing!")
return False
else:
mysqlParams.append(mysqlDb)
sqlDump = open(wpPath+"/"+fileName+".sql", "w")
if tablePrefix.strip():
#asd
tables = "--tables "
p1 = subprocess.Popen(["mysql",mysqlParams[0], \
mysqlParams[1],mysqlParams[2],mysqlParams[3], \
"-e show tables","--batch"], stdout=subprocess.PIPE)
for line in p1.stdout:
tables += line.strip()
subprocess.Popen(["mysqldump",mysqlParams[0], \
mysqlParams[1],mysqlParams[2],mysqlParams[3]],\
stdout=sqlDump)
sqlDump.close()
else:
#asd
mysqlParams.append("")
# Ja nüüd... pakkima!
# TODO: backup folder eraldi parameetriks
# vaikimisi <kasutaja kodukataloog>/wp-backup/
tarFileName = "/home/garf/wp-backup/"+fileName+".tar.gz"
backupFile = tarfile.open(tarFileName, "w:gz")
backupFile.add(wpPath)
backupFile.close()
QMessageBox.information(self,'All done!',"Backed up to "+tarFileName)
exit()
app = QApplication([])
win = MainView()
win.show()
sys.exit(app.exec_())
Teadaolevad kitsaskohad
- Testitud ainult ühe WP konfiguratsioonifailiga.
- Praegune versioon eeldab, et mysql on juba süsteemis olemas. Selle puudumist ei ole testitud.
- Veel võimalikke veasituatsioone, millest kasutajat ei informeerita (nt .tar.gz faili ei õnnestunud luua)
- Varukoopia asukoht on koodi jäigalt sisse kirjutatud
- MySQL-dump jäetakse pärast skripti lõpetamist WP kodukataloogi vedelema -- tegelikult tuleks igal juhul ära kustutada.