ajout heimdall

This commit is contained in:
2025-01-01 11:24:01 +01:00
parent f8be42e486
commit c52f60fca9
1477 changed files with 15692 additions and 0 deletions

31
heimdall/config/www/.env Executable file
View File

@@ -0,0 +1,31 @@
APP_NAME=Heimdall
APP_ENV=local
APP_KEY=base64:b4dz4c5W2PVJo6dxJJsE4PNo3JgK+K/M0MDHJ1qGHFY=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost
DB_CONNECTION=sqlite
DB_DATABASE=app.sqlite
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=database
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\AMP;
class AMP extends \App\SupportedApps {
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "65f59ec6b1ecd6170d5044474043cca9560a8071",
"name": "AMP",
"website": "https://cubecoders.com/AMP",
"license": "Proprietary",
"description": "AMP is short for Application Management Panel. It's our next-generation server administration software built for both users, and service providers. It supports both Windows and Linux based servers and allows you to manage all your game servers from a single web interface.",
"enhanced": false,
"tile_background": "light",
"icon": "amp.png"
}

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\AVMFritzbox;
class AVMFritzbox extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "e8354374b262e6f1055e7412d11f24a164a50f79",
"name": "AVM Fritzbox",
"website": "www.avm.de",
"license": "GNU General Public License v2.0 only",
"description": "\"The\" Fritzbox, stylised as FRITZ!Box, is a series of residential gateway devices produced by the German company AVM GmbH. \r\nFRITZ!OS is the FRITZ!Box operating system and can be easily controlled via your browser. User-friendly menus, easy-to-understand wizards, and the optional advanced mode come in handy in all scenarios.",
"enhanced": false,
"tile_background": "light",
"icon": "avmfritzbox.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,35 @@
<?php namespace App\SupportedApps\AWX;
class AWX extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
$test = parent::appTest($this->url('status'));
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$res = parent::execute($this->url('status'));
$details = json_decode($res->getBody());
$data = [];
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "47bf44c0ec908654f16bacf131107a5aac3ae7b4",
"name": "AWX",
"website": "https://github.com/ansible/awx",
"license": "Apache License 2.0",
"description": "AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is the upstream project for Tower, a commercial derivative of AWX.",
"enhanced": true,
"tile_background": "dark",
"icon": "awx.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,19 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.username') }}</label>
{!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }}</label>
{!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<ul class="livestats">
<li>
<span class="title">Queue</span>
<strong>{!! $queue_size !!}</strong>
</li>
<li>
<span class="title">Speed</span>
<strong>{!! $current_speed !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,52 @@
<?php namespace App\SupportedApps\AdGuardHome;
class AdGuardHome extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
$test = parent::appTest($this->url('/control/stats'));
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$res = parent::execute($this->url('/control/stats'));
$details = json_decode($res->getBody());
$data = [];
if($details) {
// format has been changed in AdguardHome v0.99.0
if (is_array($details->dns_queries)) {
$data['dns_queries'] = number_format(array_sum($details->dns_queries));
$data['blocked_filtering'] = number_format(array_sum($details->blocked_filtering));
} else {
$data['dns_queries'] = number_format($details->dns_queries);
$data['blocked_filtering'] = number_format($details->blocked_filtering);
}
}
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url);
$username = $this->config->username;
$password = $this->config->password;
$rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $api_url);
$rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
$rebuild_url = rtrim($rebuild_url, '/');
$api_url = $rebuild_url.$endpoint;
return $api_url;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "140902edbcc424c09736af28ab2de604c3bde936",
"name": "AdGuard Home",
"website": "https://github.com/AdguardTeam/AdGuardHome",
"license": "GNU General Public License v3.0 only",
"description": "AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that.\r\n\r\nIt operates as a DNS server that re-routes tracking domains to a \"black hole,\" thus preventing your devices from connecting to those servers. It's based on software we use for our public AdGuard DNS servers -- both share a lot of common code.",
"enhanced": true,
"tile_background": "light",
"icon": "adguardhome.png"
}

View File

@@ -0,0 +1,18 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.username') }}</label>
{!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }}</label>
{!! Form::password('config[password]', array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<ul class="livestats">
<li>
<span class="title">Queries</span>
<strong>{!! $dns_queries !!}</strong>
</li>
<li>
<span class="title">Blocked</span>
<strong>{!! $blocked_filtering !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Adminer;
class Adminer extends \App\SupportedApps
{
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "653caf8bdf55d6a99d77ceacd79f622353cd821a",
"name": "Adminer",
"website": "https://www.adminer.org",
"license": "Apache License 2.0",
"description": "Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Firebird, SimpleDB, Elasticsearch and MongoDB.",
"enhanced": false,
"tile_background": "light",
"icon": "adminer.svg"
}

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Airsonic;
class Airsonic extends \App\SupportedApps {
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "317f16f137fe0fd9eaf67dd6e203e50c0c1bf319",
"name": "Airsonic",
"website": "https://airsonic.github.io/",
"license": "GNU General Public License v3.0 only",
"description": "Airsonic is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work.",
"enhanced": false,
"tile_background": "dark",
"icon": "airsonic.png"
}

View File

@@ -0,0 +1,54 @@
<?php namespace App\SupportedApps\AlarmPI;
class AlarmPI extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
// $test = parent::appTest($this->url('getSensors.json'), $this->attrs);
$res = parent::execute($this->url('getSensors.json'), $this->attrs);
echo $res->getBody();
}
public function livestats()
{
$status = 'inactive';
$res = parent::execute($this->url('getSensors.json'), $this->attrs);
$details = json_decode($res->getBody());
$activesensors = 0;
foreach ($details->sensors as $key => $value) {
if ($value->enabled && $value->alert){
$activesensors += 1;
}
}
$data = [];
if ($details->triggered){
$alarmstatus = 'Intruder';
} else if ($details->alarmArmed){
$alarmstatus = 'Armed';
} else {
$alarmstatus = 'Disarmed';
}
$data['alarm_status'] = $alarmstatus;
$data['alarm_sensors'] = $activesensors;
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$this->attrs = ['auth'=> [$this->config->username, $this->config->password, 'Basic']];
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "4a1349c03398a3e66f6efdf6395fb689d80f83fa",
"name": "AlarmPI",
"website": "https://github.com/bkbilly/AlarmPI",
"license": "MIT License",
"description": "AlarmPI is a home security system based on Raspberry PI. It supports wired sensors (PIR, Magnetic etc.) and wireless through MQTT or Hikvision.",
"enhanced": true,
"tile_background": "dark",
"icon": "alarmpi.png"
}

View File

@@ -0,0 +1,19 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.username') }}</label>
{!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }}</label>
{!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<ul class="livestats">
<li>
<span class="title">Status</span>
<strong>{!! $alarm_status !!}</strong>
</li>
<li>
<span class="title">Sensors</span>
<strong>{!! $alarm_sensors !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Alertmanager;
class Alertmanager extends \App\SupportedApps {
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,10 @@
{
"appid": "9fe84adc4eb8248be3322c8754a0cf6219d122d6",
"name": "Alertmanager",
"website": "https://prometheus.io/docs/alerting/alertmanager/",
"license": "Apache License 2.0",
"description": "The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integrations such as email, PagerDuty, or OpsGenie. It also takes care of silencing and inhibition of alerts.",
"enhanced": false,
"tile_background": "light",
"icon": "alertmanager.png"
}

View File

@@ -0,0 +1,65 @@
<?php namespace App\SupportedApps\ArchiSteamFarm;
use Carbon\Carbon;
class ArchiSteamFarm extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
if(!isset($this->config->password))
{
echo "Invalid password";
return;
}
$test = parent::appTest($this->url('status?password='.$this->config->password));
echo $test->status;
}
public function livestats()
{
if(!isset($this->config->password))
return parent::getLiveStats("Inactive", []);
$status = 'inactive';
$res = parent::execute($this->url('api/bot/asf?password='.$this->config->password));
$details = json_decode($res->getBody());
$totalSecondsLeft = 0;
$cardToFarmLeft = 0;
foreach ($details->Result as $bot) {
foreach ($bot->CardsFarmer->GamesToFarm as $game) {
$cardToFarmLeft += $game->CardsRemaining;
}
if(preg_match("@([0-9].*).([0-9]+):([0-9]+):([0-9]+)@", $bot->CardsFarmer->TimeRemaining, $matches))
{
$totalSecondsLeft += $matches[1] * 24 * 60 * 60; // Days
$totalSecondsLeft += $matches[2] * 60 * 60; // Hours
$totalSecondsLeft += $matches[3] * 60; // Minutes
$totalSecondsLeft += $matches[4]; // Seconds
}
}
$d = Carbon::now();
$d->addSeconds($totalSecondsLeft);
$data = [
"time_left" => $d->diffForHumans(null, true, true, 3),
"cards_left" => $cardToFarmLeft,
];
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "7779bfb41003301f1b395c0691002423773d68c1",
"name": "ArchiSteamFarm",
"website": "https://github.com/JustArchiNET/ArchiSteamFarm",
"license": "Apache License 2.0",
"description": "ASF is a C# application with primary purpose of idling Steam cards from multiple accounts simultaneously. Unlike Idle Master which works only for one account at given time, while requiring Steam client running in the background and launching additional processes imitating \"game playing\" status, ASF doesn't require any Steam client running in the background, doesn't launch any additional processes and is made to handle unlimited Steam accounts at once. In addition to that, it's meant to be run on servers or other desktop-less machines, and features full cross-OS support, which makes it possible to launch on any operating system with .NET Core runtime, such as Windows, Linux and OS X. ASF is possible thanks to gigantic amount of work done in marvelous SteamKit2 library.\r\n\r\nToday, ASF is one of the most versatile Steam power tools, allowing you to make use of many features that were implemented over time. Apart from idling Steam cards, which remains the primary focus, ASF includes bunch of features on its own, such as a possibility to use it as Steam authenticator or chat logger. In addition to that, ASF includes plugin system, thanks to which anybody can further extend it to his/her needs.",
"enhanced": true,
"tile_background": "dark",
"icon": "archisteamfarm.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1,15 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }}</label>
{!! Form::text('config[password]', (isset($item) && isset($item->getconfig()->password) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<ul class="livestats">
@if(isset($time_left))
<li>
<span class="title">Time</span>
<strong>{{ $time_left }}</strong>
</li>
@else
<li>
<span class="title">Connection failed</span>
<strong></strong>
</li>
@endif
@if(isset($cards_left))
<li>
<span class="title">Cards</span>
<strong>{{ $cards_left }}</strong>
</li>
@endif
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\ArchiveBox;
class ArchiveBox extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "b74f349cf434a529c0fe8589315b5956a4562097",
"name": "ArchiveBox",
"website": "https://github.com/pirate/ArchiveBox",
"license": "MIT License",
"description": "The open-source self-hosted web archive. ArchiveBox takes a list of website URLs you want to archive, and creates a local, static, browsable HTML clone of the content from those websites (it saves HTML, JS, media files, PDFs, images and more).",
"enhanced": false,
"tile_background": "light",
"icon": "archivebox.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\ArchiveTeamWarrior;
class ArchiveTeamWarrior extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "5eef559f19eadb9593bafbd3ca6155dc6721a0d7",
"name": "ArchiveTeam Warrior",
"website": "https://www.archiveteam.org/index.php?title=ArchiveTeam_Warrior",
"license": "The Unlicense",
"description": "The Archive Team Warrior is a virtual archiving appliance. You can run it to help with the ArchiveTeam archiving efforts. It will download sites and upload them to their archive.",
"enhanced": false,
"tile_background": "light",
"icon": "archiveteamwarrior.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@@ -0,0 +1,93 @@
<?php namespace App\SupportedApps\AriaNg;
class AriaNg extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
$attrs = $this->newRequestAttrs('aria2.getVersion');
$test = parent::appTest($this->url('jsonrpc'), $attrs);
if ($test->code === 200) {
$data = json_decode($test->response);
if (isset($data->result) && isset($data->result->version)) {
$version = $data->result->version;
$test->status = "Connected to Aria2 v$version";
}
else {
$test->status ="Unknown Aria2 version";
}
}
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$attrs = $this->newRequestAttrs('aria2.getGlobalStat');
$res = parent::execute($this->url('jsonrpc'), $attrs);
if ($res == null) {
//Log::debug('Aria2 connection failed');
return '';
}
$details = json_decode($res->getBody());
if (!isset($details->result)) {
//Log::debug('Failed to fetch data from Aria2');
return '';
}
$downloadSpeed = $details->result->downloadSpeed;
$uploadSpeed = $details->result->uploadSpeed;
$active = $details->result->numActive;
$stopped = $details->result->numStopped;
$waiting = $details->result->numWaiting;
if ($active > 0) {
$status = 'active';
}
$data = [];
$data['download_rate'] = format_bytes($downloadSpeed, false, ' <span>', '/s</span>');
$data['upload_rate'] = format_bytes($uploadSpeed, false, ' <span>', '/s</span>');
$data['running_count'] = ($active + $waiting) ?? 0;
$data['stopped_count'] = $stopped ?? 0;
return parent::getLiveStats($status, $data);
}
private function newRequestAttrs($rpcMethod)
{
$body = [
'jsonrpc' => '2.0',
'id' => 'qwer',
'method' => $rpcMethod
];
if (isset($this->config->password)) {
$body['params'] = ['token:'.$this->config->password];
}
$attrs = [
'body' => json_encode($body),
'cookies' => $this->jar,
'headers' => ['Content-Type' => 'application/json', 'Accept' => 'application/json']
];
return $attrs;
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "a0f88a6334b03ff11dc56d1b627f122ccacb75ce",
"name": "AriaNg",
"website": "https://github.com/mayswind/AriaNg",
"license": "MIT License",
"description": "AriaNg is a modern web frontend making aria2 easier to use. AriaNg is written in pure html & javascript, thus it does not need any compilers or runtime environment. You can just put AriaNg in your web server and open it in your browser. AriaNg uses responsive layout, and supports any desktop or mobile devices.",
"enhanced": true,
"tile_background": "dark",
"icon": "ariang.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,14 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }} (http://HOST:PORT)</label>
{!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.password') }} (secret token)</label>
{!! Form::password('config[password]', (isset($item) ? $item->getconfig()->password: null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,4 @@
<ul class="livestats">
<li><span class="title">RUN: {{ $running_count}}</span><strong>{!! $download_rate !!}</strong></li>
<li><span class="title">DONE: {{ $stopped_count }}</span><strong>{!! $upload_rate !!}</strong></li>
</ul>

View File

@@ -0,0 +1,48 @@
<?php namespace App\SupportedApps\Artifactory;
class Artifactory extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
$attrs = [
'headers' => ['X-JFrog-Art-Api' => $this->config->apiKey]
];
echo $this->config->apiKey;
$test = parent::appTest($this->url('api/storageinfo'), $attrs);
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$attrs = [
'headers' => ['X-JFrog-Art-Api' => $this->config->apiKey]
];
$res = parent::execute($this->url('api/storageinfo'), $attrs);
$details = json_decode($res->getBody());
$data = [];
if($details) {
$data['artifacts_size'] = $details->binariesSummary->artifactsSize;
$data['artifacts_count'] = $details->binariesSummary->artifactsCount;
$status = 'active';
}
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "4950589b19623304e3adb649d9eee6a3bf70c35b",
"name": "Artifactory",
"website": "https://jfrog.com/open-source/",
"license": "MIT License",
"description": "Universal Repository Manager, OSS version",
"enhanced": true,
"tile_background": "light",
"icon": "artifactory.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@@ -0,0 +1,14 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>Api Key</label>
{!! Form::input('password', 'config[apiKey]', (isset($item) ? $item->getconfig()->apiKey : null), array('placeholder' => "Api Key", 'data-config' => 'apiKey', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<ul class="livestats">
<li>
<span class="title">Artifacts<br/>Size</span>
<strong>{!! $artifacts_size !!}</strong>
</li>
<li>
<span class="title">Artifacts<br/>Count</span>
<strong>{!! $artifacts_count !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\AsrockRackIPMI;
class AsrockRackIPMI extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "fa8a2fb9dfd946ec30d5e6b2ee69e24f8a252c5b",
"name": "Asrock Rack IPMI",
"website": "https://www.asrockrack.com/support/faq.de.asp?id=28",
"license": "Commercial",
"description": "Asrock Rack IPMI is an embedded server management technology by Asrock Rack.",
"enhanced": false,
"tile_background": "light",
"icon": "asrockrackipmi.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Bacula;
class Bacula extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "808ff47f28ddce2652860f5da59a4c62a7e285dd",
"name": "Bacula",
"website": "https://www.bacula.org/",
"license": "GNU Affero General Public License v3.0",
"description": "Bacula is a set of Open Source, computer programs that permit you (or the system administrator) to manage backup, recovery, and verification of computer data across a network of computers of different kinds.",
"enhanced": false,
"tile_background": "light",
"icon": "bacula.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Baikal;
class Baikal extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "2577aa56d31c9817a26e412e90d419f70ebc6353",
"name": "Baïkal",
"website": "https://sabre.io/baikal/",
"license": "GNU General Public License v3.0 only",
"description": "Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database.",
"enhanced": false,
"tile_background": "dark",
"icon": "baikal.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Bastillion;
class Bastillion extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "c07ac2e365e175d304c1cd409bcfc288ff18594f",
"name": "Bastillion",
"website": "https://www.bastillion.io",
"license": "GNU Affero General Public License v3.0 or later",
"description": "Bastillion is an open-source web-based SSH console that centrally manages administrative access to systems. A bastion host for administrators with features that promote infrastructure security, including key management and auditing.",
"enhanced": false,
"tile_background": "dark",
"icon": "bastillion.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,50 @@
<?php namespace App\SupportedApps\Bazarr;
class Bazarr extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function test()
{
$attrs = [
'headers' => ['Accept' => 'application/json']
];
$test = parent::appTest($this->url('systemstatus'), $attrs);
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$data = [];
$attrs = [
'headers' => ['Accept' => 'application/json']
];
$badges = json_decode(parent::execute($this->url('badges'), $attrs)->getBody());
$data = [];
if($badges) {
$data['movies'] = $badges->movies ?? 0;
$data['series'] = $badges->episodes ?? 0;
}
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).'api/'.$endpoint.'?apikey='.$this->config->apikey;
return $api_url;
}
}

View File

@@ -0,0 +1,27 @@
{
"appid": "085f0b437f9bf9c98bb68b745c8dcf323a7e0499",
"name": "Bazarr",
"website": "https://github.com/morpheus65535/bazarr",
"license": "GNU General Public License v3.0 only",
"description": "Bazarr is a companion application to Sonarr and Radarr. It manage and download subtitles based on your requirements. You defined your preferences by TV show or movies and Bazarr take care of everything for you.",
"enhanced": true,
"tile_background": "dark",
"icon": "bazarr.png",
"config": {
"type": "apikey",
"stat1": {
"name": "missing series",
"url": ":url:/api/episodes/wanted?apikey=:apikey:",
"key": "total",
"filter": "none",
"updateOnChange": "No"
},
"stat2": {
"name": "missing movies",
"url": ":url:/api/movies/wanted?apikey=:apikey:",
"key": "total",
"filter": "none",
"updateOnChange": "No"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -0,0 +1,15 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>{{ __('app.apps.apikey') }}</label>
{!! Form::text('config[apikey]', (isset($item) && isset($item->getconfig()->apikey) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<ul class="livestats">
<li>
<span class="title">Movies</span>
<strong>{!! $movies !!}</strong>
</li>
<li>
<span class="title">Episodes</span>
<strong>{!! $series !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Bitwarden;
class Bitwarden extends \App\SupportedApps
{
}

View File

@@ -0,0 +1,10 @@
{
"appid": "8a846dca305866d821748c007cf6b64adf00ea22",
"name": "Bitwarden",
"website": "https://bitwarden.com",
"license": "GNU Affero General Public License v3.0",
"description": "Open source password management solutions for individuals, teams, and business organizations.",
"enhanced": false,
"tile_background": "dark",
"icon": "bitwarden.svg"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Booksonic;
class Booksonic extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "091d3909d7e0bde850659125a13712c0122a6493",
"name": "Booksonic",
"website": "http://booksonic.org/",
"license": "GPL",
"description": "Booksonic is a server and an app for streaming your audiobooks to any pc or android phone. Most of the functionality is also available on other platforms that have apps for subsonic.",
"enhanced": false,
"tile_background": "dark",
"icon": "booksonic.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,65 @@
<?php namespace App\SupportedApps\Bookstack;
class Bookstack extends \App\SupportedApps implements \App\EnhancedApps {
public $config;
//protected $login_first = true; // Uncomment if api requests need to be authed first
//protected $method = 'POST'; // Uncomment if requests to the API should be set by POST
function __construct() {
//$this->jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
}
public function getHeaders()
{
$api_token = $this->config->api_token.":".$this->config->api_secret;
$attrs['headers'] = ['Authorization' => 'Token '.$api_token];
return $attrs;
}
public function test()
{
$test = parent::appTest($this->url('/api/shelves?count=0'), $this->getHeaders());
echo $test->status;
}
public function livestats()
{
$status = 'inactive';
$attrs = $this->getHeaders();
$data = ['visiblestats' => []];
foreach($this->config->availablestats as $stat) {
if (!isset(self::getAvailableStats()[$stat])) continue;
$res = parent::execute($this->url('/api/'.$stat.'?count=0'), $attrs);
$details = json_decode($res->getBody());
$newstat = new \stdClass();
$newstat->title = self::getAvailableStats()[$stat];
$newstat->value = isset($details->total) ? number_format($details->total) : 'N/A';
$data['visiblestats'][] = $newstat;
}
return parent::getLiveStats($status, $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
public static function getAvailableStats() {
return [
'shelves'=>'Shelves',
'books'=>'Books',
'chapters'=>'Chapters',
];
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "348c49dd03dddd418929316668d2e67bf2d9ae88",
"name": "Bookstack",
"website": "https://www.bookstackapp.com/",
"license": "MIT License",
"description": "BookStack is a simple, self-hosted, easy-to-use platform for organising and storing information.",
"enhanced": true,
"tile_background": "dark",
"icon": "bookstack.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,23 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', isset($item) ? ($item->getConfig()->override_url ?? null) : null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<label>Token ID</label>
{!! Form::text('config[api_token]', null, array('placeholder' => 'Token ID', 'data-config' => 'api_token', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>Token Secret</label>
{!! Form::text('config[api_secret]', null, array('placeholder' => 'Token Secret', 'data-config' => 'api_secret', 'class' => 'form-control config-item')) !!}
</div>
<div class="input">
<label>Stats to show</label>
{!! Form::select('config[availablestats][]', App\SupportedApps\Bookstack\Bookstack::getAvailableStats(), isset($item) ? ($item->getConfig()->availablestats ?? null) : null, array('multiple'=>'multiple')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,8 @@
<ul class="livestats">
@foreach ($visiblestats as $stat)
<li>
<span class="title">{!! $stat->title !!}</span>
<strong>{!! $stat->value !!}</strong>
</li>
@endforeach
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Box;
class Box extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "c7d8a6d722a1ec9a16fae165177c418d4fd63175",
"name": "Box",
"website": "box.com",
"license": "Commercial",
"description": "The company focuses on cloud content management and file sharing service for businesses.",
"enhanced": false,
"tile_background": "dark",
"icon": "box.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@@ -0,0 +1,7 @@
<?php
namespace App\SupportedApps\CUPS;
class CUPS extends \App\SupportedApps
{
}

View File

@@ -0,0 +1,10 @@
{
"appid": "ba8ed4dc9e438b22c9456a78a2c09652955be42c",
"name": "CUPS",
"website": "https://www.cups.org",
"license": "GNU General Public License v1.0 or later",
"description": "The standards-based, open source printing system developed by Apple for iOS®, iPadOS®, and macOS®. CUPS uses IPP Everywhere™ to support printing to local and network printers.",
"enhanced": false,
"tile_background": "light",
"icon": "cups.svg"
}

View File

@@ -0,0 +1,60 @@
<?php namespace App\SupportedApps\Cabot;
class Cabot extends \App\SupportedApps implements \App\EnhancedApps {
private const ENDPOINT = 'api/services/?format=json';
private const STATUS_PASSING = 'Passing';
private const STATUS_WARNING = 'Warning';
private const STATUS_ERROR = 'Error';
private const STATUS_CRITICAL = 'Critical';
public $config;
public function test()
{
$test = parent::appTest($this->url(self::ENDPOINT));
echo $test->status;
}
public function livestats()
{
$result = parent::execute($this->url(self::ENDPOINT));
$services = json_decode($result->getBody());
$results = [
self::STATUS_PASSING => 0,
self::STATUS_WARNING => 0,
self::STATUS_ERROR => 0,
self::STATUS_CRITICAL => 0,
];
foreach ($services as $service) {
$overallStatus = ucfirst(strtolower($service->overall_status ?? ''));
if (isset($results[$overallStatus])) {
$results[$overallStatus]++;
}
}
if ($results[self::STATUS_CRITICAL] > 0) {
$status = self::STATUS_CRITICAL;
} elseif ($results[self::STATUS_ERROR] > 0) {
$status = self::STATUS_ERROR;
} elseif ($results[self::STATUS_WARNING] > 0) {
$status = self::STATUS_WARNING;
} else {
$status = self::STATUS_PASSING;
}
$data['status_output'] = $status;
$data['count_output'] = $results[$status];
return parent::getLiveStats('inactive', $data);
}
public function url($endpoint)
{
$api_url = parent::normaliseurl($this->config->url).$endpoint;
return $api_url;
}
}

View File

@@ -0,0 +1,10 @@
{
"appid": "36cf09d76e7173b82ef23504aae37c05784b0215",
"name": "Cabot",
"website": "https://cabotapp.com",
"license": "MIT License",
"description": "Self-hosted watchdog for your websites and infrastructure.",
"enhanced": true,
"tile_background": "light",
"icon": "cabot.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,10 @@
<h2>{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')</h2>
<div class="items">
<div class="input">
<label>{{ strtoupper(__('app.url')) }}</label>
{!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
</div>
<div class="input">
<button style="margin-top: 32px;" class="btn test" id="test_config">Test</button>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<ul class="livestats">
<li>
<span class="title">Overall Status</span>
<strong>{!! $count_output !!} {!! $status_output !!}</strong>
</li>
</ul>

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\CalibreWeb;
class CalibreWeb extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "d0404064982ed19f24e76ca261e1fbb4d821c2a6",
"name": "CalibreWeb",
"website": "https://github.com/janeczku/calibre-web",
"license": "GNU General Public License v3.0",
"description": "Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.",
"enhanced": false,
"tile_background": "dark",
"icon": "calibreweb.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\Cardigann;
class Cardigann extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "9f2e2dd8217d1186f9ad484d91e009227efa5897",
"name": "Cardigann",
"website": "https://github.com/cardigann/cardigann",
"license": "MIT License",
"description": "A proxy server for adding new indexers to Sonarr, SickRage and other media managers",
"enhanced": false,
"tile_background": "light",
"icon": "cardigann.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\ChangeDetectionio;
class ChangeDetectionio extends \App\SupportedApps {
}

View File

@@ -0,0 +1,10 @@
{
"appid": "86c6a58798da154166de71097263f9c40804d636",
"name": "ChangeDetection.io",
"website": "https://changedetection.io",
"license": "Apache License 2.0",
"description": "Self-hosted change monitoring of web pages.\r\n\r\nKnow when web pages change! Stay ontop of new information!\r\n\r\nLive your data-life pro-actively instead of re-actively, do not rely on manipulative social media for consuming important information.",
"enhanced": false,
"tile_background": "dark",
"icon": "changedetectionio.png"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,5 @@
<?php namespace App\SupportedApps\CheckMK;
class CheckMK extends \App\SupportedApps {
}

Some files were not shown because too many files have changed in this diff Show More