From f43df1b3fef79017b820d3794f55b2c58d52ee8c Mon Sep 17 00:00:00 2001 From: HoneyBearTech <31805425+HoneyBearTech@users.noreply.github.com> Date: Fri, 23 Oct 2026 19:05:58 +0000 Subject: [PATCH 1/5] Optimize 2 SVG(s) --- Shoko/shoko.svg | 2 +- Verdaccio/verdaccio.svg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Shoko/shoko.svg b/Shoko/shoko.svg index f63e0b22c4..87ac7aa229 100644 --- a/Shoko/shoko.svg +++ b/Shoko/shoko.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Verdaccio/verdaccio.svg b/Verdaccio/verdaccio.svg index 8a98484a4a..37b7017f1e 100644 --- a/Verdaccio/verdaccio.svg +++ b/Verdaccio/verdaccio.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 56295249ffa775311f36f324b0fd1300447fcbed Mon Sep 17 00:00:00 2001 From: Sean <31805425+HoneyBearTech@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:07:56 -0500 Subject: [PATCH 2/5] Create app.json for Steerhouse configuration Added configuration for Steerhouse application. --- Steerhouse/app.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 Steerhouse/app.json diff --git a/Steerhouse/app.json b/Steerhouse/app.json new file mode 100644 index 0000000000..eb5003ab91 --- /dev/null +++ b/Steerhouse/app.json @@ -0,0 +1,10 @@ +{ + "appid": "422c6bf3a19cca6e7c2e59a393b1838cca9bb6e9", + "name": "Steerhouse", + "website": "https://github.com/HoneyBearTech/Steerhouse", + "license": "MIT License", + "description": "Self-hosted web UI and API for running Ansible playbooks, with per-project access control, isolated workers and a full audit trail.", + "enhanced": true, + "tile_background": "dark", + "icon": "steerhouse.svg" +} From c3e40b3110e1da84a70cd20aa212535b4558e308 Mon Sep 17 00:00:00 2001 From: Sean <31805425+HoneyBearTech@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:08:42 -0500 Subject: [PATCH 3/5] Add files via upload --- Steerhouse/Steerhouse.php | 68 ++++++++++++++++++++++++++++++++++ Steerhouse/config.blade.php | 31 ++++++++++++++++ Steerhouse/livestats.blade.php | 14 +++++++ 3 files changed, 113 insertions(+) create mode 100644 Steerhouse/Steerhouse.php create mode 100644 Steerhouse/config.blade.php create mode 100644 Steerhouse/livestats.blade.php diff --git a/Steerhouse/Steerhouse.php b/Steerhouse/Steerhouse.php new file mode 100644 index 0000000000..6356dda4f3 --- /dev/null +++ b/Steerhouse/Steerhouse.php @@ -0,0 +1,68 @@ +url('api/stats'), $this->getAttrs()); + echo $test->status; + } + + public function livestats() + { + $status = 'inactive'; + $data = [ + 'running' => 0, + 'queued' => 0, + 'failed' => 0, + ]; + + // GET /api/stats returns counts only, e.g. {"queued": 0, "running": 2, "succeeded_24h": 14, + // "failed_24h": 1, "workers_online": 3}. execute() returns null when the connection fails; + // a bad key gets a 401 whose body has no counts, so the tile stays at zero and inactive. + $res = parent::execute($this->url('api/stats'), $this->getAttrs()); + if ($res !== null && $res->getStatusCode() === 200) { + $body = json_decode($res->getBody()); + if (isset($body->running, $body->queued, $body->failed_24h)) { + $data['running'] = (int) $body->running; + $data['queued'] = (int) $body->queued; + $data['failed'] = (int) $body->failed_24h; + // Refresh every 5 seconds while runs are waiting or in progress, else every 30. + if ($data['running'] > 0 || $data['queued'] > 0) { + $status = 'active'; + } + } + } + + return parent::getLiveStats($status, $data); + } + + private function getAttrs() + { + // A "stats" API key from Projects -> API keys in Steerhouse: it can read these counts only. + $attrs = [ + 'headers' => [ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . ($this->config->apikey ?? ''), + ], + ]; + if (!empty($this->config->ignore_tls)) { + $attrs['verify'] = false; + } + return $attrs; + } + + public function url($endpoint) + { + $api_url = parent::normaliseurl($this->config->url) . $endpoint; + return $api_url; + } +} diff --git a/Steerhouse/config.blade.php b/Steerhouse/config.blade.php new file mode 100644 index 0000000000..51a673a866 --- /dev/null +++ b/Steerhouse/config.blade.php @@ -0,0 +1,31 @@ +

{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')

+
+
+ + {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!} +
+
+ + {!! Form::input('password', 'config[apikey]', isset($item) ? ($item->getconfig()->apikey ?? null) : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!} +
+
+ +
+ {!! Form::hidden('config[ignore_tls]', 0, ['class' => 'config-item', 'data-config' => 'ignore_tls']) !!} + +
+
+
+ +
+
diff --git a/Steerhouse/livestats.blade.php b/Steerhouse/livestats.blade.php new file mode 100644 index 0000000000..bb81f043fb --- /dev/null +++ b/Steerhouse/livestats.blade.php @@ -0,0 +1,14 @@ + From 3d69c0f227aaddad0edfb1971118d9edba8b7e0d Mon Sep 17 00:00:00 2001 From: Sean <31805425+HoneyBearTech@users.noreply.github.com> Date: Fri, 23 Oct 2026 14:10:44 -0500 Subject: [PATCH 4/5] Add files via upload --- Steerhouse/steerhouse.svg | 1 + 1 file changed, 1 insertion(+) create mode 100644 Steerhouse/steerhouse.svg diff --git a/Steerhouse/steerhouse.svg b/Steerhouse/steerhouse.svg new file mode 100644 index 0000000000..af2ce05a46 --- /dev/null +++ b/Steerhouse/steerhouse.svg @@ -0,0 +1 @@ + \ No newline at end of file From e66d0d1b5bf23cdc79f297da61a1a30df71edca5 Mon Sep 17 00:00:00 2001 From: HoneyBearTech <31805425+HoneyBearTech@users.noreply.github.com> Date: Fri, 23 Oct 2026 19:11:01 +0000 Subject: [PATCH 5/5] Optimize 1 SVG(s) --- Steerhouse/steerhouse.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Steerhouse/steerhouse.svg b/Steerhouse/steerhouse.svg index af2ce05a46..bc0cc5d3bd 100644 --- a/Steerhouse/steerhouse.svg +++ b/Steerhouse/steerhouse.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file