Webhook support, misc fixes
* Added support for slack (mattermost) webhooks * Misc fixes
This commit is contained in:
parent
6cdb155dc5
commit
1f44d9f44b
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/vendor
|
||||||
|
/composer.lock
|
||||||
|
/*.phar
|
@ -1,6 +1,8 @@
|
|||||||
# Fresh: Keeping your docker stacks up to date
|
# Fresh: Keeping your docker stacks up to date
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Build using NoccyLabs Pharlite.
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@ -24,7 +26,6 @@ Update everything and up any new containers in current dir:
|
|||||||
$ fresh.phar
|
$ fresh.phar
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
Manually pulling when changed:
|
Manually pulling when changed:
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -32,4 +33,4 @@ if ! fresh.phar --check; then
|
|||||||
docker-compose pull
|
docker-compose pull
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
fi
|
fi
|
||||||
```
|
```
|
||||||
|
@ -12,23 +12,37 @@ use NoccyLabs\FreshDocker\State\PersistentState;
|
|||||||
|
|
||||||
require_once __DIR__."/../vendor/autoload.php";
|
require_once __DIR__."/../vendor/autoload.php";
|
||||||
|
|
||||||
$opts = getopt("hd:c:i:q", [ "help", "dir:", "config:", "image:", "pull", "credentials:", "check", "slack:", "quiet" ]);
|
$opts = getopt("hd:c:i:qv", [ "help", "dir:", "config:", "image:", "pull", "credentials:", "check", "slack:", "quiet", "prune" ]);
|
||||||
|
|
||||||
if (array_key_exists('h', $opts) || array_key_exists('help', $opts)) {
|
if (array_key_exists('h', $opts) || array_key_exists('help', $opts)) {
|
||||||
|
|
||||||
|
printf("fresh.phar - (c) 2022, NoccyLabs / GPL v3 or later\n");
|
||||||
|
printf("Check for updates to docker images or compose stacks.\n\n");
|
||||||
printf("Usage:\n %s [options]\n\n", basename($argv[0]));
|
printf("Usage:\n %s [options]\n\n", basename($argv[0]));
|
||||||
printf("Options:\n");
|
printf("Options:\n");
|
||||||
|
printf(" General:\n");
|
||||||
foreach([
|
foreach([
|
||||||
'-h,--help' => "Show this help",
|
'-h,--help' => "Show this help",
|
||||||
|
'-q,--quiet' => "Don't show any output (except dockers)",
|
||||||
'-d,--dir DIR' => "Change working directory to DIR",
|
'-d,--dir DIR' => "Change working directory to DIR",
|
||||||
'-c,--config FILE' => "Use a custom configuration (not implemented)",
|
|
||||||
'-i,--image REF' => "Check a specific image instead of using config/docker-compose",
|
'-i,--image REF' => "Check a specific image instead of using config/docker-compose",
|
||||||
'--pull' => "Only pull if new, don't up",
|
'--pull' => "Only pull if new, don't up",
|
||||||
'--credentials TYPE' => "Select credentials loader (auto or basic)",
|
|
||||||
'--check' => "Only check, set exit code 1 if not fresh",
|
'--check' => "Only check, set exit code 1 if not fresh",
|
||||||
'-q,--quiet' => "Don't show any output (except dockers)",
|
'--prune' => "Prune dangling images after pull and up",
|
||||||
] as $a=>$b)
|
] as $a=>$b) printf(" %-20s %s\n", $a, $b);
|
||||||
printf(" %-20s %s\n", $a, $b);
|
|
||||||
|
printf(" Webhooks:\n");
|
||||||
|
foreach([
|
||||||
|
'--slack URL' => "Notify a Slack webhook when updating",
|
||||||
|
] as $a=>$b) printf(" %-20s %s\n", $a, $b);
|
||||||
|
|
||||||
|
printf(" Configuration:\n");
|
||||||
|
foreach([
|
||||||
|
'-c,--config FILE' => "Use a custom configuration (not implemented)",
|
||||||
|
'--credentials TYPE' => "Select credentials loader (auto or basic)",
|
||||||
|
] as $a=>$b) printf(" %-20s %s\n", $a, $b);
|
||||||
|
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -38,6 +52,8 @@ $path = realpath($opts['d'] ?? ($opts['dir'] ?? getcwd()));
|
|||||||
$onlyPull = array_key_exists('p', $opts) || array_key_exists('pull', $opts);
|
$onlyPull = array_key_exists('p', $opts) || array_key_exists('pull', $opts);
|
||||||
$onlyCheck = array_key_exists('check', $opts);
|
$onlyCheck = array_key_exists('check', $opts);
|
||||||
$quiet = array_key_exists('q', $opts) || array_key_exists('quiet', $opts);
|
$quiet = array_key_exists('q', $opts) || array_key_exists('quiet', $opts);
|
||||||
|
$verbose = array_key_exists('v', $opts);
|
||||||
|
$prune = array_key_exists('prune', $opts);
|
||||||
|
|
||||||
$slackUrl = array_key_exists('slack', $opts) ? $opts['slack'] : null;
|
$slackUrl = array_key_exists('slack', $opts) ? $opts['slack'] : null;
|
||||||
$slackHook = null;
|
$slackHook = null;
|
||||||
@ -87,7 +103,7 @@ foreach ($checks as $check) {
|
|||||||
|
|
||||||
$credentials = $credentialsLoader->getCredentials($reg);
|
$credentials = $credentialsLoader->getCredentials($reg);
|
||||||
if (!$credentials) {
|
if (!$credentials) {
|
||||||
//printf("notice: missing credentials for %s, skipping image %s\n", $reg, $check);
|
if ($verbose) printf("%s: missing credentials for %s\n", $ref->getImage(), $ref->getRegistry());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$client = new RegistryV2Client($reg, $credentials);
|
$client = new RegistryV2Client($reg, $credentials);
|
||||||
@ -119,7 +135,12 @@ if ($update) {
|
|||||||
$slackHook->sendMessage($msg, []);
|
$slackHook->sendMessage($msg, []);
|
||||||
}
|
}
|
||||||
passthru("docker-compose pull");
|
passthru("docker-compose pull");
|
||||||
if (!$onlyPull) passthru("docker-compose up -d");
|
if (!$onlyPull) {
|
||||||
|
passthru("docker-compose up -d");
|
||||||
|
if ($prune) {
|
||||||
|
passthru("docker image prune -f");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exit($update?1:0);
|
exit($update?1:0);
|
||||||
|
13
src/Hooks/HookInterface.php
Normal file
13
src/Hooks/HookInterface.php
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace NoccyLabs\FreshDocker\Hooks;
|
||||||
|
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use RuntimeException;
|
||||||
|
|
||||||
|
interface HookInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
public function sendMessage(string $text, array $options);
|
||||||
|
|
||||||
|
}
|
@ -5,7 +5,7 @@ namespace NoccyLabs\FreshDocker\Hooks;
|
|||||||
use GuzzleHttp\Client;
|
use GuzzleHttp\Client;
|
||||||
use RuntimeException;
|
use RuntimeException;
|
||||||
|
|
||||||
class SlackHook
|
class SlackHook implements HookInterface
|
||||||
{
|
{
|
||||||
|
|
||||||
private array $options = [];
|
private array $options = [];
|
||||||
@ -49,6 +49,10 @@ class SlackHook
|
|||||||
if (array_key_exists('channel', $options)) $body['channel'] = $options['channel'];
|
if (array_key_exists('channel', $options)) $body['channel'] = $options['channel'];
|
||||||
if (array_key_exists('username', $options)) $body['username'] = $options['username'];
|
if (array_key_exists('username', $options)) $body['username'] = $options['username'];
|
||||||
if (array_key_exists('icon_url', $options)) $body['icon_url'] = $options['icon_url'];
|
if (array_key_exists('icon_url', $options)) $body['icon_url'] = $options['icon_url'];
|
||||||
|
if (array_key_exists('info', $options)) {
|
||||||
|
if (!array_key_exists('props', $body)) $body['props'] = [];
|
||||||
|
$body['props']['card'] = $options['info'];
|
||||||
|
}
|
||||||
$body['text'] = $text;
|
$body['text'] = $text;
|
||||||
|
|
||||||
return $body;
|
return $body;
|
||||||
|
Loading…
Reference in New Issue
Block a user