diff --git a/.github/workflows/image.yml b/.github/workflows/image.yml index 6d16a3c..fb9a213 100644 --- a/.github/workflows/image.yml +++ b/.github/workflows/image.yml @@ -1,8 +1,8 @@ name: Build Docker Image on: -- push -- pull_request + - push + - pull_request jobs: build: @@ -10,92 +10,110 @@ jobs: strategy: matrix: variant: - - "4" - - "4/fastcgi" - - "5" - - "5/fastcgi" + - "4" + - "4/fastcgi" + - "5" + - "5/fastcgi" steps: - - uses: actions/checkout@v4 - - name: Build the image. - id: build - run: | - printf "::group::Sending context\n" - IMAGE=adminer:${VARIANT/\//-}-$(date +%s) - docker build "$VARIANT" --tag "$IMAGE" |sed 's/^Step/::endgroup::\n::group::Step/' - printf "::endgroup::\n" - printf "image=%s\n" "$IMAGE" >> $GITHUB_OUTPUT - printf "version=%s\n" "$(awk '/^ENV\s+ADMINER_VERSION/{print $3}' "$VARIANT/Dockerfile")" >> $GITHUB_OUTPUT - env: - VARIANT: ${{ matrix.variant }} - - name: Smoketest - run: | - docker run --name $container_name -d ${{ steps.build.outputs.image }} - env: - container_name: adminer_smoke - - name: Verify a restart works. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d ${{ steps.build.outputs.image }} - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ - docker restart $container_name - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ - env: - container_name: adminer_restart - - name: Verify version. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d ${{ steps.build.outputs.image }} - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ \ - |grep '${{ steps.build.outputs.version }}' - env: - container_name: adminer_version - - name: Verify that no warnings appear. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d ${{ steps.build.outputs.image }} - ! docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ \ - |grep 'Warning:' - env: - container_name: adminer_warnings - - name: Verify that the design works. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d -e ADMINER_DESIGN=nette ${{ steps.build.outputs.image }} - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ \ - |grep 'adminer.css' - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/adminer.css \ - |grep 'Nette' - env: - container_name: adminer_design - - name: Verify that the default server works. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d -e ADMINER_DEFAULT_SERVER=ADMINER_DEFAULT_SERVER_WORKS ${{ steps.build.outputs.image }} - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ \ - |grep 'ADMINER_DEFAULT_SERVER_WORKS' - env: - container_name: adminer_defaultserver - - name: Verify that loading plugins work. - if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} - run: | - docker run --name $container_name -d -e ADMINER_PLUGINS="tables-filter version-noverify" ${{ steps.build.outputs.image }} - docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ - curl -fsSL http://$container_name:8080/ \ - |grep 'verifyVersion =' - env: - container_name: adminer_plugins - - name: Show Containers and Images - run: | - printf "::group::docker ps -a\n" - docker ps -a - printf "::endgroup::\n" - printf "::group::docker images\n" - docker images - printf "::endgroup::\n" + - uses: actions/checkout@v4 + - name: Build the image. + id: build + run: | + printf "::group::Sending context\n" + IMAGE=adminer:${VARIANT/\//-}-$(date +%s) + docker build "$VARIANT" --tag "$IMAGE" |sed 's/^Step/::endgroup::\n::group::Step/' + printf "::endgroup::\n" + printf "image=%s\n" "$IMAGE" >> $GITHUB_OUTPUT + printf "version=%s\n" "$(awk '/^ENV\s+ADMINER_VERSION/{print $3}' "$VARIANT/Dockerfile")" >> $GITHUB_OUTPUT + env: + VARIANT: ${{ matrix.variant }} + - name: Smoketest + run: | + docker run --name $container_name -d ${{ steps.build.outputs.image }} + env: + container_name: adminer_smoke + - name: Verify a restart works. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ + docker restart $container_name + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ + env: + container_name: adminer_restart + - name: Verify version. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep '${{ steps.build.outputs.version }}' + env: + container_name: adminer_version + - name: Verify that no warnings appear. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d ${{ steps.build.outputs.image }} + ! docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'Warning:' + env: + container_name: adminer_warnings + - name: Verify that the design works. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d -e ADMINER_DESIGN=nette ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'adminer.css' + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/adminer.css \ + |grep 'Nette' + env: + container_name: adminer_design + - name: Verify that the default dbname works. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d -e ADMINER_DEFAULT_SERVER=ADMINER_DEFAULT_SERVER_WORKS ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'ADMINER_DEFAULT_SERVER_WORKS' + env: + container_name: adminer_defaultserver + - name: Verify that the default driver works. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d -e ADMINER_DEFAULT_DRIVER=pgsql ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'pgsql' + env: + container_name: adminer_defaultdriver + - name: Verify that the default dbname works. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d -e ADMINER_DEFAULT_DBNAME=ADMINER_DEFAULT_DBNAME_WORKS ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'ADMINER_DEFAULT_DBNAME_WORKS' + env: + container_name: adminer_defaultdbname + - name: Verify that loading plugins work. + if: ${{ ! contains(steps.build.outputs.image, 'fastcgi') }} + run: | + docker run --name $container_name -d -e ADMINER_PLUGINS="tables-filter version-noverify" ${{ steps.build.outputs.image }} + docker run -i --rm --link $container_name:$container_name buildpack-deps:curl \ + curl -fsSL http://$container_name:8080/ \ + |grep 'verifyVersion =' + env: + container_name: adminer_plugins + - name: Show Containers and Images + run: | + printf "::group::docker ps -a\n" + docker ps -a + printf "::endgroup::\n" + printf "::group::docker images\n" + docker images + printf "::endgroup::\n" diff --git a/4/fastcgi/index.php b/4/fastcgi/index.php index a48629f..b014a0e 100644 --- a/4/fastcgi/index.php +++ b/4/fastcgi/index.php @@ -1,43 +1,64 @@ MySQL', + 'name="auth[db]" value=""' + ], + [ + 'name="auth[server]" value="' . $defaultDbHost . '" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '" selected="selected"', + '>MySQL', + 'name="auth[db]" value="' . $defaultDb . '"' + ], + $form + ); - $plugins = []; - foreach (glob('plugins-enabled/*.php') as $plugin) { - $plugins[] = require($plugin); - } + return $return; + } - return new Adminer($plugins); - } + return parent::_callParent($function, $args); + } + } + + $plugins = []; + foreach (glob('plugins-enabled/*.php') as $plugin) { + $plugins[] = require($plugin); + } + + return new Adminer($plugins); + } } namespace { - if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { - header('Content-Type: text/css'); - readfile('adminer.css'); - exit; - } + if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { + header('Content-Type: text/css'); + readfile('adminer.css'); + exit; + } - function adminer_object() { - return \docker\adminer_object(); - } + function adminer_object() { + return \docker\adminer_object(); + } - require('adminer.php'); + require('adminer.php'); } diff --git a/4/index.php b/4/index.php index a48629f..b014a0e 100644 --- a/4/index.php +++ b/4/index.php @@ -1,43 +1,64 @@ MySQL', + 'name="auth[db]" value=""' + ], + [ + 'name="auth[server]" value="' . $defaultDbHost . '" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '" selected="selected"', + '>MySQL', + 'name="auth[db]" value="' . $defaultDb . '"' + ], + $form + ); - $plugins = []; - foreach (glob('plugins-enabled/*.php') as $plugin) { - $plugins[] = require($plugin); - } + return $return; + } - return new Adminer($plugins); - } + return parent::_callParent($function, $args); + } + } + + $plugins = []; + foreach (glob('plugins-enabled/*.php') as $plugin) { + $plugins[] = require($plugin); + } + + return new Adminer($plugins); + } } namespace { - if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { - header('Content-Type: text/css'); - readfile('adminer.css'); - exit; - } + if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { + header('Content-Type: text/css'); + readfile('adminer.css'); + exit; + } - function adminer_object() { - return \docker\adminer_object(); - } + function adminer_object() { + return \docker\adminer_object(); + } - require('adminer.php'); + require('adminer.php'); } diff --git a/5/fastcgi/index.php b/5/fastcgi/index.php index f336caf..11c19b5 100644 --- a/5/fastcgi/index.php +++ b/5/fastcgi/index.php @@ -1,57 +1,74 @@ loginFormField(...$args); - - return \str_replace( - 'name="auth[server]" value="" title="hostname[:port]"', - \sprintf('name="auth[server]" value="%s" title="hostname[:port]"', ($_ENV['ADMINER_DEFAULT_SERVER'] ?: 'db')), - $field, - ); - })->call($this->adminer, ...$args); - } - } - - $plugins = []; - foreach (glob('plugins-enabled/*.php') as $plugin) { - $plugins[] = require($plugin); - } - - $adminer = new \Adminer\Plugins($plugins); - - (function () { - $last = &$this->hooks['loginFormField'][\array_key_last($this->hooks['loginFormField'])]; - if ($last instanceof \Adminer\Adminer) { - $defaultServerPlugin = new DefaultServerPlugin($last); - $this->plugins[] = $defaultServerPlugin; - $last = $defaultServerPlugin; - } - })->call($adminer); - - return $adminer; - } + function adminer_object() { + /** + * Prefills the “Server”, "Driver", "DBName" fields with + * the ADMINER_DEFAULT_(SERVER,DRIVER,DBNAME) environment variables. + */ + final class DefaultServerPlugin extends \Adminer\Plugin { + public function __construct( + private \Adminer\Adminer $adminer + ) { } + + public function loginFormField(...$args) { + return (function (...$args) { + $field = $this->loginFormField(...$args); + + $defaultDbDriver = getenv('ADMINER_DEFAULT_DRIVER') ?: 'server'; + $defaultDbHost = getenv('ADMINER_DEFAULT_SERVER') ?: ''; + $defaultDb = getenv('ADMINER_DEFAULT_DBNAME') ?: ''; + + $defaultDbDriver = $defaultDbDriver == 'mysql' ? 'server' : $defaultDbDriver; + + return \str_replace( + [ + 'name="auth[server]" value="" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '"', + 'selected="">MySQL', + 'name="auth[db]" value=""' + ], + [ + 'name="auth[server]" value="' . $defaultDbHost . '" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '" selected="selected"', + '>MySQL', + 'name="auth[db]" value="' . $defaultDb . '"' + ], + $field, + ); + })->call($this->adminer, ...$args); + } + } + + $plugins = []; + foreach (glob('plugins-enabled/*.php') as $plugin) { + $plugins[] = require($plugin); + } + + $adminer = new \Adminer\Plugins($plugins); + + (function () { + $last = &$this->hooks['loginFormField'][\array_key_last($this->hooks['loginFormField'])]; + if ($last instanceof \Adminer\Adminer) { + $defaultServerPlugin = new DefaultServerPlugin($last); + $this->plugins[] = $defaultServerPlugin; + $last = $defaultServerPlugin; + } + })->call($adminer); + + return $adminer; + } } namespace { - if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { - header('Content-Type: text/css'); - readfile('adminer.css'); - exit; - } + if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { + header('Content-Type: text/css'); + readfile('adminer.css'); + exit; + } - function adminer_object() { - return \docker\adminer_object(); - } + function adminer_object() { + return \docker\adminer_object(); + } - require('adminer.php'); + require('adminer.php'); } diff --git a/5/index.php b/5/index.php index f336caf..11c19b5 100644 --- a/5/index.php +++ b/5/index.php @@ -1,57 +1,74 @@ loginFormField(...$args); - - return \str_replace( - 'name="auth[server]" value="" title="hostname[:port]"', - \sprintf('name="auth[server]" value="%s" title="hostname[:port]"', ($_ENV['ADMINER_DEFAULT_SERVER'] ?: 'db')), - $field, - ); - })->call($this->adminer, ...$args); - } - } - - $plugins = []; - foreach (glob('plugins-enabled/*.php') as $plugin) { - $plugins[] = require($plugin); - } - - $adminer = new \Adminer\Plugins($plugins); - - (function () { - $last = &$this->hooks['loginFormField'][\array_key_last($this->hooks['loginFormField'])]; - if ($last instanceof \Adminer\Adminer) { - $defaultServerPlugin = new DefaultServerPlugin($last); - $this->plugins[] = $defaultServerPlugin; - $last = $defaultServerPlugin; - } - })->call($adminer); - - return $adminer; - } + function adminer_object() { + /** + * Prefills the “Server”, "Driver", "DBName" fields with + * the ADMINER_DEFAULT_(SERVER,DRIVER,DBNAME) environment variables. + */ + final class DefaultServerPlugin extends \Adminer\Plugin { + public function __construct( + private \Adminer\Adminer $adminer + ) { } + + public function loginFormField(...$args) { + return (function (...$args) { + $field = $this->loginFormField(...$args); + + $defaultDbDriver = getenv('ADMINER_DEFAULT_DRIVER') ?: 'server'; + $defaultDbHost = getenv('ADMINER_DEFAULT_SERVER') ?: ''; + $defaultDb = getenv('ADMINER_DEFAULT_DBNAME') ?: ''; + + $defaultDbDriver = $defaultDbDriver == 'mysql' ? 'server' : $defaultDbDriver; + + return \str_replace( + [ + 'name="auth[server]" value="" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '"', + 'selected="">MySQL', + 'name="auth[db]" value=""' + ], + [ + 'name="auth[server]" value="' . $defaultDbHost . '" title="hostname[:port]"', + 'value="' . $defaultDbDriver . '" selected="selected"', + '>MySQL', + 'name="auth[db]" value="' . $defaultDb . '"' + ], + $field, + ); + })->call($this->adminer, ...$args); + } + } + + $plugins = []; + foreach (glob('plugins-enabled/*.php') as $plugin) { + $plugins[] = require($plugin); + } + + $adminer = new \Adminer\Plugins($plugins); + + (function () { + $last = &$this->hooks['loginFormField'][\array_key_last($this->hooks['loginFormField'])]; + if ($last instanceof \Adminer\Adminer) { + $defaultServerPlugin = new DefaultServerPlugin($last); + $this->plugins[] = $defaultServerPlugin; + $last = $defaultServerPlugin; + } + })->call($adminer); + + return $adminer; + } } namespace { - if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { - header('Content-Type: text/css'); - readfile('adminer.css'); - exit; - } + if (basename($_SERVER['DOCUMENT_URI'] ?? $_SERVER['REQUEST_URI']) === 'adminer.css' && is_readable('adminer.css')) { + header('Content-Type: text/css'); + readfile('adminer.css'); + exit; + } - function adminer_object() { - return \docker\adminer_object(); - } + function adminer_object() { + return \docker\adminer_object(); + } - require('adminer.php'); + require('adminer.php'); }