Просмотр исходного кода

Feature/b2 backup support (#1534)

* Add download and validation routine for b2 backup support.

* Add config part, example and credential validation

* Add upload function, thanks to @rez0n.

* Fix a small issue with var definition.

* Small fixes

* Increase version number to 1.4.0

* Add WebUI support 
Add check at v-add-backup-host
Added information v-list-backup-host

* Replaced remote backup with input box
Fixed minor issue with saving

* Update code formating.

* Drop commented error reporting.

Co-authored-by: Jaap Marcus <9754650+jaapmarcus@users.noreply.github.com>
Raphael Schneeberger 5 лет назад
Родитель
Сommit
ebd6dc95d7

+ 44 - 4
bin/v-add-backup-host

@@ -4,6 +4,7 @@
 # labels: 
 #
 # example: v-add-backup-host sftp backup.acme.com admin p4$$w@Rd
+#          v-add-backup-host b2 bucketName keyID applicationKey
 #
 # This function adds a backup host
 
@@ -25,6 +26,10 @@ port=$6
 source $HESTIA/func/main.sh
 source $HESTIA/conf/hestia.conf
 
+# Paths
+b2cli="/usr/local/bin/b2"
+b2lnk="https://f000.backblazeb2.com/file/backblazefiles/b2/cli/linux/b2"
+
 # Defining ftp command function
 ftpc() {
     ftp -p -n $host $port <<EOF
@@ -103,9 +108,11 @@ if [ "$type" != 'local' ];then
         which expect >/dev/null 2>&1
         check_result $? "expect command not found"  $E_NOTEXIST
     fi
-    if ! (is_ip_format_valid "$host" >/dev/null); then
-        host "$host" >/dev/null 2>&1
-        check_result $? "host connection failed" "$E_CONNECT"
+    if [ "$type" != 'b2' ]; then
+        if ! (is_ip_format_valid "$host" >/dev/null); then
+            host "$host" >/dev/null 2>&1
+            check_result $? "host connection failed" "$E_CONNECT"
+        fi
     fi
 fi
 
@@ -146,6 +153,7 @@ if [ "$type" = 'ftp' ]; then
         exit $E_FTP
     fi
 fi
+
 if [ "$type" = 'sftp' ]; then
     if [ -z $port ]; then
         port=22
@@ -173,14 +181,46 @@ if [ "$type" = 'sftp' ]; then
     fi
 fi
 
+if [ "$type" = 'b2' ]; then
+    # Download b2 binary
+    if [ ! -f "$b2cli" ]; then
+        wget -O $b2cli $b2lnk > /dev/null 2>&1
+        chmod +x $b2cli > /dev/null 2>&1
+        if [ ! -f "$b2cli" ]; then
+            echo "Error: Binary download failed, b2 doesnt work as expected."
+            exit 3
+        fi
+    fi
+
+    # Validate b2 binary
+    b2version="$(b2 version)"
+    if [[ ! "$b2version" =~ "b2 command line tool" ]]; then
+        echo "Error: Binary download failed, b2 doesnt work as expected."
+        exit 3
+    fi
+    
+    b2 clear-account > /dev/null 2>&1
+    b2 authorize-account "$user" "$raw_password"> /dev/null 2>&1
+    b2 ls --long $host $user > /dev/null 2>&1
+    
+    if [ $? -ne 0 ]; then
+        check_result "$E_CONNECT" "b2 failed to verify connection"
+    fi
+fi
 
 # Adding backup host
-if [ $type != 'local' ]; then
+if [ $type != 'local' ] && [ $type != 'b2' ]; then
     new_timestamp
     str="HOST='$host'\nUSERNAME='$user'\nPASSWORD='$password'"
     str="$str\nBPATH='$path'\nPORT='$port'\nTIME='$time'\nDATE='$date'"
     echo -e "$str" > $HESTIA/conf/$type.backup.conf
     chmod 660 $HESTIA/conf/$type.backup.conf
+elif [ $type == 'b2' ]; then
+    new_timestamp
+    str="BUCKET='$host'\nB2_KEYID='$user'\nB2_KEY='$password'"
+    str="$str\nTIME='$time'\nDATE='$date'"
+    echo -e "$str" > $HESTIA/conf/$type.backup.conf
+    chmod 660 $HESTIA/conf/$type.backup.conf
 fi
 
 

+ 1 - 0
bin/v-backup-user

@@ -594,6 +594,7 @@ for backup_type in $(echo -e "${BACKUP_SYSTEM//,/\\n}"); do
         ftp)   ftp_backup ;;
         sftp)  sftp_backup ;;
         google) google_backup ;;
+        b2) b2_backup ;;
     esac
 done
 

+ 41 - 0
bin/v-list-backup-host

@@ -21,6 +21,8 @@ source $HESTIA/func/main.sh
 
 # JSON list function
 json_list() {
+    case $type in 
+    'sftp' | 'ftp')
     echo '{'
     echo '    "'$type'": {
         "HOST": "'$HOST'",
@@ -32,10 +34,25 @@ json_list() {
         "DATE": "'$DATE'"
     }'
     echo '}'
+    ;;
+    'b2')
+     echo '{'
+     echo '    "'$type'": {
+         "BUCKET": "'$BUCKET'",
+         "TYPE": "'$type'",
+         "B2_KEY_ID": "'$B2_KEYID'",
+         "TIME": "'$TIME'",
+         "DATE": "'$DATE'"
+     }'
+     echo '}' 
+    ;;
+    esac
 }
 
 # SHELL list function
 shell_list() {
+    case $type in
+    'sftp' | 'ftp')
     echo "HOST:           $HOST"
     echo "USERNAME:       $USERNAME"
     echo "PORT:           $PORT"
@@ -43,17 +60,41 @@ shell_list() {
     echo "PATH:           $BPATH"
     echo "TIME:           $TIME"
     echo "DATE:           $DATE"
+    ;;
+    'b2')
+    echo "BUCKET          $BUCKET"
+    echo "TYPE            $type"
+    echo "B2_KEY_ID       $B2_KEYID"
+    echo "TIME:           $TIME"
+    echo "DATE:           $DATE"
+    ;;
+    esac
 }
 
 # PLAIN list function
 plain_list() {
+    case $type in
+    'sftp' | 'ftp')
     echo -e "$HOST\t$USERNAME\t$PORT\t$type\t$BPATH\t$TIME\t$DATE"
+    ;;
+    'b2')
+    echo -e "$BUCKET\t$type\t$B2_KEYID\t$TIME\t$DATE"
+    ;;
+    esac 
 }
 
 # CSV list function
 csv_list() {
+    case $type in
+    'sftp' | 'ftp')
     echo "HOST,USERNAME,PORT,TYPE,PATH,TIME,DATE"
     echo "$HOST,$USERNAME,$PORT,$type,$BPATH,$TIME,$DATE"
+    ;;
+    'b2')
+    echo "BUCKET,TYPE,B2_KEYID,TIME,DATE"
+    echo "$BUCKET,$type,$B2_KEYID,$TIME,$DATE"
+    ;;
+    esac 
 }
 
 # Type format validator

+ 40 - 1
func/backup.sh

@@ -418,4 +418,43 @@ google_download() {
     if [ "$?" -ne 0 ]; then
         check_result "$E_CONNECT" "gsutil failed to download $1"
     fi
-} 
+}
+
+# BackBlaze B2 backup function
+b2_backup() {
+    # Defining backblaze b2 settings
+    source $HESTIA/conf/b2.backup.conf
+
+    # Recreate backblaze auth file ~/.b2_account_info (for situation when key was changed in b2.backup.conf)
+    b2 clear-account > /dev/null 2>&1
+    b2 authorize-account $B2_KEYID $B2_KEY > /dev/null 2>&1
+
+    # Uploading backup archive
+    echo -e "$(date "+%F %T") Upload to B2: $user/$user.$backup_new_date.tar"
+    if [ "$localbackup" = 'yes' ]; then
+        cd $BACKUP
+        b2 upload-file $BUCKET $user.$backup_new_date.tar $user/$user.$backup_new_date.tar > /dev/null 2>&1
+    else
+        cd $tmpdir
+        tar -cf $BACKUP/$user.$backup_new_date.tar .
+        cd $BACKUP/
+        b2 upload-file $BUCKET $user.$backup_new_date.tar $user/$user.$backup_new_date.tar > /dev/null 2>&1
+        rc=$?
+        rm -f $user.$backup_new_date.tar
+        if [ "$rc" -ne 0 ]; then
+            check_result "$E_CONNECT" "b2 failed to upload $user.$backup_new_date.tar"
+        fi
+    fi
+
+    # Checking retention
+    backup_list=$(b2 ls --long $BUCKET $user | cut -f 1 -d ' ' 2>/dev/null)
+    backups_count=$(echo "$backup_list" |wc -l)
+    if [ "$backups_count" -ge "$BACKUPS" ]; then
+        backups_rm_number=$((backups_count - BACKUPS))
+        for backup in $(echo "$backup_list" |head -n $backups_rm_number); do
+            backup_file_name=$(b2 get-file-info $backup | grep fileName | cut -f 4 -d '"' 2>/dev/null)
+            echo -e "$(date "+%F %T") Rotated b2 backup: $backup_file_name"
+            b2 delete-file-version $backup > /dev/null 2>&1
+        done
+    fi
+}

+ 1 - 1
install/hst-install-debian.sh

@@ -23,7 +23,7 @@ HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 VERBOSE='no'
 
 # Define software versions
-HESTIA_INSTALL_VER='1.3.3~alpha'
+HESTIA_INSTALL_VER='1.4.0~alpha'
 pma_v='5.0.4'
 rc_v="1.4.10"
 multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0")

+ 1 - 1
install/hst-install-ubuntu.sh

@@ -23,7 +23,7 @@ HESTIA_INSTALL_DIR="$HESTIA/install/deb"
 VERBOSE='no'
 
 # Define software versions
-HESTIA_INSTALL_VER='1.3.3~alpha'
+HESTIA_INSTALL_VER='1.4.0~alpha'
 pma_v='5.0.4'
 rc_v="1.4.10"
 multiphp_v=("5.6" "7.0" "7.1" "7.2" "7.3" "7.4" "8.0")

+ 1 - 1
src/deb/hestia/control

@@ -1,7 +1,7 @@
 Source: hestia
 Package: hestia
 Priority: optional
-Version: 1.3.3~alpha
+Version: 1.4.0~alpha
 Section: admin
 Maintainer: HestiaCP <info@hestiacp.com>
 Homepage: https://www.hestiacp.com

+ 131 - 72
web/edit/server/index.php

@@ -1,5 +1,4 @@
 <?php
-error_reporting(NULL);
 $TAB = 'SERVER';
 
 // Main include
@@ -49,14 +48,14 @@ $v_php_versions = [
 ];
 sort($v_php_versions);
 
-if(empty($backend_templates))
+if (empty($backend_templates))
     $v_php_versions=[];
 
 $backends_active = backendtpl_with_webdomains();
 $v_php_versions = array_map(function($php_version) use ($backend_templates, $backends_active) {
     // Mark installed php versions
 
-    if(stripos($php_version,'php') !== 0)
+    if (stripos($php_version,'php') !== 0)
         return false;
 
     $phpinfo = (object) [
@@ -68,7 +67,7 @@ $v_php_versions = array_map(function($php_version) use ($backend_templates, $bac
         "protected" => false,
     ];
 
-    if(in_array($phpinfo->tpl, $backend_templates)) {
+    if (in_array($phpinfo->tpl, $backend_templates)) {
         $phpinfo->installed = true;
     }
 
@@ -81,7 +80,7 @@ $v_php_versions = array_map(function($php_version) use ($backend_templates, $bac
 
     if ($phpinfo->name == DEFAULT_PHP_VERSION) {
         // Prevent default php version to be removed
-        if($phpinfo->installed)
+        if ($phpinfo->installed)
             $phpinfo->protected = true;
 
         if (!empty($backends_active['default'])) {
@@ -95,7 +94,7 @@ $v_php_versions = array_map(function($php_version) use ($backend_templates, $bac
 // List languages
 exec (HESTIA_CMD."v-list-sys-languages json", $output, $return_var);
 $language = json_decode(implode('', $output), true);
-foreach($language as $lang){
+foreach ($language as $lang) {
     $languages[$lang] = translate_json($lang);
 }
 asort($languages);
@@ -141,12 +140,21 @@ foreach ($backup_types as $backup_type) {
         exec (HESTIA_CMD."v-list-backup-host ".escapeshellarg($backup_type)." json", $output, $return_var);
         $v_remote_backup = json_decode(implode('', $output), true);
         unset($output);
-        $v_backup_host = $v_remote_backup[$backup_type]['HOST'];
-        $v_backup_type = $v_remote_backup[$backup_type]['TYPE'];
-        $v_backup_username = $v_remote_backup[$backup_type]['USERNAME'];
-        $v_backup_password = "";
-        $v_backup_port = $v_remote_backup[$backup_type]['PORT'];
-        $v_backup_bpath = $v_remote_backup[$backup_type]['BPATH'];
+        if (in_array($backup_type , array('ftp','sftp'))) {            
+            $v_backup_host = $v_remote_backup[$backup_type]['HOST'];
+            $v_backup_type = $v_remote_backup[$backup_type]['TYPE'];
+            $v_backup_username = $v_remote_backup[$backup_type]['USERNAME'];
+            $v_backup_password = "";
+            $v_backup_port = $v_remote_backup[$backup_type]['PORT'];
+            $v_backup_bpath = $v_remote_backup[$backup_type]['BPATH'];
+            $v_backup_remote_adv = "yes";
+        } else if ( in_array($backup_type , array('b2')) ) {
+            $v_backup_bucket = $v_remote_backup[$backup_type]['BUCKET'];
+            $v_backup_type = $v_remote_backup[$backup_type]['TYPE'];
+            $v_backup_application_id = $v_remote_backup[$backup_type]['B2_KEY_ID'];
+            $v_backup_application_key = '';
+            $v_backup_remote_adv = "yes";
+        }
     }
 }
 
@@ -189,8 +197,8 @@ if (!empty($_POST['save'])) {
 
             array_map(function($php_version) use ($post_php) {
 
-                if(array_key_exists($php_version->tpl, $post_php)) {
-                    if(!$php_version->installed) {
+                if (array_key_exists($php_version->tpl, $post_php)) {
+                    if (!$php_version->installed) {
                         exec (HESTIA_CMD . "v-add-web-php " . escapeshellarg($php_version->version), $output, $return_var);
                         check_return_code($return_var, $output);
                         unset($output);
@@ -198,11 +206,11 @@ if (!empty($_POST['save'])) {
                             $php_version->installed = true;
                     }
                 } else {
-                    if($php_version->installed && !$php_version->protected) {
+                    if ($php_version->installed && !$php_version->protected) {
                         exec (HESTIA_CMD . "v-delete-web-php " . escapeshellarg($php_version->version), $output, $return_var);
                         check_return_code($return_var, $output);
                         unset($output);
-                        if(empty($_SESSION['error_msg']))
+                        if (empty($_SESSION['error_msg']))
                             $php_version->installed = false;
                     }
                 }
@@ -287,7 +295,7 @@ if (!empty($_POST['save'])) {
                 check_return_code($return_var,$output);
                 unset($output);
                 if (empty($_SESSION['error_msg'])) $_SESSION['PHPMYADMIN_KEY'] != "";
-            } else if($_POST['v_phpmyadmin_key'] == 'no' && $_SESSION['PHPMYADMIN_KEY'] != ''){
+            } else if ($_POST['v_phpmyadmin_key'] == 'no' && $_SESSION['PHPMYADMIN_KEY'] != '') {
                 exec (HESTIA_CMD."v-delete-sys-pma-sso  quiet", $output, $return_var);
                 check_return_code($return_var,$output);
                 unset($output);
@@ -385,7 +393,7 @@ if (!empty($_POST['save'])) {
     // Update send notification setting
     if (empty($_SESSION['error_msg'])) {
         if ($_POST['v_upgrade_send_notification_email'] != $_SESSION['UPGRADE_SEND_EMAIL']) {
-            if ($_POST['v_upgrade_send_notification_email'] == 'on'){ $_POST['v_upgrade_send_notification_email'] = 'true'; } else { $_POST['v_upgrade_send_notification_email'] = 'false'; }
+            if ($_POST['v_upgrade_send_notification_email'] == 'on') { $_POST['v_upgrade_send_notification_email'] = 'true'; } else { $_POST['v_upgrade_send_notification_email'] = 'false'; }
             exec (HESTIA_CMD."v-change-sys-config-value UPGRADE_SEND_EMAIL ".escapeshellarg($_POST['v_upgrade_send_notification_email']), $output, $return_var);
             check_return_code($return_var,$output);
             unset($output);
@@ -458,28 +466,44 @@ if (!empty($_POST['save'])) {
             $v_backup_adv = 'yes';
         }
     }
-
+    
     // Add remote backup host
     if (empty($_SESSION['error_msg'])) {
-        if ((!empty($_POST['v_backup_host'])) && (empty($v_backup_host))) {
-            $v_backup_host = escapeshellarg($_POST['v_backup_host']);
-            $v_backup_port = escapeshellarg($_POST['v_backup_port']);
-            $v_backup_type = escapeshellarg($_POST['v_backup_type']);
-            $v_backup_username = escapeshellarg($_POST['v_backup_username']);
-            $v_backup_password = escapeshellcmd($_POST['v_backup_password']);
-            $v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
-            exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." ". $v_backup_password ." ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
-            check_return_code($return_var,$output);
-            unset($output);
-            if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
-            if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
-            if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
-            if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
-            if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
-            if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];    
-            $v_backup_new = 'yes';
-            $v_backup_adv = 'yes';
-            $v_backup_remote_adv = 'yes';
+        if ((empty($v_backup_host) && empty($v_backup_bucket) && ((!empty($_POST['v_backup_host'])) || !empty($_POST['v_backup_bucket']))) ) {
+            if (in_array($_POST['v_backup_type'], array('ftp','sftp'))) {
+                $v_backup_host = escapeshellarg($_POST['v_backup_host']);
+                $v_backup_port = escapeshellarg($_POST['v_backup_port']);
+                $v_backup_type = escapeshellarg($_POST['v_backup_type']);
+                $v_backup_username = escapeshellarg($_POST['v_backup_username']);
+                $v_backup_password = escapeshellcmd($_POST['v_backup_password']);
+                $v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
+                exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." ". $v_backup_password ." ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
+                check_return_code($return_var,$output);
+                unset($output);
+                if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
+                if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
+                if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
+                if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
+                if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
+                if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];    
+                $v_backup_new = 'yes';
+                $v_backup_adv = 'yes';
+                $v_backup_remote_adv = 'yes';
+            } else if (in_array($_POST['v_backup_type'], array('b2'))) {
+                $v_backup_type = escapeshellarg($_POST['v_backup_type']);
+                $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_bucket ." ". $v_backup_application_id ." ". $v_backup_application_key, $output, $return_var);
+                check_return_code($return_var,$output);
+                unset($output);
+                if (empty($_SESSION['error_msg'])) $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                if (empty($_SESSION['error_msg'])) $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                if (empty($_SESSION['error_msg'])) $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                $v_backup_new = 'yes';
+                $v_backup_adv = 'yes';
+                $v_backup_remote_adv = 'yes';
+            }
         }
     }
 
@@ -488,30 +512,7 @@ if (!empty($_POST['save'])) {
         if ((!empty($_POST['v_backup_host'])) && ($_POST['v_backup_type'] != $v_backup_type)) {
             exec (HESTIA_CMD."v-delete-backup-host " . escapeshellarg($v_backup_type) , $output, $return_var);
             unset($output);
-            $v_backup_host = escapeshellarg($_POST['v_backup_host']);
-            $v_backup_port = escapeshellarg($_POST['v_backup_port']);
-            $v_backup_type = escapeshellarg($_POST['v_backup_type']);
-            $v_backup_username = escapeshellarg($_POST['v_backup_username']);
-            $v_backup_password = escapeshellcmd($_POST['v_backup_password']);
-            $v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
-            exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." ". $v_backup_password ." ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
-            check_return_code($return_var,$output);
-            unset($output);
-            if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
-            if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
-            if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
-            if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
-            if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
-            if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
-            $v_backup_adv = 'yes';
-            $v_backup_remote_adv = 'yes';
-        }
-    }
-
-    // Change remote backup host
-    if (empty($_SESSION['error_msg'])) {
-        if ((!empty($_POST['v_backup_host'])) && ($_POST['v_backup_type'] == $v_backup_type) && (!isset($v_backup_new))) {
-            if (($_POST['v_backup_host'] != $v_backup_host) || ($_POST['v_backup_username'] != $v_backup_username) || ($_POST['v_backup_password'] != $v_backup_password) || ($_POST['v_backup_bpath'] != $v_backup_bpath || $_POST['v_backup_port'] != $v_backup_port)){
+            if (in_array($_POST['v_backup_type'], array('ftp','sftp'))) {
                 $v_backup_host = escapeshellarg($_POST['v_backup_host']);
                 $v_backup_port = escapeshellarg($_POST['v_backup_port']);
                 $v_backup_type = escapeshellarg($_POST['v_backup_type']);
@@ -529,13 +530,68 @@ if (!empty($_POST['save'])) {
                 if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
                 $v_backup_adv = 'yes';
                 $v_backup_remote_adv = 'yes';
+            } else if(in_array($_POST['v_backup_type'], array('b2'))) {
+                $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_bucket ." ". $v_backup_application_id ." ". $v_backup_application_key, $output, $return_var);
+                check_return_code($return_var,$output);
+                unset($output);
+                $v_backup_type = escapeshellarg($_POST['v_backup_type']);
+                if (empty($_SESSION['error_msg'])) $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                if (empty($_SESSION['error_msg'])) $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                if (empty($_SESSION['error_msg'])) $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                $v_backup_adv = 'yes';
+                $v_backup_remote_adv = 'yes';
+            }
+        }
+    }
+
+    // Change remote backup host
+    if (empty($_SESSION['error_msg'])) {
+        if ((!empty($_POST['v_backup_host'])) && ($_POST['v_backup_type'] == $v_backup_type) && (!isset($v_backup_new))) {
+            if (in_array($_POST['v_backup_type'], array('ftp','sftp'))) {
+                if (($_POST['v_backup_host'] != $v_backup_host) || ($_POST['v_backup_username'] != $v_backup_username) || ($_POST['v_backup_password'] != $v_backup_password) || ($_POST['v_backup_bpath'] != $v_backup_bpath || $_POST['v_backup_port'] != $v_backup_port)) {
+                    $v_backup_host = escapeshellarg($_POST['v_backup_host']);
+                    $v_backup_port = escapeshellarg($_POST['v_backup_port']);
+                    $v_backup_type = escapeshellarg($_POST['v_backup_type']);
+                    $v_backup_username = escapeshellarg($_POST['v_backup_username']);
+                    $v_backup_password = escapeshellcmd($_POST['v_backup_password']);
+                    $v_backup_bpath = escapeshellarg($_POST['v_backup_bpath']);
+                    exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_host ." ". $v_backup_username ." ". $v_backup_password ." ". $v_backup_bpath." ".$v_backup_port, $output, $return_var);
+                    check_return_code($return_var,$output);
+                    unset($output);
+                    if (empty($_SESSION['error_msg'])) $v_backup_host = $_POST['v_backup_host'];
+                    if (empty($_SESSION['error_msg'])) $v_backup_type = $_POST['v_backup_type'];
+                    if (empty($_SESSION['error_msg'])) $v_backup_username = $_POST['v_backup_username'];
+                    if (empty($_SESSION['error_msg'])) $v_backup_password = $_POST['v_backup_password'];
+                    if (empty($_SESSION['error_msg'])) $v_backup_bpath = $_POST['v_backup_bpath'];
+                    if (empty($_SESSION['error_msg'])) $v_backup_port = $_POST['v_backup_port'];
+                    $v_backup_adv = 'yes';
+                    $v_backup_remote_adv = 'yes';
+                }
+            } else if(in_array($_POST['v_backup_type'], array('b2'))) {
+                if (($_POST['v_backup_bucket'] != $v_backup_bucket) || ($_POST['v_backup_application_key'] != $v_backup_application_key) || ($_POST['v_backup_application_id'] != $v_backup_application_id)) {
+                    $v_backup_type = escapeshellarg($_POST['v_backup_type']);
+                    $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                    $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                    $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                    exec (HESTIA_CMD."v-add-backup-host ". $v_backup_type ." ". $v_backup_bucket ." ". $v_backup_application_id ." ". $v_backup_application_key, $output, $return_var);
+                    check_return_code($return_var,$output);
+                    unset($output);
+                    if (empty($_SESSION['error_msg'])) $v_backup_bucket = escapeshellarg($_POST['v_backup_bucket']);
+                    if (empty($_SESSION['error_msg'])) $v_backup_application_id = escapeshellarg($_POST['v_backup_application_id']);
+                    if (empty($_SESSION['error_msg'])) $v_backup_application_key = escapeshellarg($_POST['v_backup_application_key']);
+                    $v_backup_adv = 'yes';
+                    $v_backup_remote_adv = 'yes';
+                }   
             }
         }
     }
 
     // Delete remote backup host
     if (empty($_SESSION['error_msg'])) {
-        if ((empty($_POST['v_backup_host'])) && (!empty($v_backup_host))) {
+        if (empty($_POST['v_backup_remote_adv']) && isset($v_backup_remote_adv)) {
             exec (HESTIA_CMD."v-delete-backup-host ".escapeshellarg($v_backup_type), $output, $return_var);
             check_return_code($return_var,$output);
             unset($output);
@@ -544,6 +600,9 @@ if (!empty($_POST['save'])) {
             if (empty($_SESSION['error_msg'])) $v_backup_username = '';
             if (empty($_SESSION['error_msg'])) $v_backup_password = '';
             if (empty($_SESSION['error_msg'])) $v_backup_bpath = '';
+            if (empty($_SESSION['error_msg'])) $v_backup_bucket = '';
+            if (empty($_SESSION['error_msg'])) $v_backup_application_id = '';
+            if (empty($_SESSION['error_msg'])) $v_backup_application_key = '';
             $v_backup_adv = '';
             $v_backup_remote_adv = '';
         }
@@ -560,16 +619,16 @@ if (!empty($_POST['save'])) {
         }
     }
 
-// Change login style
-if (empty($_SESSION['error_msg'])) {
-    if ($_POST['v_login_style'] != $_SESSION['LOGIN_STYLE']) {
-        exec (HESTIA_CMD."v-change-sys-config-value LOGIN_STYLE ".escapeshellarg($_POST['v_login_style']), $output, $return_var);
-        check_return_code($return_var,$output);
-        unset($output);
-        if (empty($_SESSION['error_msg'])) $v_login_style = $_POST['v_login_style'];
-        $v_security_adv = 'yes';
+    // Change login style
+    if (empty($_SESSION['error_msg'])) {
+        if ($_POST['v_login_style'] != $_SESSION['LOGIN_STYLE']) {
+            exec (HESTIA_CMD."v-change-sys-config-value LOGIN_STYLE ".escapeshellarg($_POST['v_login_style']), $output, $return_var);
+            check_return_code($return_var,$output);
+            unset($output);
+            if (empty($_SESSION['error_msg'])) $v_login_style = $_POST['v_login_style'];
+            $v_security_adv = 'yes';
+        }
     }
-}
 
     // Update SSL certificate
     if ((!empty($_POST['v_ssl_crt'])) && (empty($_SESSION['error_msg']))) {

+ 9 - 15
web/js/pages/edit_server.js

@@ -1,15 +1,9 @@
-    $('select[name=v_sftp]').change(function(){
-        if($(this).val() == 'yes'){
-            $('.sftp.description').show();
-        } else {
-            $('.sftp.description').hide();
-        }
-    });
-
-    $('input[name=v_mail_relay]').change(function(){
-        if($(this).is(':checked')){
-            $('.mail-relay').show();
-        } else {
-            $('.mail-relay').hide();
-        }
-    });
+$('#backup_type').change(function (){
+   if(this.value == 'b2'){
+       $('#backup_bucket').show();
+       $('#backup_sftp').hide();
+   }else{
+       $('#backup_bucket').hide();
+       $('#backup_sftp').show();
+   }
+});

+ 98 - 54
web/templates/admin/edit_server.html

@@ -674,10 +674,8 @@
                                                 <br><br>
                                             </td>
                                         </tr>                                        <tr>
-                                            <td class="vst-text input-label step-top">
-                                                <a href="javascript:elementHideShow('remote_backup');" class="vst-text">
-                                                <?php print _('Remote backup');?> <img src="/images/arrow.png">
-                                                </a>
+                                            <td class="vst-text input-label">
+                                                    <label><input type="checkbox" size="20" class="vst-checkbox" name="v_backup_remote_adv" <?php if (!empty($v_backup_remote_adv)) echo "checked=yes" ?> onclick="javascript:elementHideShow('remote_backup');"> <?php print _('Remote backup');?></label>
                                             </td>
                                         </tr>
                                         <tr>
@@ -689,66 +687,112 @@
                                                     </tr>
                                                     <tr>
                                                         <td>
-                                                            <select class="vst-list" name="v_backup_type">
+                                                            <select class="vst-list" name="v_backup_type" id="backup_type">
                                                                 <option value='ftp'><?php print _('ftp'); ?></option>
                                                                 <option value='sftp' <?php if((!empty($v_backup_type)) && (trim($v_backup_type,"'")  == 'sftp' )) echo 'selected="selected"'; ?>><?php print _('sftp'); ?></option>
+                                                                <option value="b2" <?php if((!empty($v_backup_type)) && (trim($v_backup_type,"'")  == 'b2' )) echo 'selected="selected"'; ?>><?php print _('Backblaze '); ?>
                                                             </select>
                                                             <br><br>
                                                         </td>
                                                     </tr>
-                                                    <tr>
-                                                        <td class="vst-text">
-                                                            <?php print _('Host') ?>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td>
-                                                            <input type="text" size="20" class="vst-input" name="v_backup_host" value="<?=trim($v_backup_host, "'")?>">
-                                                            <br><br>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td class="vst-text">
-                                                            <?php print _('Port') ?>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
+                                                    <tr style="display: <?php if ((!empty($v_backup_type)) && !in_array(trim($v_backup_type, "'"),array('ftp','sftp'))){ echo 'none';} else {echo 'block';} ?>" id="backup_sftp">
                                                         <td>
-                                                            <input type="text" size="20" class="vst-input" name="v_backup_port" value="<?=trim($v_backup_port, "'")?>">
-                                                            <br><br>
+                                                            <table>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Host') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_host" value="<?=trim($v_backup_host, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Port') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_port" value="<?=trim($v_backup_port, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Username') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_username" value="<?=trim($v_backup_username, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Password') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_password" value="<?=trim($v_backup_password, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Directory') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_bpath" value="<?=trim($v_backup_bpath, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            </table>
                                                         </td>
                                                     </tr>
-                                                    <tr>
-                                                        <td class="vst-text">
-                                                            <?php print _('Username') ?>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
+                                                    <tr style="display: <?php if ((empty($v_backup_type)) || !in_array(trim($v_backup_type, "'"),array('b2'))){ echo 'none';} else {echo 'block';} ?>"  id="backup_bucket">
                                                         <td>
-                                                            <input type="text" size="20" class="vst-input" name="v_backup_username" value="<?=trim($v_backup_username, "'")?>">
-                                                            <br><br>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td class="vst-text">
-                                                            <?php print _('Password') ?>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td>
-                                                            <input type="text" size="20" class="vst-input" name="v_backup_password" value="<?=trim($v_backup_password, "'")?>">
-                                                            <br><br>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td class="vst-text">
-                                                            <?php print _('Directory') ?>
-                                                        </td>
-                                                    </tr>
-                                                    <tr>
-                                                        <td>
-                                                            <input type="text" size="20" class="vst-input" name="v_backup_bpath" value="<?=trim($v_backup_bpath, "'")?>">
-                                                            <br><br>
+                                                            <table>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Bucket') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_bucket" value="<?=trim($v_backup_bucket, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Application ID') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_application_id" value="<?=trim($v_backup_application_id, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td class="vst-text">
+                                                                    <?php print _('Application Key') ?>
+                                                                </td>
+                                                            </tr>
+                                                            <tr>
+                                                                <td>
+                                                                    <input type="text" size="20" class="vst-input" name="v_backup_application_key" value="<?=trim($v_backup_application_key, "'")?>">
+                                                                    <br><br>
+                                                                </td>
+                                                            </tr>
+                                                            </table>
                                                         </td>
                                                     </tr>
                                                 </table>