Compare commits
29 Commits
6d5d6e18f5
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 9436fe7c60 | |||
| b84ca3e4e4 | |||
| 79a944c0e3 | |||
| a1e314b00c | |||
| e169c19bd0 | |||
| d43842790a | |||
|
|
5d3bfbc491 | ||
| 72fe3d8335 | |||
| 3c461d4570 | |||
|
|
07678cacd4 | ||
| 625c246ba9 | |||
| 8aaf241075 | |||
| 68e726fae3 | |||
|
|
1dc3c4a557 | ||
|
|
cffcb3ea64 | ||
|
|
a8e21ef76c | ||
|
|
f868d991b1 | ||
|
|
a8e4ddb2e0 | ||
|
|
8ac143be27 | ||
|
|
f0399c9c9d | ||
| 6aee52c717 | |||
| 7e5d7d1d3c | |||
| a4e71a8992 | |||
|
|
0cde20881a | ||
|
|
31983b6803 | ||
|
|
1689989bd4 | ||
|
|
7d31e98713 | ||
|
|
50e9338059 | ||
|
|
6d0f7fb392 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1 +1 @@
|
|||||||
inc/check_status
|
bin/check_status
|
||||||
|
|||||||
16
Makefile
Normal file
16
Makefile
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
BINARY_NAME=check_status
|
||||||
|
GO_PRG=check_status.go
|
||||||
|
BIN_DIR=./bin
|
||||||
|
GO=/usr/local/go/bin/go
|
||||||
|
|
||||||
|
all: build test
|
||||||
|
|
||||||
|
build:
|
||||||
|
${GO} build -o ${BIN_DIR}/${BINARY_NAME} ${GO_PRG}
|
||||||
|
|
||||||
|
test:
|
||||||
|
${GO} test -v ${GO_PRG}
|
||||||
|
|
||||||
|
clean:
|
||||||
|
${GO} clean
|
||||||
|
rm ${BIN_DIR}/${BINARY_NAME}
|
||||||
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 and update status of online computers, it checks computer with go program in glpi cron and with fusion inventory agent...
|
||||||
|
|
||||||
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>
|
||||||
|
```
|
||||||
|
|||||||
4
bin/README.md
Normal file
4
bin/README.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Go program for remotesupport plugin
|
||||||
|
|
||||||
|
- binnary program for checking states of hosts
|
||||||
|
|
||||||
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -26,9 +27,6 @@ type check struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// boundedParallelGet sends requests in parallel but only up to a certain
|
|
||||||
// limit, and furthermore it's only parallel up to the amount of CPUs but
|
|
||||||
// is always concurrent up to the concurrency limit
|
|
||||||
func boundedParallelGet(Checks []check, concurrencyLimit int) []check {
|
func boundedParallelGet(Checks []check, concurrencyLimit int) []check {
|
||||||
|
|
||||||
// this buffered channel will block at the concurrency limit
|
// this buffered channel will block at the concurrency limit
|
||||||
@@ -59,13 +57,11 @@ func boundedParallelGet(Checks []check, concurrencyLimit int) []check {
|
|||||||
// along with the index so we can sort them later along with
|
// along with the index so we can sort them later along with
|
||||||
// any error that might have occoured
|
// any error that might have occoured
|
||||||
//fmt.Println(chck.Url)
|
//fmt.Println(chck.Url)
|
||||||
|
|
||||||
client := http.Client{
|
client := http.Client{
|
||||||
Timeout: 7 * time.Second,
|
Timeout: 7 * time.Second,
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := client.Get(chck.Url)
|
res, err := client.Get(chck.Url)
|
||||||
|
|
||||||
status = 404
|
status = 404
|
||||||
if err == nil {
|
if err == nil {
|
||||||
status = res.StatusCode
|
status = res.StatusCode
|
||||||
@@ -109,9 +105,6 @@ func boundedParallelGet(Checks []check, concurrencyLimit int) []check {
|
|||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
// we'll use the init function to set up the benchmark
|
|
||||||
// by making a slice of 100 URLs to send requets to
|
|
||||||
var urls []string
|
|
||||||
var checks []check
|
var checks []check
|
||||||
var m = make(map[int]*check)
|
var m = make(map[int]*check)
|
||||||
func init() {
|
func init() {
|
||||||
@@ -123,22 +116,16 @@ func init() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// the main function sets up an anonymous benchmark func
|
|
||||||
// that will time how long it takes to get all the URLs
|
|
||||||
// at the specified concurrency level
|
|
||||||
//
|
|
||||||
// and you should see something like the following printed
|
|
||||||
// depending on how fast your computer and internet is
|
|
||||||
//
|
|
||||||
// 5 bounded parallel requests: 100/100 in 5.533223255
|
|
||||||
// 10 bounded parallel requests: 100/100 in 2.5115351219
|
|
||||||
// 25 bounded parallel requests: 100/100 in 1.189462884
|
|
||||||
// 50 bounded parallel requests: 100/100 in 1.17430002
|
|
||||||
// 75 bounded parallel requests: 100/100 in 1.001383863
|
|
||||||
// 100 bounded parallel requests: 100/100 in 1.3769354
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
||||||
|
// str_debug := os.Getenv("debug")
|
||||||
|
str_threads := os.Getenv("threads")
|
||||||
|
|
||||||
|
threads, _ := strconv.Atoi(str_threads)
|
||||||
|
// debug, _ := strconv.ParseBool(str_debug)
|
||||||
|
|
||||||
//startTime := time.Now()
|
//startTime := time.Now()
|
||||||
results := boundedParallelGet(checks, 100)
|
results := boundedParallelGet(checks, threads)
|
||||||
//seconds := time.Since(startTime).Seconds()
|
//seconds := time.Since(startTime).Seconds()
|
||||||
//tmplate := "requests: %d/%d in %v"
|
//tmplate := "requests: %d/%d in %v"
|
||||||
|
|
||||||
83
hook.php
83
hook.php
@@ -21,18 +21,92 @@
|
|||||||
--------------------------------------------------------------------------
|
--------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function plugin_remotesupport_install(){
|
function plugin_remotesupport_install()
|
||||||
|
{
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$config = new Config();
|
||||||
|
$config->setConfigurationValues('plugin:Remotesupport',
|
||||||
|
['run_mode' => 'None',
|
||||||
|
'threads' => 100,
|
||||||
|
'show_in_tickets' => true,
|
||||||
|
'show_in_computers' => true,
|
||||||
|
'easy_novnc' => true,
|
||||||
|
'fusion' => true]
|
||||||
|
);
|
||||||
|
|
||||||
|
Toolbox::logInFile("remotesupport", "Installing plugin");
|
||||||
|
$state_online = [
|
||||||
|
'name' => 'Online',
|
||||||
|
'entities_id' => 0,
|
||||||
|
'is_recursive' => 0,
|
||||||
|
'comment' => '',
|
||||||
|
'states_id' => 0,
|
||||||
|
'completename' => 'Online',
|
||||||
|
'level' => 1,
|
||||||
|
'ancestors_cache' => '[]',
|
||||||
|
'sons_cache' => 'NULL',
|
||||||
|
'is_visible_computer' => 1,
|
||||||
|
'is_visible_monitor' => 0,
|
||||||
|
'is_visible_networkequipment' => 0,
|
||||||
|
'is_visible_peripheral' => 0,
|
||||||
|
'is_visible_phone' => 0,
|
||||||
|
'is_visible_printer' => 0,
|
||||||
|
'is_visible_softwareversion' => 0,
|
||||||
|
'is_visible_softwarelicense' => 0,
|
||||||
|
'is_visible_line' => 0,
|
||||||
|
'is_visible_certificate' => 0,
|
||||||
|
'is_visible_rack' => 0,
|
||||||
|
'is_visible_passivedcequipment' => 0,
|
||||||
|
'is_visible_enclosure' => 0,
|
||||||
|
'is_visible_pdu' => 0,
|
||||||
|
'is_visible_cluster' => 0,
|
||||||
|
'is_visible_contract' => 0,
|
||||||
|
'is_visible_appliance' => 0];
|
||||||
|
|
||||||
|
$ret = $DB->insert(
|
||||||
|
'glpi_states', $state_online
|
||||||
|
);
|
||||||
|
|
||||||
|
$state_offline = $state_online;
|
||||||
|
$state_offline["name"] = 'Offline';
|
||||||
|
$state_offline["completename"] = 'Offline';
|
||||||
|
|
||||||
|
$ret = $DB->insert(
|
||||||
|
'glpi_states', $state_offline
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function plugin_remotesupport_uninstall(){
|
function plugin_remotesupport_uninstall()
|
||||||
|
{
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
Toolbox::logInFile("remotsupport", "Uninstalling plugin");
|
||||||
|
CronTask::Unregister('remotesupport');
|
||||||
|
|
||||||
|
$req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], ['OR' => ['name' => 'Online', 'name' => 'Offline']]);
|
||||||
|
|
||||||
|
$ret = $req->next();
|
||||||
|
$states_ids[$ret['name']] = $ret['id'];
|
||||||
|
$ret = $req->next();
|
||||||
|
$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["Online"]);
|
||||||
|
$DB->query('DELETE FROM glpi_states WHERE id=' . $states_ids["Offline"]);
|
||||||
|
$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;
|
||||||
|
$config = Config::getConfigurationValues('plugin:Remotesupport');
|
||||||
|
|
||||||
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" && $config["show_in_tickets"]) {
|
||||||
$id = $_GET['id'];
|
$id = $_GET['id'];
|
||||||
|
|
||||||
//mysql> select * from glpi_tickets_users where tickets_id = 2 and type = 1;
|
//mysql> select * from glpi_tickets_users where tickets_id = 2 and type = 1;
|
||||||
@@ -60,4 +134,3 @@ function plugin_remotesupport_postinit() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
|
||||||
|
|||||||
1
inc/.gitigonre
Normal file
1
inc/.gitigonre
Normal file
@@ -0,0 +1 @@
|
|||||||
|
bin/check_status
|
||||||
112
inc/config.class.php
Normal file
112
inc/config.class.php
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* @version $Id$
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
GLPI - Gestionnaire Libre de Parc Informatique
|
||||||
|
Copyright (C) 2003-2011 by the INDEPNET Development Team.
|
||||||
|
http://indepnet.net/ http://glpi-project.org
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
LICENSE
|
||||||
|
This file is part of GLPI.
|
||||||
|
GLPI is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
GLPI is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with GLPI. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PluginRemotesupportConfig extends CommonDBTM {
|
||||||
|
|
||||||
|
static protected $notable = true;
|
||||||
|
|
||||||
|
function getTabNameForItem(CommonGLPI $item, $withtemplate = 0) {
|
||||||
|
|
||||||
|
if (!$withtemplate) {
|
||||||
|
if ($item->getType() == 'Config') {
|
||||||
|
return __('Remote Support plugin');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
static function configUpdate($input) {
|
||||||
|
$input['configuration'] = 1 - $input['configuration'];
|
||||||
|
return $input;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showFormRemotesupport() {
|
||||||
|
global $CFG_GLPI;
|
||||||
|
|
||||||
|
if (!Session::haveRight("config", UPDATE)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$my_config = Config::getConfigurationValues('plugin:Remotesupport');
|
||||||
|
|
||||||
|
echo "<form name='form' action=\"".Toolbox::getItemTypeFormURL('Config')."\" method='post'>";
|
||||||
|
echo "<div class='center' id='tabsbody'>";
|
||||||
|
echo "<table class='tab_cadre_fixe'>";
|
||||||
|
echo "<input type='hidden' name='config_class' value='".__CLASS__."'>";
|
||||||
|
echo "<input type='hidden' name='config_context' value='plugin:Remotesupport'>";
|
||||||
|
echo "<tr><th colspan='4'>" . __('Remote support setup') . "</th></tr>";
|
||||||
|
echo "<tr>";
|
||||||
|
echo "<td >" . __('Run Mode:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showFromArray('run_mode', array('None' => __('None'),'Serial'=>__('Serial'),'Parallel' => __('Parallel')), array('value' => $my_config['run_mode']));
|
||||||
|
echo "</td>";
|
||||||
|
echo "<td >" . __('EasyNoVNC Installed:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showYesNo("easy_novnc", $my_config['easy_novnc']);
|
||||||
|
echo "</td></tr>";
|
||||||
|
echo "<tr>";
|
||||||
|
echo "<td >" . __('Show in Computers:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showYesNo("show_in_computers", $my_config['show_in_computers']);
|
||||||
|
echo "</td>";
|
||||||
|
echo "<td >" . __('Show in Tickets:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showYesNo("show_in_tickets", $my_config['show_in_tickets']);
|
||||||
|
echo "</td>";
|
||||||
|
echo "</tr>";
|
||||||
|
|
||||||
|
echo "<tr>";
|
||||||
|
echo "<td >" . __('Threads:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showNumber("threads",
|
||||||
|
[
|
||||||
|
'value' => 100,
|
||||||
|
'min' => 1,
|
||||||
|
'max' => 100
|
||||||
|
]);
|
||||||
|
echo "</td>";
|
||||||
|
echo "<td >" . __('Fusion inventory:') . "</td>";
|
||||||
|
echo "<td>";
|
||||||
|
Dropdown::showYesNo("fusion", $my_config['fusion']);
|
||||||
|
echo "</td>";
|
||||||
|
|
||||||
|
echo "</tr>";
|
||||||
|
|
||||||
|
echo "<tr class='tab_bg_2'>";
|
||||||
|
echo "<td colspan='4' class='center'>";
|
||||||
|
echo "<input type='submit' name='update' class='submit' value=\""._sx('button', 'Save')."\">";
|
||||||
|
echo "</td></tr>";
|
||||||
|
|
||||||
|
echo "</table></div>";
|
||||||
|
Html::closeForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
static function displayTabContentForItem(CommonGLPI $item, $tabnum = 1, $withtemplate = 0) {
|
||||||
|
|
||||||
|
if ($item->getType() == 'Config') {
|
||||||
|
$config = new self();
|
||||||
|
$config->showFormRemotesupport();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,79 +1,45 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
include "../../../inc/includes.php";
|
||||||
------------------------------------------------------------------------
|
|
||||||
FusionInventory
|
|
||||||
Copyright (C) 2010-2011 by the FusionInventory Development Team.
|
|
||||||
|
|
||||||
http://www.fusioninventory.org/ http://forge.fusioninventory.org/
|
|
||||||
------------------------------------------------------------------------
|
|
||||||
|
|
||||||
LICENSE
|
|
||||||
|
|
||||||
This file is part of FusionInventory project.
|
|
||||||
|
|
||||||
FusionInventory is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
|
||||||
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,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
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);
|
declare (ticks = 1);
|
||||||
|
|
||||||
|
|
||||||
global $DB, $agents;
|
global $DB, $agents;
|
||||||
|
|
||||||
$check_arr = [];
|
$check_arr = [];
|
||||||
|
$comps = [];
|
||||||
|
|
||||||
|
$rs_path = Plugin::getPhpDir('remotesupport');
|
||||||
|
|
||||||
|
$pfConfig = new PluginFusioninventoryConfig();
|
||||||
|
$port = $pfConfig->getValue('agent_port');
|
||||||
|
|
||||||
$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"] . ":" . $port . "/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;
|
||||||
//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', 'threads' => 100);
|
||||||
|
|
||||||
$process = proc_open(__DIR__.'/bench_urls', $descriptorspec, $pipes, $cwd, $env);
|
$process = proc_open($rs_path . '/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:
|
||||||
@@ -94,25 +60,29 @@ 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']]);
|
||||||
|
|
||||||
|
$ret = $req->next();
|
||||||
|
$states_ids[$ret['name']] = $ret['id'];
|
||||||
|
$ret = $req->next();
|
||||||
|
$states_ids[$ret['name']] = $ret['id'];
|
||||||
|
print_r($states_ids);
|
||||||
|
|
||||||
$DB->update("glpi_computers", [
|
$DB->update("glpi_computers", [
|
||||||
'states_id' => NULL ] ,
|
'states_id' => $states_ids["Offline"] ] ,
|
||||||
[ '1' => '1' ]
|
[ '1' => '1' ]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$ids = [];
|
||||||
foreach ($checked as $s) {
|
foreach ($checked as $s) {
|
||||||
echo $s->computers_id." ";
|
echo $s->computers_id."\n";
|
||||||
|
$ids[] = $s->computers_id;
|
||||||
$comp = new Computer();
|
|
||||||
$comp->getFromDB($s->computers_id);
|
|
||||||
$comp->fields["states_id"] = 2;
|
|
||||||
$DB->update("glpi_computers", [
|
|
||||||
'states_id' => $comp->fields["states_id"] ],
|
|
||||||
[ 'id' => $s->computers_id ]
|
|
||||||
);
|
|
||||||
echo $comp->fields["contact"]."\n";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$DB->update("glpi_computers", [
|
||||||
|
'states_id' => $states_ids["Online"] ],
|
||||||
|
[ 'id' => $ids ]
|
||||||
|
);
|
||||||
|
|
||||||
// print_r($a_computerextend);
|
// print_r($a_computerextend);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|||||||
@@ -4,22 +4,32 @@ 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)
|
||||||
|
{
|
||||||
|
|
||||||
|
$config = Config::getConfigurationValues('plugin:Remotesupport');
|
||||||
|
|
||||||
class PluginRemotesupportRemotesupport extends CommonDBTM {
|
if ($config["show_in_computers"] == false) {
|
||||||
static function showInfo($item) {
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
$fi_path = Plugin::getWebDir('fusioninventory');
|
$statusids = self::getStatusArray();
|
||||||
|
|
||||||
// Manage locks pictures
|
|
||||||
PluginFusioninventoryLock::showLockIcon('Computer');
|
|
||||||
|
|
||||||
|
if ($config["fusion"] == true && $config["easy_novnc"] == true) {
|
||||||
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
|
$pfInventoryComputerComputer = new PluginFusioninventoryInventoryComputerComputer();
|
||||||
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($item->getID());
|
$a_computerextend = $pfInventoryComputerComputer->hasAutomaticInventory($item->getID());
|
||||||
if (empty($a_computerextend)) {
|
if (empty($a_computerextend)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$href = "https://" . $_SERVER['SERVER_NAME'] . "/vnc.html?path=vnc%2F" . $a_computerextend['remote_addr'] . "&autoconnect=true&resize=scale&reconnect=true&show_dot=true";
|
||||||
|
$name = $a_computerextend['remote_addr'];
|
||||||
|
} else {
|
||||||
|
$href = "vnc://" . $item->fields["name"];
|
||||||
|
$name = $item->fields["name"];
|
||||||
|
}
|
||||||
echo '<table class="tab_glpi" width="100%">';
|
echo '<table class="tab_glpi" width="100%">';
|
||||||
echo '<tr>';
|
echo '<tr>';
|
||||||
echo '<th>' . __('Remote Support') . '</th>';
|
echo '<th>' . __('Remote Support') . '</th>';
|
||||||
@@ -27,7 +37,8 @@ class PluginRemotesupportRemotesupport extends CommonDBTM {
|
|||||||
echo '<tr class="tab_bg_1">';
|
echo '<tr class="tab_bg_1">';
|
||||||
echo '<td>';
|
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>";
|
$style = $statusids[$item->getID()] == "Offline" ? "style=\"background-color: red\"" : "";
|
||||||
|
$url = "<a target=\"_blank\" href=\"" . $href . "\"><li class=\"document\" ". $style ."><i class=\"fa fa-laptop-medical\"></i>" . $name . "</li></a>";
|
||||||
|
|
||||||
if ($url != "") {
|
if ($url != "") {
|
||||||
echo "<div><ul class=\"timeline_choices\"><h2>VNC connect : </h2>";
|
echo "<div><ul class=\"timeline_choices\"><h2>VNC connect : </h2>";
|
||||||
@@ -40,14 +51,121 @@ class PluginRemotesupportRemotesupport extends CommonDBTM {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getStatesIds()
|
||||||
static function cronRemotesupport($task) {
|
{
|
||||||
global $DB;
|
global $DB;
|
||||||
|
|
||||||
Toolbox::logInFile("remotsupport","Starting search of agents\n");
|
$states_ids = [];
|
||||||
|
|
||||||
|
$req = $DB->request('glpi_states', ['FIELDS' => ['glpi_states' => ['id', 'name']]], ['OR' => ['name' => 'Online', 'name' => 'Offline']]);
|
||||||
|
|
||||||
|
$ret = $req->next();
|
||||||
|
$states_ids[$ret['name']] = $ret['id'];
|
||||||
|
$ret = $req->next();
|
||||||
|
$states_ids[$ret['name']] = $ret['id'];
|
||||||
|
|
||||||
|
return $states_ids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getContactArray()
|
||||||
|
{
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$req = $DB->request('glpi_computers', ['FIELDS' => ['glpi_computers' => ['id', 'contact']]]);
|
||||||
|
|
||||||
|
$contactids = [];
|
||||||
|
while ($ret = $req->next()) {
|
||||||
|
$contactids[$ret["id"]] = $ret["contact"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $contactids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getStatusArray()
|
||||||
|
{
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$st = self::getStatesIds();
|
||||||
|
|
||||||
|
$req = $DB->request('glpi_computers', ['FIELDS' => ['glpi_computers' => ['id', 'states_id']]]);
|
||||||
|
|
||||||
|
$statusids = [];
|
||||||
|
while ($ret = $req->next()) {
|
||||||
|
$statusids[$ret["id"]] = $ret["states_id"] == $st["Offline"] ? "Offline" : "Online";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $statusids;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function cronRemotesupport($task)
|
||||||
|
{
|
||||||
|
global $DB;
|
||||||
|
|
||||||
|
$config = Config::getConfigurationValues('plugin:Remotesupport');
|
||||||
|
|
||||||
|
if ($config["fusion"] == false || $config["run_mode"] == "None") {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Toolbox::logInFile("remotesupport", "Starting search of agents\n");
|
||||||
|
|
||||||
|
if ($config["run_mode"] == "Parallel") {
|
||||||
|
$pfConfig = new PluginFusioninventoryConfig();
|
||||||
|
$port = $pfConfig->getValue('agent_port');
|
||||||
|
$rs_path = Plugin::getPhpDir('remotesupport');
|
||||||
|
|
||||||
|
$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"] . ":" . $port . "/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());
|
||||||
|
}
|
||||||
|
|
||||||
|
$descriptorspec = array(
|
||||||
|
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
|
||||||
|
2 => array("file", "/tmp/error-output.txt", "a"), // stderr is a file to write to
|
||||||
|
);
|
||||||
|
|
||||||
|
$cwd = '/tmp';
|
||||||
|
$env = array('debug' => 'false', 'threads' => $config["threads"]);
|
||||||
|
|
||||||
|
$process = proc_open($rs_path . '/bin/check_status', $descriptorspec, $pipes, $cwd, $env);
|
||||||
|
|
||||||
|
if (is_resource($process)) {
|
||||||
|
// $pipes now looks like this:
|
||||||
|
// 0 => writeable handle connected to child stdin
|
||||||
|
// 1 => readable handle connected to child stdout
|
||||||
|
// Any error output will be appended to /tmp/error-output.txt
|
||||||
|
|
||||||
|
fwrite($pipes[0], json_encode($check_arr));
|
||||||
|
fclose($pipes[0]);
|
||||||
|
|
||||||
|
$checked = json_decode(stream_get_contents($pipes[1]));
|
||||||
|
fclose($pipes[1]);
|
||||||
|
|
||||||
|
// It is important that you close any pipes before calling
|
||||||
|
// proc_close in order to avoid a deadlock
|
||||||
|
$return_value = proc_close($process);
|
||||||
|
|
||||||
|
Toolbox::logInFile("remotesupport", "command returned $return_value\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
$agents = [];
|
$agents = [];
|
||||||
$data_set = [];
|
$data_set = [];
|
||||||
|
$checked = [];
|
||||||
|
|
||||||
foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) {
|
foreach (getAllDataFromTable(PluginFusioninventoryAgent::getTable()) as $a) {
|
||||||
|
|
||||||
@@ -55,35 +173,50 @@ class PluginRemotesupportRemotesupport extends CommonDBTM {
|
|||||||
$agents[$a["id"]] = $a;
|
$agents[$a["id"]] = $a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach ($data_set as $id) {
|
foreach ($data_set as $id) {
|
||||||
$agent = new PluginFusioninventoryAgent;
|
$agent = new PluginFusioninventoryAgent;
|
||||||
$agent->getFromDB((int) $id);
|
$agent->getFromDB((int) $id);
|
||||||
$st = $agent->getStatus();
|
$st = $agent->getStatus();
|
||||||
|
|
||||||
if ($st["message"] != "noanswer")
|
if ($st["message"] != "noanswer") {
|
||||||
Toolbox::logInFile("remotsupport",print_r($agents[$id],true));
|
$check = new stdClass();
|
||||||
|
$check->computers_id = $agents[$id]["computers_id"];
|
||||||
|
$checked[] = $check;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$stids = self::getStatesIds();
|
||||||
|
|
||||||
|
$DB->update("glpi_computers", [
|
||||||
|
'states_id' => $stids["Offline"]],
|
||||||
|
['1' => '1']
|
||||||
|
);
|
||||||
|
|
||||||
|
$ids = [];
|
||||||
|
$cids = self::getContactArray();
|
||||||
|
|
||||||
|
foreach ($checked as $s) {
|
||||||
|
|
||||||
$comp = new Computer();
|
$comp = new Computer();
|
||||||
$comp->getFromDB($agents[$id]["computers_id"]);
|
$comp->getFromDB($s->computers_id);
|
||||||
if ($st["message"] == "noanswer")
|
Toolbox::logInFile("remotesupport", $s->computers_id . " " . $cids[$s->computers_id] . "\n");
|
||||||
$comp->fields["states_id"] = NULL;
|
$ids[] = $s->computers_id;
|
||||||
else
|
}
|
||||||
$comp->fields["states_id"] = 2;
|
|
||||||
$DB->update("glpi_computers", [
|
$DB->update("glpi_computers", [
|
||||||
'states_id' => $comp->fields["states_id"] ],
|
'states_id' => $stids["Online"]],
|
||||||
[ 'id' => $agents[$id]["computers_id"] ]
|
['id' => $ids]
|
||||||
);
|
);
|
||||||
$comp->fields["contact"]."\n";
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function cronInfo($name)
|
||||||
|
{
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function cronInfo($name) {
|
|
||||||
return [
|
return [
|
||||||
'description' => "Agent search remotesupport"];
|
'description' => __('Agent search remotesupport')];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
</authors>
|
</authors>
|
||||||
<versions>
|
<versions>
|
||||||
<version>
|
<version>
|
||||||
<num>0.0.1</num>
|
<num>0.0.2</num>
|
||||||
<compatibility>~9.5.0</compatibility>
|
<compatibility>~9.5.0</compatibility>
|
||||||
</version>
|
</version>
|
||||||
</versions>
|
</versions>
|
||||||
|
|||||||
20
setup.php
20
setup.php
@@ -33,26 +33,19 @@ function plugin_init_remotesupport()
|
|||||||
|
|
||||||
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'),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Plugin::registerClass('PluginRemotesupportConfig', ['addtabon' => 'Config']);
|
||||||
|
|
||||||
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']);
|
||||||
|
|
||||||
|
|
||||||
// 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['menu']['remotesupport'] = true;
|
||||||
$PLUGIN_HOOKS['post_init']['remotesupport'] = 'plugin_remotesupport_postinit';
|
$PLUGIN_HOOKS['post_init']['remotesupport'] = 'plugin_remotesupport_postinit';
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,9 +60,8 @@ function plugin_version_remotesupport()
|
|||||||
'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