This commit is contained in:
Jaroslav Drzik
2021-12-10 18:05:03 +01:00
5 changed files with 315 additions and 343 deletions

View File

@@ -1,7 +1,7 @@
# RemoteSupport # RemoteSupport
GLPI Plugin for direct VNC connection inside ticket GLPI Plugin for direct VNC connection from browser inside computer from server
This Plugin add a simple button inside tickets: This Plugin add a simple button inside computer:
![immagine](https://user-images.githubusercontent.com/35736369/142444042-0cd5627b-5a5d-4586-8022-083e51d6f06c.png) ![immagine](https://user-images.githubusercontent.com/35736369/142444042-0cd5627b-5a5d-4586-8022-083e51d6f06c.png)
@@ -10,35 +10,60 @@ If user is correctly connected to one or more computer it will launch a VNC conn
- Prerequisites - Prerequisites
1) VNC Must be installed in the destination PC 1) VNC Must be installed in the destination PC
2) PC Name must me correct and resolved inside your DNS Server 2) Fusion inventory must be installed on server with GLPI
3) Add a script in your pc and add a node inside regedit 3) Agent must be installed on remote PC
4) Easy noVNC must be installed on server with GLPI
1) write a script (you will find inside resources) like this (let's assume in c:\startVNC.bat) clone it and build binnary with make, edit Makefile in remotesupport plugin and build with make
> SET S=%1
>
> SET S=%S:~7,-2%
>
> call "C:\Program Files\TightVNC\tvnviewer.exe" %S%
>
> quit 0
2) Open regedit and add Create systemd unit file:
Windows Registry Editor Version 5.00
``` ```
[HKEY_CLASSES_ROOT\vnc] [Unit]
@="URL:vnc Protocol" Description=Easy NoVNC
"URL Protocol"=""
[HKEY_CLASSES_ROOT\vnc\shell] [Service]
ExecStart=/usr/local/bin/easy-novnc -a :8888 -H -P
[HKEY_CLASSES_ROOT\vnc\shell\open] [Install]
WantedBy=multi-user.target
[HKEY_CLASSES_ROOT\vnc\shell\open\command]
@="\"c:\\startVNC.bat\" \"%1\""
``` ```
3) Download and install the plugin as usual
It will listen on 8888 port on local host.
TODO: a lot of documentation Secure connection to server if you want, some ports are hardcoded in current status of plugin
```
<IfModule mod_ssl.c>
<VirtualHost *:443>
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
# allow for upgrading to websockets
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://localhost:8888/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /glpi/(.*) http://localhost/glpi/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) http://localhost:8888/$1 [P,L]
ProxyPass "/" "http://localhost:8888/"
ProxyPassReverse "/" "http://localhost:8888/"
ProxyPass "/glpi/" "http://localhost/glpi/"
ProxyPassReverse "/glpi/" "http://localhost/glpi/"
ProxyPass "/vnc" "ws://localhost:8888/vnc"
ProxyPassReverse "/vnc" "ws://localhost:8888/vnc
ServerName server.name.lan
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>
</IfModule>
```

201
hook.php
View File

@@ -1,124 +1,125 @@
<?php <?php
/* /*
------------------------------------------------------------------------- -------------------------------------------------------------------------
Remote Spport (VNC) Remote Spport (VNC)
Copyright (C) 2021 by Alessandro Carloni Copyright (C) 2021 by Alessandro Carloni
https://github.com/Kaya84/RemoteSupport https://github.com/Kaya84/RemoteSupport
------------------------------------------------------------------------- -------------------------------------------------------------------------
LICENSE LICENSE
This file is part of Camera Input. This file is part of Camera Input.
Camera Input is free software; you can redistribute it and/or modify Camera Input is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
Camera Input is distributed in the hope that it will be useful, Camera Input is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Camera Input. If not, see <http://www.gnu.org/licenses/>. along with Camera Input. If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------- --------------------------------------------------------------------------
*/ */
function plugin_remotesupport_install() function plugin_remotesupport_install()
{ {
global $DB; global $DB;
Toolbox::logInFile("remotsupport","Installing plugin"); Toolbox::logInFile("remotsupport", "Installing plugin");
$state_online = [ $state_online = [
'name' => 'Online', 'name' => 'Online',
'entities_id' => 0, 'entities_id' => 0,
'is_recursive' => 0, 'is_recursive' => 0,
'comment' => '', 'comment' => '',
'states_id' => 0, 'states_id' => 0,
'completename' => 'Online', 'completename' => 'Online',
'level' => 1, 'level' => 1,
'ancestors_cache' => '[]', 'ancestors_cache' => '[]',
'sons_cache' => 'NULL', 'sons_cache' => 'NULL',
'is_visible_computer' => 1, 'is_visible_computer' => 1,
'is_visible_monitor' => 0, 'is_visible_monitor' => 0,
'is_visible_networkequipment' => 0, 'is_visible_networkequipment' => 0,
'is_visible_peripheral' => 0, 'is_visible_peripheral' => 0,
'is_visible_phone' => 0, 'is_visible_phone' => 0,
'is_visible_printer' => 0, 'is_visible_printer' => 0,
'is_visible_softwareversion' => 0, 'is_visible_softwareversion' => 0,
'is_visible_softwarelicense' => 0, 'is_visible_softwarelicense' => 0,
'is_visible_line' => 0, 'is_visible_line' => 0,
'is_visible_certificate' => 0, 'is_visible_certificate' => 0,
'is_visible_rack' => 0, 'is_visible_rack' => 0,
'is_visible_passivedcequipment' => 0, 'is_visible_passivedcequipment' => 0,
'is_visible_enclosure' => 0, 'is_visible_enclosure' => 0,
'is_visible_pdu' => 0, 'is_visible_pdu' => 0,
'is_visible_cluster' => 0, 'is_visible_cluster' => 0,
'is_visible_contract' => 0, 'is_visible_contract' => 0,
'is_visible_appliance' => 0]; 'is_visible_appliance' => 0];
$ret = $DB->insert( $ret = $DB->insert(
'glpi_states', $state_online 'glpi_states', $state_online
); );
$state_offline = $state_online; $state_offline = $state_online;
$state_offline["name"] = 'Offline'; $state_offline["name"] = 'Offline';
$state_offline["completename"] = 'Offline'; $state_offline["completename"] = 'Offline';
$ret = $DB->insert( $ret = $DB->insert(
'glpi_states', $state_offline 'glpi_states', $state_offline
); );
return true; return true;
} }
function plugin_remotesupport_uninstall(){ function plugin_remotesupport_uninstall()
global $DB; {
global $DB;
Toolbox::logInFile("remotsupport","Uninstalling plugin"); Toolbox::logInFile("remotsupport", "Uninstalling plugin");
CronTask::Unregister('remotesupport'); CronTask::Unregister('remotesupport');
$req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], [ 'OR' => [ 'name' => 'Online', 'name' => 'Offline']]); $req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], ['OR' => ['name' => 'Online', 'name' => 'Offline']]);
$ret = $req->next(); $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
$ret = $req->next(); $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
$DB->query('UPDATE glpi_computers SET states_id=NULL WHERE id='.$states_ids["Offline"]); $DB->query('UPDATE glpi_computers SET states_id=NULL WHERE id=' . $states_ids["Offline"]);
$DB->query('UPDATE glpi_computers SET states_id=NULL WHERE id='.$states_ids["Online"]); $DB->query('UPDATE glpi_computers SET states_id=NULL WHERE id=' . $states_ids["Online"]);
$DB->query('DELETE FROM glpi_states WHERE id='.$states_ids["Offline"]); $DB->query('DELETE FROM glpi_states WHERE id=' . $states_ids["Offline"]);
$DB->query('DELETE FROM glpi_states WHERE id='.$states_ids["Online"]); $DB->query('DELETE FROM glpi_states WHERE id=' . $states_ids["Online"]);
return true; return true;
} }
function plugin_remotesupport_postinit() { function plugin_remotesupport_postinit()
global $CFG_GLPI, $DB; {
global $CFG_GLPI, $DB;
if(isset($_GET['id']) && $_GET['id'] != 0 && isset($_GET['_itemtype']) && $_GET['_itemtype'] == "Ticket"){ if (isset($_GET['id']) && $_GET['id'] != 0 && isset($_GET['_itemtype']) && $_GET['_itemtype'] == "Ticket") {
$id = $_GET['id']; $id = $_GET['id'];
//mysql> select * from glpi_tickets_users where tickets_id = 2 and type = 1;
$req = $DB->request(['FROM' => 'glpi_tickets_users', 'WHERE' => ['tickets_id' => $id, 'type' => 1]]);
//NB: Estraggo unicamente il primo richiedente
$row = $req->next();
$requester = $row['users_id'];
// select id, name, users_id from glpi_computers where users_id = 178;
if ($row['users_id'] != 0) {
$req2 = $DB->request(['FROM' => 'glpi_computers', 'WHERE' => ['users_id' => $requester, 'is_deleted' => 0]]);
$url = "";
while ($row2 = $req2->next()){ //mysql> select * from glpi_tickets_users where tickets_id = 2 and type = 1;
//$url .= "<li class=\"document\" onclick=\"location.href='vnc://" . $row2['name'] ."'\"$
$url .= "<li class=\"document\" onclick=\"location.href='vnc://" . $row2['name'] ."'\"><i class=\"fa fa-laptop-medical\"></i>" . $row2['name'] . "</li>";
}
if ($url != ""){ $req = $DB->request(['FROM' => 'glpi_tickets_users', 'WHERE' => ['tickets_id' => $id, 'type' => 1]]);
echo "<div><ul class=\"timeline_choices\"><h2>Remote support : </h2>"; //NB: Estraggo unicamente il primo richiedente
echo $url; $row = $req->next();
echo "</ul></div>"; $requester = $row['users_id'];
} // select id, name, users_id from glpi_computers where users_id = 178;
}
} if ($row['users_id'] != 0) {
$req2 = $DB->request(['FROM' => 'glpi_computers', 'WHERE' => ['users_id' => $requester, 'is_deleted' => 0]]);
$url = "";
while ($row2 = $req2->next()) {
//$url .= "<li class=\"document\" onclick=\"location.href='vnc://" . $row2['name'] ."'\"$
$url .= "<li class=\"document\" onclick=\"location.href='vnc://" . $row2['name'] . "'\"><i class=\"fa fa-laptop-medical\"></i>" . $row2['name'] . "</li>";
}
if ($url != "") {
echo "<div><ul class=\"timeline_choices\"><h2>Remote support : </h2>";
echo $url;
echo "</ul></div>";
}
}
}
} }
?>

View File

@@ -1,81 +1,39 @@
<?php <?php
/* include "../../../inc/includes.php";
------------------------------------------------------------------------
FusionInventory
Copyright (C) 2010-2011 by the FusionInventory Development Team.
http://www.fusioninventory.org/ http://forge.fusioninventory.org/ declare (ticks = 1);
------------------------------------------------------------------------
LICENSE global $DB, $agents;
This file is part of FusionInventory project. $check_arr = [];
$comps = [];
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) {
FusionInventory is free software: you can redistribute it and/or modify $check = [];
it under the terms of the GNU Affero General Public License as published by $a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($a["computers_id"]);
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
FusionInventory is distributed in the hope that it will be useful, $check["url"] = "http://" . $a_computerextend["remote_addr"] . ":62354/status";
but WITHOUT ANY WARRANTY; without even the implied warranty of $check["id"] = $a["id"];
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the $check["computers_id"] = $a["computers_id"];
GNU Affero General Public License for more details. $check["status"] = "unknown";
You should have received a copy of the GNU Affero General Public License
along with FusionInventory. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------------
@package FusionInventory
@author Walid Nouh
@co-author
@copyright Copyright (c) 2010-2011 FusionInventory team
@license AGPL License 3.0 or (at your option) any later version
http://www.gnu.org/licenses/agpl-3.0-standalone.html
@link http://www.fusioninventory.org/
@link http://forge.fusioninventory.org/projects/fusioninventory-for-glpi/
@since 2010
------------------------------------------------------------------------
*/
include ("../../../inc/includes.php");
declare(ticks=1);
global $DB,$agents;
$check_arr = [];
$comps = [];
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) {
$check = [];
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($a["computers_id"]);
$check["url"] = "http://".$a_computerextend["remote_addr"].":62354/status";
$check["id"] = $a["id"];
$check["computers_id"] = $a["computers_id"];
$check["status"] = "unknown";
$check_arr[] = $check;
$comps[$a["computers_id"]] = $check;
//print_r($agent->getAgentStatusURLs());
}
$check_arr[] = $check;
$comps[$a["computers_id"]] = $check;
//print_r($agent->getAgentStatusURLs());
}
$descriptorspec = array( $descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from 0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to 1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 2 => array("file", "/tmp/error-output.txt", "a"), // stderr is a file to write to
); );
$cwd = '/tmp'; $cwd = '/tmp';
$env = array('debug' => 'false'); $env = array('debug' => 'false');
$process = proc_open(__DIR__.'/check_status', $descriptorspec, $pipes, $cwd, $env); $process = proc_open(__DIR__ . '/check_status', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) { if (is_resource($process)) {
// $pipes now looks like this: // $pipes now looks like this:
@@ -96,7 +54,7 @@ if (is_resource($process)) {
echo "command returned $return_value\n"; echo "command returned $return_value\n";
} }
$req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], [ 'OR' => [ 'name' => 'Online', 'name' => 'Offline']]); $req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], ['OR' => ['name' => 'Online', 'name' => 'Offline']]);
$ret = $req->next(); $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
@@ -104,13 +62,11 @@ $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
print_r($states_ids); print_r($states_ids);
$DB->update("glpi_computers", [
'states_id' => $states_ids["Offline"] ] ,
[ '1' => '1' ]
);
$DB->update("glpi_computers", [
'states_id' => $states_ids["Offline"] ] ,
[ '1' => '1' ]
);
$ids = []; $ids = [];
foreach ($checked as $s) { foreach ($checked as $s) {
echo $s->computers_id."\n"; echo $s->computers_id."\n";
@@ -122,6 +78,5 @@ $DB->update("glpi_computers", [
[ 'id' => $ids ] [ 'id' => $ids ]
); );
// print_r($a_computerextend);
// print_r($a_computerextend);
exit(0); exit(0);

View File

@@ -1,140 +1,141 @@
<?php <?php
if (!defined('GLPI_ROOT')) { if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access directly to this file"); die("Sorry. You can't access directly to this file");
} }
class PluginRemotesupportRemotesupport extends CommonDBTM
{
public static function showInfo($item)
{
$fi_path = Plugin::getWebDir('fusioninventory');
class PluginRemotesupportRemotesupport extends CommonDBTM { // Manage locks pictures
static function showInfo($item) { PluginFusioninventoryLock::showLockIcon('Computer');
$fi_path = Plugin::getWebDir('fusioninventory'); $pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($item->getID());
if (empty($a_computerextend)) {
return true;
}
// Manage locks pictures echo '<table class="tab_glpi" width="100%">';
PluginFusioninventoryLock::showLockIcon('Computer'); echo '<tr>';
echo '<th>' . __('Remote Support') . '</th>';
echo '</tr>';
echo '<tr class="tab_bg_1">';
echo '<td>';
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer(); $url = "<a target=\"_blank\" href=\"https://" . $_SERVER['SERVER_ADDR'] . "/vnc.html?path=vnc%2F" . $a_computerextend['remote_addr'] . "&autoconnect=true&resize=scale&reconnect=true&show_dot=true\"><li class=\"document\"><i class=\"fa fa-laptop-medical\"></i>" . $a_computerextend['remote_addr'] . "</li></a>";
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($item->getID());
if (empty($a_computerextend)) {
return true;
}
echo '<table class="tab_glpi" width="100%">'; if ($url != "") {
echo '<tr>';
echo '<th>'.__('Remote Support').'</th>';
echo '</tr>';
echo '<tr class="tab_bg_1">';
echo '<td>';
$url = "<a target=\"_blank\" href=\"https://" . $_SERVER['SERVER_ADDR']. "/vnc.html?path=vnc%2F". $a_computerextend['remote_addr'] ."&autoconnect=true&resize=scale&reconnect=true&show_dot=true\"><li class=\"document\"><i class=\"fa fa-laptop-medical\"></i>" . $a_computerextend['remote_addr'] . "</li></a>";
if ($url != ""){
echo "<div><ul class=\"timeline_choices\"><h2>VNC connect : </h2>"; echo "<div><ul class=\"timeline_choices\"><h2>VNC connect : </h2>";
echo $url; echo $url;
echo "</ul></div>"; echo "</ul></div>";
} }
echo '</td>'; echo '</td>';
echo '</tr>'; echo '</tr>';
echo '</table>'; echo '</table>';
} }
static function getStatesIds() { public static function getStatesIds()
global $DB; {
global $DB;
$states_ids = []; $states_ids = [];
$req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], [ 'OR' => [ 'name' => 'Online', 'name' => 'Offline']]); $req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], ['OR' => ['name' => 'Online', 'name' => 'Offline']]);
$ret = $req->next(); $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
$ret = $req->next(); $ret = $req->next();
$states_ids[$ret['name']] = $ret['id']; $states_ids[$ret['name']] = $ret['id'];
return $states_ids;
}
static function cronRemotesupport($task) { return $states_ids;
global $DB; }
Toolbox::logInFile("remotsupport","Starting search of agents\n"); public static function cronRemotesupport($task)
{
global $DB;
Toolbox::logInFile("remotsupport", "Starting search of agents\n");
$check_arr = []; $check_arr = [];
$comps = []; $comps = [];
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer(); $pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) { foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) {
$check = []; $check = [];
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($a["computers_id"]); $a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($a["computers_id"]);
$check["url"] = "http://".$a_computerextend["remote_addr"].":62354/status"; $check["url"] = "http://" . $a_computerextend["remote_addr"] . ":62354/status";
$check["id"] = $a["id"]; $check["id"] = $a["id"];
$check["computers_id"] = $a["computers_id"]; $check["computers_id"] = $a["computers_id"];
$check["status"] = "unknown"; $check["status"] = "unknown";
$check_arr[] = $check; $check_arr[] = $check;
$comps[$a["computers_id"]] = $check; $comps[$a["computers_id"]] = $check;
//print_r($agent->getAgentStatusURLs()); //print_r($agent->getAgentStatusURLs());
} }
$descriptorspec = array( $descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from 0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to 1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to 2 => array("file", "/tmp/error-output.txt", "a"), // stderr is a file to write to
); );
$cwd = '/tmp'; $cwd = '/tmp';
$env = array('debug' => 'false'); $env = array('debug' => 'false');
$process = proc_open(__DIR__.'/../bin/check_status', $descriptorspec, $pipes, $cwd, $env); $process = proc_open(__DIR__ . '/../bin/check_status', $descriptorspec, $pipes, $cwd, $env);
if (is_resource($process)) { if (is_resource($process)) {
// $pipes now looks like this: // $pipes now looks like this:
// 0 => writeable handle connected to child stdin // 0 => writeable handle connected to child stdin
// 1 => readable handle connected to child stdout // 1 => readable handle connected to child stdout
// Any error output will be appended to /tmp/error-output.txt // Any error output will be appended to /tmp/error-output.txt
fwrite($pipes[0], json_encode($check_arr)); fwrite($pipes[0], json_encode($check_arr));
fclose($pipes[0]); fclose($pipes[0]);
$checked = json_decode(stream_get_contents($pipes[1])); $checked = json_decode(stream_get_contents($pipes[1]));
fclose($pipes[1]); fclose($pipes[1]);
// It is important that you close any pipes before calling // It is important that you close any pipes before calling
// proc_close in order to avoid a deadlock // proc_close in order to avoid a deadlock
$return_value = proc_close($process); $return_value = proc_close($process);
Toolbox::logInFile("remotsupport","command returned $return_value\n"); Toolbox::logInFile("remotsupport", "command returned $return_value\n");
} }
$stids = self::getStatesIds(); $stids = self::getStatesIds();
$DB->update("glpi_computers", [ $DB->update("glpi_computers", [
'states_id' => $stids["Offline"] ] , 'states_id' => $stids["Offline"]],
[ '1' => '1' ] ['1' => '1']
); );
foreach ($checked as $s) {
foreach ($checked as $s) { $comp = new Computer();
$comp->getFromDB($s->computers_id);
$comp->fields["states_id"] = $stids["Online"];
$DB->update("glpi_computers", [
'states_id' => $comp->fields["states_id"]],
['id' => $s->computers_id]
);
Toolbox::logInFile("remotsupport", $s->computers_id . " " . $comp->fields["contact"] . "\n");
$comp = new Computer(); }
$comp->getFromDB($s->computers_id);
$comp->fields["states_id"] = $stids["Online"];
$DB->update("glpi_computers", [
'states_id' => $comp->fields["states_id"] ],
[ 'id' => $s->computers_id ]
);
Toolbox::logInFile("remotsupport",$s->computers_id." ".$comp->fields["contact"]."\n");
} return 0;
}
return 0; public static function cronInfo($name)
} {
return [
static function cronInfo($name) {
return [
'description' => "Agent search remotesupport"]; 'description' => "Agent search remotesupport"];
} }
} }

View File

@@ -1,25 +1,25 @@
<?php <?php
/* /*
------------------------------------------------------------------------- -------------------------------------------------------------------------
Remote Spport (VNC) Remote Spport (VNC)
Copyright (C) 2021 by Alessandro Carloni Copyright (C) 2021 by Alessandro Carloni
https://github.com/Kaya84/RemoteSupport https://github.com/Kaya84/RemoteSupport
------------------------------------------------------------------------- -------------------------------------------------------------------------
LICENSE LICENSE
This file is part of Camera Input. This file is part of Camera Input.
Camera Input is free software; you can redistribute it and/or modify Camera Input is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
Camera Input is distributed in the hope that it will be useful, Camera Input is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Camera Input. If not, see <http://www.gnu.org/licenses/>. along with Camera Input. If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------- --------------------------------------------------------------------------
*/ */
define('PLUGIN_REMOTESUPPORT_VERSION', '0.0.1'); define('PLUGIN_REMOTESUPPORT_VERSION', '0.0.1');
define('PLUGIN_REMOTESUPPORT_MIN_GLPI', '9.5.0'); define('PLUGIN_REMOTESUPPORT_MIN_GLPI', '9.5.0');
@@ -28,48 +28,38 @@ define("PLUGIN_REMOTESUPPORT_DIR", GLPI_ROOT . "/plugins/remotesupport");
function plugin_init_remotesupport() function plugin_init_remotesupport()
{ {
global $PLUGIN_HOOKS; global $PLUGIN_HOOKS;
$PLUGIN_HOOKS['csrf_compliant']['remotesupport'] = true; $PLUGIN_HOOKS['csrf_compliant']['remotesupport'] = true;
if (Plugin::isPluginActive('remotesupport')) { if (Plugin::isPluginActive('remotesupport')) {
// $PLUGIN_HOOKS['add_javascript']['remotesupport'][] = 'js/support.js';
$PLUGIN_HOOKS['autoinventory_information']['remotesupport'] = array( $PLUGIN_HOOKS['autoinventory_information']['remotesupport'] = array(
'Computer' => array('PluginRemotesupportRemotesupport', 'showInfo') 'Computer' => array('PluginRemotesupportRemotesupport', 'showInfo'),
); );
CronTask::Register('PluginRemotesupportRemotesupport', 'remotesupport', 300, CronTask::Register('PluginRemotesupportRemotesupport', 'remotesupport', 300,
['mode'=>2, 'allowmode'=>3, 'logs_lifetime'=>30, ['mode' => 2, 'allowmode' => 3, 'logs_lifetime' => 30,
'comment'=> 'Remotesupport crontab search agents']); 'comment' => 'Remotesupport crontab search agents']);
$PLUGIN_HOOKS['menu']['remotesupport'] = true;
$PLUGIN_HOOKS['post_init']['remotesupport'] = 'plugin_remotesupport_postinit';
// Add Config Page }
// Plugin::registerClass('PluginRemotesupportConfig', ['addtabon' => 'Config']);
// $PLUGIN_HOOKS["menu_toadd"]['remotesupport'] = ['tools' => 'PluginRemotesupportMenu'];
// $PLUGIN_HOOKS['config_page']['remotesupport'] = 'front/index.php';
$PLUGIN_HOOKS['menu']['remotesupport'] = true;
$PLUGIN_HOOKS['post_init']['remotesupport'] = 'plugin_remotesupport_postinit';
}
} }
function plugin_version_remotesupport() function plugin_version_remotesupport()
{ {
return [ return [
'name' => __('Remote Support Input', 'remotesupport'), 'name' => __('Remote Support Input', 'remotesupport'),
'version' => PLUGIN_REMOTESUPPORT_VERSION, 'version' => PLUGIN_REMOTESUPPORT_VERSION,
'author' => 'Alessandro Carloni', 'author' => 'Alessandro Carloni',
'license' => 'GPLv2', 'license' => 'GPLv2',
'homepage' =>'https://github.com/Kaya84/', 'homepage' => 'https://github.com/Kaya84/',
'requirements' => [ 'requirements' => [
'glpi' => [ 'glpi' => [
'min' => PLUGIN_REMOTESUPPORT_MIN_GLPI, 'min' => PLUGIN_REMOTESUPPORT_MIN_GLPI,
'max' => PLUGIN_REMOTESUPPORT_MAX_GLPI 'max' => PLUGIN_REMOTESUPPORT_MAX_GLPI,
] ],
] ],
]; ];
} }