/alcasar.sh |
---|
968,19 → 968,7 |
ErrorDocument 404 https://$HOSTNAME.$DOMAIN/ |
</Directory> |
<Directory $DIR_ACC/manager/nfsen> |
SSLRequireSSL |
AllowOverride None |
Order deny,allow |
Deny from all |
Allow from 127.0.0.1 |
Allow from $PRIVATE_NETWORK_MASK |
require valid-user |
AuthType digest |
AuthName "ALCASAR Control Center (ACC)" |
AuthDigestDomain $HOSTNAME.$DOMAIN |
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On |
AuthUserFile $DIR_DEST_ETC/digest/key_manager |
ErrorDocument 404 https://$HOSTNAME.$DOMAIN/ |
<IfModule mod_rewrite.c> |
RewriteEngine On |
RewriteCond %{REQUEST_FILENAME} !-f |
1563,6 → 1551,8 |
[Service] |
Type=simple |
ExecStartPre=/bin/mkdir -p /run/nfcapd |
ExecStartPre=/bin/chown nfcapd:nfcapd /run/nfcapd |
PIDFile=/run/nfcapd/nfcapd.pid |
ExecStart=/usr/bin/nfcapd -D -b 127.0.0.1 -p 2055 -u nfcapd -g nfcapd -B 200000 -t 300 -S 1 -z -P /run/nfcapd/nfcapd.pid -I alcasar_netflow -w /var/log/nfsen/profiles-data/live/alcasar_netflow |
ExecReload=/bin/kill -HUP $MAINPID |
1572,8 → 1562,7 |
EOF |
[ -d /var/log/nfsen/profiles-data/live/alcasar_netflow ] || mkdir -p /var/log/nfsen/profiles-data/live/alcasar_netflow |
touch /var/log/nfsen/profiles-data/live/alcasar_netflow/.nfstat |
[ -d /run/nfcapd ] || mkdir -p /run/nfcapd |
chown -R nfcapd:nfcapd /var/log/nfsen /run/nfcapd |
chown -R nfcapd:nfcapd /var/log/nfsen |
# nfsen-ng |
/web/acc/manager/nfsen/Readme-alcasar.txt |
---|
0,0 → 1,53 |
PROCEDURE d'installation de "nfsen-ng" sur ALCASAR: |
archive du git |
- Désarchiver et supprimer tout sauf "backend", "frontend", "vendor" et la licence |
nfcapd |
- info : les flux netflow collectés par nfcapd sont dans /var/log/nfsen/profiles-data/live/alcasar_netflow |
- Note : nfsen-ng expects the profiles-data folder structure to be PROFILES_DATA_PATH/PROFILE/SOURCE/YYYY/MM/DD/nfcapd.YYYYMMDDHHII |
- modifier l'unité systemd de nfcap en conséquence (/etc/systemd/system/nfcapd.)(ExecStart=/usr/bin/nfcapd -D -b 127.0.0.1 -p 2055 -u nfcapd -g nfcapd -B 200000 -t 300 -S 7) --> S1 |
RPM |
- installer php-rrd |
- voir si php-phar est utile. Voir si rrdtool est utile |
- restart + Verif des modules PHP activés avec php -m et php -i (grep Phar e rrd ) |
Modules apache (rewrite/deflate/headers/expires ) |
- Activer le mod_rewrite sur apache (les autres sont déja installés) |
- cf /etc/httpd/conf/modules.d/00_base.conf |
- Restart + Vérif "apachectl -M |grep ..." ou "httpd -M|grep ..." |
nfsen-ng (install) |
- désarchive de nfsen-ng dans /var/www/html/acc/manager/nfsen + "chown -R apache:apache nfsen" |
- dans le répertoire nfsen, install de "composer.phar" (cf. https://getcomposer.org/download/) |
- lancement de composer.phar (php composer.phar install --no-dev) pour téléchargement des bibliothèques tiers. Cela ajoute le répertoire "vendor" à la racine (contient "autoload.php" + rep "composer" avec 7 fichiers. |
nfsen-ng (backend conf) |
- renommer backend/settings/settings.php.dist en backend/settings/settings.php |
- modif de "Profiles_data" = /var/log/nfsen/profiles-data |
- supprimer "source2" et renommer "source1" en "alcasar_netflow" |
- ajouter le port 443 |
nfsen-ng (frontend modif) |
- retrait du menu Config |
initialisation et peuplement de la base RDD |
- dans /backend, php cli.php -f -p -ps import |
- Si ok, les données rrd sont dans "backend/datasources/data" |
Réactivation et test de la page de l'ACC |
- Décommenter la ligne 244 dans "menu.php" |
- Mofifier la page manager/nfsen.php pour pointer sur nfsen/frontend/index.html |
- Inclure les regles de rewrite dans le alcasar.conf d'apache sur ce répertoire (cf. .htaccess). Pour tester avec le .htaccess --> modif AllowOnerride All dans le bon "directory" de "alcasar.conf"" |
- testez le frontend (via l'ACC) : affichage de l'interface |
- tester l'API du backend (cf. fichier API_ENDPOINTS.md) : exemple avec l'URL "manager/nfsen/backend/index.php?request=config" idem avec le mod_rewrite : "manager/nfsen/api/config" |
Daemon Backend |
Le daemon backend peut-etre lancé via la commande cli.php start (verif par "cli.php status" et dans l'interface nfsen-ng). Il lance client.php et crée le fichier "nfsen-ng.pid". |
Une unité systemd est proposée : https://github.com/mbolli/nfsen-ng/issues/70 |
TODO |
Faire pointer jquery.min.js + bootstrap.min.js + bootstrap.min.css sur ceux d'ALCASAR |
Revoir l'archivage et la génération du rapport |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/web/acc/manager/nfsen/frontend/index.html |
---|
49,11 → 49,7 |
</svg> |
</a> |
</li> |
<li role="presentation" class="nav-item"> |
<a class="nav-link" data-view="config" href="#">Config ⚙️ |
</a> |
</li> |
</ul> |
</ul> |
</header> |
<div id="filterContainer" class="container-fluid tab-content"> |
<form autocomplete="off"> |
94,30 → 90,6 |
</div> |
</div> |
</div> |
<div class="d-none col-xs-6 col-sm-2" data-view="config"> |
<ul> |
<li> |
Config <a href="../api/config">/api/config</a> |
</li> |
<li> |
Theme |
<a href="javascript:window.localStorage.setItem('theme', 'light')">Light</a> |
<a href="javascript:window.localStorage.setItem('theme', 'dark')">Dark</a> |
</li> |
<script> |
var theme = window.localStorage.getItem("theme"); |
var styleId = document.styleSheets.length - 1; |
var ruleId = 2; |
switch (theme) |
{ |
case "light": document.styleSheets[styleId].rules[ruleId].style.filter="invert(0.0)"; break;; |
case "dark": document.styleSheets[styleId].rules[ruleId].style.filter="invert(0.9)"; break;; |
} |
</script> |
</div> |
<div id="filterDisplay" class="d-none col-xs-6 col-sm-2" data-view="graphs"> |
<p class="h6">Display</p> |
/web/acc/manager/nfsen/frontend/index.old |
---|
0,0 → 1,516 |
<!DOCTYPE html> |
<html lang="en"> |
<head> |
<meta charset="utf-8"> |
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
<title>nfsen-ng</title> |
<script src="js/jquery.min.js"></script> |
<script src="js/popper.min.js"></script> |
<script src="js/bootstrap.min.js"></script> |
<script src="js/ion.rangeSlider.min.js"></script> |
<script src="js/dygraph.min.js"></script> |
<script src="js/footable.min.js"></script> |
<link rel="stylesheet" type="text/css" href="css/dygraph.css" /> |
<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css" /> |
<link rel="stylesheet" type="text/css" href="css/ion.rangeSlider.css" /> |
<link rel="stylesheet" type="text/css" href="css/footable.bootstrap.min.css" /> |
<link rel="stylesheet" type="text/css" href="css/nfsen-ng.css" /> |
</head> |
<body class="p-2"> |
<header> |
<a class="position-absolute link-secondary" style="text-decoration: none;" href="https://github.com/mbolli/nfsen-ng" target="_blank"> |
nfsen-ng <span id="version"></span> |
</a> |
<ul id="viewList" class="nav nav-tabs justify-content-end" role="tablist"> |
<li role="presentation" class="nav-item align-self-center"> |
<a href="#" class="reload px-3"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-house-door-fill" viewBox="0 0 16 16"> |
<path d="M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5"/> |
</svg></a> |
</li> |
<li role="presentation" class="nav-item"> |
<a class="nav-link active" data-view="graphs" href="#">Graphs <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-graph-up" viewBox="0 0 16 16"> |
<path fill-rule="evenodd" d="M0 0h1v15h15v1H0zm14.817 3.113a.5.5 0 0 1 .07.704l-4.5 5.5a.5.5 0 0 1-.74.037L7.06 6.767l-3.656 5.027a.5.5 0 0 1-.808-.588l4-5.5a.5.5 0 0 1 .758-.06l2.609 2.61 4.15-5.073a.5.5 0 0 1 .704-.07"/> |
</svg> |
</a> |
</li> |
<li role="presentation" class="nav-item"> |
<a class="nav-link" data-view="flows" href="#">Flows <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-zoom-in" viewBox="0 0 16 16"> |
<path fill-rule="evenodd" d="M6.5 12a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11M13 6.5a6.5 6.5 0 1 1-13 0 6.5 6.5 0 0 1 13 0"/> |
<path d="M10.344 11.742q.044.06.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1 1 0 0 0-.115-.1 6.5 6.5 0 0 1-1.398 1.4z"/> |
<path fill-rule="evenodd" d="M6.5 3a.5.5 0 0 1 .5.5V6h2.5a.5.5 0 0 1 0 1H7v2.5a.5.5 0 0 1-1 0V7H3.5a.5.5 0 0 1 0-1H6V3.5a.5.5 0 0 1 .5-.5"/> |
</svg> |
</a> |
</li> |
<li role="presentation" class="nav-item"> |
<a class="nav-link" data-view="statistics" href="#">Statistics <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-list-columns" viewBox="0 0 16 16"> |
<path fill-rule="evenodd" d="M0 .5A.5.5 0 0 1 .5 0h9a.5.5 0 0 1 0 1h-9A.5.5 0 0 1 0 .5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2A.5.5 0 0 1 .5 2h8a.5.5 0 0 1 0 1h-8a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2A.5.5 0 0 1 .5 4h10a.5.5 0 0 1 0 1H.5a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2A.5.5 0 0 1 .5 6h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2A.5.5 0 0 1 .5 8h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5m-13 2a.5.5 0 0 1 .5-.5h10a.5.5 0 0 1 0 1H.5a.5.5 0 0 1-.5-.5m13 0a.5.5 0 0 1 .5-.5h2a.5.5 0 0 1 0 1h-2a.5.5 0 0 1-.5-.5"/> |
</svg> |
</a> |
</li> |
<li role="presentation" class="nav-item"> |
<a class="nav-link" data-view="config" href="#">Config ⚙️ |
</a> |
</li> |
</ul> |
</header> |
<div id="filterContainer" class="container-fluid tab-content"> |
<form autocomplete="off"> |
<div id="filter" class="filter row align-items-start bg-light border-bottom py-3" style="flex-direction: row"> |
<div class="date_selection col-12 p-3 mb-4 border-bottom"> |
<div class="mb-3"> |
<input type="text" name="date_range" id="date_range"/> |
</div> |
<div class="float-end"> |
<div class="btn-group" id="date_slot" data-bs-toggle="buttons"> |
<input type="radio" class="btn-check" name="range" data-unit="h" id="dateSlotH" value="3600000"> |
<label class="btn btn-outline-primary" for="dateSlotH">1 hour</label> |
<input type="radio" class="btn-check" name="range" data-unit="d" id="dateSlotD" value="86400000"> |
<label class="btn btn-outline-primary" for="dateSlotD">24 hours</label> |
<input type="radio" class="btn-check" name="range" data-unit="w" id="dateSlotW" value="604800000"> |
<label class="btn btn-outline-primary" for="dateSlotW">Week</label> |
<input type="radio" class="btn-check" name="range" data-unit="m" id="dateSlotM" value="2592000000"> |
<label class="btn btn-outline-primary" for="dateSlotM">Month</label> |
<input type="radio" class="btn-check" name="range" data-unit="y" id="dateSlotY" value="31536000000"> |
<label class="btn btn-outline-primary" for="dateSlotY">Year</label> |
</div> |
<div class="btn-group" id="date_slot_nav"> |
<button type="button" class="btn btn-outline-primary prev" disabled><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-left" viewBox="0 0 16 16"> |
<path fill-rule="evenodd" d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8"/> |
</svg></button> |
<button type="button" class="btn btn-outline-primary next" disabled><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-right" viewBox="0 0 16 16"> |
<path fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8"/> |
</svg></button> |
</div> |
<div class="btn-group" id="date_syncing" data-view="graphs"> |
<button type="button" class="btn btn-outline-primary sync-date" disabled>Copy from graph <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-repeat" viewBox="0 0 16 16"> |
<path d="M11.534 7h3.932a.25.25 0 0 1 .192.41l-1.966 2.36a.25.25 0 0 1-.384 0l-1.966-2.36a.25.25 0 0 1 .192-.41m-11 2h3.932a.25.25 0 0 0 .192-.41L2.692 6.23a.25.25 0 0 0-.384 0L.342 8.59A.25.25 0 0 0 .534 9"/> |
<path fill-rule="evenodd" d="M8 3c-1.552 0-2.94.707-3.857 1.818a.5.5 0 1 1-.771-.636A6.002 6.002 0 0 1 13.917 7H12.9A5 5 0 0 0 8 3M3.1 9a5.002 5.002 0 0 0 8.757 2.182.5.5 0 1 1 .771.636A6.002 6.002 0 0 1 2.083 9z"/> |
</svg></button> |
</div> |
</div> |
</div> |
<div class="d-none col-xs-6 col-sm-2" data-view="config"> |
<ul> |
<li> |
Config <a href="../api/config">/api/config</a> |
</li> |
<li> |
Theme |
<a href="javascript:window.localStorage.setItem('theme', 'light')">Light</a> |
<a href="javascript:window.localStorage.setItem('theme', 'dark')">Dark</a> |
</li> |
<script> |
var theme = window.localStorage.getItem("theme"); |
var styleId = document.styleSheets.length - 1; |
var ruleId = 2; |
switch (theme) |
{ |
case "light": document.styleSheets[styleId].rules[ruleId].style.filter="invert(0.0)"; break;; |
case "dark": document.styleSheets[styleId].rules[ruleId].style.filter="invert(0.9)"; break;; |
} |
</script> |
</div> |
<div id="filterDisplay" class="d-none col-xs-6 col-sm-2" data-view="graphs"> |
<p class="h6">Display</p> |
<div class="form-group"> |
<select id="filterDisplaySelect" class="form-control form-select"> |
<option value="sources">Sources</option> |
<option value="protocols">Protocols</option> |
<option value="ports">Ports</option> |
</select> |
</div> |
</div> |
<div id="filterPorts" class="d-none col-xs-6 col-sm-2 col-md-1" data-view="graphs" data-display="ports"> |
<p class="h6">Ports</p> |
<div class="form-group"> |
<select id="filterPortsSelect" multiple class="form-control form-select"></select> |
</div> |
</div> |
<div id="filterSources" class="d-none col-xs-6 col-sm-3 col-md-2" data-view="graphs flows statistics" data-display="sources protocols ports"> |
<p class="h6">Sources</p> |
<div class="form-group"> |
<select id="filterSourcesSelect" multiple class="form-control form-select"> |
<option value="any">Any</option> |
</select> |
</div> |
</div> |
<div id="filterProtocols" class="d-none col-xs-12 col-sm-6 col-md-4 col-lg-3" data-view="graphs" data-display="sources protocols ports"> |
<p class="h6">Protocols</p> |
<div id="filterProtocolButtons" class="btn-group btn-group-md" data-bs-toggle="buttons"> |
<input type="radio" class="btn-check" name="protocol[]" value="any" id="filterProtocolAny"> |
<label class="btn btn-outline-primary" for="filterProtocolAny">Any</label> |
<input type="radio" class="btn-check" name="protocol[]" value="tcp" id="filterProtocolTcp"> |
<label class="btn btn-outline-primary" for="filterProtocolTcp">TCP</label> |
<input type="radio" class="btn-check" name="protocol[]" value="udp" id="filterProtocolUdp"> |
<label class="btn btn-outline-primary" for="filterProtocolUdp">UDP</label> |
<input type="radio" class="btn-check" name="protocol[]" value="icmp" id="filterProtocolIcmp"> |
<label class="btn btn-outline-primary" for="filterProtocolIcmp">ICMP</label> |
<input type="radio" class="btn-check" name="protocol[]" value="other" id="filterProtocolOther"> |
<label class="btn btn-outline-primary" for="filterProtocolOther">Others</label> |
</div> |
</div> |
<div id="filterTypes" class="d-none col-xs-12 col-sm-6 col-md-3 col-lg-2" data-view="graphs" data-display="sources protocols ports"> |
<p class="h6">Data Type</p> |
<div class="btn-group btn-group-md" data-bs-toggle="buttons"> |
<input type="radio" class="btn-check" name="datatype" value="traffic" id="dataTypeTraffic" checked> |
<label class="btn btn-outline-primary" for="dataTypeTraffic">Traffic</label> |
<input type="radio" class="btn-check" name="datatype" value="packets" id="dataTypePackets"> |
<label class="btn btn-outline-primary" for="dataTypePackets">Packets</label> |
<input type="radio" class="btn-check" name="datatype" value="flows" id="dataTypeFlows"> |
<label class="btn btn-outline-primary" for="dataTypeFlows">Flows</label> |
</div> |
</div> |
<div id="trafficUnit" class="d-none col-xs-6 col-sm-3 col-md-2 col-lg-2" data-view="graphs" data-display="sources protocols ports"> |
<p class="h6">Traffic unit</p> |
<div class="btn-group btn-group-md" data-bs-toggle="buttons"> |
<input type="radio" class="btn-check" name="trafficUnit" value="bits" id="trafficUnitBits" checked> |
<label class="btn btn-outline-primary" for="trafficUnitBits">Bits</label> |
<input type="radio" class="btn-check" name="trafficUnit" value="bytes" id="trafficUnitBytes"> |
<label class="btn btn-outline-primary" for="trafficUnitBytes">Bytes</label> |
</div> |
</div> |
<div id="filterFlowsLimit" class="d-none col-xs-6 col-sm-2 col-md-2 col-lg-1" data-view="flows"> |
<p class="h6">Limit Flows</p> |
<div class="form-group"> |
<select id="flowsFilterLimitSelection" class="form-control form-select"> |
<option value="20">20</option> |
<option value="50" >50</option> |
<option value="100" >100</option> |
<option value="500" >500</option> |
<option value="1000" >1000</option> |
<option value="10000" >10000</option> |
</select> |
</div> |
</div> |
<div id="filterStatisticsTop" class="d-none col-xs-6 col-sm-2 col-md-2 col-lg-1" data-view="statistics"> |
<p class="h6">Top records</p> |
<div class="form-group"> |
<select id="statsFilterTopSelection" class="form-control form-select"> |
<option value="10" selected>10</option> |
<option value="20">20</option> |
<option value="50">50</option> |
<option value="100">100</option> |
<option value="200">200</option> |
<option value="500">500</option> |
</select> |
</div> |
</div> |
<div id="filterNfdump" class="d-none col-xs-12 col-sm-7 col-md-5" data-view="graphs flows statistics"> |
<p class="h6">NFDUMP filter <span aria-hidden="true" data-bs-toggle="tooltip" data-bs-placement="right" title="The filter syntax is similar to the well known pcap library used by tcpdump. All keywords are case-independent. Example: dst port 80"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16"> |
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2"/> |
</svg></span></p> |
<div class="form-group"> |
<textarea class="form-control" id="filterNfdumpTextarea" rows="3" autocomplete="on"></textarea> |
</div> |
<div class="btn-group"> |
<div id="filterFilters" class="form-group"> |
<label class="form-control" >Filters</label> |
<select id="filterFiltersSelect" class="form-control form-select" title="Filters" style=""> |
<option value="" disabled selected>Select your filter</option> |
</select> |
</div> |
<button id="filterFiltersButtonRemove" type="button" class="btn btn-outline-primary" >Delete filter (server)</button> |
<button id="filterFiltersButtonSave" type="button" class="btn btn-outline-primary" >Save filter (server)</button> |
</div> |
</div> |
<div id="filterFlowAggregation" class="col"> |
<div class="d-none" data-view="flows"> |
<p class="h6">Global Aggregation</p> |
<div class="btn-group btn-group-md" data-bs-toggle="buttons" id="filterFlowAggregationGlobal"> |
<input type="checkbox" class="btn-check" name="bidirectional" id="filterFlowAggregationGlobalBi"> |
<label class="btn btn-outline-primary" for="filterFlowAggregationGlobalBi">Bi-directional</label> |
<input data-disable-on="bi-directional" type="checkbox" class="btn-check" name="proto" id="filterFlowAggregationGlobalProto"> |
<label class="btn btn-outline-primary" for="filterFlowAggregationGlobalProto">Protocol</label> |
</div> |
</div> |
<div class="d-none" data-view="flows"> |
<p class="h6">Port Aggregation</p> |
<div class="btn-group btn-group-md" data-bs-toggle="buttons" id="filterFlowAggregationPort"> |
<input data-disable-on="bi-directional" type="checkbox" class="btn-check" name="srcport" id="filterFlowAggregationPortSrc"> |
<label class="btn btn-outline-primary" for="filterFlowAggregationPortSrc">Source port</label> |
<input data-disable-on="bi-directional" type="checkbox" class="btn-check" name="dstport" id="filterFlowAggregationPortDst"> |
<label class="btn btn-outline-primary" for="filterFlowAggregationPortDst">Destination port</label> |
</div> |
</div> |
<div class="d-none" data-view="flows"> |
<p class="h6">IP Aggregation</p> |
<div class="row"> |
<div class="col-xs-6 col-sm-6"> |
<label>Source</label><br> |
<div class="form-group"> |
<select data-disable-on="bi-directional" data-kind="source" name="srcip" id="filterFlowAggregationSourceAddressSelect" class="form-control form-select float-start" style="width: 70%"> |
<option value="none">No aggregation</option> |
<option value="srcip">IP</option> |
<option value="srcip4">IPv4 subnets</option> |
<option value="srcip6">IPv6 subnets</option> |
</select> |
<div id="sourceCIDRPrefixDiv" class="d-none float-start" style="width:30%"> |
<input data-disable-on="bi-directional" id="sourceCIDRPrefix" placeholder="24" name="srcipprefix" type="text" class="form-control"> |
</div> |
</div> |
</div> |
<div class="col-xs-6 col-sm-6"> |
<label>Destination</label> |
<div class="form-group"> |
<select data-disable-on="bi-directional" data-kind="destination" name="dstip" id="filterFlowAggregationDestinationAddressSelect" class="form-control form-select float-start" style="width: 70%"> |
<option value="none">No aggregation</option> |
<option value="dstip">IP</option> |
<option value="dstip4">IPv4 subnets</option> |
<option value="dstip6">IPv6 subnets</option> |
</select> |
<div id="destinationCIDRPrefixDiv" class="d-none float-start" style="width:30%"> |
<input data-disable-on="bi-directional" id="destinationCIDRPrefix" placeholder="24" name="dstipprefix" type="text" class="form-control"> |
</div> |
</div> |
</div> |
</div> |
</div><!-- flowsFilterAggregationDiv --> |
</div> |
<div id="statsLimitDiv" class="d-none col-xs-6 col-sm-6 col-md-2" data-view="statistics"> |
<p class="h6">Data Limit</p> |
<div class="form-group"> |
<select id="statsLimitSelect" class="form-control form-select" data-view="statistics" disabled> |
<option value="none">No limit</option> |
<option value="">Packets</option> |
<option value="">Bytes</option> |
</select> |
</div> |
</div> |
<div id="filterStatsProperties" class="d-none col-xs-6 col-sm-6 col-md-4 col-lg-2" data-view="statistics"> |
<p class="h6">Statistic properties</p> |
<div class="form-group"> |
<label for="statsFilterForSelection">Statistic for</label> |
<select id="statsFilterForSelection" class="form-control form-select"> |
<option value="record" selected>Flow Records</option> |
<option value="ip">Any IP address</option> |
<option value="srcip">Src IP address</option> |
<option value="dstip">Dst IP address</option> |
<option value="port">Any port</option> |
<option value="srcport">Src port</option> |
<option value="dstport">Dst port</option> |
<option value="if">Any interface</option> |
<option value="inif">IN interface</option> |
<option value="outif">OUT interface</option> |
<option value="as">Any AS</option> |
<option value="srcas">Src AS</option> |
<option value="dstas">Dst AS</option> |
<option value="nhip">Next Hop IP</option> |
<option value="nhbip">Next Hop BGP IP</option> |
<option value="router">Router IP</option> |
<option value="proto">Proto</option> |
<option value="dir">Direction</option> |
<option value="srctos">Src TOS</option> |
<option value="dsttos">Dst TOS</option> |
<option value="tos">Tos</option> |
<option value="mask">Any Mask Bits</option> |
<option value="srcmask">Src Mask Bits</option> |
<option value="dstmask">Dst Mask Bits</option> |
<option value="vlan">Any VLAN ID</option> |
<option value="srcvlan">Src VLAN ID</option> |
<option value="dstvlan">Dst VLAN ID</option> |
<option value="srcmac">Src MAC</option> |
<option value="dstmac">Dst MAC</option> |
<option value="inmac">IN MAC</option> |
<option value="outmac">OUT MAC</option> |
<option value="insrcmac">IN src MAC</option> |
<option value="outdstmac">OUT dst MAC</option> |
<option value="indstmac">IN dst MAC</option> |
<option value="outsrcmac">OUT src MAC</option> |
<option value="mpls1">MPLS Label 1</option> |
<option value="mpls2">MPLS Label 2</option> |
<option value="mpls3">MPLS Label 3</option> |
<option value="mpls4">MPLS Label 4</option> |
<option value="mpls5">MPLS Label 5</option> |
<option value="mpls6">MPLS Label 6</option> |
<option value="mpls7">MPLS Label 7</option> |
<option value="mpls8">MPLS Label 8</option> |
<option value="mpls9">MPLS Label 9</option> |
<option value="mpls10">MPLS Label 10</option> |
</select> |
</div> |
<div class="form-group"> |
<label for="statsFilterOrderBySelection">Order by</label> |
<select id="statsFilterOrderBySelection" class="form-control form-select"> |
<option value="flows" selected>Flows</option> |
<option value="packets">Packets</option> |
<option value="bytes">Bytes</option> |
<option value="pps">Packets per second</option> |
<option value="bps">Bits per second</option> |
<option value="bpp">Bytes per packet</option> |
</select> |
</div> |
</div><!-- statsFilterPropertiesDiv --> |
<div id="filterOutput" class="hidden col-xs-12 col-sm-6 col-md-4 col-lg-4" data-view="flows statistics"> |
<p class="h6">Output</p> |
<div class="row"> |
<div class="form-group col-xs-6 col-sm-6"> |
<label for="filterOutputSelection">Output type</label> |
<select id="filterOutputSelection" name="filterOutputSelection" class="form-control form-select"> |
<option value="line">Line</option> |
<option value="long">Long</option> |
<option value="extended">Extended</option> |
<option value="full">Full</option> |
<option value="custom">Custom</option> |
</select> |
</div> |
<div class="form-group col-xs-6 col-sm-6"> |
<label>Other options</label> |
<br> |
<div class="" id="flowsFilterOther" data-bs-toggle="buttons"> |
<input type="checkbox" class="btn-check" name="ordertstart" value="true" id="flowsFilterOtherOrderTstart"> |
<label class="btn btn-outline-primary" data-view="flows" for="flowsFilterOtherOrderTstart">Order by tstart</label> |
</div> |
</div> |
</div> |
<div id="customListOutputFormat" class="form-group hidden"> |
<label for="customListOutputFormatValue">Custom output format |
<span aria-hidden="true" data-bs-toggle="tooltip" data-bs-placement="right" title="Specify output format in nfdump-style. E.g. %ts %tr %pr"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-info-circle-fill" viewBox="0 0 16 16"> |
<path d="M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.93-9.412-1 4.705c-.07.34.029.533.304.533.194 0 .487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703 0-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381 2.29-.287zM8 5.5a1 1 0 1 1 0-2 1 1 0 0 1 0 2"/> |
</svg></span></label> |
<input id="customListOutputFormatValue" type="text" class="form-control"> |
</div> |
</div> |
<div id="filterCommands" class="hidden col-xs-12 col-sm-6 col-md-3" data-view="flows statistics"> |
<p class="h6">Commands</p> |
<div class="btn-group btn-group-md" data-bs-toggle="buttons"> |
<button type="button" class="btn btn-outline-primary submit">Process data</button> |
<button type="button" class="btn btn-success csv">Get CSV</button> |
<button type="button" class="btn btn-outline-primary reset">Reset filters</button> |
</div> |
</div> |
</div><!-- statsFilterDiv --> |
</form> |
</div><!-- filterDiv --> |
<div id="error"></div> |
<div id="contentDiv"> |
<div id="graphsContentDiv" data-view="graphs" class="content container-fluid"> |
<div class="col-sm-12 my-4"> |
<div id="flowDiv" style="width: 100%;"></div> |
</div> |
<div id="graphOptions" class="row"> |
<div class="col-xs-6 col-sm-3"> |
<p class="h6">Graph Scale</p> |
<div class="btn-group" role="group" id="graph_linlog"> |
<input type="radio" class="btn-check" name="scale" autocomplete="off" value="linear" checked id="graph_linlog_linear"> |
<label for="graph_linlog_linear" class="btn btn-outline-primary">Linear</label> |
<input id="graph_linlog_log" type="radio" class="btn-check" name="scale" autocomplete="off" value="logarithmic"> |
<label for="graph_linlog_log" class="btn btn-outline-primary">Logarithmic</label> |
</div> |
</div> |
<div class="col-xs-6 col-sm-3"> |
<p class="h6">Series display</p> |
<div class="btn-group" data-bs-toggle="buttons" id="graph_linestacked"> |
<input type="radio" class="btn-check" name="type" autocomplete="off" value="stacked" checked id="graph_linestacked_stacked"> |
<label class="btn btn-outline-primary" for="graph_linestacked_stacked">Stacked</label> |
<input type="radio" class="btn-check" name="type" autocomplete="off" value="line" id="graph_linestacked_line"> |
<label class="btn btn-outline-primary" for="graph_linestacked_line">Line</label> |
</div> |
<div class="btn-group" data-bs-toggle="buttons" id="graph_lineplot"> |
<input type="radio" class="btn-check" name="lineplot" autocomplete="off" value="step" id="graph_lineplot_step" checked> |
<label class="btn btn-outline-primary" for="graph_lineplot_step">Step plot</label> |
<input type="radio" class="btn-check" name="lineplot" autocomplete="off" value="curve" id="graph_lineplot_curve"> |
<label class="btn btn-outline-primary" for="graph_lineplot_curve">Curve plot</label> |
</div> |
</div> |
<div class="col-xs-6 col-sm-3 accordion"> |
<p class="h6" data-bs-toggle="collapse" data-bs-target="#series" role="button" aria-expanded="true">Series</p> |
<div class="collapse show" id="series"></div> |
</div> |
<div class="col-xs-6 col-sm-3 accordion"> |
<p class="h6" data-bs-toggle="collapse" data-bs-target="#legend" role="button" aria-expanded="true">Values</p> |
<div class="collapse show" id="legend"></div> |
</div> |
</div> |
</div> |
<div id="flowsContentDiv" data-view="flows" class="content"> |
<table class="table" data-paging="true" data-paging-limit="10" data-paging-size="50" data-filtering="true" data-sorting="true"></table> |
</div><!-- flowsContentDiv --> |
<div id="statisticsContentDiv" data-view="statistics" class="content"> |
<table class="table" data-paging="true" data-paging-limit="10" data-paging-size="50" data-filtering="true" data-sorting="true"></table> |
</div><!-- statsContentDiv --> |
</div><!-- contentDiv --> |
<div class="modal fade" id="modal" tabindex="-1" aria-labelledby="modalLabel" aria-hidden="true"> |
<div class="modal-dialog"> |
<div class="modal-content"> |
<div class="modal-header"> |
<h1 class="modal-title fs-5" id="modalLabel">Modal title</h1> |
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
</div> |
<div class="modal-body"></div> |
<div class="modal-loader d-none text-center"> |
<div class="spinner-border" role="status"> |
<span class="visually-hidden">Loading</span> |
</div> |
</div> |
<div class="modal-footer"> |
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> |
</div> |
</div> |
</div> |
</div> |
<script src="js/nfsen-ng.js"></script> |
</body> |
</html> |
/web/acc/manager/nfsen/vendor/autoload.php |
---|
0,0 → 1,25 |
<?php |
// autoload.php @generated by Composer |
if (PHP_VERSION_ID < 50600) { |
if (!headers_sent()) { |
header('HTTP/1.1 500 Internal Server Error'); |
} |
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; |
if (!ini_get('display_errors')) { |
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { |
fwrite(STDERR, $err); |
} elseif (!headers_sent()) { |
echo $err; |
} |
} |
trigger_error( |
$err, |
E_USER_ERROR |
); |
} |
require_once __DIR__ . '/composer/autoload_real.php'; |
return ComposerAutoloaderInitf00fa0808b7e3ccf5d95c78c1d4b3318::getLoader(); |
/web/acc/manager/nfsen/vendor/composer/ClassLoader.php |
---|
0,0 → 1,579 |
<?php |
/* |
* This file is part of Composer. |
* |
* (c) Nils Adermann <naderman@naderman.de> |
* Jordi Boggiano <j.boggiano@seld.be> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Composer\Autoload; |
/** |
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader. |
* |
* $loader = new \Composer\Autoload\ClassLoader(); |
* |
* // register classes with namespaces |
* $loader->add('Symfony\Component', __DIR__.'/component'); |
* $loader->add('Symfony', __DIR__.'/framework'); |
* |
* // activate the autoloader |
* $loader->register(); |
* |
* // to enable searching the include path (eg. for PEAR packages) |
* $loader->setUseIncludePath(true); |
* |
* In this example, if you try to use a class in the Symfony\Component |
* namespace or one of its children (Symfony\Component\Console for instance), |
* the autoloader will first look for the class under the component/ |
* directory, and it will then fallback to the framework/ directory if not |
* found before giving up. |
* |
* This class is loosely based on the Symfony UniversalClassLoader. |
* |
* @author Fabien Potencier <fabien@symfony.com> |
* @author Jordi Boggiano <j.boggiano@seld.be> |
* @see https://www.php-fig.org/psr/psr-0/ |
* @see https://www.php-fig.org/psr/psr-4/ |
*/ |
class ClassLoader |
{ |
/** @var \Closure(string):void */ |
private static $includeFile; |
/** @var string|null */ |
private $vendorDir; |
// PSR-4 |
/** |
* @var array<string, array<string, int>> |
*/ |
private $prefixLengthsPsr4 = array(); |
/** |
* @var array<string, list<string>> |
*/ |
private $prefixDirsPsr4 = array(); |
/** |
* @var list<string> |
*/ |
private $fallbackDirsPsr4 = array(); |
// PSR-0 |
/** |
* List of PSR-0 prefixes |
* |
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) |
* |
* @var array<string, array<string, list<string>>> |
*/ |
private $prefixesPsr0 = array(); |
/** |
* @var list<string> |
*/ |
private $fallbackDirsPsr0 = array(); |
/** @var bool */ |
private $useIncludePath = false; |
/** |
* @var array<string, string> |
*/ |
private $classMap = array(); |
/** @var bool */ |
private $classMapAuthoritative = false; |
/** |
* @var array<string, bool> |
*/ |
private $missingClasses = array(); |
/** @var string|null */ |
private $apcuPrefix; |
/** |
* @var array<string, self> |
*/ |
private static $registeredLoaders = array(); |
/** |
* @param string|null $vendorDir |
*/ |
public function __construct($vendorDir = null) |
{ |
$this->vendorDir = $vendorDir; |
self::initializeIncludeClosure(); |
} |
/** |
* @return array<string, list<string>> |
*/ |
public function getPrefixes() |
{ |
if (!empty($this->prefixesPsr0)) { |
return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); |
} |
return array(); |
} |
/** |
* @return array<string, list<string>> |
*/ |
public function getPrefixesPsr4() |
{ |
return $this->prefixDirsPsr4; |
} |
/** |
* @return list<string> |
*/ |
public function getFallbackDirs() |
{ |
return $this->fallbackDirsPsr0; |
} |
/** |
* @return list<string> |
*/ |
public function getFallbackDirsPsr4() |
{ |
return $this->fallbackDirsPsr4; |
} |
/** |
* @return array<string, string> Array of classname => path |
*/ |
public function getClassMap() |
{ |
return $this->classMap; |
} |
/** |
* @param array<string, string> $classMap Class to filename map |
* |
* @return void |
*/ |
public function addClassMap(array $classMap) |
{ |
if ($this->classMap) { |
$this->classMap = array_merge($this->classMap, $classMap); |
} else { |
$this->classMap = $classMap; |
} |
} |
/** |
* Registers a set of PSR-0 directories for a given prefix, either |
* appending or prepending to the ones previously set for this prefix. |
* |
* @param string $prefix The prefix |
* @param list<string>|string $paths The PSR-0 root directories |
* @param bool $prepend Whether to prepend the directories |
* |
* @return void |
*/ |
public function add($prefix, $paths, $prepend = false) |
{ |
$paths = (array) $paths; |
if (!$prefix) { |
if ($prepend) { |
$this->fallbackDirsPsr0 = array_merge( |
$paths, |
$this->fallbackDirsPsr0 |
); |
} else { |
$this->fallbackDirsPsr0 = array_merge( |
$this->fallbackDirsPsr0, |
$paths |
); |
} |
return; |
} |
$first = $prefix[0]; |
if (!isset($this->prefixesPsr0[$first][$prefix])) { |
$this->prefixesPsr0[$first][$prefix] = $paths; |
return; |
} |
if ($prepend) { |
$this->prefixesPsr0[$first][$prefix] = array_merge( |
$paths, |
$this->prefixesPsr0[$first][$prefix] |
); |
} else { |
$this->prefixesPsr0[$first][$prefix] = array_merge( |
$this->prefixesPsr0[$first][$prefix], |
$paths |
); |
} |
} |
/** |
* Registers a set of PSR-4 directories for a given namespace, either |
* appending or prepending to the ones previously set for this namespace. |
* |
* @param string $prefix The prefix/namespace, with trailing '\\' |
* @param list<string>|string $paths The PSR-4 base directories |
* @param bool $prepend Whether to prepend the directories |
* |
* @throws \InvalidArgumentException |
* |
* @return void |
*/ |
public function addPsr4($prefix, $paths, $prepend = false) |
{ |
$paths = (array) $paths; |
if (!$prefix) { |
// Register directories for the root namespace. |
if ($prepend) { |
$this->fallbackDirsPsr4 = array_merge( |
$paths, |
$this->fallbackDirsPsr4 |
); |
} else { |
$this->fallbackDirsPsr4 = array_merge( |
$this->fallbackDirsPsr4, |
$paths |
); |
} |
} elseif (!isset($this->prefixDirsPsr4[$prefix])) { |
// Register directories for a new namespace. |
$length = strlen($prefix); |
if ('\\' !== $prefix[$length - 1]) { |
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
} |
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
$this->prefixDirsPsr4[$prefix] = $paths; |
} elseif ($prepend) { |
// Prepend directories for an already registered namespace. |
$this->prefixDirsPsr4[$prefix] = array_merge( |
$paths, |
$this->prefixDirsPsr4[$prefix] |
); |
} else { |
// Append directories for an already registered namespace. |
$this->prefixDirsPsr4[$prefix] = array_merge( |
$this->prefixDirsPsr4[$prefix], |
$paths |
); |
} |
} |
/** |
* Registers a set of PSR-0 directories for a given prefix, |
* replacing any others previously set for this prefix. |
* |
* @param string $prefix The prefix |
* @param list<string>|string $paths The PSR-0 base directories |
* |
* @return void |
*/ |
public function set($prefix, $paths) |
{ |
if (!$prefix) { |
$this->fallbackDirsPsr0 = (array) $paths; |
} else { |
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; |
} |
} |
/** |
* Registers a set of PSR-4 directories for a given namespace, |
* replacing any others previously set for this namespace. |
* |
* @param string $prefix The prefix/namespace, with trailing '\\' |
* @param list<string>|string $paths The PSR-4 base directories |
* |
* @throws \InvalidArgumentException |
* |
* @return void |
*/ |
public function setPsr4($prefix, $paths) |
{ |
if (!$prefix) { |
$this->fallbackDirsPsr4 = (array) $paths; |
} else { |
$length = strlen($prefix); |
if ('\\' !== $prefix[$length - 1]) { |
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); |
} |
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; |
$this->prefixDirsPsr4[$prefix] = (array) $paths; |
} |
} |
/** |
* Turns on searching the include path for class files. |
* |
* @param bool $useIncludePath |
* |
* @return void |
*/ |
public function setUseIncludePath($useIncludePath) |
{ |
$this->useIncludePath = $useIncludePath; |
} |
/** |
* Can be used to check if the autoloader uses the include path to check |
* for classes. |
* |
* @return bool |
*/ |
public function getUseIncludePath() |
{ |
return $this->useIncludePath; |
} |
/** |
* Turns off searching the prefix and fallback directories for classes |
* that have not been registered with the class map. |
* |
* @param bool $classMapAuthoritative |
* |
* @return void |
*/ |
public function setClassMapAuthoritative($classMapAuthoritative) |
{ |
$this->classMapAuthoritative = $classMapAuthoritative; |
} |
/** |
* Should class lookup fail if not found in the current class map? |
* |
* @return bool |
*/ |
public function isClassMapAuthoritative() |
{ |
return $this->classMapAuthoritative; |
} |
/** |
* APCu prefix to use to cache found/not-found classes, if the extension is enabled. |
* |
* @param string|null $apcuPrefix |
* |
* @return void |
*/ |
public function setApcuPrefix($apcuPrefix) |
{ |
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; |
} |
/** |
* The APCu prefix in use, or null if APCu caching is not enabled. |
* |
* @return string|null |
*/ |
public function getApcuPrefix() |
{ |
return $this->apcuPrefix; |
} |
/** |
* Registers this instance as an autoloader. |
* |
* @param bool $prepend Whether to prepend the autoloader or not |
* |
* @return void |
*/ |
public function register($prepend = false) |
{ |
spl_autoload_register(array($this, 'loadClass'), true, $prepend); |
if (null === $this->vendorDir) { |
return; |
} |
if ($prepend) { |
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; |
} else { |
unset(self::$registeredLoaders[$this->vendorDir]); |
self::$registeredLoaders[$this->vendorDir] = $this; |
} |
} |
/** |
* Unregisters this instance as an autoloader. |
* |
* @return void |
*/ |
public function unregister() |
{ |
spl_autoload_unregister(array($this, 'loadClass')); |
if (null !== $this->vendorDir) { |
unset(self::$registeredLoaders[$this->vendorDir]); |
} |
} |
/** |
* Loads the given class or interface. |
* |
* @param string $class The name of the class |
* @return true|null True if loaded, null otherwise |
*/ |
public function loadClass($class) |
{ |
if ($file = $this->findFile($class)) { |
$includeFile = self::$includeFile; |
$includeFile($file); |
return true; |
} |
return null; |
} |
/** |
* Finds the path to the file where the class is defined. |
* |
* @param string $class The name of the class |
* |
* @return string|false The path if found, false otherwise |
*/ |
public function findFile($class) |
{ |
// class map lookup |
if (isset($this->classMap[$class])) { |
return $this->classMap[$class]; |
} |
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { |
return false; |
} |
if (null !== $this->apcuPrefix) { |
$file = apcu_fetch($this->apcuPrefix.$class, $hit); |
if ($hit) { |
return $file; |
} |
} |
$file = $this->findFileWithExtension($class, '.php'); |
// Search for Hack files if we are running on HHVM |
if (false === $file && defined('HHVM_VERSION')) { |
$file = $this->findFileWithExtension($class, '.hh'); |
} |
if (null !== $this->apcuPrefix) { |
apcu_add($this->apcuPrefix.$class, $file); |
} |
if (false === $file) { |
// Remember that this class does not exist. |
$this->missingClasses[$class] = true; |
} |
return $file; |
} |
/** |
* Returns the currently registered loaders keyed by their corresponding vendor directories. |
* |
* @return array<string, self> |
*/ |
public static function getRegisteredLoaders() |
{ |
return self::$registeredLoaders; |
} |
/** |
* @param string $class |
* @param string $ext |
* @return string|false |
*/ |
private function findFileWithExtension($class, $ext) |
{ |
// PSR-4 lookup |
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; |
$first = $class[0]; |
if (isset($this->prefixLengthsPsr4[$first])) { |
$subPath = $class; |
while (false !== $lastPos = strrpos($subPath, '\\')) { |
$subPath = substr($subPath, 0, $lastPos); |
$search = $subPath . '\\'; |
if (isset($this->prefixDirsPsr4[$search])) { |
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); |
foreach ($this->prefixDirsPsr4[$search] as $dir) { |
if (file_exists($file = $dir . $pathEnd)) { |
return $file; |
} |
} |
} |
} |
} |
// PSR-4 fallback dirs |
foreach ($this->fallbackDirsPsr4 as $dir) { |
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { |
return $file; |
} |
} |
// PSR-0 lookup |
if (false !== $pos = strrpos($class, '\\')) { |
// namespaced class name |
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) |
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); |
} else { |
// PEAR-like class name |
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; |
} |
if (isset($this->prefixesPsr0[$first])) { |
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { |
if (0 === strpos($class, $prefix)) { |
foreach ($dirs as $dir) { |
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
return $file; |
} |
} |
} |
} |
} |
// PSR-0 fallback dirs |
foreach ($this->fallbackDirsPsr0 as $dir) { |
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { |
return $file; |
} |
} |
// PSR-0 include paths. |
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { |
return $file; |
} |
return false; |
} |
/** |
* @return void |
*/ |
private static function initializeIncludeClosure() |
{ |
if (self::$includeFile !== null) { |
return; |
} |
/** |
* Scope isolated include. |
* |
* Prevents access to $this/self from included files. |
* |
* @param string $file |
* @return void |
*/ |
self::$includeFile = \Closure::bind(static function($file) { |
include $file; |
}, null, null); |
} |
} |
/web/acc/manager/nfsen/vendor/composer/InstalledVersions.php |
---|
0,0 → 1,362 |
<?php |
/* |
* This file is part of Composer. |
* |
* (c) Nils Adermann <naderman@naderman.de> |
* Jordi Boggiano <j.boggiano@seld.be> |
* |
* For the full copyright and license information, please view the LICENSE |
* file that was distributed with this source code. |
*/ |
namespace Composer; |
use Composer\Autoload\ClassLoader; |
use Composer\Semver\VersionParser; |
/** |
* This class is copied in every Composer installed project and available to all |
* |
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions |
* |
* To require its presence, you can require `composer-runtime-api ^2.0` |
* |
* @final |
*/ |
class InstalledVersions |
{ |
/** |
* @var mixed[]|null |
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null |
*/ |
private static $installed; |
/** |
* @var bool|null |
*/ |
private static $canGetVendors; |
/** |
* @var array[] |
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> |
*/ |
private static $installedByVendor = array(); |
/** |
* Returns a list of all package names which are present, either by being installed, replaced or provided |
* |
* @return string[] |
* @psalm-return list<string> |
*/ |
public static function getInstalledPackages() |
{ |
$packages = array(); |
foreach (self::getInstalled() as $installed) { |
$packages[] = array_keys($installed['versions']); |
} |
if (1 === \count($packages)) { |
return $packages[0]; |
} |
return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); |
} |
/** |
* Returns a list of all package names with a specific type e.g. 'library' |
* |
* @param string $type |
* @return string[] |
* @psalm-return list<string> |
*/ |
public static function getInstalledPackagesByType($type) |
{ |
$packagesByType = array(); |
foreach (self::getInstalled() as $installed) { |
foreach ($installed['versions'] as $name => $package) { |
if (isset($package['type']) && $package['type'] === $type) { |
$packagesByType[] = $name; |
} |
} |
} |
return $packagesByType; |
} |
/** |
* Checks whether the given package is installed |
* |
* This also returns true if the package name is provided or replaced by another package |
* |
* @param string $packageName |
* @param bool $includeDevRequirements |
* @return bool |
*/ |
public static function isInstalled($packageName, $includeDevRequirements = true) |
{ |
foreach (self::getInstalled() as $installed) { |
if (isset($installed['versions'][$packageName])) { |
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; |
} |
} |
return false; |
} |
/** |
* Checks whether the given package satisfies a version constraint |
* |
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: |
* |
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') |
* |
* @param VersionParser $parser Install composer/semver to have access to this class and functionality |
* @param string $packageName |
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package |
* @return bool |
*/ |
public static function satisfies(VersionParser $parser, $packageName, $constraint) |
{ |
$constraint = $parser->parseConstraints((string) $constraint); |
$provided = $parser->parseConstraints(self::getVersionRanges($packageName)); |
return $provided->matches($constraint); |
} |
/** |
* Returns a version constraint representing all the range(s) which are installed for a given package |
* |
* It is easier to use this via isInstalled() with the $constraint argument if you need to check |
* whether a given version of a package is installed, and not just whether it exists |
* |
* @param string $packageName |
* @return string Version constraint usable with composer/semver |
*/ |
public static function getVersionRanges($packageName) |
{ |
foreach (self::getInstalled() as $installed) { |
if (!isset($installed['versions'][$packageName])) { |
continue; |
} |
$ranges = array(); |
if (isset($installed['versions'][$packageName]['pretty_version'])) { |
$ranges[] = $installed['versions'][$packageName]['pretty_version']; |
} |
if (array_key_exists('aliases', $installed['versions'][$packageName])) { |
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); |
} |
if (array_key_exists('replaced', $installed['versions'][$packageName])) { |
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); |
} |
if (array_key_exists('provided', $installed['versions'][$packageName])) { |
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); |
} |
return implode(' || ', $ranges); |
} |
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
} |
/** |
* @param string $packageName |
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present |
*/ |
public static function getVersion($packageName) |
{ |
foreach (self::getInstalled() as $installed) { |
if (!isset($installed['versions'][$packageName])) { |
continue; |
} |
if (!isset($installed['versions'][$packageName]['version'])) { |
return null; |
} |
return $installed['versions'][$packageName]['version']; |
} |
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
} |
/** |
* @param string $packageName |
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present |
*/ |
public static function getPrettyVersion($packageName) |
{ |
foreach (self::getInstalled() as $installed) { |
if (!isset($installed['versions'][$packageName])) { |
continue; |
} |
if (!isset($installed['versions'][$packageName]['pretty_version'])) { |
return null; |
} |
return $installed['versions'][$packageName]['pretty_version']; |
} |
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
} |
/** |
* @param string $packageName |
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference |
*/ |
public static function getReference($packageName) |
{ |
foreach (self::getInstalled() as $installed) { |
if (!isset($installed['versions'][$packageName])) { |
continue; |
} |
if (!isset($installed['versions'][$packageName]['reference'])) { |
return null; |
} |
return $installed['versions'][$packageName]['reference']; |
} |
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
} |
/** |
* @param string $packageName |
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. |
*/ |
public static function getInstallPath($packageName) |
{ |
foreach (self::getInstalled() as $installed) { |
if (!isset($installed['versions'][$packageName])) { |
continue; |
} |
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; |
} |
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); |
} |
/** |
* @return array |
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} |
*/ |
public static function getRootPackage() |
{ |
$installed = self::getInstalled(); |
return $installed[0]['root']; |
} |
/** |
* Returns the raw installed.php data for custom implementations |
* |
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. |
* @return array[] |
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} |
*/ |
public static function getRawData() |
{ |
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); |
if (null === self::$installed) { |
// only require the installed.php file if this file is loaded from its dumped location, |
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 |
if (substr(__DIR__, -8, 1) !== 'C') { |
self::$installed = include __DIR__ . '/installed.php'; |
} else { |
self::$installed = array(); |
} |
} |
return self::$installed; |
} |
/** |
* Returns the raw data of all installed.php which are currently loaded for custom implementations |
* |
* @return array[] |
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> |
*/ |
public static function getAllRawData() |
{ |
return self::getInstalled(); |
} |
/** |
* Lets you reload the static array from another file |
* |
* This is only useful for complex integrations in which a project needs to use |
* this class but then also needs to execute another project's autoloader in process, |
* and wants to ensure both projects have access to their version of installed.php. |
* |
* A typical case would be PHPUnit, where it would need to make sure it reads all |
* the data it needs from this class, then call reload() with |
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure |
* the project in which it runs can then also use this class safely, without |
* interference between PHPUnit's dependencies and the project's dependencies. |
* |
* @param array[] $data A vendor/composer/installed.php data set |
* @return void |
* |
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data |
*/ |
public static function reload($data) |
{ |
self::$installed = $data; |
self::$installedByVendor = array(); |
} |
/** |
* @return array[] |
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> |
*/ |
private static function getInstalled() |
{ |
if (null === self::$canGetVendors) { |
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); |
} |
$installed = array(); |
$copiedLocalDir = false; |
if (self::$canGetVendors) { |
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { |
if (isset(self::$installedByVendor[$vendorDir])) { |
$installed[] = self::$installedByVendor[$vendorDir]; |
} elseif (is_file($vendorDir.'/composer/installed.php')) { |
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ |
$required = require $vendorDir.'/composer/installed.php'; |
self::$installedByVendor[$vendorDir] = $required; |
$installed[] = $required; |
if (strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { |
self::$installed = $required; |
$copiedLocalDir = true; |
} |
} |
} |
} |
if (null === self::$installed) { |
// only require the installed.php file if this file is loaded from its dumped location, |
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 |
if (substr(__DIR__, -8, 1) !== 'C') { |
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ |
$required = require __DIR__ . '/installed.php'; |
self::$installed = $required; |
} else { |
self::$installed = array(); |
} |
} |
if (self::$installed !== array() && !$copiedLocalDir) { |
$installed[] = self::$installed; |
} |
return $installed; |
} |
} |
/web/acc/manager/nfsen/vendor/composer/LICENSE |
---|
0,0 → 1,21 |
Copyright (c) Nils Adermann, Jordi Boggiano |
Permission is hereby granted, free of charge, to any person obtaining a copy |
of this software and associated documentation files (the "Software"), to deal |
in the Software without restriction, including without limitation the rights |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
copies of the Software, and to permit persons to whom the Software is furnished |
to do so, subject to the following conditions: |
The above copyright notice and this permission notice shall be included in all |
copies or substantial portions of the Software. |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
THE SOFTWARE. |
/web/acc/manager/nfsen/vendor/composer/autoload_classmap.php |
---|
0,0 → 1,10 |
<?php |
// autoload_classmap.php @generated by Composer |
$vendorDir = dirname(__DIR__); |
$baseDir = dirname($vendorDir); |
return array( |
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', |
); |
/web/acc/manager/nfsen/vendor/composer/autoload_namespaces.php |
---|
0,0 → 1,9 |
<?php |
// autoload_namespaces.php @generated by Composer |
$vendorDir = dirname(__DIR__); |
$baseDir = dirname($vendorDir); |
return array( |
); |
/web/acc/manager/nfsen/vendor/composer/autoload_psr4.php |
---|
0,0 → 1,10 |
<?php |
// autoload_psr4.php @generated by Composer |
$vendorDir = dirname(__DIR__); |
$baseDir = dirname($vendorDir); |
return array( |
'mbolli\\nfsen_ng\\' => array($baseDir . '/backend'), |
); |
/web/acc/manager/nfsen/vendor/composer/autoload_real.php |
---|
0,0 → 1,38 |
<?php |
// autoload_real.php @generated by Composer |
class ComposerAutoloaderInitf00fa0808b7e3ccf5d95c78c1d4b3318 |
{ |
private static $loader; |
public static function loadClassLoader($class) |
{ |
if ('Composer\Autoload\ClassLoader' === $class) { |
require __DIR__ . '/ClassLoader.php'; |
} |
} |
/** |
* @return \Composer\Autoload\ClassLoader |
*/ |
public static function getLoader() |
{ |
if (null !== self::$loader) { |
return self::$loader; |
} |
require __DIR__ . '/platform_check.php'; |
spl_autoload_register(array('ComposerAutoloaderInitf00fa0808b7e3ccf5d95c78c1d4b3318', 'loadClassLoader'), true, true); |
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); |
spl_autoload_unregister(array('ComposerAutoloaderInitf00fa0808b7e3ccf5d95c78c1d4b3318', 'loadClassLoader')); |
require __DIR__ . '/autoload_static.php'; |
call_user_func(\Composer\Autoload\ComposerStaticInitf00fa0808b7e3ccf5d95c78c1d4b3318::getInitializer($loader)); |
$loader->register(true); |
return $loader; |
} |
} |
/web/acc/manager/nfsen/vendor/composer/autoload_static.php |
---|
0,0 → 1,36 |
<?php |
// autoload_static.php @generated by Composer |
namespace Composer\Autoload; |
class ComposerStaticInitf00fa0808b7e3ccf5d95c78c1d4b3318 |
{ |
public static $prefixLengthsPsr4 = array ( |
'm' => |
array ( |
'mbolli\\nfsen_ng\\' => 16, |
), |
); |
public static $prefixDirsPsr4 = array ( |
'mbolli\\nfsen_ng\\' => |
array ( |
0 => __DIR__ . '/../..' . '/backend', |
), |
); |
public static $classMap = array ( |
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', |
); |
public static function getInitializer(ClassLoader $loader) |
{ |
return \Closure::bind(function () use ($loader) { |
$loader->prefixLengthsPsr4 = ComposerStaticInitf00fa0808b7e3ccf5d95c78c1d4b3318::$prefixLengthsPsr4; |
$loader->prefixDirsPsr4 = ComposerStaticInitf00fa0808b7e3ccf5d95c78c1d4b3318::$prefixDirsPsr4; |
$loader->classMap = ComposerStaticInitf00fa0808b7e3ccf5d95c78c1d4b3318::$classMap; |
}, null, ClassLoader::class); |
} |
} |
/web/acc/manager/nfsen/vendor/composer/installed.json |
---|
0,0 → 1,5 |
{ |
"packages": [], |
"dev": false, |
"dev-package-names": [] |
} |
/web/acc/manager/nfsen/vendor/composer/installed.php |
---|
0,0 → 1,23 |
<?php return array( |
'root' => array( |
'name' => 'mbolli/nfsen-ng', |
'pretty_version' => '1.0.0+no-version-set', |
'version' => '1.0.0.0', |
'reference' => null, |
'type' => 'library', |
'install_path' => __DIR__ . '/../../', |
'aliases' => array(), |
'dev' => false, |
), |
'versions' => array( |
'mbolli/nfsen-ng' => array( |
'pretty_version' => '1.0.0+no-version-set', |
'version' => '1.0.0.0', |
'reference' => null, |
'type' => 'library', |
'install_path' => __DIR__ . '/../../', |
'aliases' => array(), |
'dev_requirement' => false, |
), |
), |
); |
/web/acc/manager/nfsen/vendor/composer/platform_check.php |
---|
0,0 → 1,26 |
<?php |
// platform_check.php @generated by Composer |
$issues = array(); |
if (!(PHP_VERSION_ID >= 80100)) { |
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.1.0". You are running ' . PHP_VERSION . '.'; |
} |
if ($issues) { |
if (!headers_sent()) { |
header('HTTP/1.1 500 Internal Server Error'); |
} |
if (!ini_get('display_errors')) { |
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { |
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); |
} elseif (!headers_sent()) { |
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; |
} |
} |
trigger_error( |
'Composer detected issues in your platform: ' . implode(' ', $issues), |
E_USER_ERROR |
); |
} |
/web/acc/manager/nfsen.php |
---|
17,7 → 17,7 |
<body> |
<div class="panel"> |
<div class="panel-header"><?= $l_title ?></div> |
<iframe class="panel-iframe" src="nfsen/nfsen.php"> |
<iframe class="panel-iframe" src="nfsen/frontend/index.html"> |
</iframe> |
</div> |
</body> |