From b63260533fba52b6688b481d98041c2d8046ba60 Mon Sep 17 00:00:00 2001 From: Christopher Vagnetoft Date: Tue, 19 Apr 2016 22:55:09 +0200 Subject: [PATCH] Improvements --- Makefile | 2 +- bin/bootstrap.php | 2 ++ bin/hotfix | 0 makephar | Bin 0 -> 30830 bytes src/Command/ApplyCommand.php | 35 +++++++++++++++++++++------ src/Hotfix/Hotfix.php | 20 +++++++++++++-- src/Hotfix/Loader.php | 19 +++++++++++++-- src/Hotfix/Loader/FileLoader.php | 5 ++++ src/Hotfix/Loader/GistLoader.php | 5 ++++ src/Hotfix/Loader/HttpLoader.php | 5 ++++ src/Hotfix/Loader/PastebinLoader.php | 5 ++++ src/stubs/bash.stub | 16 ++++++++++++ 12 files changed, 101 insertions(+), 13 deletions(-) mode change 100644 => 100755 bin/hotfix create mode 100755 makephar create mode 100644 src/stubs/bash.stub diff --git a/Makefile b/Makefile index 0f18b7a..1dd3779 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,3 @@ .phony: phar phar: - makephar -c makephar.conf + ./makephar -c makephar.conf diff --git a/bin/bootstrap.php b/bin/bootstrap.php index b3fbe85..6fefdcc 100644 --- a/bin/bootstrap.php +++ b/bin/bootstrap.php @@ -2,6 +2,8 @@ require_once __DIR__."/../vendor/autoload.php"; require_once __DIR__."/systemtest.php"; +if (file_exists(__DIR__."/banner.php")) + require_once __DIR__."/banner.php"; use NoccyLabs\Hotfix\HotfixApplication; diff --git a/bin/hotfix b/bin/hotfix old mode 100644 new mode 100755 diff --git a/makephar b/makephar new file mode 100755 index 0000000000000000000000000000000000000000..ebb2ac90efa4abf9c43fd7c21ae7e705de3e92ec GIT binary patch literal 30830 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 NOVmGm^62={{{tlRG>!lO literal 0 HcmV?d00001 diff --git a/src/Command/ApplyCommand.php b/src/Command/ApplyCommand.php index d519a65..cc0cfef 100644 --- a/src/Command/ApplyCommand.php +++ b/src/Command/ApplyCommand.php @@ -9,6 +9,7 @@ use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ConfirmationQuestion; +use Symfony\Component\Console\Question\ChoiceQuestion; use NoccyLabs\Hotfix\Hotfix\Loader; class ApplyCommand extends Command @@ -20,6 +21,7 @@ class ApplyCommand extends Command $this->setDescription("Apply a hotfix from a file or the Internet"); $this->addOption("insecure", "I", InputOption::VALUE_NONE, "Disable signature checks. Don't use unless you know what you are doing!"); + $this->addOption("preview", "p", InputOption::VALUE_NONE, "Only preview the hotfix script, don't apply anything"); $this->addArgument("hotfix", InputArgument::OPTIONAL, "The identifier, path or filename of the hotfix"); } @@ -30,10 +32,20 @@ class ApplyCommand extends Command $fix = $input->getArgument("hotfix"); $insecure = $input->getOption("insecure"); + $loader = new Loader(); + + if (!$fix) { + + $loaders = $loader->getLoaders(); + $output->writeln("Supported loaders:\n"); + foreach ($loaders as $loader) { + $output->writeln(" * ".$loader->getInfo()); + } + return; + } $output->writeln("Reading hotfix {$fix}..."); - $loader = new Loader(); try { $hotfix = $loader->load($fix, $insecure); } catch (\Exception $e) { @@ -47,20 +59,27 @@ class ApplyCommand extends Command $output->writeln(""); if (($signer = $hotfix->getSignedBy())) { - $output->writeln("Hotfix has good signature by {$signer}"); + $keyid = $hotfix->getKeyId(); + $output->writeln("Hotfix has good signature from {$signer} (keyid {$keyid})"); } else { $output->writeln("Warning: Hotfix is not signed or signature not valid!"); } $output->writeln(""); - $output->writeln(" Hotfix: ".$hotfix->getName().""); + $output->writeln(" Hotfix: ".$hotfix->getName().""); $output->writeln(" Author: ".$hotfix->getAuthor().""); - $output->writeln(" Info:"); - $info = explode("\n",wordwrap(trim($hotfix->getInfo()), 70)); - foreach ($info as $line) { - $output->writeln(" | {$line}"); - } + $info = explode("\n",wordwrap(trim($hotfix->getInfo()), 60)); + $info = "".join("\n ", $info).""; + $output->writeln(" Info: ".$info); $output->writeln(""); + if ($input->getOption("preview")) { + $output->writeln("This is the script that will be executed:"); + $body = $hotfix->getBody(); + $body = " ".join("\n ", explode("\n",$body)).""; + $output->writeln($body); + return; + } + $helper = $this->getHelper("question"); $question = new ConfirmationQuestion("Do you want to apply this hotfix? [y/N] ", false); diff --git a/src/Hotfix/Hotfix.php b/src/Hotfix/Hotfix.php index 1fd5ed6..c827142 100644 --- a/src/Hotfix/Hotfix.php +++ b/src/Hotfix/Hotfix.php @@ -9,6 +9,8 @@ class Hotfix protected $signer; + protected $keyId; + protected $header; protected $body; @@ -16,7 +18,8 @@ class Hotfix public function __construct($hotfix, $signer) { $this->load($hotfix); - $this->signer = $signer; + $this->signer = $signer[0]; + $this->keyId = $signer[1]; } protected function load($hotfix) @@ -31,6 +34,11 @@ class Hotfix $this->body = $body; } + public function getBody() + { + return $this->body; + } + public function apply() { if (!array_key_exists('lang', $this->header)) { @@ -40,9 +48,12 @@ class Hotfix } $script = null; + $head = null; + $foot = null; switch ($lang) { case 'bash': $exec = "/bin/bash"; + $head = file_get_contents(__DIR__."/../stubs/bash.stub"); break; case 'php': $exec = "/usr/bin/env php"; @@ -53,7 +64,7 @@ class Hotfix } $tmpfile = sys_get_temp_dir()."/hotfix_".sha1($this->header['hotfix']); - file_put_contents($tmpfile, $this->body); + file_put_contents($tmpfile, $head."\n".$this->body."\n".$foot); passthru($exec." ".$tmpfile); unlink($tmpfile); } @@ -68,6 +79,11 @@ class Hotfix $this->signer['uids'][0]['email'] ); } + + public function getKeyId() + { + return $this->keyId; + } public function getName() { diff --git a/src/Hotfix/Loader.php b/src/Hotfix/Loader.php index be1ea47..ace3013 100644 --- a/src/Hotfix/Loader.php +++ b/src/Hotfix/Loader.php @@ -22,6 +22,11 @@ class Loader $this->loaders[] = $loader; } + public function getLoaders() + { + return $this->loaders; + } + public function load($fix, $insecure=false) { foreach ($this->loaders as $loader) { @@ -56,12 +61,22 @@ class Loader throw new \Exception("Hotfix signature is not valid!"); } - $keyInfo = gnupg_keyinfo($gpg, $sigInfo[0]['fingerprint']); + $fingerprint = $sigInfo[0]['fingerprint']; + $keyInfo = gnupg_keyinfo($gpg, $fingerprint); + + $subKeys = $keyInfo[0]['subkeys']; + $keyId = null; + foreach ($subKeys as $subKey) { + if ($subKey['fingerprint'] == $fingerprint) { + $keyId = $subKey['keyid']; + break; + } + } if (empty($keyInfo)) { throw new \Exception("Unknown signer (key id {$sigInfo[0]['fingerprint']})"); } - return $keyInfo[0]; + return [ $keyInfo[0], $keyId ]; } } diff --git a/src/Hotfix/Loader/FileLoader.php b/src/Hotfix/Loader/FileLoader.php index b70b3f7..4240525 100644 --- a/src/Hotfix/Loader/FileLoader.php +++ b/src/Hotfix/Loader/FileLoader.php @@ -15,4 +15,9 @@ class FileLoader implements LoaderInterface } return false; } + + public function getInfo() + { + return "filename - Read a hotfix from a file"; + } } diff --git a/src/Hotfix/Loader/GistLoader.php b/src/Hotfix/Loader/GistLoader.php index c9d13c9..85b099e 100644 --- a/src/Hotfix/Loader/GistLoader.php +++ b/src/Hotfix/Loader/GistLoader.php @@ -15,4 +15,9 @@ class GistLoader implements LoaderInterface return file_get_contents($url); } + + public function getInfo() + { + return "gist:user/gist-id - Read hotfix from a Gist"; + } } diff --git a/src/Hotfix/Loader/HttpLoader.php b/src/Hotfix/Loader/HttpLoader.php index a78dee3..7383b74 100644 --- a/src/Hotfix/Loader/HttpLoader.php +++ b/src/Hotfix/Loader/HttpLoader.php @@ -12,4 +12,9 @@ class HttpLoader implements LoaderInterface } return false; } + + public function getInfo() + { + return "http(s)://url - Read hotfix from a URL"; + } } diff --git a/src/Hotfix/Loader/PastebinLoader.php b/src/Hotfix/Loader/PastebinLoader.php index a6ddf71..43c5d3e 100644 --- a/src/Hotfix/Loader/PastebinLoader.php +++ b/src/Hotfix/Loader/PastebinLoader.php @@ -20,4 +20,9 @@ class PastebinLoader implements LoaderInterface return $body; } + + public function getInfo() + { + return "pastebin:paste-id - Read hotfix from Pastebin"; + } } diff --git a/src/stubs/bash.stub b/src/stubs/bash.stub new file mode 100644 index 0000000..a43f9a2 --- /dev/null +++ b/src/stubs/bash.stub @@ -0,0 +1,16 @@ +test -e /etc/lsb-release && source /etc/lsb-release + +function exec() { + echo -e "\e[36;1m[exec]\e[36;21m $*\e[0m" + LOG=$(tempfile -p exec) + $@ &>$LOG + EC=$? + if [ $EC -gt 0 ]; then + echo -e "\e[31;1m[warn]\e[31;21m Command completed with exitcode $EC\e[0m" + cat $LOG + fi + rm $LOG +} +function info() { + echo -e "\e[32;1m[info]\e[32;21m $*\e[0m" +}