Skript, mis teeb varukoopia WordPressi instantsist - Python

From ICO wiki

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.