ispCP - Board - Support
Ispcp Backup konfiguration - Printable Version

+- ispCP - Board - Support (http://www.isp-control.net/forum)
+-- Forum: ispCP Omega International Area (/forum-22.html)
+--- Forum: German Corner (/forum-26.html)
+--- Thread: Ispcp Backup konfiguration (/thread-10833.html)



Ispcp Backup konfiguration - pilleee - 05-31-2010 11:21 PM

Hallo,

Ich habe den Document Root von ispcp in /var/www/virtuals. Als unterordner befinden sich hier die namen der subdomains mit jeweils einem ordner "htdocs", die qwiderum als document root der subdomain gelten.
Meine Frag ist nun: Wie kann ich es so einstellen, dass der nicht die komplette domain sichert, sondern nur den ordner einer bestimmten Subdomain? Hier habe ich das backupscript von ispcp: Dies befindet sich in /var/www/ispcp/engine/backup/ und trägt den Namen "ispcp-backup-all".
Dies wird in der /etc/cron.d täglich als Root ausgeführt:

Code:
#!/usr/bin/perl

# ispCP ω (OMEGA) a Virtual Hosting Control Panel
# Copyright (C) 2001-2006 by moleSoftware GmbH - http://www.molesoftware.com
# Copyright (C) 2006-2010 by isp Control Panel - http://ispcp.net
#
# Version: $Id: ispcp-backup-all 2511 2010-01-11 08:08:16Z joximu $
#
# The contents of this file are subject to the Mozilla Public License
# Version 1.1 (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
# License for the specific language governing rights and limitations
# under the License.
#
# The Original Code is "VHCS - Virtual Hosting Control System".
#
# The Initial Developer of the Original Code is moleSoftware GmbH.
# Portions created by Initial Developer are Copyright (C) 2001-2006
# by moleSoftware GmbH. All Rights Reserved.
# Portions created by the ispCP Team are Copyright (C) 2006-2010 by
# isp Control Panel. All Rights Reserved.
#
# The ispCP ω Home Page is:
#
#    http://isp-control.net
#

use FindBin;
use lib "$FindBin::Bin/..";
require 'ispcp_common_code.pl';

use strict;
use warnings;

our $backup_lock_file = "/tmp/ispcp-backup-all.lock";

sub lock_backup_all_system {

    push_el(\@main::el, 'lock_backup_all_system()', 'Starting...');

    if ($main::cfg{'BACKUP_DOMAINS'} ne 'yes') {

        push_el(\@main::el, 'lock_backup_all_system()', 'NOTICE: domain backups are disabled');
        return 2;
    }

    if (-e $backup_lock_file) {

        push_el(\@main::el, 'lock_backup_all_system()', 'ERROR: backup request engine already locked!');
        return 1;

    }

    my $touch_cmd = "$main::cfg{'CMD_TOUCH'} $backup_lock_file";

    my $rs = sys_command($touch_cmd);
    return 1 if ($rs != 0);

    push_el(\@main::el, 'lock_backup_all_system()', 'Ending...');

    return 0;
}


sub unlock_backup_all_system {

    push_el(\@main::el, 'unlock_backup_all_system()', 'Starting...');

    my $rs = del_file($backup_lock_file);
    return $rs if ($rs != 0);

    push_el(\@main::el, 'unlock_backup_all_system()', 'Ending...');

    return 0;

}


sub backup_all_start_up {

    my ($rs, $rdata) = (undef, undef);

    push_el(\@main::el, 'backup_all_start_up()', 'Starting...');

    $rs = lock_backup_all_system();
    return $rs if ($rs != 0);

    # config check;

    $rs = get_conf();
    return $rs if ($rs != 0);

    push_el(\@main::el, 'backup_all_start_up()', 'Ending...');

    return 0;

}


sub backup_all_shut_down {


    my $rs = undef;

    push_el(\@main::el, 'backup_all_shut_down()', 'Starting...');

    $rs = unlock_backup_all_system();
    return $rs if ($rs != 0);

    push_el(\@main::el, 'backup_all_shut_down()', 'Ending...');
    return 0;

}


sub err_exit {

    my $el_data = pop_el(\@main::el);

    $main::el_sep = "\t#\t";

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    unlock_backup_all_system($backup_lock_file);
    exit 1;

}

sub backup_sql {

    push_el(\@main::el, 'backup_sql()', 'Starting...');

    my ($dmn_id, $dmn_name, $domain_uid, $domain_gid) = @_;
    my $zip = $main::cfg{'ZIP'};
    my ($rs, $rdata, $sql) = (undef, undef, undef);

    my $dmn_backup_dir = $main::cfg{'APACHE_WWW_DIR'}."/$dmn_name/backups";

    $sql = "SELECT sqld_id, sqld_name FROM sql_database WHERE domain_id=$dmn_id";
    ($rs, $rdata) = doSQL($sql);

    foreach (@$rdata) {

        my $db_id = @$_[0];
        my $db_name = @$_[1];
        my $db_backup_file = "$dmn_backup_dir/$db_name.sql";
        my ($db_filename, $db_compresscmd) = (undef, undef);

        my $db_backupcmd = "$main::cfg{'CMD_MYSQLDUMP'} --add-drop-table --allow-keywords --quote-names -h'$main::cfg{'DATABASE_HOST'}' -u'$main::cfg{'DATABASE_USER'}' -p'".decrypt_db_password($main::cfg{'DATABASE_PASSWORD'})."' '$db_name' >'$db_backup_file'";

        if ($zip eq "bzip2") {
            $db_filename = "$db_backup_file.bz2";
            $db_compresscmd = "$main::cfg{'CMD_BZIP'} --force '$db_backup_file'";
        } elsif ($zip eq "gzip") {
            $db_filename = "$db_backup_file.gz";
            $db_compresscmd = "$main::cfg{'CMD_GZIP'} --force '$db_backup_file'";
        } elsif ($zip eq "lzma") {
            $db_filename = "$db_backup_file.lzma";
            $db_compresscmd = "$main::cfg{'CMD_LZMA'} --force '$db_backup_file'";
        } else {
            push_el(\@main::el, 'backup_sql()', "Domain $dmn_name: Backup algorithm for domain $dmn_name not supported: $zip!");
            send_error_mail('backup_sql()', "Domain $dmn_name: Backup algorithm for domain $dmn_name not supported: $zip!");
            return -1;
        }

        $rs = sys_command($db_backupcmd);
        if( $rs != 0 ){
            push_el(\@main::el, 'backup_sql()', "Domain $dmn_name: ERROR: Failed to backup database $db_name!");
            send_error_mail('backup_sql()', "Domain $dmn_name: ERROR: Failed to backup database $db_name!");
            unlink($db_backup_file);
            return $rs;
        }

        $rs = setfmode("$db_backup_file", $domain_uid, $domain_gid, 0660);
        if( $rs != 0 ){
            push_el(\@main::el, 'backup_sql()', "Domain $dmn_name: ERROR: Can not chmod 0660 uid: $domain_uid gid: $domain_gid file $db_backup_file!");
            send_error_mail('backup_sql()', "Domain $dmn_name: ERROR: Can not chmod 0660 uid: $domain_uid gid: $domain_gid file $db_backup_file!");
            unlink($db_backup_file);
            return $rs;
        }

        $rs = sys_command($db_compresscmd);
        if ($rs != 0){
            push_el(\@main::el, 'backup_sql()', "Domain $dmn_name: ERROR: Error while executing  $db_compresscmd!");
            send_error_mail('backup_sql()', "Domain $dmn_name: ERROR: Error while executing $db_compresscmd!");
            unlink($db_backup_file);
            return $rs;
        }

    }

    push_el(\@main::el, 'backup_sql()', 'Ending...');
    return 0;
}

sub backup_all_engine {

    push_el(\@main::el, 'backup_all_engine()', 'Starting...');

    my ($rs, $rdata, $sql) = (undef, undef, undef);
    my $zip = $main::cfg{'ZIP'};

    $sql = "
        SELECT
            t1.domain_id,
            t1.domain_name,
            t1.domain_status,
            t1.domain_uid,
            t1.domain_gid,
            t1.allowbackup,
            t2.admin_name,
            t2.email
        FROM
            domain AS t1,
            admin AS t2
        WHERE
                t1.domain_status    = 'ok'
            AND    t1.domain_admin_id    = t2.admin_id
            AND     t1.allowbackup        != 'no'
        ORDER BY
            t1.domain_id
    ";

    ($rs, $rdata) = doSQL($sql);
    return $rs if ($rs != 0);

    my $cmd_tar = $main::cfg{'CMD_TAR'};

    my $cmd_rm = $main::cfg{'CMD_RM'};

    my $cmd_mv = $main::cfg{'CMD_MV'};

    my $httpd_uid = $main::cfg{'APACHE_USER'};

    my $httpd_gid = $main::cfg{'APACHE_GROUP'};

    foreach (@$rdata) {

    # DO NOT RETURN, even if backup throws an error, otherwise other domains will not be backuped
    # I DO MEAN IT :)

        my ($dmn_id, $dmn_name, $dmn_status, $domain_uid, $domain_gid, $allowbackup, $admin_name, $admin_email) = (@$_[0], @$_[1], @$_[2], @$_[3], @$_[4], @$_[5], @$_[6], @$_[7]);

        if ($allowbackup eq "full" || $allowbackup eq "dmn" || $allowbackup eq "sql") {

            my $date = get_human_date();
            my $www_dir = $main::cfg{'APACHE_WWW_DIR'};
            my $dmn_dir = $main::cfg{'APACHE_WWW_DIR'}."/$dmn_name";
            my $dmn_backup_dir = $main::cfg{'APACHE_WWW_DIR'}."/$dmn_name/backups";
            my ($backup_filename, $backup_cmd) = (undef, "");

            #
            # User Database Backup
            #

            if (! -d $dmn_backup_dir) {
                $rs = make_dir($dmn_backup_dir, $domain_uid, $domain_gid, 0770);
                return $rs if ($rs != 0);
            }

            if( $zip eq 'bzip2' || $zip eq 'gzip' || $zip eq 'lzma' || $zip eq 'xz') {
                $backup_filename = "$dmn_name-backup-$date.tar.".($zip eq 'bzip2' ? 'bz2' : ($zip eq 'gzip' ? 'gz' : $zip));
                if ($allowbackup eq "full" || $allowbackup eq "dmn") {
                    $backup_cmd = "$cmd_tar --create --directory=$dmn_dir --$zip --file=$www_dir/$backup_filename --exclude=logs --exclude=phptmp --exclude=backups . 2> $www_dir/$backup_filename.log";
                }
                if ( $allowbackup eq "full" || $allowbackup eq "sql" ) {
                    $rs = backup_sql($dmn_id, $dmn_name, $domain_uid, $domain_gid);
                }
            } else {
                push_el(\@main::el, 'backup_all_engine()', "Backup algorithm not supported: $zip for domain $dmn_name!");
                send_error_mail('backup_all_engine()', "Backup algorithm not supported: $zip for domain $dmn_name!");
            }

            if ( length($backup_cmd) != 0 ) {
                $rs = sys_command($backup_cmd);

                if ($rs == 0) { # everything ok

                    $rs = sys_command("$cmd_rm -rf $www_dir/$backup_filename.log");
                    if ($rs != 0){
                        push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_rm -rf $www_dir/$backup_filename.log!");
                        send_error_mail('backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_rm -rf $www_dir/$backup_filename.log!");
                    }

                    $rs = sys_command("$cmd_rm -rf $dmn_backup_dir/$dmn_name-*.tar.*");
                    if ($rs != 0){
                        push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_rm -rf $dmn_backup_dir/$dmn_name-*.tar.*!");
                        send_error_mail('backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_rm -rf $dmn_backup_dir/$dmn_name-*.tar.*!");
                    }

                    $rs = sys_command("$cmd_mv -f $www_dir/$backup_filename $dmn_backup_dir");
                    if ($rs != 0){
                        push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_mv -f $www_dir/$backup_filename $dmn_backup_dir!");
                        send_error_mail('backup_all_engine()', "Domain $dmn_name: Error while executing $cmd_mv -f $www_dir/$backup_filename $dmn_backup_dir!");
                    }

                    $rs = setfmode("$dmn_backup_dir/$backup_filename", $domain_uid, $domain_gid, 0660);
                    if ($rs != 0){
                        push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: Error while changing mode to 0660 uid: $domain_uid gid: $domain_gid for $dmn_backup_dir/$backup_filename!");
                        send_error_mail('backup_all_engine()', "Domain $dmn_name: Error while changing mode to 0660 uid: $domain_uid gid: $domain_gid for $dmn_backup_dir/$backup_filename!");
                    }

                } else { # some error occurred

                    push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: ERROR: tar returned exit status $rs, have a look in $www_dir/$backup_filename.log");
                    # send mail so we know something went wrong...
                    send_error_mail('backup_all_engine()', "Domain $dmn_name: ERROR: tar returned exit status $rs, have a look in $www_dir/$backup_filename.log");

                    # delete backup file...
                    if ( -e "$www_dir/$backup_filename" ) {
                        $rs = del_file("$www_dir/$backup_filename");
                        if ($rs != 0){
                            push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: Error while removing file $www_dir/$backup_filename!");
# we don't need a second mail...            send_error_mail('backup_all_engine()', "Domain $dmn_name: Error while removing file $dmn_dir/$backup_filename!");
                        }
                    }

                }
            }
        } else {
            push_el(\@main::el, 'backup_all_engine()', "Domain $dmn_name: ERROR: the type of backup (*$allowbackup*) is not allowed!");
        }
    }

    push_el(\@main::el, 'backup_all_engine()', 'Ending...');

    return 0;

}

my $rs = undef;
my $proceed = $ARGV[0];

if (!defined($proceed) || $proceed eq '') {

    push_el(\@main::el, 'main()', "ERROR: Missing Input Data! Please provide appropriate command line parameter(s)!");

    err_exit();

}

if ($proceed ne 'yes') {

    push_el(\@main::el, 'main()', "NOTICE: If you want full backup of your domain data, please run this script with 'yes' command line parameter!");

    err_exit();

}

$rs = backup_all_start_up();
err_exit() if ($rs != 0 && $rs != 2);

exit 0 if ($rs == 2); # $rs == 2 when backups are disabled

$rs = backup_all_engine();
err_exit() if ($rs != 0);

$rs = backup_all_shut_down();
err_exit() if ($rs != 0);

exit 0;

*add*
Ich bin nicht so bewandt in Shell-programmierung, deswegen wäre eine ausführliche, "noob-gerechte" Erklärung nett.

Vielen Dank


RE: Ispcp Backup konfiguration - joximu - 06-01-2010 12:10 AM

Das ist nicht Shell Programmiereung - das ist Perl.

In der sub backup_all_engine wrd eine Liste der Domains aus der Datenbank gelesen - inklusive Angaben, was alles gesichert werden soll (nichts, Dateien, DB, alles) u.a. angaben...

Nach ein paar Initialisierungen wird eine foreach Schleife ausgeführt und für jede Domain das gesichert, was soll...

Wenn du nun Subdomains separat willst, musst du da im Prinzip nochmals dasselbe machen: für jede Domains die Subdomains (und Aliase???) abfragen (und auch, was davon gesichert werden darf - das sollte dann noch im ispcp rein...) - dann auch wieder ne Schlaufe (alle zusätzlichen Domains/Subdomains)...
und im Tar der Hauptdomain sollte man dann die Verzeichnisse der Subdomains/Aliasen excluden...

also eigentlich kein Aufwand Smile Smile Smile

/J


RE: Ispcp Backup konfiguration - pilleee - 06-01-2010 01:44 AM

sorry, aber ich verstehe nur Bahnhof... zugegeben, ich habe mich noch nie so richtig mir perl befasst.


RE: Ispcp Backup konfiguration - ZooL - 06-01-2010 07:56 AM

dann solltest dir deine gedanken löschen oder jemanden damit beauftragen gegen obolus....
vieleicht findest ja jemanden hier der es dir macht weil er zuviel zeit hat im leben Wink gibt es ja alles..


mfg


RE: Ispcp Backup konfiguration - MasterTH - 06-05-2010 09:32 AM

wenn du immer noch hilfe brauchst, grad per PM melden


RE: Ispcp Backup konfiguration - p3g3h - 09-23-2010 09:57 AM

Moin

Das Thema ist zwar schon älter und wurde auch schon in mehreren Threads angesprochen aber nun gut. Ich habe eine ähnliche Situation bzw. würde halt gerne ein "Backup Vollständig" was jedoch teilweise doch nicht vollständig ist von ispCP automatisiert erstellen lassen Big Grin

Soll bedeuten ich möchte 1-2 Subdomains auschließen. Nun ist die Frage gibt es dafür schon ein workaround um das mit dem ispCP Backup Script umzusetzen bzw. wer setzt derzeit ein ähnliches Szenario um mit dem ispCP Backup Script?

Gruß