-
Hahn Axel (hahn) authoredHahn Axel (hahn) authored
index.php 11.95 KiB
<?php
/**
* IML APPMONITOR CHECKS FOR CI SERVER
*
* @author: Axel Hahn
*
* ------------------------------------------------------------------
* 2014-10-24 v0.1
* ...
* 2024-09-04 php8 only: short array syntax
*/
require_once('classes/appmonitor-client.class.php');
require_once(__DIR__.'/../deployment/classes/project.class.php');
$oMonitor = new appmonitor();
$sCfgfile='../../config/inc_projects_config.php';
require_once $sCfgfile;
include('general_include.php');
// ----------------------------------------------------------------------
// config files
// ----------------------------------------------------------------------
$oMonitor->addCheck(
[
"name" => "read config file",
"description" => "Check if config file is readable",
"check" => [
"function" => "File",
"params" => [
"filename" => $sCfgfile,
"file" => true,
"readable" => true,
],
],
]
);
foreach ([
"config/config_custom.php",
"config/config_defaults.php",
"config/inc_roles.php",
] as $sCfgfile) {
$oMonitor->addCheck(
[
"name" => "read config file $sCfgfile",
"description" => "Check if config file $sCfgfile is an existing file and is readable",
"check" => [
"function" => "File",
"params" => [
"filename" => "../../$sCfgfile",
"file" => true,
"readable" => true,
],
],
]
);
}
// echo '<pre>' . print_r($aConfig, 1) . '</pre>';die();
// ----------------------------------------------------------------------
// directories
// ----------------------------------------------------------------------
foreach ([
'tmpDir'=>['dir'=>$aConfig['tmpDir'], 'descr'=>'Temp Dir mit git Daten'],
'configDir'=>['dir'=>$aConfig['configDir'], 'descr'=>'Ablage der Programm-Config'],
'dataDir'=>['dir'=>$aConfig['dataDir'], 'descr'=>'Basisverzeichnis fue DB, Projekt-Configs, SSH-Keys'],
'dataDir/database'=>['dir'=>$aConfig['dataDir'].'/database', 'descr'=>'DB-Ablage (Sqlite)'],
'dataDir/projects'=>['dir'=>$aConfig['dataDir'].'/projects', 'descr'=>'Projekt-Configdateien'],
'dataDir/sshkeys'=>['dir'=>$aConfig['dataDir'].'/sshkeys', 'descr'=>'SSH Keys'],
'buildDir'=>['dir'=>$aConfig['buildDir'], 'descr'=>'Basisverzeichnis fuer Builds'],
'packageDir'=>['dir'=>$aConfig['packageDir'], 'descr'=>'Basisverzeichnis der Pakete und Versionen'],
'archiveDir'=>['dir'=>$aConfig['archiveDir'], 'descr'=>'Ablage der gebuildeten Archive'],
] as $sKey=>$aItem) {
$oMonitor->addCheck(
[
"name" => "dir $sKey",
"description" => $aItem['descr'],
"parent" => "read config file",
"check" => [
"function" => "File",
"params" => [
"filename" => $aItem['dir'],
"dir" => true,
"writable" => true,
],
],
]
);
}
$oMonitor->addCheck(
[
"name" => "Free space in Archive dir ",
"description" => "The file storage must have some space left",
"check" => [
"function" => "Diskfree",
"parent" => "read config file",
"params" => [
"directory" => $aConfig['archiveDir'],
"warning" => "2GB",
"critical" => "500MB",
],
],
]
);
// ----------------------------------------------------------------------
// count of Projects
// ----------------------------------------------------------------------
$oPrj=new project();
$iProjectCount=count($oPrj->getProjects());
$iInProgress=0;
$iInQueue=0;
foreach ($oPrj->getProjects() as $sPrj) {
$oPrj2=new project($sPrj);
$aProgress=$oPrj2->getProgress();
/*
* so ist irgendwas anders ... er initialisiert das Projekt nicht
*
$oPrj->setProjectById($sPrj);
$aProgress=$oPrj->getProgress();
*/
$iInProgress+=$aProgress['inprogress'] ? 1 : 0;
$iInQueue+=$aProgress['hasQueue'] ? 1 : 0;
}
$oMonitor->addCheck(
[
"name" => "ci projects",
"description" => "Count of Projects in CI Webgui",
"group" => "monitor",
"parent" => "read config file",
"check" => [
"function" => "Simple",
"params" => [
"result" => $iProjectCount ? RESULT_OK : RESULT_ERROR,
"value" => "found projects: $iProjectCount",
"count" => $iProjectCount,
"visual" => "simple",
],
],
]
);
$oMonitor->addCheck(
[
"name" => "ci inProgress",
"description" => "Projects in progress",
"group" => "monitor",
"parent" => "read config file",
"check" => [
"function" => "Simple",
"params" => [
"result" => RESULT_OK,
"value" => "found projects: $iInProgress",
"count" => $iInProgress,
"visual" => "simple",
],
],
]
);
$oMonitor->addCheck(
[
"name" => "ci hasqueue",
"description" => "Waiting for install",
"group" => "monitor",
"parent" => "read config file",
"check" => [
"function" => "Simple",
"params" => [
"result" => RESULT_OK,
"value" => "found projects: $iInQueue",
"count" => $iInQueue,
"visual" => "simple",
],
],
]
);
include 'plugins/apps/shared_check_ssl.php';
// ----------------------------------------------------------------------
// foreman
// ----------------------------------------------------------------------
if(isset($aConfig['foreman']['api'])){
require_once(__DIR__.'/../deployment/classes/foremanapi.class.php');
$oForeman = new ForemanApi($aConfig['foreman']);
foreach (['hostgroups', 'hosts'] as $sForemanKey){
$aFData=$oForeman->read([
'request' => [
[$sForemanKey],
],
'response' => [
'id', 'title'
],
]);
$oMonitor->addCheck(
[
"name" => "Foreman $sForemanKey",
"description" => "Count of Foreman $sForemanKey",
"group" => "monitor",
"parent" => "read config file",
"check" => [
"function" => "Simple",
"params" => [
"result" => count($aFData) ? RESULT_OK : RESULT_ERROR,
"value" => "Count of found Foreman $sForemanKey: " . count($aFData)."; response status: ".$oForeman->getResponseStatus() . "; Http-Code ".$oForeman->getResponseInfo('http_code'),
"count" => count($aFData),
"visual" => "simple",
],
],
]
);
}
}
// #6421 - add check for AWX
// #7709 - update for instances per rollout plugin
if(isset($aConfig['plugins']['rollout']['awx'])){
$aOpts=[];
foreach ($aConfig['plugins']['rollout'] as $sId => $aRolloutConfig) {
if ($aRolloutConfig['plugin'] == "awx") {
$aOpts['url'] = $aRolloutConfig['url'].'/';
$aOpts['userpwd'] = $aRolloutConfig['user']
. (isset($aRolloutConfig['password'])
? ':'.$aRolloutConfig['password']
: ''
)
;
$oMonitor->addCheck(
[
"name" => "AWX API - ".$sId,
"description" => "check if AWX api is available",
"group" => "network",
"parent" => "read config file",
"check" => [
"function" => "HttpContent",
"params" => $aOpts,
],
]
);
}
}
}
// ----------------------------------------------------------------------
// ssh targets
// ----------------------------------------------------------------------
if(count($aConfig['mirrorPackages'])){
foreach($aConfig['mirrorPackages'] as $sHostKey=>$aData){
/*
[puppet.one] => Array
(
[type] => rsync
[runas] =>
[target] => copy-deployment@puppet:/var/shared/imldeployment
)
*/
$sTargetHost = preg_replace('/\:.*/', '', $aData['target']);
$sCmd='ssh '.$sTargetHost. ' ls -1';
exec($sCmd, $sOut, $iRc);
$oMonitor->addCheck(
[
"name" => "mirror target $sHostKey",
"description" => "Sync target of generated packages",
"group" => "network",
"parent" => "read config file",
"check" => [
"function" => "Simple",
"params" => [
"result" => $iRc ? RESULT_ERROR : RESULT_OK,
"value" => "Command [$sCmd] returns with exitcode $iRc; output: ".implode(" ", $sOut),
],
],
]
);
}
}
foreach([
/*
[
'host'=>'gitlab.iml.unibe.ch',
'port'=>22,
'descr'=>'SSH port to Gitlab on gitlab.iml.unibe.ch'
],
*/
[
'host'=>'git-repo.iml.unibe.ch',
'port'=>22,
'descr'=>'SSH port to Gitlab on git-repo.iml.unibe.ch'
],
[
'host'=>'github.com',
'port'=>22,
'descr'=>'SSH port to Github'
],
] as $aDescr){
$oMonitor->addCheck(
[
"name" => 'port check '.$aDescr['host'].':'.$aDescr['port'],
"description" => $aDescr['descr'],
"group" => "cloud",
"parent" => "read config file",
"check" => [
"function" => "PortTcp",
"params" => [
"port"=>$aDescr['port'],
"host"=>$aDescr['host'],
],
],
]
);
}
// ----------------------------------------------------------------------
// database
// ----------------------------------------------------------------------
$sSqlitefile=$aConfig['dataDir'].'/database/logs.db';
$oMonitor->addCheck(
[
"name" => "Sqlite DB for action logs",
"description" => "Connect sqlite db ". basename($sSqlitefile),
"parent" => "read config file",
"check" => [
"function" => "SqliteConnect",
"params" => [
"db"=>$sSqlitefile
],
],
]
);
// ----------------------------------------------------------------------
// system stuff
// ----------------------------------------------------------------------
$oMonitor->addCheck(
[
"name" => "plugin Load",
"description" => "current load",
"parent" => false,
"check" => [
"function" => "Loadmeter",
"params" => [
"warning" => 1.0,
"error" => 3,
],
],
"worstresult" => RESULT_OK
]
);
$oMonitor->addCheck(
[
"name" => "plugin ApacheProcesses",
"description" => "Apache processes",
"parent" => false,
"check" => [
"function" => "ApacheProcesses",
"params" => [
"warning" => 50,
"error" => 75,
],
],
"worstresult" => RESULT_OK
]
);
// ----------------------------------------------------------------------
$oMonitor->setResult();
$oMonitor->render();
// ----------------------------------------------------------------------