CORE-POS/IS4C

View on GitHub
fannie/modules/plugins2.0/Borg/BorgTask.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php
/*******************************************************************************

    Copyright 2014 Whole Foods Co-op

    This file is part of IT CORE.

    IT CORE is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    IT CORE is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    in the file license.txt along with IT CORE; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*********************************************************************************/

include(dirname(__FILE__).'/../../../config.php');
if (!class_exists('FannieAPI')) {
    include_once(__DIR__ . '/../../../classlib2.0/FannieAPI.php');
}

/**
*/
class BorgTask extends FannieTask 
{
    public $name = 'Borg';

    public $description = 'Send backups to a borg repo';

    public $default_schedule = array(
        'min' => 30,
        'hour' => 4,
        'day' => '*',
        'month' => '*',
        'weekday' => '*',
    );

    public function run()
    {
        $settings = $this->config->get('PLUGIN_SETTINGS');
        $target = $this->getTarget($settings);
        if ($target == '' || !file_exists($target)) {
            $this->cronMsg('Backup target not found: ' . $target, FannieLogger::ALERT);
            return;
        }

        $cmd = realpath($settings['BorgBinPath'] . DIRECTORY_SEPARATOR . "borg");
        if ($cmd === false) {
            $this->cronMsg('Borg command not found', FannieLogger::ALERT);
            return;
        }

        $repo = $settings['BorgRepo'];
        $backup = $cmd
            . ' create '
            . ' --stats '
            . ' --list '
            . escapeshellarg($repo . '::core-db-{now:%Y-%m-%d}')
            . ' ' . escapeshellarg($target);

        $prune = $cmd
            . ' prune '
            . ' -v '
            . ' --list '
            . escapeshellarg($repo);
        if (((int)$settings['BorgDaily']) > 0) {
            $prune .= ' --keep-daily=' . ((int)$settings['BorgDaily']);
        }
        if (((int)$settings['BorgMonthly']) > 0) {
            $prune .= ' --keep-monthly=' . ((int)$settings['BorgMonthly']);
        }
        $prune .= ' --prefix="core-db-" ';

        $this->cronMsg('Backup command: ' . $backup, FannieLogger::INFO);
        $lastLine = exec($backup, $retval, $output);
        if ($retval == 0) {
            $this->cronMsg('Borg backup complete', FannieLogger::INFO);
        } else {
            $this->cronMsg('Borg backup failed', FannieLogger::ALERT);
            $this->cronMsg('Detail: ' . implode("\n", $output) . "\n" . $lastLine, FannieLogger::ALERT);
        }

        $this->cronMsg('Prune command: ' . $prune, FannieLogger::INFO);
        $lastLine = exec($prune, $retval, $output);
        if ($retval == 0) {
            $this->cronMsg('Borg prune complete', FannieLogger::INFO);
        } else {
            $this->cronMsg('Borg prune failed', FannieLogger::ALERT);
            $this->cronMsg('Detail: ' . implode("\n", $output) . "\n" . $lastLine, FannieLogger::ALERT);
        }
    }

    private function getTarget($settings)
    {
        if ($settings['BorgBackupPlugin'] == 'Simple') {
            return trim($settings['SimpleBackupDir']);
        } elseif ($settings['BorgBackupPlugin'] == 'Fast') {
            return trim($settings['FastBackupTarget']);
        } 

        return trim($settings['BorgBackupManual']);
    }
}