diff --git a/controller/ad-controller.ps1 b/controller/ad-controller.ps1 new file mode 100644 index 0000000..680b12f --- /dev/null +++ b/controller/ad-controller.ps1 @@ -0,0 +1,96 @@ +# Funktion zum Konvertieren des LastLogonTimestamp in Datum +function Convert-LastLogonTimestamp { + param ( + [Parameter(Mandatory = $true)] + [long]$Timestamp + ) + + $DateTime = [DateTime]::FromFileTime($Timestamp) + return $DateTime +} + +# Funktion zum Abrufen der lokalen IP-Adresse +function Get-LocalIPAddress { + $ipAddress = [System.Net.Dns]::GetHostAddresses([System.Net.Dns]::GetHostName()) | + Where-Object { $_.AddressFamily -eq 'InterNetwork' } | + Select-Object -First 1 + return $ipAddress.IPAddressToString +} + +# Gruppe "Users" abrufen +$groupName = "Reporting" +$group = Get-ADGroup -Filter { Name -eq $groupName } + +if ($group -eq $null) { + Write-Error "Gruppe '$groupName' wurde nicht gefunden." + exit +} + +# Mitglieder der Gruppe abrufen +$groupMembers = Get-ADGroupMember -Identity $group -Recursive | Where-Object { $_.objectClass -eq 'user' } + +# Abrufen der lokalen IP-Adresse +$localIPAddress = Get-LocalIPAddress + +# Erstellen einer Hash-Tabelle zum Speichern der letzten Anmeldeinformationen für jeden Benutzer +$userLogins = @{} + +# Umwandeln der Benutzerinformationen und Ausgabe zur Konsole +foreach ($member in $groupMembers) { + $user = Get-ADUser -Identity $member.SamAccountName -Properties LastLogonTimestamp,createTimeStamp + $lastLogonDateTime = if ($user.LastLogonTimestamp) { (Convert-LastLogonTimestamp -Timestamp $user.LastLogonTimestamp).ToString("yyyy-MM-dd HH:mm:ss") } else { ($user.createTimeStamp).ToString("yyyy-MM-dd HH:mm:ss") } + + $convertedUser = [PSCustomObject]@{ + username = $user.SamAccountName + lastaccess = $lastLogonDateTime + ipaddress = $localIPAddress + } + + # Ausgabe des konvertierten Benutzers zur Konsole + Write-Output $convertedUser + + # Rückgabe des konvertierten Benutzers für JSON-Umwandlung + $userLogins[$user.SamAccountName] = $convertedUser +} + +# Define the JSON file path with current date and hour +$dateString = (Get-Date).ToString("yyyyMMdd_HH-mm") +$jsonPath = "C:\Scripte\LastLogins_$dateString.json" + +# Output the last login event for each user to the JSON file +$userLoginsArray = $userLogins.GetEnumerator() | ForEach-Object { + $_.Value +} + +$userLoginsArray | ConvertTo-Json | Set-Content -Path $jsonPath -Encoding UTF8 + +Write-Output "JSON file created at $jsonPath" + +# API endpoint URL +$apiUrl = "http://api.stines.de:8001/report" + +# Your API key +$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" +$headers.Add("Content-Type", "application/json") +$headers.Add("access_token", "^YWUbG7yX*V!tV^KBSd*2c&vdN3wV9a2i7f3hfGFMBYFxi6#mMiJGiaA5KEHE%B*miK%qb7rQ67gmcYP@gqmux8") + +# Loop through the collected user logins and send each as a JSON payload to the API +foreach ($userLogin in $userLoginsArray) { + $userLoginObject = $userLogin | Select-Object username, lastaccess, ipaddress + + # Convert the user login object to JSON + $jsonPayload = $userLoginObject | ConvertTo-Json -Depth 3 + + # Encode JSON payload in UTF-8 + $utf8JsonPayload = [System.Text.Encoding]::UTF8.GetBytes($jsonPayload) + + # Send the JSON payload to the API + try { + $response = Invoke-RestMethod -Uri $apiUrl -Method Post -Body $utf8JsonPayload -ContentType 'application/json' -Headers $headers + Write-Output "Sent login data for user $($userLoginObject.username) to the API. Response: $response" + } catch { + Write-Error "Failed to send login data for user $($userLoginObject.username). Error: $_" + } +} + +Write-Output "Finished sending login data to the API" diff --git a/controller/ad-controller.py b/controller/ad-controller.py index 141def6..e69de29 100644 --- a/controller/ad-controller.py +++ b/controller/ad-controller.py @@ -1,9 +0,0 @@ -## Abfrage des Eregniss für Userlogin (lastacces) - -## Abfrage Gruppen (groups) - -## Abfrage Festplatten Belegung (space_used) - -## Abfrage Profile Ordner Belegung (services_space_used) -> übergabe item & spaceused - -## Abfrage Updates (updates = yes/no) diff --git a/controller/mailcow.py b/controller/imap.py similarity index 100% rename from controller/mailcow.py rename to controller/imap.py diff --git a/controller/nextcloud.py b/controller/nextcloud.py new file mode 100644 index 0000000..e69de29 diff --git a/controller/office_365.py b/controller/office_365.py deleted file mode 100644 index f23dd01..0000000 --- a/controller/office_365.py +++ /dev/null @@ -1,117 +0,0 @@ -import msal -import requests -import pandas as pd -from datetime import datetime - -# Konfigurationsvariablen -client_id = '90571c9b-d407-4d2a-aadd-4a523ff85296' -client_secret = 'ryp8Q~qr6LBOUL2G333a.mf-vg5V..ONl7qJTdza' -tenant_id = '9e449aaa-285c-4572-a132-58db027026d0' -api_server_endpoint = "http://api.stines.de:8001/office/post" -# headers = 'access_token':'^YWUbG7yX*V!tV^KBSd*2c&vdN3wV9a2i7f3hfGFMBYFxi6#mMiJGiaA5KEHE%B*miK%qb7rQ67gmcYP@gqmux8' - -# Die URL für das Token -authority = f'https://login.microsoftonline.com/{tenant_id}' - -# Der Scope für die Microsoft Graph API -scope = ['https://graph.microsoft.com/.default'] - -# MSAL-Instanz erstellen -app = msal.ConfidentialClientApplication( - client_id, - authority=authority, - client_credential=client_secret, -) - -# Token erhalten -result = None -result = app.acquire_token_silent(scope, account=None) - -if not result: - print("Kein Caching vorhanden, holen Sie ein neues Token.") - result = app.acquire_token_for_client(scopes=scope) - print(result) - -if "access_token" in result: - # Token erfolgreich erhalten - access_token = result['access_token'] - - print(access_token) - - # API-Endpunkt für aktive Office-Pakete - endpoint = "https://graph.microsoft.com/v1.0/users?$select=userPrincipalName,assignedLicenses,signInActivity" - - - headers = { - 'Authorization': f'Bearer {access_token}', - 'Content-Type': 'application/json' - } - - response = requests.get(endpoint, headers=headers) - - if response.status_code == 200: - # Die Antwort als JSON behandeln - data = response.json() - - # Extrahieren der Benutzerdaten aus dem JSON - users = data.get('value', []) - - # Die `skuId` und `lastNonInteractiveSignInDateTime` extrahieren und hinzufügen - user_list = [] - for user in users: - if 'assignedLicenses' in user: - for license in user['assignedLicenses']: - if 'skuId' in license: - user_copy = user.copy() - user_copy['skuId'] = license['skuId'] - if user_copy.get('signInActivity'): - sign_in_time = user_copy['signInActivity'].get('lastNonInteractiveSignInDateTime') - if sign_in_time: - user_copy['lastNonInteractiveSignInDateTime'] = datetime.strptime(sign_in_time,'%Y-%m-%dT%H:%M:%SZ').strftime('%Y-%m-%d %H:%M:%S') - else: - user_copy['lastNonInteractiveSignInDateTime'] = None - else: - user_copy['lastNonInteractiveSignInDateTime'] = None - user_list.append(user_copy) - - # Filtern der Benutzer, die eine `skuId` haben - users_with_skuId = [user for user in user_list if user['skuId']] - - # Konvertieren der Benutzerdaten in ein DataFrame - df = pd.DataFrame(users_with_skuId) - - # Pandas Anzeigeoptionen anpassen - pd.set_option('display.max_columns', None) - pd.set_option('display.max_rows', None) - pd.set_option('display.max_colwidth', None) - pd.set_option('display.width', 1000) - - # Alles nach dem @ im "User Principal Name" entfernen - if 'userPrincipalName' in df.columns: - df['userPrincipalName'] = df['userPrincipalName'].str.split('@').str[0] - - # Nur die gewünschten Spalten auswählen und an die API-Server übergeben - selected_columns = df[["userPrincipalName", "skuId", "lastNonInteractiveSignInDateTime"]] - reporting_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S') - - for index, row in selected_columns.iterrows(): - payload = { - "itemkey": row["skuId"], - "username": row["userPrincipalName"], - "reportingdate": reporting_date, - "lastaccess": row["lastNonInteractiveSignInDateTime"] - } - api_response = requests.post(api_server_endpoint, json=payload, headers= {'access_token':'^YWUbG7yX*V!tV^KBSd*2c&vdN3wV9a2i7f3hfGFMBYFxi6#mMiJGiaA5KEHE%B*miK%qb7rQ67gmcYP@gqmux8'}) - if api_response.status_code == 200: - print(f"Erfolgreich gesendet: {payload}") - else: - print(f"Fehler beim Senden von {payload}: {api_response.status_code} - {api_response.text}") - - else: - print(f"Fehler beim Abrufen der Daten: {response.status_code}") - print(f"Antwort: {response.text}") -else: - print("Fehler beim Abrufen des Tokens") - print(result.get("error")) - print(result.get("error_description")) - print(result.get("correlation_id")) \ No newline at end of file diff --git a/services/linux/agents.services b/services/linux/agents.services new file mode 100644 index 0000000..e69de29 diff --git a/services/linux/service.py b/services/linux/service.py new file mode 100644 index 0000000..fc7da30 --- /dev/null +++ b/services/linux/service.py @@ -0,0 +1,10 @@ +import os +import sys +import requests + +current_version = [] +new_version = [] + +# Get Current Version of Files -> Verionfile txt on /opt/agents/version.txt + +# Check Verison on Github by Curl https://gitlab.stines.de \ No newline at end of file diff --git a/version b/version new file mode 100644 index 0000000..9f8e9b6 --- /dev/null +++ b/version @@ -0,0 +1 @@ +1.0 \ No newline at end of file