Add connection module

This commit is contained in:
Thilina
2021-06-27 17:49:05 +02:00
parent 46e3bf439e
commit 47871d9551
5 changed files with 253 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
<?php
use Classes\StatsHelper;
use Connection\Common\ConnectionService;
$moduleName = 'connection';
$moduleGroup = 'admin';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$isIceHrmPro = false;
if (class_exists('\\Classes\\ProVersion')) {
$data = \Classes\ProVersion::$data;
$isIceHrmPro = true;
$data = json_decode($data, true);
}
$employeeCount = StatsHelper::getEmployeeCount();
$userCount = StatsHelper::getUserCount();
$connectionService = new ConnectionService();
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabConnection" href="#tabConnection"><?=t('Connection')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabConnection">
<div class="reviewBlock" data-content="List">
<div id="connectionData"></div>
</div>
</div>
</div>
</div>
<div id="dataGroup"></div>
<?php
$moduleData = [
'user_level' => $user->user_level,
'components' => [
'employeeCount' => [
'isIceHrmPro' => $isIceHrmPro,
'count' => $employeeCount,
'allowed' => $isIceHrmPro ? intval($data['employees']) : 'N/A',
'validUntil' => $data['licenseActivated'],
'licenseId' => $data['key'],
],
'systemData' => [
'data' => $connectionService->getSystemReport(),
'issues' => $connectionService->getSystemErrors(),
],
]
];
?>
<script>
initAdminConnection(<?=json_encode($moduleData)?>);
</script>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -0,0 +1,12 @@
{
"label": "Ice Connect",
"menu": "System",
"order": "9",
"icon": "fa-wifi",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Connection\\Common\\Model",
"manager": "\\Connection\\Admin\\Api\\ConnectionAdminManager"
}

View File

@@ -0,0 +1,9 @@
<?php
namespace Connection\Admin\Api;
use Classes\SubActionManager;
class ConnectionActionManager extends SubActionManager
{
}

View File

@@ -0,0 +1,38 @@
<?php
namespace Connection\Admin\Api;
use Classes\AbstractModuleManager;
use Connection\Common\ConnectionService;
class ConnectionAdminManager extends AbstractModuleManager
{
public function initialize()
{
$iceConnect = new ConnectionService();
if ($iceConnect->dispatchInstallationRequest()) {
$iceConnect->reportInstallationData();
}
}
public function initializeUserClasses()
{
// TODO: Implement initializeUserClasses() method.
}
public function initializeFieldMappings()
{
// TODO: Implement initializeFieldMappings() method.
}
public function initializeDatabaseErrorMappings()
{
// TODO: Implement initializeDatabaseErrorMappings() method.
}
public function setupModuleClassDefinitions()
{
// TODO: Implement setupModuleClassDefinitions() method.
}
}

View File

@@ -0,0 +1,135 @@
<?php
namespace Connection\Common;
use Classes\BaseService;
use Classes\SettingsManager;
use Classes\StatsHelper;
use GuzzleHttp\Client;
use Users\Common\Model\User;
class ConnectionService
{
public function getInstallationData()
{
$proKey = '';
if (class_exists('\\Classes\\ProVersion')) {
$data = \Classes\ProVersion::$data;
$data = json_decode($data, true);
$proKey = $data['key'];
}
return [
'id' => BaseService::getInstance()->getInstanceId(),
'secret' => md5(BaseService::getInstance()->getInstanceKey()),
'external_ip' => $this->getExternalIP(),
'internal_ip' => $_SERVER['SERVER_ADDR'],
'employees' => StatsHelper::getEmployeeCount(),
'users' => StatsHelper::getUserCount(),
'version' => VERSION,
'company' => SettingsManager::getInstance()->getSetting('Company: Name'),
'pro_key' => $proKey,
];
}
public function getSystemReport()
{
return [
[
'name' => 'Installation ID',
'value' => BaseService::getInstance()->getInstanceId(),
],
[
'name' => 'PHP Version',
'value' => phpversion(),
],
[
'name' => 'PHP Extensions',
'value' => join(', ', get_loaded_extensions()),
],
[
'name' => 'Web Server',
'value' => $_SERVER['SERVER_SOFTWARE'],
],
[
'name' => 'MySQL Server',
'value' => mysqli_get_server_info((new User())->DB()->_connectionID),
],
[
'name' => 'Modules Loaded',
'value' => join(', ', array_keys(BaseService::getInstance()->getModuleManagerNames())),
]
];
}
public function getSystemErrors()
{
$errors = [];
$res = fopen(CLIENT_BASE_PATH.'data/connection_test.txt', "w");
if (false === $res) {
$errors[] = [
'type' => 'error',
'message' =>
'Data directory is not writable. Please make sure php can has write access to <icehrm>/app/data',
];
} else {
fwrite($res, date('Y-m-d'));
$file = CLIENT_BASE_URL.'data/connection_test.txt';
$file_headers = @get_headers($file);
if ($file_headers && $file_headers[0] !== 'HTTP/1.1 404 Not Found') {
$errors[] = [
'type' => 'error',
'link' => 'https://icehrm.gitbook.io/icehrm/getting-started/securing-icehrm-installation',
'linkText' => 'Learn how to fix',
'message' => 'Data directory is accessible from outside.',
];
}
}
return $errors;
}
public function dispatchInstallationRequest()
{
$timeNow = time();
$time = BaseService::getInstance()->getSystemData('sysDataTime');
if (null === $time) {
BaseService::getInstance()->setSystemData('sysDataTime', $timeNow);
return true;
}
$time = intval($time);
if ($timeNow > $time + 3600) {
BaseService::getInstance()->setSystemData('sysDataTime', $timeNow);
return true;
}
return false;
}
public function getExternalIP()
{
try {
$externalContent = file_get_contents('http://checkip.dyndns.com/');
preg_match('/Current IP Address: \[?([:.0-9a-fA-F]+)\]?/', $externalContent, $m);
return $m[1];
} catch (\Exception $e) {
}
return null;
}
public function reportInstallationData()
{
try {
$client = new Client();
$response = $client->request('POST', APP_WEB_URL . '/sapi/installtion-data', [
'json' => $this->getInstallationData(),
]);
} catch (\Throwable $e) {
return false;
}
return true;
}
}