REBOL [ Title: "Report deployed monitors from the computer info files" Purpose: {Use a folder of files from the GatherComputerInfo program and list the monitors therein, and the computers that have them. This could be quick-and-dirty way to track a site's monitor inventory.} ] ;; [---------------------------------------------------------------------------] ;; [ This program was suggested as a way to keep track of monitors that we ] ;; [ purchase and then deploy without always following official inventory ] ;; [ procedures. It uses text files created at startup time by computers. ] ;; [ Each text file contains information that the computer gathered about ] ;; [ itself, including the serial numbers of its monitors. Those files ] ;; [ were written into a common folder, and then all files in that folder ] ;; [ were processed by this program which extracted the monitor information. ] ;; [ The file is text in a REBOL-readable format, and the relevant items ] ;; [ look like this: ] ;; [ COMPUTERNAME: "IS-SWHITE7" ] ;; [ MODEL: "HP EliteDesk 800 G1 SFF" ] ;; [ SERIALNO: "2UA52831RN" ] ;; [ MONITORS: ["CN422004BF " "HWP " 2012 ] ] ;; [ ] ;; [ The program to create these files is on the COBOLREBOL free stuff area ] ;; [ and is called GatherComputerInfo.ps1. ] ;; [---------------------------------------------------------------------------] ;; [---------------------------------------------------------------------------] ;; [ Change these items for your own installation. ] ;; [---------------------------------------------------------------------------] MR-FILENAME: %DeployedMonitors.html ;; output report in html format LOGDIR: %ComputerList ;; folder of computer info files ;; [---------------------------------------------------------------------------] ;; [ In our html report, we want to mark any monitors on our "watch list" ] ;; [ of monitors that were lost because they were deployed without the ] ;; [ official inventory procedure. These are hard-coded serial numbers. ] ;; [---------------------------------------------------------------------------] WATCHLIST: [ "CN45040L60" "CN45040L5X" "CN45040LG7" "2UA52831RM" "2UA52831RY" "2UA5101VR2" "2UA5101VR4" ] WATCHLIST-ALERT-COLOR: "#FFE1E1" WATCHLIST-OK-COLOR: "#FFFFFF" WATCHLIST-SEARCH: "" ;; [---------------------------------------------------------------------------] ;; [ In a report file, there are several REBOL-readable data items. ] ;; [ The ones below are the ones we will report on. ] ;; [---------------------------------------------------------------------------] LOGINDATE: "" COMPUTERNAME: "" MODEL: "" SERIALNO: "" MONITORS: [] MONITOR-SERIALNO: "" MONITOR-MANUFACTURER: "" MONITOR-YEAR: "" MONITOR-LIST: "" CURRENT-FILE: "" REPORT-COLOR: "" ;; [---------------------------------------------------------------------------] ;; [ In our first attempt (and this might still be true), powershell put ] ;; [ nulls in the list of monitors. So we will read the file as binary, ] ;; [ replace nulls with empty strings or spaces (whatever works), and then ] ;; [ load that instead of loading the file directly. ] ;; [---------------------------------------------------------------------------] PHONEHOME-BINARY: "" ;; [---------------------------------------------------------------------------] ;; [ These are the html fragments we will use to produce a report. ] ;; [---------------------------------------------------------------------------] MR-PAGE: "" MR-HTML-HEAD: { Deployed Monitor Report

Deployed Monitor report

} MR-HTML-FOOT: {
Computer name Model Serial Number Monitor Serial, manufacturer, year Reported on
} MR-HTML-ROW: { <% COMPUTERNAME %> <% MODEL %> <% SERIALNO %> <% MONITOR-LIST %> <% LOGINDATE %> } MR-HTML-CORRUPT: { <% COMPUTERNAME %> <% rejoin ["Corrupt file " CURRENT-FILE] %> } change-dir LOGDIR FILE-LIST: read %. append MR-PAGE MR-HTML-HEAD append MR-PAGE newline foreach FILENAME FILE-LIST [ if not dir? FILENAME [ print ["Checking " FILENAME] CURRENT-FILE: copy "" CURRENT-FILE: copy to-string FILENAME LOGINDATA: copy "" COMPUTERNAME: copy "" MODEL: copy "" SERIALNO: copy "" MONITORS: copy [] MONITOR-LIST: copy "" PHONEHOME-BINARY: copy "" REPORT-COLOR: copy WATCHLIST-OK-COLOR PHONEHOME-BINARY: to-string read/binary FILENAME replace/all PHONEHOME-BINARY #{00} "" either error? try [do load PHONEHOME-BINARY] [ append MR-PAGE build-markup MR-HTML-CORRUPT ] [ foreach [MONSERIAL MONMAKER MONYEAR] MONITORS [ append MONITOR-LIST rejoin [ trim to-string MONSERIAL ", " trim to-string MONMAKER ", " trim to-string MONYEAR "
" ] WATCHLIST-SEARCH: copy trim to-string MONSERIAL if find WATCHLIST WATCHLIST-SEARCH [ REPORT-COLOR: copy WATCHLIST-ALERT-COLOR ] ] append MR-PAGE build-markup MR-HTML-ROW ] append MR-PAGE newline ] ] append MR-PAGE MR-HTML-FOOT append MR-PAGE newline write MR-FILENAME MR-PAGE browse MR-FILENAME ;halt