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

2
heimdall/config/.migrations Executable file
View File

@@ -0,0 +1,2 @@
01-nginx-site-confs-default
02-default-location

22
heimdall/config/keys/cert.crt Executable file
View File

@@ -0,0 +1,22 @@
-----BEGIN CERTIFICATE-----
MIIDsTCCApmgAwIBAgIUB5SMEqlvO75Mdp2q3mkdcUfsYXkwDQYJKoZIhvcNAQEL
BQAwaDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2Jh
ZDEXMBUGA1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVy
MQowCAYDVQQDDAEqMB4XDTIxMTEyMDEwMTY1M1oXDTMxMTExODEwMTY1M1owaDEL
MAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2JhZDEXMBUG
A1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVyMQowCAYD
VQQDDAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2VWGIt/JZHus
E7sZvdk6JkRfjrhG8FRPOGC4FwETNgCN8F6psNk0lOsCBXKzgr9NWCGoYCC9objg
xpaeq4r5/u+NQE2sKl62ZZFIiMndHADZtQyCe1sGoS2Fc9lGOFcAztt+3NIERqcX
OqlJLbMmvjnTYrk+QAUl+9WVyXkyUOZGci1EMQ4DxzMdkoQrtTcJ0B7Ho7M2DR+q
AbNh9Vrp/S0dhy01lmm4cE7bAgarF8mTem6nBdQ6fvnuqUVa0o7m36OhSNgekIbq
s8op91pWB12WIaIcTAB3ZPK5QcRpJ/hK07MISKKloorhE5h81VSC34oFHZNpZMrb
H90BDmRF0wIDAQABo1MwUTAdBgNVHQ4EFgQUbp8VDmWndREkce7etru5J1NfFFow
HwYDVR0jBBgwFoAUbp8VDmWndREkce7etru5J1NfFFowDwYDVR0TAQH/BAUwAwEB
/zANBgkqhkiG9w0BAQsFAAOCAQEAN6OufAIhlYHUc/VpP2aDnJ/0n1K2HxpW3nxO
B8S2NAky9psMRb/0DEGI3LOb8cchxYUPDbNeeqCV7u9+hWCjz4ut6dCpqBM3McHN
5VxSEkn/BArHmuadGSXc7iTNu65avFyZN2hWC+K/7KmAsN9fCdRRwMWT9faZh2zR
KpQcmydV+mAxn16MAnsgbISenjs5qrOX0IcL4InaF8pjNG7SqP0IRzTiPy4CQjcc
lBOpW0lBKKXHzEGYvcCpaiH0KjvKDcXYTSk2YvOaZuYZv7PKsISAWyw1eHbB80T1
4JZzWqzeJ7ir0mXisW28nEGcw4CvvecUDl8qpFI8rwGr4+5Idg==
-----END CERTIFICATE-----

28
heimdall/config/keys/cert.key Executable file
View File

@@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZVYYi38lke6wT
uxm92TomRF+OuEbwVE84YLgXARM2AI3wXqmw2TSU6wIFcrOCv01YIahgIL2huODG
lp6rivn+741ATawqXrZlkUiIyd0cANm1DIJ7WwahLYVz2UY4VwDO237c0gRGpxc6
qUktsya+OdNiuT5ABSX71ZXJeTJQ5kZyLUQxDgPHMx2ShCu1NwnQHsejszYNH6oB
s2H1Wun9LR2HLTWWabhwTtsCBqsXyZN6bqcF1Dp++e6pRVrSjubfo6FI2B6Qhuqz
yin3WlYHXZYhohxMAHdk8rlBxGkn+ErTswhIoqWiiuETmHzVVILfigUdk2lkytsf
3QEOZEXTAgMBAAECggEBAMW3JVlypz+PtwMYMpnhFiKcDybChF69BHjwnGjpJHX7
WSV0qQFnCIv1pBgaui5XJODpdclF395RV8OyYNUEkNwZSDJYtyiwk1ShMBCpPEru
hyBLKiVYsRZOWFsFLfmxRN3rF2WCdjtkZSCLwzQdCEEEUEc+6N/LDzwkmaj5Zgnr
VrpzeSWM4pMlK9l0viv4tlqcUfNW0Mnn5l3Rrg3SCl5i0M83sR1LMrtr2s8r5KIj
oEot6YjnHtf61YfEGQquxmhMm8rsgYWguf4d7ZEP0qqh4AmArqLJR7oBldCwPqa6
7jcfD9csf6GmPEXJFYdfELUsKrSm8sOCicTreGvLVrECgYEA7V/La9EVxionYzLX
tUdWbbez5INsi4anhXQwye9qfjU3Pbit47GIPOtLuwGZ0kauOBJeCV5DzuDCQRBw
AI+dxPRhj6nldHLg59fmXOnj5kwkzhPWqDzAz1zr5X7XGHx3qs8PhVO7WOlsTdP9
94FxleR5drYvig31lHaAYclVnxkCgYEA6mMtdVsPzwooCF87sS/H9kWr0dy6Jry5
AOt5p5uFfwulnkHru3uR6gfMaramjDcqMc4Ibt/f1uKSW0Cfl0Oo5ui7tz0XVxPh
CQRUP4MddjM7GxcAd9pvdyvNGi2rnC9WITJQmlo9YeZCt2KIM8CYEl2f9fQjQfhI
VvwOC1oUpcsCgYAhfwMVk8ueyxQDy4jk68wmb2XTOTh39+hrzJmV5VMBvECvVQA0
wTiYYBuvp+os4gxznSPn7oVjDBRdWhRz/9AjmtipjS/z3sId9TlsoxSlytjmu6Xu
16Pdnx8qo1t2+Rlp4Q4vokEtqsK9uMx9wKZmoHcDaXIL6SxeZtp28hJDAQKBgDjg
LiS/Hxvva/10FokNfildiK8ZL7a8ruvxOAka7Q8CJYM8ndZVyveOQuVWQx3dOQjy
5Qr6mleLjVZFXTSYf4Dg0sRJN8OymDXW7hanW1vWXK5bK4rp34h8gX2rvWvd9LmD
exmpciGyfVgAuepM/tneDDXjszaL6AnrigDpL/93AoGAJhoVBYQ20vBgTtwCvj5i
JJVsCOjEOvgpp012Q0Wg4ec7E+7FBimtVHkF/2qdcN0CpXx47RS8PfDOAVSEDS6a
+HMSZRRMfA/e4qApUEMohkQm9CoCno8C/ICDVsJ181GffZqgsnQ4uf3EDSFTGM8X
RcGOvwssGGgPx0Wp2O6gPIE=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,13 @@
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
+8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e
8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx
iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K
zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=
-----END DH PARAMETERS-----

View File

@@ -0,0 +1,98 @@
user abc;
worker_processes 4;
pid /run/nginx.pid;
include /etc/nginx/modules/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
client_max_body_size 0;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /config/log/nginx/access.log;
error_log /config/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##
#include /etc/nginx/naxsi_core.rules;
##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##
#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /config/nginx/site-confs/*.conf;
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
daemon off;

View File

@@ -0,0 +1,84 @@
## Version 2024/05/27 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample
### Based on alpine defaults
# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.20-stable
user abc;
# Set number of worker processes automatically based on number of CPU cores.
include /config/nginx/worker_processes.conf;
# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;
# Configures default error logger.
error_log /config/log/nginx/error.log;
# Includes files with directives to load dynamic modules.
include /etc/nginx/modules/*.conf;
# Include files with config snippets into the root context.
include /etc/nginx/conf.d/*.conf;
events {
# The maximum number of simultaneous connections that can be opened by
# a worker process.
worker_connections 1024;
}
http {
# Includes mapping of file name extensions to MIME types of responses
# and defines the default type.
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Name servers used to resolve names of upstream servers into addresses.
# It's also needed when using tcpsocket and udpsocket in Lua modules.
#resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
include /config/nginx/resolver.conf;
# Don't tell nginx version to the clients. Default is 'on'.
server_tokens off;
# Specifies the maximum accepted body size of a client request, as
# indicated by the request header Content-Length. If the stated content
# length is greater than this size, then the client receives the HTTP
# error code 413. Set to 0 to disable. Default is '1m'.
client_max_body_size 0;
# Sendfile copies data between one FD and other from within the kernel,
# which is more efficient than read() + write(). Default is off.
sendfile on;
# Causes nginx to attempt to send its HTTP response head in one packet,
# instead of using partial frames. Default is 'off'.
tcp_nopush on;
# all ssl related config moved to ssl.conf
# included in server blocks where listen 443 is defined
# Enable gzipping of responses.
#gzip on;
# Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
gzip_vary on;
# Helper variable for proxying websockets.
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
# Enable http2 by default for all servers
http2 on;
# Sets the path, format, and configuration for a buffered log write.
access_log /config/log/nginx/access.log;
# Includes virtual hosts configs.
include /etc/nginx/http.d/*.conf;
include /config/nginx/site-confs/*.conf;
}
daemon off;
pid /run/nginx.pid;

View File

@@ -0,0 +1,3 @@
# This file is auto-generated only on first start, based on the container's /etc/resolv.conf file. Feel free to modify it as you wish.
resolver 127.0.0.11 valid=30s;

View File

@@ -0,0 +1,43 @@
## Version 2018/03/06 - Changelog: https://github.com/linuxserver/docker-heimdall/commits/master/root/defaults/default
server {
listen 80 default_server;
listen 443 ssl;
root /app/www/public;
index index.php index.html index.htm;
server_name _;
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
client_max_body_size 0;
error_page 599 = @noauth;
location / {
if (!-f /config/nginx/.htpasswd) {
return 599;
}
auth_basic "Restricted";
auth_basic_user_file /config/nginx/.htpasswd;
try_files $uri $uri/ /index.php?$args;
}
location @noauth {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
# With php5-fpm:
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
}

View File

@@ -0,0 +1,44 @@
## Version 2024/07/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/site-confs/default.conf.sample
server {
listen 80 default_server;
listen [::]:80 default_server;
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
server_name _;
include /config/nginx/ssl.conf;
set $root /app/www/public;
if (!-d /app/www/public) {
set $root /config/www;
}
root $root;
index index.html index.htm index.php;
location / {
# enable for basic auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
try_files $uri $uri/ /index.html /index.htm /index.php$is_args$args;
}
location ~ ^(.+\.php)(.*)$ {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
fastcgi_split_path_info ^(.+\.php)(.*)$;
if (!-f $document_root$fastcgi_script_name) { return 404; }
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
}
# deny access to .htaccess/.htpasswd files
location ~ /\.ht {
deny all;
}
}

39
heimdall/config/nginx/ssl.conf Executable file
View File

@@ -0,0 +1,39 @@
## Version 2022/08/20 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
### Mozilla Recommendations
# generated 2022-08-05, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /config/nginx/dhparams.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
#add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
#ssl_stapling on;
#ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
#ssl_trusted_certificate /config/keys/cert.crt;
# Optional additional headers
#add_header Cache-Control "no-transform" always;
#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'";
#add_header Permissions-Policy "interest-cohort=()";
#add_header Referrer-Policy "same-origin" always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-Frame-Options "SAMEORIGIN" always;
#add_header X-UA-Compatible "IE=Edge" always;
#add_header X-XSS-Protection "1; mode=block" always;

View File

@@ -0,0 +1,39 @@
## Version 2023/08/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
### Mozilla Recommendations
# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration
# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7
ssl_certificate /config/keys/cert.crt;
ssl_certificate_key /config/keys/cert.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
ssl_dhparam /config/nginx/dhparams.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
#add_header Strict-Transport-Security "max-age=63072000" always;
# OCSP stapling
#ssl_stapling on;
#ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
#ssl_trusted_certificate /config/keys/cert.crt;
# Optional additional headers
#add_header Cache-Control "no-transform" always;
#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always;
#add_header Permissions-Policy "interest-cohort=()" always;
#add_header Referrer-Policy "same-origin" always;
#add_header X-Content-Type-Options "nosniff" always;
#add_header X-Frame-Options "SAMEORIGIN" always;
#add_header X-UA-Compatible "IE=Edge" always;
#add_header X-XSS-Protection "1; mode=block" always;

View File

@@ -0,0 +1,3 @@
# This file is auto-generated only on first start, based on the cpu cores detected. Feel free to change it to any other number or to auto to let nginx handle it automatically.
worker_processes 2;

View File

@@ -0,0 +1,3 @@
; Edit this file to override php.ini directives and restart the container
date.timezone = Europe/Paris

5
heimdall/config/php/www2.conf Executable file
View File

@@ -0,0 +1,5 @@
; Edit this file to override www.conf and php-fpm.conf directives and restart the container
; Pool name
[www]

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;
}
}

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