Phpserververmonitor > Service consultation > Add an not logged page to view statistics for a website or a service

[+] Allows to retrieve website or service by its own label instead of its ID.
[+] Add a specific AbstractConsultController for customizing some variables passed to the main template body.tpl.html
[+] Add Logo and name Openscop in the main navar but only for page module ConsultController.php
[+] Add some french translations for these features
This commit is contained in:
Martin Massé 2020-10-30 17:27:06 +01:00
parent 5c5d980bd3
commit 55da4cb9c6
13 changed files with 1103 additions and 452 deletions

1
.gitignore vendored
View File

@ -12,3 +12,4 @@ __MACOSX/
.DS_Store .DS_Store
.buildpath .buildpath
.settings/ .settings/
.ddev/

View File

@ -18,3 +18,9 @@ AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/x-javascript
</IfModule> </IfModule>
#Rule to avoid some characters in urls
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+[a-zàâäéèêëîïôöûüA-Z0-9-\-\'\$\*\µ\§\£\€\:\(\)\,\;\.\!\<\^\{\}\°]+)$ ?mod=consult&action=view&ip=$1 [QSA,L]

314
composer.lock generated
View File

@ -81,16 +81,16 @@
}, },
{ {
"name": "paragonie/random_compat", "name": "paragonie/random_compat",
"version": "v2.0.18", "version": "v2.0.19",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/paragonie/random_compat.git", "url": "https://github.com/paragonie/random_compat.git",
"reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db" "reference": "446fc9faa5c2a9ddf65eb7121c0af7e857295241"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/446fc9faa5c2a9ddf65eb7121c0af7e857295241",
"reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db", "reference": "446fc9faa5c2a9ddf65eb7121c0af7e857295241",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -126,7 +126,7 @@
"pseudorandom", "pseudorandom",
"random" "random"
], ],
"time": "2019-01-03T20:59:08+00:00" "time": "2020-10-15T10:06:57+00:00"
}, },
{ {
"name": "php-pushover/php-pushover", "name": "php-pushover/php-pushover",
@ -160,21 +160,22 @@
}, },
{ {
"name": "phpmailer/phpmailer", "name": "phpmailer/phpmailer",
"version": "v6.1.3", "version": "v6.1.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/PHPMailer/PHPMailer.git", "url": "https://github.com/PHPMailer/PHPMailer.git",
"reference": "a25ae38e03de4ee4031725498a600012364787c7" "reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/a25ae38e03de4ee4031725498a600012364787c7", "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
"reference": "a25ae38e03de4ee4031725498a600012364787c7", "reference": "917ab212fa00dc6eacbb26e8bc387ebe40993bc1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-ctype": "*", "ext-ctype": "*",
"ext-filter": "*", "ext-filter": "*",
"ext-hash": "*",
"php": ">=5.5.0" "php": ">=5.5.0"
}, },
"require-dev": { "require-dev": {
@ -218,7 +219,13 @@
} }
], ],
"description": "PHPMailer is a full-featured email creation and transfer class for PHP", "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
"time": "2019-11-21T09:37:46+00:00" "funding": [
{
"url": "https://github.com/synchro",
"type": "github"
}
],
"time": "2020-10-09T14:55:58+00:00"
}, },
{ {
"name": "psr/container", "name": "psr/container",
@ -271,16 +278,16 @@
}, },
{ {
"name": "symfony/config", "name": "symfony/config",
"version": "v3.4.36", "version": "v3.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/config.git", "url": "https://github.com/symfony/config.git",
"reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe" "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/a599a867d0e4a07c342b5f1e656b3915a540ddbe", "url": "https://api.github.com/repos/symfony/config/zipball/bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
"reference": "a599a867d0e4a07c342b5f1e656b3915a540ddbe", "reference": "bc6b3fd3930d4b53a60b42fe2ed6fc466b75f03f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -302,11 +309,6 @@
"symfony/yaml": "To use the yaml reference dumper" "symfony/yaml": "To use the yaml reference dumper"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Component\\Config\\": "" "Symfony\\Component\\Config\\": ""
@ -331,20 +333,34 @@
], ],
"description": "Symfony Config Component", "description": "Symfony Config Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-12-01T10:45:41+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-24T10:57:07+00:00"
}, },
{ {
"name": "symfony/dependency-injection", "name": "symfony/dependency-injection",
"version": "v3.4.36", "version": "v3.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/dependency-injection.git", "url": "https://github.com/symfony/dependency-injection.git",
"reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2" "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0d201916bfb3af939fec3c0c8815ea16c60ac1a2", "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
"reference": "0d201916bfb3af939fec3c0c8815ea16c60ac1a2", "reference": "51d2a2708c6ceadad84393f8581df1dcf9e5e84b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -373,11 +389,6 @@
"symfony/yaml": "" "symfony/yaml": ""
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Component\\DependencyInjection\\": "" "Symfony\\Component\\DependencyInjection\\": ""
@ -402,20 +413,34 @@
], ],
"description": "Symfony DependencyInjection Component", "description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-12-01T08:33:36+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-24T10:57:07+00:00"
}, },
{ {
"name": "symfony/event-dispatcher", "name": "symfony/event-dispatcher",
"version": "v3.4.36", "version": "v3.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/event-dispatcher.git", "url": "https://github.com/symfony/event-dispatcher.git",
"reference": "f9031c22ec127d4a2450760f81a8677fe8a10177" "reference": "31fde73757b6bad247c54597beef974919ec6860"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f9031c22ec127d4a2450760f81a8677fe8a10177", "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/31fde73757b6bad247c54597beef974919ec6860",
"reference": "f9031c22ec127d4a2450760f81a8677fe8a10177", "reference": "31fde73757b6bad247c54597beef974919ec6860",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -427,6 +452,7 @@
"require-dev": { "require-dev": {
"psr/log": "~1.0", "psr/log": "~1.0",
"symfony/config": "~2.8|~3.0|~4.0", "symfony/config": "~2.8|~3.0|~4.0",
"symfony/debug": "~3.4|~4.4",
"symfony/dependency-injection": "~3.3|~4.0", "symfony/dependency-injection": "~3.3|~4.0",
"symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0",
"symfony/stopwatch": "~2.8|~3.0|~4.0" "symfony/stopwatch": "~2.8|~3.0|~4.0"
@ -436,11 +462,6 @@
"symfony/http-kernel": "" "symfony/http-kernel": ""
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Component\\EventDispatcher\\": "" "Symfony\\Component\\EventDispatcher\\": ""
@ -465,20 +486,34 @@
], ],
"description": "Symfony EventDispatcher Component", "description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-10-24T15:33:53+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-24T10:57:07+00:00"
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v3.4.36", "version": "v3.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2" "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/00cdad0936d06fab136944bc2342b762b1c3a4a2", "url": "https://api.github.com/repos/symfony/filesystem/zipball/e58d7841cddfed6e846829040dca2cca0ebbbbb3",
"reference": "00cdad0936d06fab136944bc2342b762b1c3a4a2", "reference": "e58d7841cddfed6e846829040dca2cca0ebbbbb3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -486,11 +521,6 @@
"symfony/polyfill-ctype": "~1.8" "symfony/polyfill-ctype": "~1.8"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Component\\Filesystem\\": "" "Symfony\\Component\\Filesystem\\": ""
@ -515,20 +545,34 @@
], ],
"description": "Symfony Filesystem Component", "description": "Symfony Filesystem Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-11-25T16:36:22+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-24T10:57:07+00:00"
}, },
{ {
"name": "symfony/http-foundation", "name": "symfony/http-foundation",
"version": "v3.4.36", "version": "v3.4.46",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/http-foundation.git", "url": "https://github.com/symfony/http-foundation.git",
"reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593" "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/d2d0cfe8e319d9df44c4cca570710fcf221d4593", "url": "https://api.github.com/repos/symfony/http-foundation/zipball/b9885fcce6fe494201da4f70a9309770e9d13dc8",
"reference": "d2d0cfe8e319d9df44c4cca570710fcf221d4593", "reference": "b9885fcce6fe494201da4f70a9309770e9d13dc8",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -540,11 +584,6 @@
"symfony/expression-language": "~2.8|~3.0|~4.0" "symfony/expression-language": "~2.8|~3.0|~4.0"
}, },
"type": "library", "type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.4-dev"
}
},
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Symfony\\Component\\HttpFoundation\\": "" "Symfony\\Component\\HttpFoundation\\": ""
@ -569,24 +608,38 @@
], ],
"description": "Symfony HttpFoundation Component", "description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"time": "2019-11-28T12:52:59+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-24T10:57:07+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
"version": "v1.13.1", "version": "v1.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git", "url": "https://github.com/symfony/polyfill-ctype.git",
"reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3" "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
"reference": "f8f0b461be3385e56d6de3dbb5a0df24c0c275e3", "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.3" "php": ">=7.1"
}, },
"suggest": { "suggest": {
"ext-ctype": "For best performance" "ext-ctype": "For best performance"
@ -594,7 +647,11 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.13-dev" "dev-main": "1.20-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -627,24 +684,38 @@
"polyfill", "polyfill",
"portable" "portable"
], ],
"time": "2019-11-27T13:56:44+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-23T14:02:19+00:00"
}, },
{ {
"name": "symfony/polyfill-mbstring", "name": "symfony/polyfill-mbstring",
"version": "v1.13.1", "version": "v1.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git", "url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "7b4aab9743c30be783b73de055d24a39cf4b954f" "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7b4aab9743c30be783b73de055d24a39cf4b954f", "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
"reference": "7b4aab9743c30be783b73de055d24a39cf4b954f", "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.3.3" "php": ">=7.1"
}, },
"suggest": { "suggest": {
"ext-mbstring": "For best performance" "ext-mbstring": "For best performance"
@ -652,7 +723,11 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.13-dev" "dev-main": "1.20-dev"
},
"thanks": {
"name": "symfony/polyfill",
"url": "https://github.com/symfony/polyfill"
} }
}, },
"autoload": { "autoload": {
@ -686,42 +761,48 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2019-11-27T14:18:11+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-23T14:02:19+00:00"
}, },
{ {
"name": "symfony/polyfill-php70", "name": "symfony/polyfill-php70",
"version": "v1.13.1", "version": "v1.20.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/polyfill-php70.git", "url": "https://github.com/symfony/polyfill-php70.git",
"reference": "af23c7bb26a73b850840823662dda371484926c4" "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/af23c7bb26a73b850840823662dda371484926c4", "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/5f03a781d984aae42cebd18e7912fa80f02ee644",
"reference": "af23c7bb26a73b850840823662dda371484926c4", "reference": "5f03a781d984aae42cebd18e7912fa80f02ee644",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"paragonie/random_compat": "~1.0|~2.0|~9.99", "php": ">=7.1"
"php": ">=5.3.3"
}, },
"type": "library", "type": "metapackage",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.13-dev" "dev-main": "1.20-dev"
}
},
"autoload": {
"psr-4": {
"Symfony\\Polyfill\\Php70\\": ""
}, },
"files": [ "thanks": {
"bootstrap.php" "name": "symfony/polyfill",
], "url": "https://github.com/symfony/polyfill"
"classmap": [ }
"Resources/stubs"
]
}, },
"notification-url": "https://packagist.org/downloads/", "notification-url": "https://packagist.org/downloads/",
"license": [ "license": [
@ -745,35 +826,48 @@
"portable", "portable",
"shim" "shim"
], ],
"time": "2019-11-27T13:56:44+00:00" "funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-10-23T14:02:19+00:00"
}, },
{ {
"name": "twig/twig", "name": "twig/twig",
"version": "v1.42.4", "version": "v1.44.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/twigphp/Twig.git", "url": "https://github.com/twigphp/Twig.git",
"reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152" "reference": "04b15d4c0bb18ddbf82626320ac07f6a73f199c9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/twigphp/Twig/zipball/e587180584c3d2d6cb864a0454e777bb6dcb6152", "url": "https://api.github.com/repos/twigphp/Twig/zipball/04b15d4c0bb18ddbf82626320ac07f6a73f199c9",
"reference": "e587180584c3d2d6cb864a0454e777bb6dcb6152", "reference": "04b15d4c0bb18ddbf82626320ac07f6a73f199c9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=5.5.0", "php": ">=7.2.5",
"symfony/polyfill-ctype": "^1.8" "symfony/polyfill-ctype": "^1.8"
}, },
"require-dev": { "require-dev": {
"psr/container": "^1.0", "psr/container": "^1.0",
"symfony/debug": "^3.4|^4.2", "symfony/phpunit-bridge": "^4.4.9|^5.0.9"
"symfony/phpunit-bridge": "^4.4@dev|^5.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-master": "1.42-dev" "dev-master": "1.44-dev"
} }
}, },
"autoload": { "autoload": {
@ -797,7 +891,6 @@
}, },
{ {
"name": "Twig Team", "name": "Twig Team",
"homepage": "https://twig.symfony.com/contributors",
"role": "Contributors" "role": "Contributors"
}, },
{ {
@ -811,7 +904,17 @@
"keywords": [ "keywords": [
"templating" "templating"
], ],
"time": "2019-11-11T16:49:32+00:00" "funding": [
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/twig/twig",
"type": "tidelift"
}
],
"time": "2020-10-27T19:22:48+00:00"
} }
], ],
"packages-dev": [], "packages-dev": [],
@ -828,5 +931,6 @@
"ext-pdo": "*", "ext-pdo": "*",
"ext-xml": "*" "ext-xml": "*"
}, },
"platform-dev": [] "platform-dev": [],
"plugin-api-version": "1.1.0"
} }

View File

@ -12,6 +12,7 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/sc
<parameter>module.server</parameter> <parameter>module.server</parameter>
<parameter>module.user</parameter> <parameter>module.user</parameter>
<parameter>module.install</parameter> <parameter>module.install</parameter>
<parameter>module.consult</parameter>
</parameter> </parameter>
<parameter key="path.src" type="constant">PSM_PATH_SRC</parameter> <parameter key="path.src" type="constant">PSM_PATH_SRC</parameter>
@ -31,6 +32,7 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/sc
<service id="module.server" class="psm\Module\Server\ServerModule" /> <service id="module.server" class="psm\Module\Server\ServerModule" />
<service id="module.user" class="psm\Module\User\UserModule" /> <service id="module.user" class="psm\Module\User\UserModule" />
<service id="module.install" class="psm\Module\Install\InstallModule" /> <service id="module.install" class="psm\Module\Install\InstallModule" />
<service id="module.consult" class="psm\Module\Consult\ConsultModule" />
<!--MODULES end--> <!--MODULES end-->
<!--SERVICES start--> <!--SERVICES start-->

View File

@ -34,295 +34,299 @@ $sm_lang = array(
'1' => 'fr_FR', '1' => 'fr_FR',
'2' => 'french', '2' => 'french',
), ),
'openscop' => array(
'title' => 'Openscop',
'consult_title' => 'Disponibilité de service'
),
'locale_tag' => 'fr', 'locale_tag' => 'fr',
'locale_dir' => 'ltr', 'locale_dir' => 'ltr',
'system' => array( 'system' => array(
'title' => 'Server Monitor', 'title' => 'Server Monitor',
'install' => 'Installer', 'install' => 'Installer',
'action' => 'Action', 'action' => 'Action',
'save' => 'Enregistrer', 'save' => 'Enregistrer',
'edit' => 'Editer', 'edit' => 'Editer',
'delete' => 'Supprimer', 'delete' => 'Supprimer',
'view' => 'Détails', 'view' => 'Détails',
'date' => 'Date', 'date' => 'Date',
'message' => 'Message', 'message' => 'Message',
'yes' => 'Oui', 'yes' => 'Oui',
'no' => 'Non', 'no' => 'Non',
'insert' => 'Nouveau', 'insert' => 'Nouveau',
'add_new' => 'Nouveau', 'add_new' => 'Nouveau',
'update_available' => 'Une nouvelle version ({version}) est disponible à l\'adresse <a 'update_available' => 'Une nouvelle version ({version}) est disponible à l\'adresse <a
href="https://github.com/phpservermon/phpservermon/releases/latest" target="_blank" href="https://github.com/phpservermon/phpservermon/releases/latest" target="_blank"
rel="noopener">http://www.phpservermonitor.org</a>.', rel="noopener">http://www.phpservermonitor.org</a>.',
'back_to_top' => 'Haut de page', 'back_to_top' => 'Haut de page',
'go_back' => 'Retour', 'go_back' => 'Retour',
'ok' => 'OK', 'ok' => 'OK',
'bad' => 'mauvais', 'bad' => 'mauvais',
'cancel' => 'Annuler', 'cancel' => 'Annuler',
'none' => 'Aucun', 'none' => 'Aucun',
'activate' => 'Activer', 'activate' => 'Activer',
'short_day_format' => 'Le %e %B', 'short_day_format' => 'Le %e %B',
'long_day_format' => 'Le %e %B %Y', 'long_day_format' => 'Le %e %B %Y',
'yesterday_format' => 'Hier à %kh%M', 'yesterday_format' => 'Hier à %kh%M',
'other_day_format' => '%A à %kh%M', 'other_day_format' => '%A à %kh%M',
'never' => 'Jamais', 'never' => 'Jamais',
'hours_ago' => 'Il y a %d heures', 'hours_ago' => 'Il y a %d heures',
'an_hour_ago' => 'Il y a une heure', 'an_hour_ago' => 'Il y a une heure',
'minutes_ago' => 'Il y a %d minutes', 'minutes_ago' => 'Il y a %d minutes',
'a_minute_ago' => 'Il y a une minute', 'a_minute_ago' => 'Il y a une minute',
'seconds_ago' => 'Il y a %d secondes', 'seconds_ago' => 'Il y a %d secondes',
'a_second_ago' => 'Il y a une seconde', 'a_second_ago' => 'Il y a une seconde',
'year' => 'année', 'year' => 'année',
'years' => 'années', 'years' => 'années',
'month' => 'mois', 'month' => 'mois',
'months' => 'mois', 'months' => 'mois',
'day' => 'jour', 'day' => 'jour',
'days' => 'jours', 'days' => 'jours',
'hour' => 'heure', 'hour' => 'heure',
'hours' => 'heures', 'hours' => 'heures',
'minute' => 'minute', 'minute' => 'minute',
'minutes' => 'minutes', 'minutes' => 'minutes',
'second' => 'seconde', 'second' => 'seconde',
'seconds' => 'secondes', 'seconds' => 'secondes',
'current' => 'actuel', 'current' => 'actuel',
'settings' => 'Paramètres', 'settings' => 'Paramètres',
'search' => 'Recherche', 'search' => 'Recherche',
), ),
'menu' => array( 'menu' => array(
'config' => 'Configuration', 'config' => 'Configuration',
'server' => 'Serveurs', 'server' => 'Serveurs',
'server_log' => 'Événements', 'server_log' => 'Événements',
'server_status' => 'États', 'server_status' => 'États',
'server_update' => 'Mise à jour', 'server_update' => 'Mise à jour',
'user' => 'Utilisateurs', 'user' => 'Utilisateurs',
'help' => 'Aide', 'help' => 'Aide',
), ),
'users' => array( 'users' => array(
'user' => 'Utilisateur', 'user' => 'Utilisateur',
'name' => 'Nom', 'name' => 'Nom',
'user_name' => 'Nom d\'utilisateur', 'user_name' => 'Nom d\'utilisateur',
'password' => 'Mot de passe', 'password' => 'Mot de passe',
'password_repeat' => 'Répéter le mot de passe', 'password_repeat' => 'Répéter le mot de passe',
'password_leave_blank' => 'Laisser vide pour ne pas le modifier', 'password_leave_blank' => 'Laisser vide pour ne pas le modifier',
'level' => 'Rôle', 'level' => 'Rôle',
'level_10' => 'Administrateur', 'level_10' => 'Administrateur',
'level_20' => 'Utilisateur', 'level_20' => 'Utilisateur',
'level_description' => 'Les <b>Administrateurs</b> ont un accès total. Ils peuvent gérer les serveurs, les 'level_description' => 'Les <b>Administrateurs</b> ont un accès total. Ils peuvent gérer les serveurs, les
utilisateurs et éditer la configuration globale.<br>Les <b>Utilisateurs</b> ne utilisateurs et éditer la configuration globale.<br>Les <b>Utilisateurs</b> ne
peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.', peuvent que voir et mettre à jour les serveurs qui leur ont été assignés.',
'mobile' => 'Téléphone', 'mobile' => 'Téléphone',
'email' => 'Email', 'email' => 'Email',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir <a 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir <a
href="https://pushover.net/" target="_blank">leur site web</a> pour plus href="https://pushover.net/" target="_blank">leur site web</a> pour plus
d\'informations.', d\'informations.',
'pushover_key' => 'Clé Pushover', 'pushover_key' => 'Clé Pushover',
'pushover_device' => 'Appareil Pushover', 'pushover_device' => 'Appareil Pushover',
'pushover_device_description' => 'Nom de l\'appareil auquel le message doit être envoyé. Laissez vide pour 'pushover_device_description' => 'Nom de l\'appareil auquel le message doit être envoyé. Laissez vide pour
l\'envoyer à tous les appareils.', l\'envoyer à tous les appareils.',
'telegram' => 'Telegram', 'telegram' => 'Telegram',
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> est une application de 'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> est une application de
messagerie instantanée qui facilite la réception de notification en temps réel. messagerie instantanée qui facilite la réception de notification en temps réel.
Lisez la <a href="http://docs.phpservermonitor.org/" Lisez la <a href="http://docs.phpservermonitor.org/"
target="_blank">documentation</a> pour obtenir plus d\'informations sur la target="_blank">documentation</a> pour obtenir plus d\'informations sur la
configuration de ce service.', configuration de ce service.',
'telegram_chat_id' => 'ID de conversation (Chat ID) Telegram', 'telegram_chat_id' => 'ID de conversation (Chat ID) Telegram',
'telegram_chat_id_description' => 'Les notifications seront envoyées à la conversation correspondante.', 'telegram_chat_id_description' => 'Les notifications seront envoyées à la conversation correspondante.',
'telegram_get_chat_id' => 'Cliquez ici pour obtenir votre ID de conversation (Chat ID)', 'telegram_get_chat_id' => 'Cliquez ici pour obtenir votre ID de conversation (Chat ID)',
'activate_telegram' => 'Activer les alertes Telegram', 'activate_telegram' => 'Activer les alertes Telegram',
'activate_telegram_description' => 'Permet aux notifications Telegram d\'être envoyée à la conversation 'activate_telegram_description' => 'Permet aux notifications Telegram d\'être envoyée à la conversation
spécifiée. Sans cette permission, Telegram ne nous autorise pas à vous spécifiée. Sans cette permission, Telegram ne nous autorise pas à vous
envoyer des notifications.', envoyer des notifications.',
'telegram_bot_username_found' => 'Le BOT a été trouvé&nbsp;!<br><a href="%s" target="_blank" 'telegram_bot_username_found' => 'Le BOT a été trouvé&nbsp;!<br><a href="%s" target="_blank"
rel="noopener"><button class="btn btn-primary">Étape suivante</button></a> rel="noopener"><button class="btn btn-primary">Étape suivante</button></a>
<br>Cela va ouvrir une conversation avec le BOT. Vous devez appuyer sur <br>Cela va ouvrir une conversation avec le BOT. Vous devez appuyer sur
\'/start\' ou le saisir.', \'/start\' ou le saisir.',
'telegram_bot_username_error_token' => '<b>401 - Unauthorized</b>. Assuez-vous que le Token API soit valide.', 'telegram_bot_username_error_token' => '<b>401 - Unauthorized</b>. Assuez-vous que le Token API soit valide.',
'telegram_bot_error' => 'Une erreur s\'est produite en tentant d\'activer les notifications Telegram&nbsp;: %s', 'telegram_bot_error' => 'Une erreur s\'est produite en tentant d\'activer les notifications Telegram&nbsp;: %s',
'delete_title' => 'Supprimer un utilisateur', 'delete_title' => 'Supprimer un utilisateur',
'delete_message' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur \'%1\'&nbsp;?', 'delete_message' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur \'%1\'&nbsp;?',
'deleted' => 'Utilisateur supprimé.', 'deleted' => 'Utilisateur supprimé.',
'updated' => 'Utilisateur mis à jour.', 'updated' => 'Utilisateur mis à jour.',
'inserted' => 'Utilisateur ajouté.', 'inserted' => 'Utilisateur ajouté.',
'profile' => 'Profil', 'profile' => 'Profil',
'profile_updated' => 'Votre profil a été mis à jour.', 'profile_updated' => 'Votre profil a été mis à jour.',
'error_user_name_bad_length' => 'Le nom d\'utilisateur doit avoir entre 2 et 64 caractères.', 'error_user_name_bad_length' => 'Le nom d\'utilisateur doit avoir entre 2 et 64 caractères.',
'error_user_name_invalid' => 'Le nom d\'utilisateur ne peut contenir que des caractères alphabétiques (a-z, 'error_user_name_invalid' => 'Le nom d\'utilisateur ne peut contenir que des caractères alphabétiques (a-z,
A-Z), des chiffres (0-9), points (.) ou underscore (_).', A-Z), des chiffres (0-9), points (.) ou underscore (_).',
'error_user_name_exists' => 'Ce nom d\'utilisateur existe déjà.', 'error_user_name_exists' => 'Ce nom d\'utilisateur existe déjà.',
'error_user_email_bad_length' => 'L\'adresse email doit avoir entre 5 et 255 caractères.', 'error_user_email_bad_length' => 'L\'adresse email doit avoir entre 5 et 255 caractères.',
'error_user_email_invalid' => 'L\'adresse email n\'est pas valide.', 'error_user_email_invalid' => 'L\'adresse email n\'est pas valide.',
'error_user_level_invalid' => 'Le rôle d\'utilisateur n\'est pas valide.', 'error_user_level_invalid' => 'Le rôle d\'utilisateur n\'est pas valide.',
'error_user_no_match' => 'L\'utilisateur n\'a pas été trouvé dans la base de données.', 'error_user_no_match' => 'L\'utilisateur n\'a pas été trouvé dans la base de données.',
'error_user_password_invalid' => 'Le mot de passe n\'est pas valide.', 'error_user_password_invalid' => 'Le mot de passe n\'est pas valide.',
'error_user_password_no_match' => 'Le mot de passe est incorrect.', 'error_user_password_no_match' => 'Le mot de passe est incorrect.',
), ),
'log' => array( 'log' => array(
'title' => 'Événements', 'title' => 'Événements',
'type' => 'Type', 'type' => 'Type',
'status' => 'État', 'status' => 'État',
'email' => 'Email', 'email' => 'Email',
'sms' => 'SMS', 'sms' => 'SMS',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
'telegram' => 'Telegram', 'telegram' => 'Telegram',
'no_logs' => 'Aucun événement', 'no_logs' => 'Aucun événement',
'clear' => 'Effacer les journaux', 'clear' => 'Effacer les journaux',
'delete_title' => 'Supprimer les journaux', 'delete_title' => 'Supprimer les journaux',
'delete_message' => 'Êtes-vous sûr de vouloir supprimer <b>tous</b> les journaux&nbsp;?', 'delete_message' => 'Êtes-vous sûr de vouloir supprimer <b>tous</b> les journaux&nbsp;?',
), ),
'servers' => array( 'servers' => array(
'server' => 'Serveur', 'server' => 'Serveur',
'status' => 'État', 'status' => 'État',
'label' => 'Nom', 'label' => 'Nom',
'domain' => 'Domaine/IP', 'domain' => 'Domaine/IP',
'timeout' => 'Délai d\'attente', 'timeout' => 'Délai d\'attente',
'timeout_description' => 'Nombre de secondes à attendre une réponse du serveur.', 'timeout_description' => 'Nombre de secondes à attendre une réponse du serveur.',
'authentication_settings' => 'Paramètres d\'authentification', 'authentication_settings' => 'Paramètres d\'authentification',
'optional' => 'Optionnel', 'optional' => 'Optionnel',
'website_username' => 'Nom d\'utilisateur', 'website_username' => 'Nom d\'utilisateur',
'website_username_description' => 'Nom d\'utilisateur pour accèder au site. (Seul l\'authentification Apache 'website_username_description' => 'Nom d\'utilisateur pour accèder au site. (Seul l\'authentification Apache
est supporté.)', est supporté.)',
'website_password' => 'Mot de passe', 'website_password' => 'Mot de passe',
'website_password_description' => 'Mot de passe pour accèder au site. Le mot de passe est cryptè dans la 'website_password_description' => 'Mot de passe pour accèder au site. Le mot de passe est cryptè dans la
base de donnée.', base de donnée.',
'fieldset_monitoring' => 'Monitoring', 'fieldset_monitoring' => 'Monitoring',
'fieldset_permissions' => 'Permissions', 'fieldset_permissions' => 'Permissions',
'permissions' => 'Les utilisateurs suivants pourront voir le serveur.', 'permissions' => 'Les utilisateurs suivants pourront voir le serveur.',
'port' => 'Port', 'port' => 'Port',
'custom_port' => 'Port personnalisé', 'custom_port' => 'Port personnalisé',
'popular_ports' => 'Ports courant', 'popular_ports' => 'Ports courant',
'request_method' => 'Type de requête', 'request_method' => 'Type de requête',
'custom_request_method' => 'Type de requête personalisée', 'custom_request_method' => 'Type de requête personalisée',
'popular_request_methods' => 'Type de requête prédéfinie', 'popular_request_methods' => 'Type de requête prédéfinie',
'post_field' => 'Champ POST', 'post_field' => 'Champ POST',
'post_field_description' => 'Les données qui seront envoyés en utilisant le type de requête choisi.', 'post_field_description' => 'Les données qui seront envoyés en utilisant le type de requête choisi.',
'please_select' => 'Veuillez choisir', 'please_select' => 'Veuillez choisir',
'type' => 'Type', 'type' => 'Type',
'type_website' => 'Site Web', 'type_website' => 'Site Web',
'type_service' => 'Service', 'type_service' => 'Service',
'type_ping' => 'Ping', 'type_ping' => 'Ping',
'pattern' => 'Rechercher un texte/motif', 'pattern' => 'Rechercher un texte/motif',
'pattern_description' => 'Si ce texte n\'est par retrouvé sur le site web, le serveur est marqué 'pattern_description' => 'Si ce texte n\'est par retrouvé sur le site web, le serveur est marqué
hors-service. Les expressions régulières sont autorisées.', hors-service. Les expressions régulières sont autorisées.',
'pattern_online' => 'Le texte indique que le site est', 'pattern_online' => 'Le texte indique que le site est',
'pattern_online_description' => 'En ligne&nbsp;: Si ce texte est trouvé sur le site internet, le serveur sera 'pattern_online_description' => 'En ligne&nbsp;: Si ce texte est trouvé sur le site internet, le serveur sera
considéré en ligne. Hors-ligne&nbsp;: Si ce texte n\'est pas trouvé sur le considéré en ligne. Hors-ligne&nbsp;: Si ce texte n\'est pas trouvé sur le
site, le serveur sera considéré hors-ligne.', site, le serveur sera considéré hors-ligne.',
'redirect_check' => 'La redirection vers un autre domaine est', 'redirect_check' => 'La redirection vers un autre domaine est',
'redirect_check_description' => 'Une redirection vers un autre domaine est généralement mauvais signe.', 'redirect_check_description' => 'Une redirection vers un autre domaine est généralement mauvais signe.',
'allow_http_status' => 'Autoriser les codes de status HTTP', 'allow_http_status' => 'Autoriser les codes de status HTTP',
'allow_http_status_description' => 'Marquer le serveur en ligne. Les codes de status HTTP inférieur à 400 'allow_http_status_description' => 'Marquer le serveur en ligne. Les codes de status HTTP inférieur à 400
sont considérés comme en ligne par défaut. Séparés les valeurs avec sont considérés comme en ligne par défaut. Séparés les valeurs avec
|.', |.',
'header_name' => 'Nom d\'en-têtes', 'header_name' => 'Nom d\'en-têtes',
'header_value' => 'Valeur d\'en-tête', 'header_value' => 'Valeur d\'en-tête',
'header_name_description' => 'Sensible à la casse.', 'header_name_description' => 'Sensible à la casse.',
'header_value_description' => 'Les expréssions régulières sont autorisées.', 'header_value_description' => 'Les expréssions régulières sont autorisées.',
'last_check' => 'Dernière vérification', 'last_check' => 'Dernière vérification',
'last_online' => 'Dernière fois OK', 'last_online' => 'Dernière fois OK',
'last_offline' => 'Dernière fois hors-ligne', 'last_offline' => 'Dernière fois hors-ligne',
'last_output' => 'Dernière sortie positive', 'last_output' => 'Dernière sortie positive',
'last_error' => 'Dernière erreur', 'last_error' => 'Dernière erreur',
'last_error_output' => 'Dernière erreur de sortie', 'last_error_output' => 'Dernière erreur de sortie',
'output' => 'Sortie', 'output' => 'Sortie',
'monitoring' => 'Surveillé', 'monitoring' => 'Surveillé',
'no_monitoring' => 'Non surveillé', 'no_monitoring' => 'Non surveillé',
'email' => 'Email', 'email' => 'Email',
'send_email' => 'Envoyer un email', 'send_email' => 'Envoyer un email',
'sms' => 'SMS', 'sms' => 'SMS',
'send_sms' => 'Envoyer un SMS', 'send_sms' => 'Envoyer un SMS',
'pushover' => 'Pushover', 'pushover' => 'Pushover',
'send_pushover' => 'Envoyer des notifications Pushover', 'send_pushover' => 'Envoyer des notifications Pushover',
'telegram' => 'Telegram', 'telegram' => 'Telegram',
'send_telegram' => 'Envoyer des notifications Telegram', 'send_telegram' => 'Envoyer des notifications Telegram',
'users' => 'Utilisateurs', 'users' => 'Utilisateurs',
'delete_title' => 'Supprimer un serveur', 'delete_title' => 'Supprimer un serveur',
'delete_message' => 'Êtes-vous sûr de vouloir supprimer le serveur \'%1\'&nbsp;?', 'delete_message' => 'Êtes-vous sûr de vouloir supprimer le serveur \'%1\'&nbsp;?',
'deleted' => 'Serveur supprimé.', 'deleted' => 'Serveur supprimé.',
'updated' => 'Serveur mis à jour.', 'updated' => 'Serveur mis à jour.',
'inserted' => 'Serveur ajouté.', 'inserted' => 'Serveur ajouté.',
'latency' => 'Temps de réponse', 'latency' => 'Temps de réponse',
'latency_max' => 'Temps de réponse maximum', 'latency_max' => 'Temps de réponse maximum',
'latency_min' => 'Temps de réponse minimum', 'latency_min' => 'Temps de réponse minimum',
'latency_avg' => 'Temps de réponse moyen', 'latency_avg' => 'Temps de réponse moyen',
'online' => 'en ligne', 'online' => 'en ligne',
'offline' => 'hors ligne', 'offline' => 'hors ligne',
'uptime' => 'Disponibilité', 'uptime' => 'Disponibilité',
'year' => 'Année', 'year' => 'Année',
'month' => 'Mois', 'month' => 'Mois',
'week' => 'Semaine', 'week' => 'Semaine',
'day' => 'Jour', 'day' => 'Jour',
'hour' => 'Heure', 'hour' => 'Heure',
'warning_threshold' => 'Seuil d\'alerte', 'warning_threshold' => 'Seuil d\'alerte',
'warning_threshold_description' => 'Nombre d\'échecs de connexion avant que le serveur soit marqué 'warning_threshold_description' => 'Nombre d\'échecs de connexion avant que le serveur soit marqué
hors-service.', hors-service.',
'chart_last_week' => 'La dernière semaine', 'chart_last_week' => 'La dernière semaine',
'chart_history' => 'Historique', 'chart_history' => 'Historique',
'chart_day_format' => '%d/%m/%Y', 'chart_day_format' => '%d/%m/%Y',
'chart_long_date_format' => '%d/%m/%Y %H:%M:%S', 'chart_long_date_format' => '%d/%m/%Y %H:%M:%S',
'chart_short_date_format' => '%d/%m %H:%M', 'chart_short_date_format' => '%d/%m %H:%M',
'chart_short_time_format' => '%H:%M', 'chart_short_time_format' => '%H:%M',
'warning_notifications_disabled_sms' => 'Les notifications SMS sont désactivées.', 'warning_notifications_disabled_sms' => 'Les notifications SMS sont désactivées.',
'warning_notifications_disabled_email' => 'Les notifications par email sont désactivées.', 'warning_notifications_disabled_email' => 'Les notifications par email sont désactivées.',
'warning_notifications_disabled_pushover' => 'Les notifications Pushover sont désactivées.', 'warning_notifications_disabled_pushover' => 'Les notifications Pushover sont désactivées.',
'warning_notifications_disabled_telegram' => 'Les notifications Telegram sont désactivées.', 'warning_notifications_disabled_telegram' => 'Les notifications Telegram sont désactivées.',
'error_server_no_match' => 'Serveur non trouvé.', 'error_server_no_match' => 'Serveur non trouvé.',
'error_server_label_bad_length' => 'Le nom doit avoir entre 1 et 255 caractères.', 'error_server_label_bad_length' => 'Le nom doit avoir entre 1 et 255 caractères.',
'error_server_ip_bad_length' => 'Domaine/IP doit avoir entre 1 et 255 caractères.', 'error_server_ip_bad_length' => 'Domaine/IP doit avoir entre 1 et 255 caractères.',
'error_server_ip_bad_service' => 'L\'adresse IP n\'est pas valide.', 'error_server_ip_bad_service' => 'L\'adresse IP n\'est pas valide.',
'error_server_ip_bad_website' => 'L\'URL du site web n\'est pas valide.', 'error_server_ip_bad_website' => 'L\'URL du site web n\'est pas valide.',
'error_server_type_invalid' => 'Le type de service sélectionné n\'est pas valide.', 'error_server_type_invalid' => 'Le type de service sélectionné n\'est pas valide.',
'error_server_warning_threshold_invalid' => 'Le seuil d\'alerte doit être un nombre entier supérieur à 0.', 'error_server_warning_threshold_invalid' => 'Le seuil d\'alerte doit être un nombre entier supérieur à 0.',
), ),
'config' => array( 'config' => array(
'general' => 'Général', 'general' => 'Général',
'language' => 'Langue', 'language' => 'Langue',
'show_update' => 'Vérifier les nouvelles mises à jour chaque semaine', 'show_update' => 'Vérifier les nouvelles mises à jour chaque semaine',
'password_encrypt_key' => 'Clée de cryptage des mots de passe', 'password_encrypt_key' => 'Clée de cryptage des mots de passe',
'password_encrypt_key_note' => 'Cette clée est utilisée pour crypter les mots de passe qui sont enregistrés 'password_encrypt_key_note' => 'Cette clée est utilisée pour crypter les mots de passe qui sont enregistrés
dans la base de donnée pour les serveurs qui requiert une authentification. dans la base de donnée pour les serveurs qui requiert une authentification.
Si la clé est modifié, les mots de passe enregistré ne seront plus Si la clé est modifié, les mots de passe enregistré ne seront plus
valide&nbsp;!', valide&nbsp;!',
'proxy' => 'Activer le proxy', 'proxy' => 'Activer le proxy',
'proxy_url' => 'URL du proxy', 'proxy_url' => 'URL du proxy',
'proxy_user' => 'Nom d\'utilisateur du proxy', 'proxy_user' => 'Nom d\'utilisateur du proxy',
'proxy_password' => 'Mot de passe du proxy', 'proxy_password' => 'Mot de passe du proxy',
'email_status' => 'Autoriser l\'envoi de mail', 'email_status' => 'Autoriser l\'envoi de mail',
'email_from_email' => 'Adresse de l\'expéditeur', 'email_from_email' => 'Adresse de l\'expéditeur',
'email_from_name' => 'Nom de l\'expéditeur', 'email_from_name' => 'Nom de l\'expéditeur',
'email_smtp' => 'Utiliser un serveur SMTP', 'email_smtp' => 'Utiliser un serveur SMTP',
'email_smtp_host' => 'Adresse serveur SMTP', 'email_smtp_host' => 'Adresse serveur SMTP',
'email_smtp_port' => 'Port SMTP', 'email_smtp_port' => 'Port SMTP',
'email_smtp_security' => 'Protocole de sécurité SMTP', 'email_smtp_security' => 'Protocole de sécurité SMTP',
'email_smtp_security_none' => 'Aucun', 'email_smtp_security_none' => 'Aucun',
'email_smtp_username' => 'Nom utilisateur SMTP', 'email_smtp_username' => 'Nom utilisateur SMTP',
'email_smtp_password' => 'Mot de passe SMTP', 'email_smtp_password' => 'Mot de passe SMTP',
'email_smtp_noauth' => 'Laisser vide si pas d\'authentication', 'email_smtp_noauth' => 'Laisser vide si pas d\'authentication',
'sms_status' => 'Autoriser l\'envoi de SMS', 'sms_status' => 'Autoriser l\'envoi de SMS',
'sms_gateway' => 'Passerelle à utiliser pour l\'envoi de SMS', 'sms_gateway' => 'Passerelle à utiliser pour l\'envoi de SMS',
'sms_gateway_username' => 'Nom utilisateur de la passerelle', 'sms_gateway_username' => 'Nom utilisateur de la passerelle',
'sms_gateway_password' => 'Mot de passe de la passerelle', 'sms_gateway_password' => 'Mot de passe de la passerelle',
'sms_from' => 'SMS de l\'expéditeur', 'sms_from' => 'SMS de l\'expéditeur',
'pushover_status' => 'Autoriser l\'envoi des messages Pushover', 'pushover_status' => 'Autoriser l\'envoi des messages Pushover',
'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir <a 'pushover_description' => 'Pushover est un service qui simplifie les notifications en temps réel. Voir <a
href="https://pushover.net/" target="_blank">leur site web</a> pour plus href="https://pushover.net/" target="_blank">leur site web</a> pour plus
d\'informations.', d\'informations.',
'pushover_clone_app' => 'Cliquez ici pour créer votre application Pushover', 'pushover_clone_app' => 'Cliquez ici pour créer votre application Pushover',
'pushover_api_token' => 'Jeton application Pushover', 'pushover_api_token' => 'Jeton application Pushover',
'pushover_api_token_description' => 'Avant de pouvoir utiliser Pushover, vous devez <a href="%1$s" 'pushover_api_token_description' => 'Avant de pouvoir utiliser Pushover, vous devez <a href="%1$s"
target="_blank" rel="noopener">créer une application</a> sur leur site target="_blank" rel="noopener">créer une application</a> sur leur site
web et entrer ici le jeton (Token) de l\'application.', web et entrer ici le jeton (Token) de l\'application.',
'telegram_status' => 'Autorise l\'envoi de message Telegram', 'telegram_status' => 'Autorise l\'envoi de message Telegram',
'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> est une application de 'telegram_description' => '<a href="https://telegram.org/" target="_blank">Telegram</a> est une application de
messagerie instantanée qui facilite la réception de notification en temps réel. messagerie instantanée qui facilite la réception de notification en temps réel.
Lisez la <a href="http://docs.phpservermonitor.org/" Lisez la <a href="http://docs.phpservermonitor.org/"
target="_blank">documentation</a> pour obtenir plus d\'informations sur la target="_blank">documentation</a> pour obtenir plus d\'informations sur la
configuration de ce service.', configuration de ce service.',
'telegram_api_token' => 'Token API Telegram', 'telegram_api_token' => 'Token API Telegram',
'telegram_api_token_description' => 'Afin de pouvoir utiliser Telegram, il vous faut obtenir un token api. 'telegram_api_token_description' => 'Afin de pouvoir utiliser Telegram, il vous faut obtenir un token api.
Consultez la <a href="http://docs.phpservermonitor.org/" Consultez la <a href="http://docs.phpservermonitor.org/"
target="_blank">documentation</a> pour obtenir de l\'aide.', target="_blank">documentation</a> pour obtenir de l\'aide.',
'alert_type' => 'Choisissez quand vous souhaitez être notifié', 'alert_type' => 'Choisissez quand vous souhaitez être notifié',
'alert_type_description' => '<b>Changement d\'état&nbsp;: </b>Vous recevez une notification chaque fois que 'alert_type_description' => '<b>Changement d\'état&nbsp;: </b>Vous recevez une notification chaque fois que
le serveur change d\'état. C\'est-à-dire passe de l\'état OK à HORS SERVICE le serveur change d\'état. C\'est-à-dire passe de l\'état OK à HORS SERVICE
ou de HORS SERVICE à OK.<br><br><b>Hors service&nbsp;: </b>Vous ne recevez une ou de HORS SERVICE à OK.<br><br><b>Hors service&nbsp;: </b>Vous ne recevez une
notification que quand le serveur passe de l\'état OK à HORS SERVICE. Par notification que quand le serveur passe de l\'état OK à HORS SERVICE. Par
@ -331,145 +335,145 @@ $sm_lang = array(
6 heures du matin.Vous ne recevez qu\'une seule notification à 1 heure du 6 heures du matin.Vous ne recevez qu\'une seule notification à 1 heure du
matin.<br><br><b>Toujours&nbsp;: </b>Vous recevez une notification à chaque matin.<br><br><b>Toujours&nbsp;: </b>Vous recevez une notification à chaque
exécution de la tâche planifiée si le serveur est à l\'état HORS SERVICE ', exécution de la tâche planifiée si le serveur est à l\'état HORS SERVICE ',
'alert_type_status' => 'Changement d\'état', 'alert_type_status' => 'Changement d\'état',
'alert_type_offline' => 'Hors service', 'alert_type_offline' => 'Hors service',
'alert_type_always' => 'Toujours', 'alert_type_always' => 'Toujours',
'combine_notifications' => 'Combiner les notifications', 'combine_notifications' => 'Combiner les notifications',
'combine_notifications_description' => 'Réduit le nombre de notifications en les combinant toutes en une 'combine_notifications_description' => 'Réduit le nombre de notifications en les combinant toutes en une
seule. (Cela ne s\'applique pas aux SMS.)', seule. (Cela ne s\'applique pas aux SMS.)',
'alert_proxy' => 'Le serveur proxy n\'est jamais utilisé pour les services, même quand celui-ci est activé.', 'alert_proxy' => 'Le serveur proxy n\'est jamais utilisé pour les services, même quand celui-ci est activé.',
'alert_proxy_url' => 'Format&nbsp;: hôte:port', 'alert_proxy_url' => 'Format&nbsp;: hôte:port',
'log_status' => 'Etat des événements', 'log_status' => 'Etat des événements',
'log_status_description' => 'Si l\'option est activée, un événement est enregistré chaque fois qu\'une 'log_status_description' => 'Si l\'option est activée, un événement est enregistré chaque fois qu\'une
notification a lieu.', notification a lieu.',
'log_email' => 'Enregistrer tous les emails envoyés', 'log_email' => 'Enregistrer tous les emails envoyés',
'log_sms' => 'Enregistrer tous les SMS envoyés', 'log_sms' => 'Enregistrer tous les SMS envoyés',
'log_pushover' => 'Enregistrer tous les messages Pushover envoyés', 'log_pushover' => 'Enregistrer tous les messages Pushover envoyés',
'log_telegram' => 'Enregistrer tous les messages Telegram envoyés', 'log_telegram' => 'Enregistrer tous les messages Telegram envoyés',
'updated' => 'La configuration a été mise à jour.', 'updated' => 'La configuration a été mise à jour.',
'tab_email' => 'Email', 'tab_email' => 'Email',
'tab_sms' => 'SMS', 'tab_sms' => 'SMS',
'tab_pushover' => 'Pushover', 'tab_pushover' => 'Pushover',
'tab_telegram' => 'Telegram', 'tab_telegram' => 'Telegram',
'settings_email' => 'Configuration email', 'settings_email' => 'Configuration email',
'settings_sms' => 'Configuration SMS', 'settings_sms' => 'Configuration SMS',
'settings_pushover' => 'Configuration Pushover', 'settings_pushover' => 'Configuration Pushover',
'settings_telegram' => 'Configuration Telegram', 'settings_telegram' => 'Configuration Telegram',
'settings_notification' => 'Configuration des notifications', 'settings_notification' => 'Configuration des notifications',
'settings_log' => 'Configuration des événements', 'settings_log' => 'Configuration des événements',
'settings_proxy' => 'Configuration du proxy', 'settings_proxy' => 'Configuration du proxy',
'auto_refresh' => 'Auto-rachaîchissement', 'auto_refresh' => 'Auto-rachaîchissement',
'auto_refresh_description' => 'Auto-rachaîchissement de la page serveurs.<br><span class="small">Temps en 'auto_refresh_description' => 'Auto-rachaîchissement de la page serveurs.<br><span class="small">Temps en
secondes. Si 0, la page n\'est pas rafraîchie.</span>', secondes. Si 0, la page n\'est pas rafraîchie.</span>',
'seconds' => 'secondes', 'seconds' => 'secondes',
'test' => 'Tester', 'test' => 'Tester',
'test_email' => 'Un email va vous être envoyé à l\'adresse définie dans votre profil utilisateur.', 'test_email' => 'Un email va vous être envoyé à l\'adresse définie dans votre profil utilisateur.',
'test_sms' => 'Un SMS va vous être envoyé au numéro défini dans votre profil utilisateur.', 'test_sms' => 'Un SMS va vous être envoyé au numéro défini dans votre profil utilisateur.',
'test_pushover' => 'Une notification Pushover va être envoyée en utilisant la clé spécifiée dans votre 'test_pushover' => 'Une notification Pushover va être envoyée en utilisant la clé spécifiée dans votre
profil utilisateur.', profil utilisateur.',
'test_telegram' => 'Une notification Telegram sera envoyé à la conversion indiqué sur votre profil (ID de 'test_telegram' => 'Une notification Telegram sera envoyé à la conversion indiqué sur votre profil (ID de
conversation).', conversation).',
'send' => 'Envoyer', 'send' => 'Envoyer',
'test_subject' => 'Test', 'test_subject' => 'Test',
'test_message' => 'Message de test', 'test_message' => 'Message de test',
'email_sent' => 'Email envoyé', 'email_sent' => 'Email envoyé',
'email_error' => 'Erreur lors de l\'envoi de l\'email', 'email_error' => 'Erreur lors de l\'envoi de l\'email',
'sms_sent' => 'SMS envoyé', 'sms_sent' => 'SMS envoyé',
'sms_error' => 'Erreur lors de l\'envoi du SMS. %s', 'sms_error' => 'Erreur lors de l\'envoi du SMS. %s',
'sms_error_nomobile' => 'Impossible d\'envoyer un SMS de test: aucun numéro de téléphone défini dans votre 'sms_error_nomobile' => 'Impossible d\'envoyer un SMS de test: aucun numéro de téléphone défini dans votre
profil.', profil.',
'pushover_sent' => 'Notification Pushover envoyée', 'pushover_sent' => 'Notification Pushover envoyée',
'pushover_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification Pushover&nbsp;: %s', 'pushover_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification Pushover&nbsp;: %s',
'pushover_error_noapp' => 'Impossible d\'envoyer une notification de test: Aucun jeton application Pushover 'pushover_error_noapp' => 'Impossible d\'envoyer une notification de test: Aucun jeton application Pushover
n\'a été défini dans la configuration Pushover.', n\'a été défini dans la configuration Pushover.',
'pushover_error_nokey' => 'Impossible d\'envoyer une notification de test: Aucune clé Pushover n\'a été 'pushover_error_nokey' => 'Impossible d\'envoyer une notification de test: Aucune clé Pushover n\'a été
définie dans votre profil.', définie dans votre profil.',
'telegram_sent' => 'Notification Telegram envoyée', 'telegram_sent' => 'Notification Telegram envoyée',
'telegram_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification&nbsp;: %s', 'telegram_error' => 'Une erreur s\'est produite lors de l\'envoi de la notification&nbsp;: %s',
'telegram_error_notoken' => 'Impossible d\'envoyé la notification de test&nbsp;: aucun token APII token 'telegram_error_notoken' => 'Impossible d\'envoyé la notification de test&nbsp;: aucun token APII token
trouvé dans la configuration.', trouvé dans la configuration.',
'telegram_error_noid' => 'Impossible d\'envoyé la notification de test&nbsp;: aucun ID de conversation 'telegram_error_noid' => 'Impossible d\'envoyé la notification de test&nbsp;: aucun ID de conversation
trouvé dans votre profil utilisateur.', trouvé dans votre profil utilisateur.',
'log_retention_period' => 'Durée de conservation', 'log_retention_period' => 'Durée de conservation',
'log_retention_period_description' => 'Nombre de jours de conservation des événements envoyés et des temps 'log_retention_period_description' => 'Nombre de jours de conservation des événements envoyés et des temps
de réponse des serveurs. Entrez 0 pour les conserver indéfiniment.', de réponse des serveurs. Entrez 0 pour les conserver indéfiniment.',
'log_retention_days' => 'jours', 'log_retention_days' => 'jours',
), ),
'notifications' => array( 'notifications' => array(
'off_sms' => 'Le Serveur \'%LABEL%\' est HORS SERVICE: IP=%IP%, Port=%PORT%. Erreur=%ERROR%', 'off_sms' => 'Le Serveur \'%LABEL%\' est HORS SERVICE: IP=%IP%, Port=%PORT%. Erreur=%ERROR%',
'off_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est HORS SERVICE', 'off_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est HORS SERVICE',
'off_email_body' => 'Impossible de se connecter au serveur suivant:<br><br>Serveur&nbsp;: %LABEL%<br>IP&nbsp;: 'off_email_body' => 'Impossible de se connecter au serveur suivant:<br><br>Serveur&nbsp;: %LABEL%<br>IP&nbsp;:
%IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;: %ERROR%<br>Date: %DATE%', %IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;: %ERROR%<br>Date: %DATE%',
'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE', 'off_pushover_title' => 'Le Serveur \'%LABEL%\' est HORS SERVICE',
'off_pushover_message' => 'Impossible de se connecter au serveur suivant&nbsp;:<br><br>Serveur&nbsp;: 'off_pushover_message' => 'Impossible de se connecter au serveur suivant&nbsp;:<br><br>Serveur&nbsp;:
%LABEL%<br>IP&nbsp;: %IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;: %LABEL%<br>IP&nbsp;: %IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;:
%ERROR%<br>Date&nbsp;: %DATE%', %ERROR%<br>Date&nbsp;: %DATE%',
'off_telegram_message' => 'Impossible de se connecter au serveur suivant&nbsp;:<br><br>Serveur&nbsp;: 'off_telegram_message' => 'Impossible de se connecter au serveur suivant&nbsp;:<br><br>Serveur&nbsp;:
%LABEL%<br>IP&nbsp;: %IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;: %LABEL%<br>IP&nbsp;: %IP%<br>Port&nbsp;: %PORT%<br>Erreur&nbsp;:
%ERROR%<br>Date&nbsp;: %DATE%', %ERROR%<br>Date&nbsp;: %DATE%',
'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%, il était hors-ligne pendant 'on_sms' => 'Le Serveur \'%LABEL%\' est OK: IP=%IP%, Port=%PORT%, il était hors-ligne pendant
%LAST_OFFLINE_DURATION%', %LAST_OFFLINE_DURATION%',
'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK', 'on_email_subject' => 'IMPORTANT: Le Serveur \'%LABEL%\' est OK',
'on_email_body' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant 'on_email_body' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant
%LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date:
%DATE%', %DATE%',
'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK', 'on_pushover_title' => 'Le Serveur \'%LABEL%\' est OK',
'on_pushover_message' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant 'on_pushover_message' => 'Le Serveur \'%LABEL%\' est de nouveau OK, il était hors-ligne pendant
%LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port: %LAST_OFFLINE_DURATION%:<br><br>Serveur: %LABEL%<br>IP: %IP%<br>Port:
%PORT%<br>Date: %DATE%', %PORT%<br>Date: %DATE%',
'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for: 'on_telegram_message' => 'Server \'%LABEL%\' is running again, it was down for:
%LAST_OFFLINE_DURATION%<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date: %LAST_OFFLINE_DURATION%<br><br>Server: %LABEL%<br>IP: %IP%<br>Port: %PORT%<br>Date:
%DATE%', %DATE%',
'combi_off_email_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;: 'combi_off_email_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;:
%PORT%</li><li>Erreur&nbsp;: %ERROR%</li><li>Date&nbsp;: %DATE%</li></ul>', %PORT%</li><li>Erreur&nbsp;: %ERROR%</li><li>Date&nbsp;: %DATE%</li></ul>',
'combi_off_pushover_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;: 'combi_off_pushover_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;:
%PORT%</li><li>Erreur&nbsp;: %ERROR%</li><li>Date&nbsp;: %DATE%</li></ul>', %PORT%</li><li>Erreur&nbsp;: %ERROR%</li><li>Date&nbsp;: %DATE%</li></ul>',
'combi_off_telegram_message' => '- Serveur&nbsp;: %LABEL%<br>- IP&nbsp;: %IP%<br>- Port&nbsp;: %PORT%<br>- 'combi_off_telegram_message' => '- Serveur&nbsp;: %LABEL%<br>- IP&nbsp;: %IP%<br>- Port&nbsp;: %PORT%<br>-
Erreur&nbsp;: %ERROR%<br>- Date&nbsp;: %DATE%<br><br>', Erreur&nbsp;: %ERROR%<br>- Date&nbsp;: %DATE%<br><br>',
'combi_on_email_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;: 'combi_on_email_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;:
%PORT%</li><li>Durée&nbsp;: %LAST_OFFLINE_DURATION%</li><li>Date&nbsp;: %PORT%</li><li>Durée&nbsp;: %LAST_OFFLINE_DURATION%</li><li>Date&nbsp;:
%DATE%</li></ul>', %DATE%</li></ul>',
'combi_on_pushover_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;: 'combi_on_pushover_message' => '<ul><li>Serveur&nbsp;: %LABEL%</li><li>IP&nbsp;: %IP%</li><li>Port&nbsp;:
%PORT%</li><li>Durée&nbsp;: %LAST_OFFLINE_DURATION%</li><li>Date&nbsp;: %PORT%</li><li>Durée&nbsp;: %LAST_OFFLINE_DURATION%</li><li>Date&nbsp;:
%DATE%</li></ul>', %DATE%</li></ul>',
'combi_on_telegram_message' => '- Serveur&nbsp;: %LABEL%<br>- IP: %IP%<br>- Port&nbsp;: %PORT%<br>- 'combi_on_telegram_message' => '- Serveur&nbsp;: %LABEL%<br>- IP: %IP%<br>- Port&nbsp;: %PORT%<br>-
Durée&nbsp;: %LAST_OFFLINE_DURATION%<br>- Date&nbsp;: %DATE%<br><br>', Durée&nbsp;: %LAST_OFFLINE_DURATION%<br>- Date&nbsp;: %DATE%<br><br>',
'combi_email_subject' => 'IMPORTANT&nbsp;: \'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs 'combi_email_subject' => 'IMPORTANT&nbsp;: \'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs
hors-ligne', hors-ligne',
'combi_pushover_subject' => '\'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs hors-ligne', 'combi_pushover_subject' => '\'%UP%\' serveurs de nouveaux en ligne, \'%DOWN%\' serveurs hors-ligne',
'combi_email_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les 'combi_email_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les
serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%', serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%',
'combi_pushover_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les 'combi_pushover_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les
serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%', serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%',
'combi_telegram_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les 'combi_telegram_message' => '<b>Les serveurs suivants sont hors-ligne&nbsp;:</b><br>%DOWN_SERVERS%<br><b>Les
serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%', serveurs suivants sont en ligne&nbsp;:</b><br>%UP_SERVERS%',
), ),
'login' => array( 'login' => array(
'welcome_usermenu' => 'Bonjour %user_name%', 'welcome_usermenu' => 'Bonjour %user_name%',
'title_sign_in' => 'Connectez vous SVP', 'title_sign_in' => 'Connectez vous SVP',
'title_forgot' => 'Mot de passe oublié&nbsp;?', 'title_forgot' => 'Mot de passe oublié&nbsp;?',
'title_reset' => 'Réinitialisation du mot de passe', 'title_reset' => 'Réinitialisation du mot de passe',
'submit' => 'Envoyer', 'submit' => 'Envoyer',
'remember_me' => 'Se souvenir de moi', 'remember_me' => 'Se souvenir de moi',
'login' => 'Connexion', 'login' => 'Connexion',
'logout' => 'Déconnexion', 'logout' => 'Déconnexion',
'username' => 'Nom', 'username' => 'Nom',
'password' => 'Mot de passe', 'password' => 'Mot de passe',
'password_repeat' => 'Répéter le mot de passe', 'password_repeat' => 'Répéter le mot de passe',
'password_forgot' => 'Mot de passe oublié&nbsp;?', 'password_forgot' => 'Mot de passe oublié&nbsp;?',
'password_reset' => 'Réinitialiser le mot de passe', 'password_reset' => 'Réinitialiser le mot de passe',
'password_reset_email_subject' => 'Réinitialisation du mot de passe pour PHP Server Monitor', 'password_reset_email_subject' => 'Réinitialisation du mot de passe pour PHP Server Monitor',
'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe. 'password_reset_email_body' => 'Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe.
Veuillez noter qu\'il expire dans une heure.<br><br>%link%', Veuillez noter qu\'il expire dans une heure.<br><br>%link%',
'error_user_incorrect' => 'Nom d\'utilisateur invalide.', 'error_user_incorrect' => 'Nom d\'utilisateur invalide.',
'error_login_incorrect' => 'Informations incorrectes.', 'error_login_incorrect' => 'Informations incorrectes.',
'error_login_passwords_nomatch' => 'Mot de passe invalide.', 'error_login_passwords_nomatch' => 'Mot de passe invalide.',
'error_reset_invalid_link' => 'Le lien d\'initialisation du mot de passe n\'est pas valide.', 'error_reset_invalid_link' => 'Le lien d\'initialisation du mot de passe n\'est pas valide.',
'success_password_forgot' => 'Un email vous a été envoyé pour réinitialiser votre mot de passe.', 'success_password_forgot' => 'Un email vous a été envoyé pour réinitialiser votre mot de passe.',
'success_password_reset' => 'Votre mot de passe a été réinitialisé.', 'success_password_reset' => 'Votre mot de passe a été réinitialisé.',
), ),
'error' => array( 'error' => array(
'401_unauthorized' => 'Non autorisée', '401_unauthorized' => 'Non autorisée',
'401_unauthorized_description' => 'Vous n\'avez pas les privilèges nécessaires pour voir cette page.', '401_unauthorized_description' => 'Vous n\'avez pas les privilèges nécessaires pour voir cette page.',
), ),
); );

View File

@ -0,0 +1,25 @@
<?php
namespace psm\Module\Consult;
use psm\Module\ModuleInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class ConsultModule implements ModuleInterface
{
public function load(ContainerBuilder $container)
{
}
public function getControllers()
{
return array(
'consult' => __NAMESPACE__ . '\Controller\ConsultController',
'server' => __NAMESPACE__ . '\Controller\ServerController',
'log' => __NAMESPACE__ . '\Controller\LogController',
'status' => __NAMESPACE__ . '\Controller\StatusController',
'update' => __NAMESPACE__ . '\Controller\UpdateController',
);
}
}

View File

@ -0,0 +1,113 @@
<?php
/**
* PHP Server Monitor
* Monitor your servers and websites.
*
* This file is part of PHP Server Monitor.
* PHP Server Monitor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PHP Server Monitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PHP Server Monitor. If not, see <http://www.gnu.org/licenses/>.
*
* @package phpservermon
* @author Pepijn Over <pep@mailbox.org>
* @copyright Copyright (c) 2008-2017 Pepijn Over <pep@mailbox.org>
* @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3
* @version Release: v3.5.0
* @link http://www.phpservermonitor.org/
**/
namespace psm\Module\Consult\Controller;
use psm\Module\Server\Controller\AbstractServerController;
use psm\Service\Database;
use Symfony\Component\HttpFoundation\Response;
abstract class AbstractConsultController extends AbstractServerController
{
/**
* Create HTML code for the menu
* @return string
*/
protected function createHTMLMenu()
{
return '';
}
public function __construct(Database $db, \Twig_Environment $twig)
{
parent::__construct($db, $twig);
$this->twig->addGlobal('subtitle', psm_get_lang('openscop', 'consult_title'));
$this->twig->addGlobal('title', psm_get_lang('openscop', 'consult_title'));
}
protected function createHTML($html = null)
{
if (!$this->xhr) {
// in XHR mode, we will not add the main template
$tpl_data = array(
'title' => strtoupper(psm_get_lang('openscop', 'title')),
'label_back_to_top' => psm_get_lang('system', 'back_to_top'),
'add_footer' => $this->add_footer,
'version' => 'v' . PSM_VERSION,
'messages' => $this->getMessages(),
'html_content' => $html,
);
// add menu to page?
if ($this->add_menu) {
$tpl_data['html_menu'] = $this->createHTMLMenu();
}
// add header accessories to page ?
if ($this->header_accessories) {
$tpl_data['header_accessories'] = $this->header_accessories;
}
// add modal dialog to page ?
if (sizeof($this->modal)) {
$html_modal = '';
foreach ($this->modal as $modal) {
$html_modal .= $modal->createHTML();
}
$tpl_data['html_modal'] = $html_modal;
}
// add sidebar to page?
if ($this->sidebar !== null) {
$tpl_data['html_sidebar'] = $this->sidebar->createHTML();
}
if (psm_update_available()) {
$tpl_data['update_available'] = str_replace(
'{version}',
'v' .
psm_get_conf('version_update_check'),
psm_get_lang('system', 'update_available')
);
}
if ($this->black_background) {
$tpl_data['body_class'] = 'black_background';
}
$tpl_data['custom_navbar'] = true;
// Insert logo url in navbar
$tpl_data['logo_url'] = 'https://www.openscop.news/wp-content/uploads/sites/10/2020/04/logo_horizontal_600x150.png';
$html = $this->twig->render('main/body.tpl.html', $tpl_data);
}
$response = new Response($html);
return $response;
}
}

View File

@ -0,0 +1,115 @@
<?php
/**
* PHP Server Monitor
* Monitor your servers and websites.
*
* This file is part of PHP Server Monitor.
* PHP Server Monitor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* PHP Server Monitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PHP Server Monitor. If not, see <http://www.gnu.org/licenses/>.
*
* @package phpservermon
* @author Pepijn Over <pep@mailbox.org>
* @copyright Copyright (c) 2008-2017 Pepijn Over <pep@mailbox.org>
* @license http://www.gnu.org/licenses/gpl.txt GNU GPL v3
* @version Release: v3.5.0
* @link http://www.phpservermonitor.org/
* @since phpservermon 3.0.0
**/
namespace psm\Module\Consult\Controller;
use psm\Module\AbstractController;
use psm\Module\Consult\Controller\AbstractConsultController;
use psm\Module\Server\Controller\AbstractServerController;
use psm\Service\Database;
abstract class AbstractConsultServerController extends AbstractConsultController
{
/**
* Get all servers for the current user
* @param Countable|array|\PDOStatement $server_id (int) if true only that server will be retrieved.
* @param array|\PDOStatement $ip
* @return array
*/
public function getServers($server_id = null, $ip = null)
{
$sql_join = '';
$sql_where = '';
if ($server_id !== null) {
$server_id = intval($server_id);
$sql_where = "WHERE `s`.`server_id`={$server_id} ";
}
$sql = "SELECT
`s`.`server_id`,
`s`.`ip`,
`s`.`port`,
`s`.`request_method`,
`s`.`post_field`,
`s`.`type`,
`s`.`label`,
`s`.`pattern`,
`s`.`pattern_online`,
`s`.`redirect_check`,
`s`.`allow_http_status`,
`s`.`header_name`,
`s`.`header_value`,
`s`.`status`,
`s`.`error`,
`s`.`rtime`,
`s`.`last_check`,
`s`.`last_online`,
`s`.`last_offline`,
`s`.`last_offline_duration`,
`s`.`active`,
`s`.`email`,
`s`.`sms`,
`s`.`pushover`,
`s`.`telegram`,
`s`.`jabber`,
`s`.`warning_threshold`,
`s`.`warning_threshold_counter`,
`s`.`ssl_cert_expiry_days`,
`s`.`ssl_cert_expired_time`,
`s`.`timeout`,
`s`.`website_username`,
`s`.`website_password`,
`s`.`last_error`,
`s`.`last_error_output`,
`s`.`last_output`
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
{$sql_join}
{$sql_where}
ORDER BY `active` ASC, `status` DESC, `label` ASC";
$servers = $this->db->query($sql);
if ($server_id !== null && count($servers) == 1) {
$servers = $servers[0];
}
return $servers;
}
/**
* Format server data for display
* @param array $server
* @return array
*/
protected function formatServer($server)
{
return parent::formatServer($server);
}
}

View File

@ -0,0 +1,142 @@
<?php
namespace psm\Module\Consult\Controller;
use psm\Module\AbstractController;
use psm\Module\Consult\Controller\AbstractConsultServerController;
use psm\Module\Server\Controller\AbstractServerController;
use psm\Service\Database;
class ConsultController extends AbstractConsultServerController
{
public $server_id;
public $ip;
public $id;
function __construct(Database $db, \Twig_Environment $twig)
{
parent::__construct($db, $twig);
$this->ip = isset($_GET['ip']) ? $_GET['ip'] : "";
$this->setActions(array(
'view',
), 'index');
$this->setMinUserLevelRequiredForAction(PSM_USER_ANONYMOUS, []);
$this->setMinUserLevelRequired(PSM_USER_ANONYMOUS);
}
protected function executeView()
{
$sql = 'SELECT server_id FROM ' . PSM_DB_PREFIX . 'servers WHERE label = "' . $this->ip . '"';
$server_id = $this->db->query($sql);
if (empty($server_id)) {
$tpl_data = $this->getError();
return $this->twig->render('module/error/401.tpl.html', $tpl_data);
} else
$id = $server_id[0]['server_id'];
$this->id = $id;
$server = $this->getServers($this->id);
$tpl_data = $this->getLabels();
$tpl_data = array_merge($tpl_data, $this->formatServer($server));
$history = new \psm\Util\Server\HistoryGraph($this->db, $this->twig);
$tpl_data['html_history'] = $history->createHTML($this->id);
$sidebar = new \psm\Util\Module\Sidebar($this->twig);
$this->setSidebar($sidebar);
return $this->twig->render('module/consult/consult.tpl.html', $tpl_data);
}
protected function getError()
{
return array(
'label_title' => "Erreur",
'label_description' => "Vous n'avez pas saisi la bonne adresse !"
);
}
protected function getLabels()
{
return array(
'label_label' => psm_get_lang('servers', 'label'),
'label_status' => psm_get_lang('servers', 'status'),
'label_domain' => psm_get_lang('servers', 'domain'),
'label_timeout' => psm_get_lang('servers', 'timeout'),
'label_timeout_description' => psm_get_lang('servers', 'timeout_description'),
'label_authentication_settings' => psm_get_lang('servers', 'authentication_settings'),
'label_optional' => psm_get_lang('servers', 'optional'),
'label_website_username' => psm_get_lang('servers', 'website_username'),
'label_website_username_description' => psm_get_lang('servers', 'website_username_description'),
'label_website_password' => psm_get_lang('servers', 'website_password'),
'label_website_password_description' => psm_get_lang('servers', 'website_password_description'),
'label_fieldset_monitoring' => psm_get_lang('servers', 'fieldset_monitoring'),
'label_fieldset_permissions' => psm_get_lang('servers', 'fieldset_permissions'),
'label_permissions' => psm_get_lang('servers', 'permissions'),
'label_port' => psm_get_lang('servers', 'port'),
'label_custom_port' => psm_get_lang('servers', 'custom_port'),
'label_popular_ports' => psm_get_lang('servers', 'popular_ports'),
'label_request_method' => psm_get_lang('servers', 'request_method'),
'label_custom_request_method' => psm_get_lang('servers', 'custom_request_method'),
'label_popular_request_methods' => psm_get_lang('servers', 'popular_request_methods'),
'label_post_field' => psm_get_lang('servers', 'post_field'),
'label_post_field_description' => psm_get_lang('servers', 'post_field_description'),
'label_none' => psm_get_lang('system', 'none'),
'label_please_select' => psm_get_lang('servers', 'please_select'),
'label_type' => psm_get_lang('servers', 'type'),
'label_website' => psm_get_lang('servers', 'type_website'),
'label_service' => psm_get_lang('servers', 'type_service'),
'label_ping' => psm_get_lang('servers', 'type_ping'),
'label_pattern' => psm_get_lang('servers', 'pattern'),
'label_pattern_description' => psm_get_lang('servers', 'pattern_description'),
'label_pattern_online' => psm_get_lang('servers', 'pattern_online'),
'label_pattern_online_description' => psm_get_lang('servers', 'pattern_online_description'),
'label_redirect_check' => psm_get_lang('servers', 'redirect_check'),
'label_redirect_check_description' => psm_get_lang('servers', 'redirect_check_description'),
'label_allow_http_status' => psm_get_lang('servers', 'allow_http_status'),
'label_allow_http_status_description' => psm_get_lang('servers', 'allow_http_status_description'),
'label_header_name' => psm_get_lang('servers', 'header_name'),
'label_header_value' => psm_get_lang('servers', 'header_value'),
'label_header_name_description' => psm_get_lang('servers', 'header_name_description'),
'label_header_value_description' => psm_get_lang('servers', 'header_value_description'),
'label_last_check' => psm_get_lang('servers', 'last_check'),
'label_rtime' => psm_get_lang('servers', 'latency'),
'label_last_online' => psm_get_lang('servers', 'last_online'),
'label_last_offline' => psm_get_lang('servers', 'last_offline'),
'label_last_output' => psm_get_lang('servers', 'last_output'),
'label_last_error' => psm_get_lang('servers', 'last_error'),
'label_last_error_output' => psm_get_lang('servers', 'last_error_output'),
'label_monitoring' => psm_get_lang('servers', 'monitoring'),
'label_email' => psm_get_lang('servers', 'email'),
'label_send_email' => psm_get_lang('servers', 'send_email'),
'label_sms' => psm_get_lang('servers', 'sms'),
'label_send_sms' => psm_get_lang('servers', 'send_sms'),
'label_send_pushover' => psm_get_lang('servers', 'send_pushover'),
'label_telegram' => psm_get_lang('servers', 'telegram'),
'label_jabber' => psm_get_lang('servers', 'jabber'),
'label_pushover' => psm_get_lang('servers', 'pushover'),
'label_send_telegram' => psm_get_lang('servers', 'send_telegram'),
'label_send_jabber' => psm_get_lang('servers', 'send_jabber'),
'label_users' => psm_get_lang('servers', 'users'),
'label_warning_threshold' => psm_get_lang('servers', 'warning_threshold'),
'label_warning_threshold_description' => psm_get_lang('servers', 'warning_threshold_description'),
'label_ssl_cert_expiry_days' => psm_get_lang('servers', 'ssl_cert_expiry_days'),
'label_ssl_cert_expiry_days_description' => psm_get_lang('servers', 'ssl_cert_expiry_days_description'),
'label_action' => psm_get_lang('system', 'action'),
'label_save' => psm_get_lang('system', 'save'),
'label_go_back' => psm_get_lang('system', 'go_back'),
'label_edit' => psm_get_lang('system', 'edit'),
'label_delete' => psm_get_lang('system', 'delete'),
'label_view' => psm_get_lang('system', 'view'),
'label_yes' => psm_get_lang('system', 'yes'),
'label_no' => psm_get_lang('system', 'no'),
'label_add_new' => psm_get_lang('system', 'add_new'),
'label_seconds' => psm_get_lang('config', 'seconds'),
'label_online' => psm_get_lang('servers', 'online'),
'label_offline' => psm_get_lang('servers', 'offline'),
'label_ok' => psm_get_lang('system', 'ok'),
'label_bad' => psm_get_lang('system', 'bad'),
'default_value_timeout' => PSM_CURL_TIMEOUT,
'label_settings' => psm_get_lang('system', 'settings'),
'label_output' => psm_get_lang('servers', 'output'),
'label_search' => psm_get_lang('system', 'search'),
);
}
}

View File

@ -95,6 +95,10 @@ class HistoryGraph
$tpl_data = array( $tpl_data = array(
'graphs' => $graphs, 'graphs' => $graphs,
); );
//$graphs[1]['info'][0]['value'] = '1.2336';
//echo '<pre>';
//print_r($graphs);die;
return $this->twig->render('module/server/history.tpl.html', $tpl_data); return $this->twig->render('module/server/history.tpl.html', $tpl_data);
} }

View File

@ -24,14 +24,19 @@
<link href="src/templates/default/static/css/bootstrap.min.css" rel="stylesheet"> <link href="src/templates/default/static/css/bootstrap.min.css" rel="stylesheet">
<link href="src/templates/default/static/plugin/bootstrap-select/dist/css/bootstrap-select.min.css" rel="stylesheet"> <link href="src/templates/default/static/plugin/bootstrap-select/dist/css/bootstrap-select.min.css" rel="stylesheet">
<link href="src/templates/default/static/css/style.min.css" rel="stylesheet"> <link href="src/templates/default/static/css/style.min.css" rel="stylesheet">
{% if custom_navbar == 1 %}
<link href="src/templates/default/static/openscop/css/style.css" rel="stylesheet">
{% endif %}
<!--[if lt IE 9]> <!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]--> <![endif]-->
</head> </head>
<body> <body>
<nav class="navbar fixed-top navbar-expand-lg navbar-dark bg-dark"> <nav class="navbar fixed-top navbar-expand-lg navbar-dark {% if custom_navbar == 1 %}bg-light navbar_openscop {% else %} bg-dark {% endif %}">
<a class="navbar-brand" href="index.php">{{ title }}</a> <a class="navbar-brand" href="index.php">
<img src="{{ logo_url }}" class="img-fluid logo-openscop" />
{{ title }}</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar" <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar" aria-controls="navbar"
aria-expanded="false" aria-label="Toggle navigation"> aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>

View File

@ -0,0 +1,127 @@
{{ macro.input_csrf() }}
<div class="container">
<div class="row">
<div class="card text-white text-center col-md-2 pl-0 pr-0 mb-4 {% if status|lower == 'on' %}bg-success{% elseif status|lower == 'warning' %}bg-warning{% elseif status|lower == 'off' %}bg-danger{% endif %}">
<div class="card-body d-flex align-items-center justify-content-center">
{% if status|lower == 'on' %}
<i class="fas fa-check-circle fa-6x"></i>
<noscript><h1>&#10003</h1></noscript>
{% elseif status|lower == 'warning' %}
<i class="fas fa-exclamation-triangle fa-6x"></i>
<noscript><h1>&#9888</h1></noscript>
{% elseif status|lower == 'off' %}
<i class="fas fa-times-circle fa-6x"></i>
<noscript><h1>&#10005</h1></noscript>
{% else %}
<i class="fas fa-question-circle fa-6x"></i>
<noscript><h1>&#8263</h1></noscript>
{% endif %}
</div>
</div>
<div class="card col-md-5 mr-5 ml-auto pl-0 pr-0 mb-4">
<div class="card-header">
{{ label }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_domain }}:</dt>
<dd class="col-md-8">
<a href="{{ ip|raw }}" title="{{ ip|raw }}" target="_blank" rel="noopener">
{{ ip|raw }}
</a>
</dd>
</dl>
</li>
{% if type|lower == 'service' %}
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_port }}:</dt>
<dd class="col-md-8">{{ port }}</dd>
</dl>
</li>
{% endif %}
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_status }}:</dt>
<dd class="col-md-8">{{ status }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-4">{{ label_rtime }}:</dt>
<dd class="col-md-8">{{ rtime }} {{ label_seconds }}</dd>
</dl>
</li>
</ul>
</div>
<div class="card col-md-3 ml-5 pl-0 pr-0 mb-4">
<div class="card-header">
{{ label_status }}
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_online }}:</dt>
<dd class="col-md-6">{{ last_online }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_offline }}:</dt>
<dd class="col-md-6">{{ last_offline }}</dd>
</dl>
</li>
<li class="list-group-item">
<dl class="row">
<dt class="col-md-6">{{ label_last_check }}:</dt>
<dd class="col-md-6">{{ last_check }}</dd>
</dl>
</li>
</ul>
</div>
</div>
<div class="row">
{{ html_history|raw }}
</div>
<div class="modal fade" id="modal_last_output" tabindex="-1" role="dialog" aria-labelledby="modal_last_output_label" aria-hidden="true">
<div class="modal-dialog" style="width:75%;max-width: 100%" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal_last_output_label">{{ label_last_output }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" style="word-wrap: break-word;">
{{ last_output|nl2br }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="modal_last_error" tabindex="-1" role="dialog" aria-labelledby="modal_last_error_label" aria-hidden="true">
<div class="modal-dialog" style="width:75%;max-width: 100%" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modal_last_error_label">{{ label_last_error_output }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" style="word-wrap: break-word;">
{{ last_error_output|nl2br }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
.logo-openscop {
height: 50px;
}