Merge branch 'main' of https://git.bh.ttx.sk/jaro/remotesupport into main
This commit is contained in:
73
README.md
73
README.md
@@ -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:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -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
201
hook.php
@@ -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>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
?>
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
98
setup.php
98
setup.php
@@ -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,
|
||||||
]
|
],
|
||||||
]
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user