Better backup utility.

This commit is contained in:
Antoine Nguyen
2015-11-02 21:20:55 +01:00
parent 92f2539568
commit 1824707d76
4 changed files with 33 additions and 12 deletions

View File

@@ -8,7 +8,9 @@ An installer which deploy a complete mail server based on Modoboa.
This tool is still in beta stage, it has been tested on Debian This tool is still in beta stage, it has been tested on Debian
Jessie (8) only. Jessie (8) only.
/tmp partitions must be mounted without ``noexec``. .. warning::
``/tmp`` partition must be mounted without the ``noexec`` option.
Usage:: Usage::
@@ -26,9 +28,11 @@ By default, the following components are installed:
* Dovecot * Dovecot
* Amavis (with SpamAssassin and ClamAV) * Amavis (with SpamAssassin and ClamAV)
If you want to follow details of installation process, use --debug If you want more information about the installation process, add the
``--debug`` option to your command line.
At the end of the process, you should consider updating virus database with this command:: At the end of the process, you should consider updating virus databases
with this command::
freshclam $ freshclam
/etc/init.d/clamav-daemon restart $ service clamav-daemon restart

View File

@@ -2,7 +2,6 @@
import glob import glob
import pwd import pwd
import shutil
from .. import database from .. import database
from .. import utils from .. import utils
@@ -64,7 +63,7 @@ class Dovecot(base.Installer):
self.get_file_path("fix_modoboa_postgres_schema.sql") self.get_file_path("fix_modoboa_postgres_schema.sql")
) )
for f in glob.glob("{}/*".format(self.get_file_path("conf.d"))): for f in glob.glob("{}/*".format(self.get_file_path("conf.d"))):
shutil.copy(f, "{}/conf.d".format(self.config_dir)) utils.copy_file(f, "{}/conf.d".format(self.config_dir))
def restart_daemon(self): def restart_daemon(self):
"""Restart daemon process. """Restart daemon process.

View File

@@ -2,7 +2,6 @@
import os import os
import pwd import pwd
import shutil
import stat import stat
from .. import utils from .. import utils
@@ -31,7 +30,8 @@ class Razor(base.Installer):
path = os.path.join(self.config.get("amavis", "home_dir"), ".razor") path = os.path.join(self.config.get("amavis", "home_dir"), ".razor")
utils.mkdir(path, stat.S_IRWXU, pw[2], pw[3]) utils.mkdir(path, stat.S_IRWXU, pw[2], pw[3])
utils.exec_cmd("razor-admin -home {} -create".format(path)) utils.exec_cmd("razor-admin -home {} -create".format(path))
shutil.copy(os.path.join(path, "razor-agent.conf"), self.config_dir) utils.copy_file(
os.path.join(path, "razor-agent.conf"), self.config_dir)
utils.exec_cmd("razor-admin -home {} -discover".format(path), utils.exec_cmd("razor-admin -home {} -discover".format(path),
sudo_user=user) sudo_user=user)
utils.exec_cmd("razor-admin -home {} -register".format(path), utils.exec_cmd("razor-admin -home {} -register".format(path),

View File

@@ -2,6 +2,7 @@
import contextlib import contextlib
import datetime import datetime
import glob
import os import os
import shutil import shutil
import string import string
@@ -103,14 +104,31 @@ class ConfigFileTemplate(string.Template):
delimiter = "%" delimiter = "%"
def backup_file(fname):
"""Create a backup of a given file."""
for f in glob.glob("{}.old.*".format(fname)):
os.unlink(f)
bak_name = "{}.old.{}".format(
fname, datetime.datetime.now().isoformat())
shutil.copy(fname, bak_name)
def copy_file(src, dest):
"""Copy a file to a destination and make a backup before."""
if os.path.isdir(dest):
dest = os.path.join(dest, os.path.basename(src))
if os.path.isfile(dest):
backup_file(dest)
shutil.copy(src, dest)
def copy_from_template(template, dest, context): def copy_from_template(template, dest, context):
"""Create and copy a configuration file from a template.""" """Create and copy a configuration file from a template."""
now = datetime.datetime.now().isoformat() now = datetime.datetime.now().isoformat()
with open(template) as fp: with open(template) as fp:
buf = fp.read() buf = fp.read()
if os.path.exists(dest): if os.path.isfile(dest):
bak_name = "{}.{}.{}".format(dest, "old", now) backup_file(dest)
shutil.copy(dest, bak_name)
with open(dest, "w") as fp: with open(dest, "w") as fp:
fp.write( fp.write(
"# This file was automatically installed on {}\n" "# This file was automatically installed on {}\n"