Project

General

Profile

Download (5.36 KB) Statistics
| Branch: | Tag: | Revision:
1 0a74e0dd Steve Beaver
<?php
2
/*
3
 * autoconfigbackup.inc
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6
 * Copyright (c) 2008-2013 BSD Perimeter
7
 * Copyright (c) 2013-2016 Electric Sheep Fencing
8 8f2f85c3 Luiz Otavio O Souza
 * Copyright (c) 2014-2022 Rubicon Communications, LLC (Netgate)
9 0a74e0dd Steve Beaver
 * All rights reserved.
10
 *
11
 * Licensed under the Apache License, Version 2.0 (the "License");
12
 * you may not use this file except in compliance with the License.
13
 * You may obtain a copy of the License at
14
 *
15
 * http://www.apache.org/licenses/LICENSE-2.0
16
 *
17
 * Unless required by applicable law or agreed to in writing, software
18
 * distributed under the License is distributed on an "AS IS" BASIS,
19
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
 * See the License for the specific language governing permissions and
21
 * limitations under the License.
22
 */
23
24
 /*
25
  * This file is called by CRON every few minutes to upload ACB backups to the server.
26
  * This allows the GUI to remain responsive. Backup files are deleted after upload.
27
  */
28
 
29
require_once("filter.inc");
30
require_once("notices.inc");
31
32 5ae46c60 Steve Beaver
$lockfile = "/tmp/acb.lock";
33 0a74e0dd Steve Beaver
// Check for 
34 5ae46c60 Steve Beaver
if (file_exists($lockfile)) {
35 fa13ece8 Steve Beaver
    if (time()-filemtime($lockfile) > (60 * 60)) {
36 5ae46c60 Steve Beaver
        // The lock file is more than an hour old. Something probably went wrong
37 e3732f92 Renato Botelho do Couto
        unlink_if_exists($lockfile);
38 5ae46c60 Steve Beaver
        log_error("Stale ACB lock file removed");
39
    } else {
40
       exit();
41
    }
42 0a74e0dd Steve Beaver
}
43
44 5ae46c60 Steve Beaver
touch($lockfile);
45 0a74e0dd Steve Beaver
46
// Location of backup file pairs
47
$acbuploadpath = $g['acbbackuppath'];
48
// systems we do not allow
49
$badreasons = array("snort", "pfblocker", "minicron", "merged in config");
50
// List any ACB file pairs that have been created
51
$files = glob($acbuploadpath . '*.form');
52
53
if (count($files) > 0) {
54
    // Sort them, oldest first
55
    usort($files, function($a, $b) {
56
        return filemtime($a) - filemtime($b);
57
    });
58
59
    // Upload them to the server
60
    foreach ($files as $file) {
61
        $basename = basename($file, ".form");
62
        upload($basename);
63
    }
64
}
65
66 e3732f92 Renato Botelho do Couto
unlink_if_exists($lockfile);
67 5ae46c60 Steve Beaver
68 0a74e0dd Steve Beaver
function upload($basename) {
69
    global $acbuploadpath, $badreasons;
70
71 77b54274 Viktor G
    $upload_url = "https://acb.netgate.com/save";
72
73 770a7c5d Viktor G
    if (!is_url_hostname_resolvable($upload_url)) {
74
	$data = " Unable to resolve " . parse_url($upload_url, PHP_URL_HOST) . " ";
75
	acb_error_log($upload_url, $data);
76
	unlink_if_exists($acbuploadpath . $basename . ".data");
77
	unlink_if_exists($acbuploadpath . $basename . ".form");
78
	return;
79
    }
80
81 0a74e0dd Steve Beaver
    // Retrieve the data to send
82
    // Retrieve the form data
83
    $formdata = file_get_contents($acbuploadpath . $basename . ".form");
84
    $post_fields = json_decode($formdata, true);
85
    // Add the backup data file
86
    $post_fields['file'] = curl_file_create($acbuploadpath . $basename . ".data", 'image/jpg', 'config.jpg');
87
88
    // Ensure there are no backups from systems we do not allow
89
    foreach ($badreasons as $term) {
90
        if (strpos(strtolower($post_fields['reason']), $term) !== false) {
91 770a7c5d Viktor G
            log_error("Skipping ACB backup for " . strtolower($post_fields['reason']) . '.');
92 90574ebd Steve Beaver
            unlink_if_exists($acbuploadpath . $basename . ".data");
93
            unlink_if_exists($acbuploadpath . $basename . ".form");
94 0a74e0dd Steve Beaver
            return;
95
        }
96
    }
97
98
    // Check configuration into the ESF repo (Copied from /etc/inc/acb.inc)
99
    $curl_session = curl_init();
100
101 77b54274 Viktor G
    curl_setopt($curl_session, CURLOPT_URL, $upload_url);
102 0a74e0dd Steve Beaver
    curl_setopt($curl_session, CURLOPT_POST, count($post_fields));
103
    curl_setopt($curl_session, CURLOPT_POSTFIELDS, $post_fields);
104
    curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1);
105
    curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 1);
106
    curl_setopt($curl_session, CURLOPT_CONNECTTIMEOUT, 55);
107
    curl_setopt($curl_session, CURLOPT_TIMEOUT, 30);
108
    curl_setopt($curl_session, CURLOPT_USERAGENT, $g['product_label'] . '/' . rtrim(file_get_contents("/etc/version")));
109
    // Proxy
110
    set_curlproxy($curl_session);
111
112
    $data = curl_exec($curl_session);
113 770a7c5d Viktor G
    $httpcode = curl_getinfo($curl_session, CURLINFO_RESPONSE_CODE);
114 0a74e0dd Steve Beaver
115
    if (curl_errno($curl_session)) {
116
        $fd = fopen("/tmp/backupdebug.txt", "w");
117 770a7c5d Viktor G
        $acb_curl_error = curl_error($curl_session);
118 0a74e0dd Steve Beaver
        fwrite($fd, $upload_url . "" . $fields_string . "\n\n");
119
        fwrite($fd, $data);
120 770a7c5d Viktor G
        fwrite($fd, $acb_curl_error);
121 0a74e0dd Steve Beaver
        fclose($fd);
122
    } else {
123
        curl_close($curl_session);
124
    }
125
126
    // Delete the backup files, whether it worked or not
127
    unlink_if_exists($acbuploadpath . $basename . ".data");
128
    unlink_if_exists($acbuploadpath . $basename . ".form");
129
130 770a7c5d Viktor G
    if (strpos(strval($httpcode), '20') === false) {
131
	if (empty($data) && $acb_curl_error) {
132
		$data = $acb_curl_error;
133
	} else {
134
		$data = "Unknown error";
135
	}
136
	acb_error_log($upload_url, $data);
137 0a74e0dd Steve Beaver
    } else {
138
        // Update last pfS backup time
139
        $fd = fopen("/cf/conf/lastpfSbackup.txt", "w");
140
        fwrite($fd, $config['revision']['time']);
141
        fclose($fd);
142
        $notice_text = "End of configuration backup to " . $upload_url . " (success).";
143
        log_error($notice_text);
144
        update_filter_reload_status($notice_text);
145
    }
146 e3732f92 Renato Botelho do Couto
}
147 770a7c5d Viktor G
148
function acb_error_log($upload_url, $data) {
149
        $notice_text = sprintf(gettext(
150
            "An error occurred while uploading the encrypted %s configuration to "), $g['product_label']) .
151
            $upload_url . " (" . htmlspecialchars($data) . ")";
152
        log_error($notice_text . " - " . $data);
153
        file_notice("AutoConfigBackup", $notice_text);
154
        update_filter_reload_status($notice_text);
155
}