Skip to content

Instantly share code, notes, and snippets.

@darrenjrobinson
Last active November 17, 2018 22:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darrenjrobinson/82c3b72bb32d69c2b087856f9bb9050c to your computer and use it in GitHub Desktop.
Save darrenjrobinson/82c3b72bb32d69c2b087856f9bb9050c to your computer and use it in GitHub Desktop.
xMatters PowerShell FIM/MIM Management Agent - Import Script. Supporting blog post is located here https://blog.darrenjrobinson.com/building-a-fimmim-management-agent-for-xmatters/
PARAM
(
$Username,
$Password,
$Credentials,
$OperationType,
[bool] $usepagedimport,
$pagesize
)
# xMatters Basic AuthN
$site_auth = "$($Username):$($Password)"
$site_Bytes = [System.Text.Encoding]::utf8.GetBytes($site_auth)
$Site_EncodedAuth=[Convert]::ToBase64String($site_Bytes)
# xMatters is using TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$DebugFilePath = "C:\PROGRA~1\MICROS~4\2010\SYNCHR~1\EXTENS~2\xMatters\Debug\xMattersImport.txt"
if(!(Test-Path $DebugFilePath))
{$DebugFile = New-Item -Path $DebugFilePath -ItemType File}
else
{$DebugFile = Get-Item -Path $DebugFilePath}
"Starting Import : " + (Get-Date) | Out-File $DebugFile -Append
# API Timeout (seconds)
[int]$Global:apiTimeout = 15
# URI Variables
$xMattersBaseURI = 'https://customer.hosted.xmatters.com'
$xMattersGetUsersURI = '/api/xm/1/people'
$xMattersGetSitesURI = '/reapi/2015-04-01/sites'
# Create and Modify
$xMattersCreateUsersURI = '/api/xm/1/people'
function GetDevices ($n) {
$Global:return = $null
try{
$Global:return = Invoke-RestMethod -Uri ($xMattersBaseURI + $xMattersCreateUsersURI +"/$($n)/devices") -Headers @{Authorization = "Basic $($Site_EncodedAuth)"} -method GET -ContentType 'application/json;charset=UTF-8' -TimeoutSec $Global:apiTimeout -ErrorAction SilentlyContinue
if ($Global:return){"$($Global:return.count) devices Exist for $($n)" | Out-File $DebugFile -Append}
} catch {
$Global:return = $null
switch ($_.Exception.Response.StatusCode.value__){
"400" {"Devices Check: 400 Bad Request" | Out-File $DebugFile -Append}
"404" {"Devices Check: 404 Not Found" | Out-File $DebugFile -Append}
Default {"Devices Check Failed: $($_.Exception.Response.StatusDescription)" | Out-File $DebugFile -Append}
}
}
}
# GET USERS
$xUsers = @()
[int]$offset = 1000
$xResult = Invoke-RestMethod -Uri ($xMattersBaseURI + $xMattersGetUsersURI +'?limit=1000') -Headers @{Authorization = "Basic $Site_EncodedAuth"} -Method Get -ContentType 'application/json' -TimeoutSec 60 -ErrorAction:Stop
$xUsers += $xResult.data
do {
# next page
$more = Invoke-RestMethod -Uri ($xMattersBaseURI + $xMattersGetUsersURI +"?offset=$($offset)&limit=1000") -Headers @{Authorization = "Basic $Site_EncodedAuth"} -Method Get -ContentType 'application/json' -TimeoutSec 60 -ErrorAction:Stop
$xUsers += $more.data
[int]$offset += 1000
}while ($more.links.next)
# GET SITES
$xSites = @()
# try{
$xResult = Invoke-RestMethod -Uri ($xMattersBaseURI + $xMattersGetSitesURI) -Headers @{Authorization = "Basic $Site_EncodedAuth"} -Method Get -ContentType 'application/json' -TimeoutSec 60 -ErrorAction:Stop
$xSites += $xResult.sites
$xSitesNext = $xResult.nextRecordsURL
do {
# next page
$more = Invoke-RestMethod -Uri ($xMattersBaseURI + $xSitesNext) -Headers @{Authorization = "Basic $Site_EncodedAuth"} -Method Get -ContentType 'application/json' -TimeoutSec 60 -ErrorAction:Stop
$xSites += $more.sites
$xSitesNext = $more.nextRecordsURL
}while ($more.nextRecordsURL)
# Parse USERS
ForEach($user in $xUsers)
{
$obj = @{}
$obj.Add("id",$user.id)
$obj.Add("objectClass", "user")
$obj.Add("targetName", $user.targetName)
$obj.Add("recipientType", $user.recipientType)
$obj.Add("externallyOwned", $user.externallyOwned)
$obj.Add("firstName", $user.firstName)
$obj.Add("lastName", $user.lastName)
$obj.Add("language", $user.language)
$obj.Add("timezone", $user.timezone)
$obj.Add("webLogin", $user.webLogin)
$obj.Add("siteID", $user.site.id)
$obj.Add("siteName", $user.site.name)
$obj.Add("manuallyManaged", $user.properties.'Manually Managed')
$obj.Add("status", $user.status)
# Get Users Devices
GetDevices $user.targetName
if ($return){$blnDevice = $true; $xDevices = $return}else{$blnDevice = $false}
if ($blnDevice){
foreach ($device in $xDevices.data){
switch ($device.name){
"Work Email" {
$obj.Add("email", $device.emailAddress)
$obj.Add("emailID", $device.id)
}
"SMS Phone" {
$obj.Add("workMobile", $device.phoneNumber)
$obj.Add("workMobileID", $device.id)
}
}
}
$obj
} else {
$obj
}
}
# Parse SITES
ForEach($site in $xSites) {
$obj2 = @{}
$obj2.Add("id",$site.identifier)
$obj2.Add("objectClass", "site")
$obj2.Add("name", $site.name)
$obj2.Add("status", $site.status)
$obj2.Add("language", $site.language)
$obj2.Add("timezone", $site.timezone)
$obj2.Add("cluster", $site.cluster)
$obj2.Add("address1", $site.address1)
$obj2.Add("address2", $site.address2)
$obj2.Add("city", $site.city)
$obj2.Add("state", $site.state)
$obj2.Add("country", $site.country)
$obj2.Add("postalCode", $site.postalCode)
$obj2.Add("latitude", $site.latitude)
$obj2.Add("longitude", $site.longitude)
$obj2
}
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment