diff options
author | Chris Buechler <cmb@pfsense.org> | 2016-06-30 01:05:15 -0500 |
---|---|---|
committer | Chris Buechler <cmb@pfsense.org> | 2016-06-30 01:05:15 -0500 |
commit | d691888e596d1982d468e17602fff3162d6cb6ea (patch) | |
tree | f54b39167b32350b59d01d752a3194ef879f3c95 /src/etc | |
parent | 792997227fd1113a1a350f5bbf88b83ada685510 (diff) | |
parent | d20f76bc7f3b3e05270411857f0be2c87af0a163 (diff) | |
download | pfsense-d691888e596d1982d468e17602fff3162d6cb6ea.zip pfsense-d691888e596d1982d468e17602fff3162d6cb6ea.tar.gz |
Merge pull request #3031 from NOYB/GitSync_Diff_Only_Option
Diffstat (limited to 'src/etc')
-rw-r--r-- | src/etc/phpshellsessions/gitsync | 195 |
1 files changed, 133 insertions, 62 deletions
diff --git a/src/etc/phpshellsessions/gitsync b/src/etc/phpshellsessions/gitsync index 1731eaa..a8b8cc7 100644 --- a/src/etc/phpshellsessions/gitsync +++ b/src/etc/phpshellsessions/gitsync @@ -38,6 +38,12 @@ $valid_args = array( "--minimal" => "\tPerform a minimal copy of only the updated files.\n" . "\tNot recommended if the system has files modified by any method other\n" . "\tthan gitsync.\n", + "--diff" => "\tPerform a copy of only the files that are different or missing.\n" . + "\tRecommended for SSD if system has files modified by any method other\n" . + "\tthan gitsync.\n", + "--verbose" => "\tDisplay constructed command. In combination with the --diff\n" . + "\toption, display the array of different and missing files.\n", + "--dry-run" => "\tDry-run only. No files copied.\n", "--help" => "\tDisplay this help list.\n" ); $args = array(); @@ -68,6 +74,69 @@ while (!empty($temp_args)) { } } +if (!function_exists('post_cvssync_commands')) { +function post_cvssync_commands() { + echo "===> Removing FAST-CGI temporary files...\n"; + exec("find /tmp -name \"php-fastcgi.socket*\" -exec rm -rf {} \;"); + exec("find /tmp -name \"*.tmp\" -exec rm -rf {} \;"); + + exec("rm -rf /tmp/xcache/* 2>/dev/null"); + + echo "===> Upgrading configuration (if needed)...\n"; + convert_config(); + + echo "===> Configuring filter..."; + exec("/etc/rc.filter_configure_sync"); + exec("pfctl -f /tmp/rules.debug"); + echo "\n"; + + if (file_exists("/etc/rc.php_ini_setup")) { + echo "===> Running /etc/rc.php_ini_setup..."; + exec("/etc/rc.php_ini_setup >/dev/null 2>&1"); + echo "\n"; + } + + /* lock down console if necessary */ + echo "===> Locking down the console if needed...\n"; + reload_ttys(); + + echo "===> Signaling PHP and nginx restart..."; + $fd = fopen("/tmp/restart_nginx", "w"); + fwrite($fd, "#!/bin/sh\n"); + fwrite($fd, "sleep 5\n"); + fwrite($fd, "/usr/local/sbin/pfSctl -c 'service restart webgui'\n"); + fclose($fd); + mwexec_bg("sh /tmp/restart_nginx"); + echo "\n"; +} +} + +if (!function_exists('isUrl')) { +function isUrl($url = "") { + if ($url) { + if (strstr($url, "rcs.pfsense.org") or + strstr($url, "mainline") or + strstr($url, ".git") or + strstr($url, "git://")) { + return true; + } + } + return false; +} +} + +if (!function_exists('run_cmds')) { +function run_cmds($cmds) { + global $debug; + foreach ($cmds as $cmd) { + if ($debug) { + echo "Running $cmd"; + } + exec($cmd); + } +} +} + unlink_if_exists("/tmp/config.cache"); conf_mount_rw(); @@ -298,8 +367,10 @@ if (isset($args["--minimal"])) { $old_revision = trim(file_get_contents("/etc/version.lastcommit")); } $files_to_copy = strtr(shell_exec("cd $CODIR/pfSenseGITREPO/pfSenseGITREPO && {$GIT_BIN} diff --name-only --relative=src " . escapeshellarg($old_revision)), "\n", " "); + $tar_options = '-C ./src'; } else { - $files_to_copy = '-C ./src .'; + $files_to_copy = '.'; + $tar_options = '-C ./src'; } // Save new commit ID for later minimal file copies @@ -324,16 +395,74 @@ exec("rm -rf {$CODIR}/pfSenseGITREPO/pfSenseGITREPO/src/conf*"); exec("rm -rf {$CODIR}/pfSenseGITREPO/pfSenseGITREPO/src/cf 2>/dev/null"); @chmod("{$CODIR}/pfSenseGITREPO/pfSenseGITREPO/src/tmp", 01777); +if(isset($args["--diff"])) { + # Find different and missing files. + $different_missing_files = shell_exec("/usr/bin/diff -qr / $CODIR/pfSenseGITREPO/pfSenseGITREPO/src/ | /usr/bin/grep -E '^(Files .*? and $CODIR/pfSenseGITREPO/pfSenseGITREPO/src/.*? differ)|(Only in $CODIR/pfSenseGITREPO/pfSenseGITREPO/src/)'"); + + # Get the path of each different or missing file. + preg_match_all('@(?:^Files .*? and '.$CODIR.'/pfSenseGITREPO/pfSenseGITREPO/src/(.*?) differ.*?$)@sim', $different_missing_files, $different_files_array, PREG_PATTERN_ORDER); + preg_match_all('@(?:^Only in '.$CODIR.'/pfSenseGITREPO/pfSenseGITREPO/src/(.*?)$)@sim', $different_missing_files, $missing_files_array, PREG_PATTERN_ORDER); + + # Deal with diff's output format of missing files (path: missing_file). + foreach ($missing_files_array[1] as $key => $file) { + + # Most of the time there will be only the one ': ' injected by diff output. So global replace with dir delimiter (/) is fine. + $tmp = str_replace(": ", "/", $file, $count); + if ($count == 1) + $file = ltrim($tmp, "/"); + + # For the very rare case a path component (dir or file) contains ': ' as well, then need to find and replace only the ': ' injected by diff output. + else { + $tmp = $file; + do { + $pos = strrpos($tmp, ": "); + if ($pos) { + $tmp = substr($tmp, 0, $pos); + $res = is_dir("$CODIR/pfSenseGITREPO/pfSenseGITREPO/src/$tmp/"); + } + } while (!$res && $pos); + + if ($res) + $file = ltrim($tmp . "/" . substr($file, $pos+2), "/"); + } + + $missing_files_array[1][$key] = $file; + } + + # Convert the list from array to space separated quoted strings. Quoted for white space file name support. + $different_files = $missing_files = ''; + if (count($different_files_array[1]) > 0) + $different_files .= '"' . implode('" "', $different_files_array[1]) . '"'; + if (count($missing_files_array[1]) > 0) + $missing_files .= '"' . implode('" "', $missing_files_array[1]) . '"'; + + # Files to be copied. + $files_to_copy = trim($different_files . " " . $missing_files); + $tar_options = '-C ./src'; + + if(isset($args["--verbose"])) { + echo "===> Different Files: \n"; + print_r($different_files_array[1]); + echo "===> Missing Files: \n"; + print_r($missing_files_array[1]); + } +} + echo "===> Installing new files...\n"; if ($g['platform'] == $g['product_name']) { - $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$files_to_copy} | (cd / ; tar -Uxpf -)"; + $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$tar_options} {$files_to_copy} | (cd / ; tar -Uxpf -)"; } else { - $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$files_to_copy} | (cd / ; tar -xpf -) 2>/dev/null"; + $command = "cd $CODIR/pfSenseGITREPO/pfSenseGITREPO ; tar -cpf - {$tar_options} {$files_to_copy} | (cd / ; tar -xpf -) 2>/dev/null"; } if (!empty($files_to_copy)) { - exec($command); + if(isset($args["--verbose"])) { + echo "===> Command: \n$command\n"; + } + if(!isset($args["--dry-run"])) { + exec($command); + } } else { echo "Already up-to-date.\n"; $upgrading = true; @@ -362,62 +491,4 @@ if (!$upgrading) { echo "Your system is now sync'd.\n\n"; } -function post_cvssync_commands() { - echo "===> Removing FAST-CGI temporary files...\n"; - exec("find /tmp -name \"php-fastcgi.socket*\" -exec rm -rf {} \;"); - exec("find /tmp -name \"*.tmp\" -exec rm -rf {} \;"); - - exec("rm -rf /tmp/xcache/* 2>/dev/null"); - - echo "===> Upgrading configuration (if needed)...\n"; - convert_config(); - - echo "===> Configuring filter..."; - exec("/etc/rc.filter_configure_sync"); - exec("pfctl -f /tmp/rules.debug"); - echo "\n"; - - if (file_exists("/etc/rc.php_ini_setup")) { - echo "===> Running /etc/rc.php_ini_setup..."; - exec("/etc/rc.php_ini_setup >/dev/null 2>&1"); - echo "\n"; - } - - /* lock down console if necessary */ - echo "===> Locking down the console if needed...\n"; - reload_ttys(); - - echo "===> Signaling PHP and nginx restart..."; - $fd = fopen("/tmp/restart_nginx", "w"); - fwrite($fd, "#!/bin/sh\n"); - fwrite($fd, "sleep 5\n"); - fwrite($fd, "/usr/local/sbin/pfSctl -c 'service restart webgui'\n"); - fclose($fd); - mwexec_bg("sh /tmp/restart_nginx"); - echo "\n"; - -} - -function isUrl($url = "") { - if ($url) { - if (strstr($url, "rcs.pfsense.org") or - strstr($url, "mainline") or - strstr($url, ".git") or - strstr($url, "git://")) { - return true; - } - } - return false; -} - -function run_cmds($cmds) { - global $debug; - foreach ($cmds as $cmd) { - if ($debug) { - echo "Running $cmd"; - } - exec($cmd); - } -} - conf_mount_ro(); |