Vendredi, Novembre 19, 2021

Couchdb - la base

Upload de fichier Powershell

Contexte:

des fichier json sont preésents dans une arborescende de dossier et doivent être uplaoder dans le serveur couchdb.

$files = ls *.json -Recurse -File | select FullName
foreach ($file in $files) {$f = $file.Fullname; curl -X POST "http://admin:password@server_couchdb:5984/alerts" -d "@$f" -H "Content-Type:application/json"}
  • ligne 1 : liste les fichiers json du répertoire courant et des sous-répertoires, en sélectionnant le Fullname c’est à dire le chemin complet
  • ligne 2 : pour chaque item on envoi le fichier json vers le serveur couchdb

Accès à l’interface web

L’accès se fait via un browser web à l’URL suivante: http://server_couchdb:5984/_utils/

Requête basique

Afficher tous les records:

{
   "selector": {
      "_id": {
         "$gt": null
      }
   }
}

Afficher tous les records mais en séectionnant les colonnes:

{
   "selector": {
      "_id": {
         "$gt": null
      }
   },
   "fields": [
      "column1",
      "column2",
      "column3.sub1",
      "column5.sub1.sub2"
   ]
}

Tester port distant

Telnet

/! Uniquement pour les ports TCP

telnet [hostname/IP address] [port number]

Netcat

Pour les ports TCP.

Test d’un port unique, par exemple 443.

nc -z -v [hostname/IP address] [port number]
nc -z -v [hostname/IP address] 443

Test d’un range de port, par exemple tester les ports 20 à 22.

nc -z -v [hostname/IP address] [port range]
nc -z -v [hostname/IP address] 20-22

Test de ports multiples, par exemple ports 22, 80, 443:

nc -z -v [hostname/IP address] [port number] [port number] [port number]
nc -z -v [hostname/IP address] 22 80 443

Pour les ports UDP

nc -z -v -u [hostname/IP address] [port number]

Jeudi, Novembre 18, 2021

Amélioration des pages avec des requêtes

SolarWinds offre des pages par défaut avec de (trop) noébreuses informations mais parfois il manque quand même quelques informations. Les requêtes suivantes vont ajouter des informations sur les pages des nodes et de volumes.

Page node details

Ces requêtes sont à ajouter dans les pages de type node details.

Affichage des groupes

Il facile de savoir ce qui constitue un groupe, il suffit de déplier l’arborescence du groupe. Il est par contre moins facile de déterminer à quel groupe appartient un node spécifique, c’est tout l’intérêt de cette requête.

SELECT 
    cm.Container.Name AS [Group_Name]
    ,cm.Container.DetailsUrl AS [_LinkFor_Group_Name]
FROM 
    Orion.ContainerMembers cm 
WHERE cm.FullName = '${Caption}'

Historique des alertes

Une page simple mais vraiment efficace qui affiche l’historique des alertes du node. A noter qu’il est possible de retrouver ces informations par la page Message center, simplement cette requête donne l’info sans quitter la page du node.

SELECT 
    AlertHistory.AlertObjects.AlertConfigurations.Name AS [Alert Name], 
    Message, 
    AlertHistory.AlertObjects.EntityCaption AS [Triggering Object],
    ToLocal(Timestamp) AS [Time],
    AlertHistory.AlertObjects.RelatedNodeCaption AS [Related Node],
    'https://solarwinds/Orion/NetPerfMon/ActiveAlertDetails.aspx?NetObject=AAT:'+ToString(AlertObjectID) AS [_linkfor_Message],
    'https://solarwinds/Orion/NetPerfMon/ActiveAlertDetails.aspx?NetObject=AAT:'+ToString(AlertObjectID) AS [_linkfor_Alert Name]
FROM
    Orion.AlertHistory 
WHERE
    AlertHistory.AlertObjects.RelatedNodeID='${NodeID}'
    AND EventType = 0
ORDER BY
    TimeStamp desc

Maintenance status

SELECT
    N.Caption AS [Node],
    ToString(tolocal(N.UnManageFrom)) AS [Suppressed From],
    CASE
        WHEN ToString(N.UnManageUntil)='Jan  1 9999 12:00AM' THEN ' - Forever - '
        ELSE ToString(tolocal(N.UnManageUntil))
    END AS [Suppressed TO],
    CONCAT('/NetPerfMon/Images/Vendors/',N.Icon) AS [_ICONFor_Node],
    N.DetailsUrl AS [_LinkFor_Node],
    CONCAT(DayDiff(N.UnManageFrom,GetDate()), ' days') as [Suppressed days],
    AE.AccountID AS [Supressed By],
    'Unmanaged' AS [Type]
FROM Orion.Nodes N
LEFT OUTER JOIN (
        SELECT
            AE.NetObjectID,
            Max(AE.AuditEventID) as [AuditEventID],
            Max(AE.TimeLoggedUtc) as [TimeLoggedUtc] 
        FROM Orion.AuditingEvents AE
        where ActionTypeID in
            ( 
            SELECT ActionTypeID 
            FROM Orion.AuditingActionTypes 
            where
                ActionType = 'Orion.AlertSuppressionAdded' 
                or ActionType = 'Orion.AlertSuppressionChanged' 
            ) 
        group by AE.NetObjectID
) AS [LastMuteEvents] ON LastMuteEvents.NetObjectID=N.NodeID
LEFT OUTER JOIN Orion.AuditingEvents AE ON AE.AuditEventID=LastMuteEvents.AuditEventid
WHERE
    N.UnManaged=1 and LastMuteEvents.NetObjectID = ${NodeId}

UNION
(
SELECT
    N.Caption AS [Node],
    ToString(tolocal(Supp.SuppressFrom)) AS [Suppressed From],
    ISNULL(ToString(tolocal(Supp.SuppressUntil)),' - Forever - ') AS [Suppressed TO],
 CONCAT('/NetPerfMon/Images/Vendors/',N.Icon) AS [_ICONFor_Node],
   N.DetailsUrl AS [_LinkFor_Node],
    --CONCAT('/Orion/images/StatusIcons/',N.StatusIcon) as Icon,
    CONCAT(DayDiff(Supp.SuppressFrom,GetDate()), ' days') as [Suppressed days],
    AE.AccountID AS [Supressed By],
    'Muted' AS [Type]
FROM Orion.Nodes N
INNER JOIN Orion.AlertSuppression Supp ON Supp.EntityUri=N.Uri
LEFT OUTER JOIN (
        SELECT
            AE.NetObjectID,
            Max(AE.AuditEventID) as [AuditEventID],
            Max(AE.TimeLoggedUtc) as [TimeLoggedUtc] 
        FROM Orion.AuditingEvents AE
        where ActionTypeID in
            ( 
            SELECT ActionTypeID 
            FROM Orion.AuditingActionTypes 
            where
                ActionType = 'Orion.AlertSuppressionAdded' 
                or ActionType = 'Orion.AlertSuppressionChanged' 
            ) 
        group by AE.NetObjectID
) AS [LastMuteEvents] ON LastMuteEvents.NetObjectID=N.NodeID
LEFT OUTER JOIN Orion.AuditingEvents AE ON AE.AuditEventID=LastMuteEvents.AuditEventid
WHERE LastMuteEvents.NetObjectID = ${NodeId}
)

order BY N.Caption

Status du node avec Root Cause

SELECT   
    Caption, 
    statusdescription AS [Status],  
    n.NodeStatusRootCause AS [Root Cause],
    n.engine.servername AS [Poller]
FROM 
    Orion.Nodes n
WHERE 
    nodeid LIKE ${NodeId} --sera pris directement du node de la page

Page des volumes

Ces requêtes sont à ajouter dans les pages volume details.

Status de la collecte des métriques

Nous considérons ici comme obsolètes les données qui sont datées de plus de 90 minutes.

SELECT
    CASE
        WHEN n.Volumes.MinutesSinceLastSync > 90 THEN ' Data are obsolete !!'
        ELSE 'Data are up to date'
    END AS [Metrics status],
    CASE
        WHEN n.Volumes.MinutesSinceLastSync > 90 then '/Orion/images/StatusIcons/Small-Warning.gif'
        ELSE '/Orion/images/StatusIcons/Small-Up.gif'
    END AS [_iconfor_Metrics status] 
FROM 
    Orion.Nodes n
WHERE 
    n.volumes.volumeid = ${VolumeID} --pris de la page du volume

Mercredi, Novembre 17, 2021

SCP copie de fichiers distant

Copie de distant vers local

scp remote_username@10.10.0.2:/remote/file.txt /local/directory

Copie de local vers distant

scp file.txt remote_username@10.10.0.2:/remote/directory

Copie de distant 1 vers distamt 2

scp user1@host1.com:/files/file.txt user2@host2.com:/files

Copie de distant 1 vers distant 2 via local

scp -3 user1@host1.com:/files/file.txt user2@host2.com:/files

Taille des dossiers

Afficher la taille des dossiers et sous dossiers

du -hc chemin_du_dossier
du -hc chemin_du_dossier | grep total

une version plus light avec uniquement l’affichage total du dossier sans afficher les sous dossier ni les fichiers

du -sh chemin_du_dossier

Note:

  • h pour rendre lisible par un humain la taille affiché
  • s affichage uniquement pour le dossier parent
  • c affichage tous les dossiers et sous dossiers et fichiers avec un grand total final