Saturday, July 27, 2019

Fragile VS. Brittle

Fragile VS. Brittle


In technology what is the difference?


I asked Chat GPT this.

What is the difference between a brittle and fragile system?

A brittle system is one that is likely to fail suddenly and completely when subjected to unexpected stress or changes. This type of system is characterized by a lack of resilience and a lack of ability to adapt to new circumstances.

A fragile system, on the other hand, is one that is vulnerable to damage or failure, but is not necessarily brittle. A fragile system may be able to withstand some level of stress or change before breaking down, and may be able to recover from failure or damage to some extent.

In general, brittle systems are considered to be more dangerous than fragile systems, as they are more likely to fail without warning and without any opportunity to take corrective action. Fragile systems, while still vulnerable, may be more resilient and able to adapt to changing conditions.



Tuesday, July 9, 2019

Dashboard with Powershell

Building a Dashboard

Goal
Show Status of production assets grouped in kits.


Using our asset management system's data and PowerShell

Asset Management System
https://www.ezofficeinventory.com/developers
Universal Dashboard for PowerShell
https://docs.universaldashboard.io/

Setup
Update PowerShell
Find-Module -Name PowerShellGet | Install-Module
Install UniversalDashboard.Community Version 2.3.2
Install-Module UniversalDashboard.Community -MaximumVersion 2.3.2

Folder Structure
C:\Support\scripts\dashboard
          - data   # XML data stored here
          - pages # Dashboard pages
          - modules # modules that pull and format data


TLS Error - Older versions of Windows may need TLS1.2 enabled.
[System.Net.ServicePointManager]::SecurityProtocol = `
[System.Net.SecurityProtocolType]::Tls12;


Get Assets  - get-ezoffice-assets.ps1

$token="mykeyguid"
$baseuri="https://mydomain.ezofficeinventory.com"
$method="/assets.api"
$senduri=$baseuri+$method

$pages=0

$assets=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
$pages=$assets.total_pages
$allassets=@()
$curpage=1
While($curpage -le $pages){
# $curpage
$senduri=$baseuri+$method+"?page="+$curpage
$assets=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
$curpage++
$allassets = $allassets + $assets.assets
}

#$allassets.count
$allassets |Export-Clixml -Path C:\support\scripts\dashboard\data\assets.xml

Get Group Data - get-ezoffice-groups.ps1

$token="mykeyguid"
$baseuri="https://mydomain.ezofficeinventory.com"
$method="/assets/classification_view.api"
$senduri=$baseuri+$method

$pages=0
$groups =@{}
$groups=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri


$pages=$groups.total_pages
#$pages
$allgroups=@()
$curpage=1
While($curpage -le $pages){

$senduri=$baseuri+$method+"?page="+$curpage
$groups=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
$curpage++
$allgroups = $allgroups + $groups.groups.group

}

$allgroups |Export-Clixml -Path C:\support\scripts\dashboard\data\groups.xml



Build display data with data from EZoffice Inventory - get-ezoffice-bundles.ps1

$token="mykeyguid"
$baseuri="https://mydomain.ezofficeinventory.com"
$method="/bundles.api"
$senduri=$baseuri+$method
###############################
### Get All bundles from EzOfficeInventory
###############################
$pages=0
$bundles =@{}
$bundles=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
$pages=$bundles.total_pages
$allbundles=@()
$curpage=1
While($curpage -le $pages){
$senduri=$baseuri+$method+"?page="+$curpage
$bundles=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
$curpage++
$allbundles = $allbundles + $bundles.bundles
}
####### Save Bundles to XML file
$allbundles|Export-Clixml -Path C:\support\scripts\dashboard\data\bundles.xml


###############################
### Load Group and Asset data
###############################
$assetDataPath = "C:\support\scripts\dashboard\data\assets.xml"
$groupsDataPath = "C:\support\scripts\dashboard\data\groups.xml"
$locationsDataPath = "C:\support\scripts\dashboard\data\locations.xml"
#
$assets = @{}
$groups = @{}
$locations = @{}
$ghash=@{} #groups hash table
#
$assets = import-Clixml -Path $assetDataPath
$groups = import-Clixml -Path $groupsDataPath
$groups|Where-Object{$ghash.add($_.id,$_.name)} # Convert goups to hash table
$locations = import-Clixml -Path $locationsDataPath

###############################


###############################
# Build Bundle Items XML
###############################

$bundleData = @{}
[System.Collections.ArrayList]$bundleItems = @{}
$allbundles|ForEach-Object{
$method="/bundles/" + $_.id + ".api"
$senduri=$baseuri+$method
$bundleData=Invoke-RestMethod -H @{"token" = $token} -Method GET -URI $senduri
#$KitAssets = @{}
$bundleData.bundle.line_item_labels.GetEnumerator()|ForEach-Object {
$TassetID=$_.Replace("Asset #","").split(' ')[0]
$ta=@{}
$ta = $assets | Where-Object {$_.sequence_num -eq $TassetID}

$KitAsset = [pscustomobject]@{
Name = $ta| Select-Object -ExpandProperty name
Identifier = $ta| Select-Object -ExpandProperty identifier
State = $ta| Select-Object -ExpandProperty state
User = $ta| Select-Object -ExpandProperty assigned_to_user_name
AssetID = $TassetID
Description = $ta| Select-Object -ExpandProperty description
}

$Items = [pscustomobject]@{
bundleID = $bundleData.bundle.id
assetID = $_.Replace("Asset #","").split(' ')[0]
Asset = $KitAsset#$a1 +"/"+ $a3 +"/"+ $a2
}
$bundleItems.add($Items)|Out-Null
}

}
$bundleItems|Export-Clixml -Path C:\support\scripts\dashboard\data\bundleItems.xml


###############################
# Build Kits Display Data XML
###############################
$KitsDisplay = Foreach ($row in $allbundles)
{
[pscustomobject]@{
KitName = $row.name
State = $locations | Where-Object {$_.id -eq $row.location_id} |Select-Object -ExpandProperty state
Assets = $bundleItems| Where-Object {$_.bundleID -eq $row.id} | Select-Object -ExpandProperty Asset
}
}
$KitsDisplay |Export-Clixml -Path C:\support\scripts\dashboard\data\KitsDisplay.xml


Kits Dashboard page - kits.ps1

#
#
# Kits Page
#
New-UDPage -AutoRefresh -RefreshInterval 60 -Name 'Kits' -Icon cloud -Content {

###############################
### Load Group and Asset data
###############################
$KitsData = "C:\support\scripts\dashboard\data\KitsDisplay.xml"
$Global:kitdata =$null
$Global:kitname =$null
#
$kits= @{}

$kits = import-Clixml -Path $KitsData


###############################

$myBGColor=@{
available = "white" 
maintenance = "orange"
}

$TblStyle = "
<style>
TABLE{border-width: 2px;border-style: solid;border-color: black;border-collapse: collapse;}
TH{border-width: 1px;padding: 3px;border-style: solid;border-color: black;background-color:#778899}
TD{border-width: 1px;padding: 3px;border-style: solid;border-color: black;}

</style>
"


New-UDRow {

    New-UDColumn {
New-UDCard -Content {"Nevada"} -BackgroundColor blue -FontColor white

$kits |Where-Object {$_.State -eq 'NV'} |ForEach-Object {
$Tbl=$TblStyle
#tr:nth-child(odd) { background-color:#d3d3d3;}
#tr:nth-child(even) { background-color:white;}
$Tbl=$Tbl+"<table> <tr><th>"+ $_.KitName + "</th></tr>"
$_.Assets|ForEach-Object {
$Thref = "https://mydomain.ezofficeinventory.com/assets/"+$_.AssetID
$Ttitle = $_.Description # Displayed in with mouseover hover
$Tbl=$Tbl+ '<tr bgcolor="'+$myBGColor[$_.State]+'"><td> <a href="'+$Thref+'" title="'+$Ttitle+'" target="_blank">' + $_.Name + '</td></tr>'
}
$Tbl=$Tbl+ "</table>"

New-UDHtml -Markup $Tbl
}

} ### - End UDColumn
New-UDColumn {
         New-UDCard -Content {"Arizona"} -BackgroundColor blue -FontColor white
    
$kits |Where-Object {$_.State -eq 'AZ'} |ForEach-Object {
$Tbl=$TblStyle
#tr:nth-child(odd) { background-color:#d3d3d3;}
#tr:nth-child(even) { background-color:white;}
$Tbl=$Tbl+"<table> <tr><th>"+ $_.KitName + "</th></tr>"
$_.Assets|ForEach-Object {
$Thref = "https://mydomain.ezofficeinventory.com/assets/"+$_.AssetID
$Ttitle = $_.Description
$Tbl=$Tbl+ '<tr bgcolor="'+$myBGColor[$_.State]+'"><td> <a href="'+$Thref+'" title="'+$Ttitle+'" target="_blank">' + $_.Name + '</td></tr>' }
$Tbl=$Tbl+ "</table>"

New-UDHtml -Markup $Tbl
}


}### - End UDColumn
    New-UDColumn {
         New-UDCard -Content {"Washington"} -BackgroundColor blue -FontColor white
    
$kits |Where-Object {$_.State -eq 'WA'} |ForEach-Object {
$Tbl=$TblStyle
#tr:nth-child(odd) { background-color:#d3d3d3;}
#tr:nth-child(even) { background-color:white;}
$Tbl=$Tbl+"<table> <tr><th>"+ $_.KitName + "</th></tr>"
$_.Assets|ForEach-Object {
$Thref = "https://mydomain.ezofficeinventory.com/assets/"+$_.AssetID
$Ttitle = $_.Description
$Tbl=$Tbl+ '<tr bgcolor="'+$myBGColor[$_.State]+'"><td> <a href="'+$Thref+'" title="'+$Ttitle+'" target="_blank">' + $_.Name + '</td></tr>' }
$Tbl=$Tbl+ "</table>"

New-UDHtml -Markup $Tbl
}


} ### - End UDColumn
New-UDColumn {
         New-UDCard -Content {"Utah"} -BackgroundColor blue -FontColor white
    
$kits |Where-Object {$_.State -eq 'UT'} |ForEach-Object {
$Tbl=$TblStyle
#tr:nth-child(odd) { background-color:#d3d3d3;}
#tr:nth-child(even) { background-color:white;}
$Tbl=$Tbl+"<table> <tr><th>"+ $_.KitName + "</th></tr>"
$_.Assets|ForEach-Object {
$Thref = "https://mydomain.ezofficeinventory.com/assets/"+$_.AssetID
$Ttitle = $_.Description
$Tbl=$Tbl+ '<tr bgcolor="'+$myBGColor[$_.State]+'"><td> <a href="'+$Thref+'" title="'+$Ttitle+'" target="_blank">' + $_.Name + '</td></tr>' }
$Tbl=$Tbl+ "</table>"

New-UDHtml -Markup $Tbl
}


} ### - End UDColumn
########## - End UDRow
}

}