templates/default/vpspopin.html.twig line 1

Open in your IDE?
  1. <div class="modal-dialog">
  2.     <div class="modal-content">
  3.         <div class="modal-header"><h5 class="modal-title">VPS{{ vpsid }}</h5>
  4.             <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
  5.                         aria-hidden="true">×</span></button>
  6.         </div>
  7.         <div class="modal-body">
  8.             <h3>Containers ({{ dockervpsValues.containers|length }})</h3>
  9.             {% for projet, containers in dockervpsValues.containers %}
  10.                 {% set projectsize = 0 %}
  11.                 {% for directory, size in sizeinfo %}
  12.                     {% if directory in projet %}
  13.                         {% set projectsize = size*1024 %}
  14.                     {% elseif directory == "symfokasa" and projet == "kasanature" %}
  15.                         {% set projectsize = size*1024 %}
  16.                     {% elseif directory == "devsymfo" and projet == "sf5vps2" %}
  17.                         {% set projectsize = size*1024 %}
  18.                     {% endif %}
  19.                 {% endfor %}
  20.                 {% set oldprojectsize = 0 %}
  21.                 {% for directory, size in sizeinfoold %}
  22.                     {% if directory in projet %}
  23.                         {% set oldprojectsize = size*1024 %}
  24.                     {% elseif directory == "symfokasa" and projet == "kasanature" %}
  25.                         {% set oldprojectsize = size*1024 %}
  26.                     {% elseif directory == "devsymfo" and projet == "sf5vps2" %}
  27.                         {% set oldprojectsize = size*1024 %}
  28.                     {% endif %}
  29.                 {% endfor %}
  30.                 {% set oldoldprojectsize = 0 %}
  31.                 {% for directory, size in sizeinfooldold %}
  32.                     {% if directory in projet %}
  33.                         {% set oldoldprojectsize = size*1024 %}
  34.                     {% elseif directory == "symfokasa" and projet == "kasanature" %}
  35.                         {% set oldoldprojectsize = size*1024 %}
  36.                     {% elseif directory == "devsymfo" and projet == "sf5vps2" %}
  37.                         {% set oldoldprojectsize = size*1024 %}
  38.                     {% endif %}
  39.                 {% endfor %}
  40.                 {% set tendancesize = false %}
  41.                 {% if projectsize and oldprojectsize %}
  42.                     {% set diffsize = 0 %}
  43.                     {% if projectsize > oldprojectsize %}
  44.                         {% set diffsize = projectsize - oldprojectsize %}
  45.                         {% set tendancesize = '<i class="ti-arrow-up" title="tendance h-12 | +'~diffsize|realsize(2)~'"></i>' %}
  46.                     {% elseif projectsize < oldprojectsize %}
  47.                         {% set diffsize = oldprojectsize - projectsize %}
  48.                         {% set tendancesize = '<i class="ti-arrow-down" title="tendance h-12 | -'~diffsize|realsize(2)~'"></i>' %}
  49.                     {% elseif projectsize == oldprojectsize %}
  50.                         {% set tendancesize = '<i class="ti-line-double" title="tendance h-12"></i>' %}
  51.                     {% endif %}
  52.                 {% endif %}
  53.                 {% set tendancesizeold = false %}
  54.                 {% if oldoldprojectsize and oldprojectsize %}
  55.                     {% set diffsize = 0 %}
  56.                     {% if oldprojectsize > oldoldprojectsize %}
  57.                         {% set diffsize = oldprojectsize - oldoldprojectsize %}
  58.                         {% set tendancesizeold = '<i class="ti-arrow-up" title="tendance h-24 | +'~diffsize|realsize(2)~'"></i>' %}
  59.                     {% elseif oldprojectsize < oldoldprojectsize %}
  60.                         {% set diffsize = oldoldprojectsize - oldprojectsize %}
  61.                         {% set tendancesizeold = '<i class="ti-arrow-down" title="tendance h-24 | -'~diffsize|realsize(2)~'"></i>' %}
  62.                     {% elseif oldprojectsize == oldoldprojectsize %}
  63.                         {% set tendancesizeold = '<i class="ti-line-double" title="tendance h-24"></i>' %}
  64.                     {% endif %}
  65.                 {% endif %}
  66.                 <div class="vpsa">
  67.                     <strong>
  68.                         {% if 'vps' in projet %}
  69.                             <a href="https://{{ projet|replace({'vps': '.vps'}) }}.kelkii.com" title="https://{{ projet|replace({'vps': '.vps'}) }}.kelkii.com" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
  70.                         {% elseif 'phpmyadmin' in projet %}
  71.                             <a href="https://phpm.vps1.kelkii.com" title="https://phpm.vps1.kelkii.com" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
  72.                         {% elseif 'kasanature' in projet %}
  73.                             <a href="https://kasanature.kelkii.com/fr/" title="https://kasanature.kelkii.com/fr/" target="_blank">{{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}</a>
  74.                         {% else %}
  75.                             {{ projet|replace({'vps1': ''})|replace({'vps2': ''}) }}
  76.                         {% endif %}
  77.                         {% if projectsize %} - {{ projectsize|realsize(2) }}{% endif %}{% if tendancesize %} {{ tendancesize|raw }}{% endif %}{% if tendancesizeold %} {{ tendancesizeold|raw }}{% endif %}
  78.                     </strong> <em class="detaildocker">({% for container in containers %}{{ container|trim }}{% if not loop.last %}, {% endif %}{% endfor %})</em>
  79.                 </div>
  80.             {% endfor %}
  81.             <br>
  82.             <h3>Outils</h3>
  83.             <a href="https://traefik.vps{{ vpsid }}.kelkii.com/" target="_blank">Traefik</a> - <a href="https://portainer.vps{{ vpsid }}.kelkii.com/" target="_blank">Portainer</a>
  84.             <br>
  85.             <br>
  86.             <h3>Disque</h3>
  87.             <canvas id="myChart" width="400" height="200"></canvas>
  88.             <script>
  89.                 var ctx = document.getElementById('myChart').getContext('2d');
  90.                 var sizehisto = {{ sizehisto|json_encode|raw }};
  91.                 var dates = sizehisto.map(function(item) {
  92.                     return item.logDate;
  93.                 });
  94.                 var percents = sizehisto.map(function(item) {
  95.                     return item.percent;
  96.                 });
  97.                 var chart = new Chart(ctx, {
  98.                     type: 'line',
  99.                     data: {
  100.                         labels: dates,
  101.                         datasets: [{
  102.                             label: 'Size (%)',
  103.                             data: percents,
  104.                             backgroundColor: 'rgba(0,194,132,0.25)',
  105.                             borderColor: '#00c284',
  106.                             borderWidth: 2
  107.                         }]
  108.                     },
  109.                     options: {
  110.                         scales: {
  111.                             yAxes: [{
  112.                                 ticks: {
  113.                                     min: 0,
  114.                                     max: 100
  115.                                 }
  116.                             }]
  117.                         }
  118.                     }
  119.                 });
  120.             </script>
  121.             <br>
  122.             <span id="show30Button" class="cpointer tgreen btn btn-outline-success btn-sm mb-2"><i class="fa fa-line-chart" aria-hidden="true"></i> Changer niveau de zoom</span>
  123.             <h3>Mémoire</h3>
  124.             <canvas id="memChart" width="400" height="200"></canvas>
  125.             <br>
  126.             <h3>Utilisation de la mémoire docker</h3>
  127.             <canvas id="memoryChart" width="800" height="400"></canvas>
  128.             <br>
  129.             <h3>IPs Bannis</h3>
  130.             <p>Login sur le serveur : {{ vpsinfolastping.login_date }} / {{ vpsinfolastping.login_ip }}</p>
  131.             <canvas id="ipChart" width="400" height="200"></canvas>
  132.             <br>
  133.             <script>
  134.                 var vpsinfo = {{ vpsinfo|json_encode|raw }};
  135.                 var vpsdockerinfo = {{ vpsdockerinfo|json_encode|raw }};
  136.                 var memCtx = document.getElementById('memChart').getContext('2d');
  137.                 var ipCtx = document.getElementById('ipChart').getContext('2d');
  138.                 var dockerCtx = document.getElementById('memoryChart').getContext('2d');
  139.                 var memChart, ipChart, dockerChart;
  140.                 var zoomState = 0; // 0: all data, 1: last 40, 2: last 20
  141.                 function createCharts(data, dockerData, pointRadius = 0, maxy = true) {
  142.                     // VPS Info Charts
  143.                     var memDates = data.map(item => item.date);
  144.                     var memUsage = data.map(item => item.mem_usage);
  145.                     var bannedIps = data.map(item => item.banned_ips);
  146.                     var memOptions = {
  147.                         scales: {
  148.                             yAxes: [{
  149.                                 ticks: {
  150.                                     callback: value => value + '%'
  151.                                 }
  152.                             }]
  153.                         }
  154.                     };
  155.                     if (maxy) {
  156.                         memOptions.scales.yAxes[0].ticks.min = 0;
  157.                         memOptions.scales.yAxes[0].ticks.max = 100;
  158.                     }
  159.                     memChart = new Chart(memCtx, {
  160.                         type: 'line',
  161.                         data: {
  162.                             labels: memDates,
  163.                             datasets: [{
  164.                                 label: 'Memory Usage (%)',
  165.                                 data: memUsage,
  166.                                 backgroundColor: 'rgba(54, 162, 235, 0.25)',
  167.                                 borderColor: 'rgb(54, 162, 235)',
  168.                                 borderWidth: 2,
  169.                                 pointRadius: pointRadius
  170.                             }]
  171.                         },
  172.                         options: memOptions
  173.                     });
  174.                     ipChart = new Chart(ipCtx, {
  175.                         type: 'line',
  176.                         data: {
  177.                             labels: memDates,
  178.                             datasets: [{
  179.                                 label: 'Banned IPs',
  180.                                 data: bannedIps,
  181.                                 backgroundColor: 'rgba(255, 99, 132, 0.25)',
  182.                                 borderColor: 'rgb(255, 99, 132)',
  183.                                 borderWidth: 2,
  184.                                 pointRadius: pointRadius
  185.                             }]
  186.                         },
  187.                         options: {
  188.                             scales: {
  189.                                 yAxes: [{
  190.                                     ticks: {
  191.                                         min: 0,
  192.                                         stepSize: 1
  193.                                     }
  194.                                 }]
  195.                             }
  196.                         }
  197.                     });
  198.                     // Docker Info Chart
  199.                     var datasets = {};
  200.                     var dates = [];
  201.                     var allContainers = {};
  202.                     function getContainerName(containerName) {
  203.                         return containerName.replace(/_php_1$/, '').replace(/vps[12]_/, '');
  204.                     }
  205.                     // First pass: collect all unique containers and dates
  206.                     dockerData.forEach(function(entry) {
  207.                         dates.push(entry.date);
  208.                         var jsondata = JSON.parse(entry.jsondata);
  209.                         Object.keys(jsondata.jsondata).forEach(function(containerName) {
  210.                             if (containerName.includes('_php')) {
  211.                                 var cleanName = getContainerName(containerName);
  212.                                 allContainers[cleanName] = true;
  213.                             }
  214.                         });
  215.                     });
  216.                     // Initialize datasets for all containers
  217.                     Object.keys(allContainers).forEach(function(cleanName) {
  218.                         datasets[cleanName] = [];
  219.                     });
  220.                     // Second pass: fill data, using null for missing values
  221.                     dockerData.forEach(function(entry) {
  222.                         var jsondata = JSON.parse(entry.jsondata);
  223.                         var currentData = {};
  224.                         Object.keys(jsondata.jsondata).forEach(function(containerName) {
  225.                             if (containerName.includes('_php')) {
  226.                                 var cleanName = getContainerName(containerName);
  227.                                 currentData[cleanName] = jsondata.jsondata[containerName].memory;
  228.                             }
  229.                         });
  230.                         // Add data for all containers (null if not present)
  231.                         Object.keys(allContainers).forEach(function(cleanName) {
  232.                             datasets[cleanName].push(currentData[cleanName] !== undefined ? currentData[cleanName] : null);
  233.                         });
  234.                     });
  235.                     var chartDatasets = Object.keys(datasets).map(function(cleanName, index) {
  236.                         var color = 'hsl(' + (index * 360 / Object.keys(datasets).length) + ', 70%, 50%)';
  237.                         return {
  238.                             label: cleanName,
  239.                             data: datasets[cleanName],
  240.                             borderColor: color,
  241.                             backgroundColor: color + '33',
  242.                             fill: false,
  243.                             lineTension: 0.4,
  244.                             pointRadius: pointRadius,
  245.                             spanGaps: true
  246.                         };
  247.                     });
  248.                     dockerChart = new Chart(dockerCtx, {
  249.                         type: 'line',
  250.                         data: {
  251.                             labels: dates,
  252.                             datasets: chartDatasets
  253.                         },
  254.                         options: {
  255.                             responsive: true,
  256.                             scales: {
  257.                                 yAxes: [{
  258.                                     ticks: {
  259.                                         beginAtZero: true,
  260.                                         callback: value => value + '%'
  261.                                     },
  262.                                     scaleLabel: {
  263.                                         display: true,
  264.                                         labelString: 'Utilisation de la mémoire (%)'
  265.                                     }
  266.                                 }],
  267.                                 xAxes: [{
  268.                                     scaleLabel: {
  269.                                         display: true,
  270.                                         labelString: 'Date et heure'
  271.                                     }
  272.                                 }]
  273.                             },
  274.                             legend: {
  275.                                 display: true,
  276.                                 position: 'top',
  277.                                 labels: {
  278.                                     boxWidth: 12,
  279.                                     padding: 10
  280.                                 }
  281.                             },
  282.                             title: {
  283.                                 display: true,
  284.                                 text: 'Évolution de l\'utilisation de la mémoire par conteneur PHP'
  285.                             }
  286.                         }
  287.                     });
  288.                 }
  289.                 // Initial chart creation with all data
  290.                 createCharts(vpsinfo, vpsdockerinfo, 0, true);
  291.                 // Function to toggle between different zoom levels
  292.                 function toggleDataDisplay() {
  293.                     memChart.destroy();
  294.                     ipChart.destroy();
  295.                     dockerChart.destroy();
  296.                     zoomState = (zoomState + 1) % 3; // Cycle through 0, 1, 2
  297.                     let displayData, displayDockerData, pointRadius, setMaxY;
  298.                     switch(zoomState) {
  299.                         case 1: // Last 40 points
  300.                             displayData = vpsinfo.slice(-40);
  301.                             displayDockerData = vpsdockerinfo.slice(-40);
  302.                             pointRadius = 3;
  303.                             setMaxY = false;
  304.                             break;
  305.                         case 2: // Last 20 points
  306.                             displayData = vpsinfo.slice(-20);
  307.                             displayDockerData = vpsdockerinfo.slice(-20);
  308.                             pointRadius = 4;
  309.                             setMaxY = false;
  310.                             break;
  311.                         default: // All data
  312.                             displayData = vpsinfo;
  313.                             displayDockerData = vpsdockerinfo;
  314.                             pointRadius = 0;
  315.                             setMaxY = true;
  316.                     }
  317.                     createCharts(displayData, displayDockerData, pointRadius, setMaxY);
  318.                 }
  319.                 // Event listener for the button
  320.                 document.getElementById('show30Button').addEventListener('click', toggleDataDisplay);
  321.             </script>
  322.             <h3>Backups</h3>
  323.             {% for backup in backups %}
  324.                 {{ backup.name }} : <em>{{ backup.time|date('d/m/Y H:i') }} ({{ backup.size|realsize(2) }})</em><br>
  325.             {% endfor %}
  326.             <br>
  327.             <em>{{ dockervpsValues.containerstime|date('d/m/Y H:i') }}</em>
  328.         </div>
  329.         <div class="modal-footer">
  330.             <button type="button" class="btn btn-default" data-dismiss="modal">Fermer</button>
  331.         </div>
  332.     </div>
  333. </div>