From 8de1cd480c598565b438cb478b31d5d7e44bedd9 Mon Sep 17 00:00:00 2001 From: Todd McDaniel Date: Fri, 24 Nov 2017 12:20:47 -0700 Subject: [PATCH] Initial release. Initial release of SCL JAMF EA Collection. --- README.md | 155 ++++++++++++++++++++++++++++++ attached_displays.py | 123 ++++++++++++++++++++++++ bluetooth_device_battery_level.py | 79 +++++++++++++++ disk_free_space_reporter.py | 78 +++++++++++++++ estimated_age.py | 100 +++++++++++++++++++ estimated_date_of_manufacture.py | 81 ++++++++++++++++ external_encrypted_disks.py | 56 +++++++++++ imgs/bluetooth.png | Bin 0 -> 17614 bytes imgs/diskspace.png | Bin 0 -> 17920 bytes imgs/estimatedage.png | Bin 0 -> 7840 bytes imgs/manufacturedate.png | Bin 0 -> 11425 bytes imgs/timemachine.png | Bin 0 -> 13071 bytes smartmon_check.py | 78 +++++++++++++++ time_machine_status.py | 100 +++++++++++++++++++ 14 files changed, 850 insertions(+) create mode 100755 README.md create mode 100755 attached_displays.py create mode 100755 bluetooth_device_battery_level.py create mode 100755 disk_free_space_reporter.py create mode 100755 estimated_age.py create mode 100755 estimated_date_of_manufacture.py create mode 100755 external_encrypted_disks.py create mode 100644 imgs/bluetooth.png create mode 100644 imgs/diskspace.png create mode 100644 imgs/estimatedage.png create mode 100644 imgs/manufacturedate.png create mode 100644 imgs/timemachine.png create mode 100755 smartmon_check.py create mode 100755 time_machine_status.py diff --git a/README.md b/README.md new file mode 100755 index 0000000..9efa25e --- /dev/null +++ b/README.md @@ -0,0 +1,155 @@ +# SCL JAMF Pro Extension Attribute collection + +This repository contains a collection of scripts written to perform as extension attributes for the JAMF Pro of management tool. They have been written to suit our specific environment and may need to be modified to operate correctly in others. + +## Contents + +* [Download](#download) - get the .dmg +* [Contact](#contact) +* [System Requirements](#system-requirements) +* [Install](#install) +* [Uninstall](#uninstall) +* [Purpose](#purpose) +* [The Scripts](#scripts) + * [Bluetooth device battery level](#bluetooth-device-battery-level) + * [Disk free space reporter](#disk-free-space-reporter) + * [Estimated date of manufacture](#estimated-date-of-manufacture) + * [Estimated Age](#estimated-age) + * [SMARTmon check](#smartmon-check) + * [Time Machine Status](#time-machine-status) + * [Attached Displays](#attached-displays) + * [External Encrypted Disks](#external-encrypted-disks) +* [Notes](#notes) +* [Update History](#update-history) + +## Download + +[Download the latest installer here!](../../releases/) + +## Contact + +If you have any comments, questions, or other input, either [file an issue](../../issues) or [send us an email](mailto:mlib-its-mac-github@lists.utah.edu). Thanks! + +## System Requirements +These scripts are designed to be as extension attributes within Casper's JAMF Software Server (JSS). Most of them are written in Python. + +* Python 2.7 (included in MacOS) + +## Install + +These scripts are designed to be copy-and-pasted into a script field in a JSS extension attribute field. + +## Uninstall + +Delete the extension attribute. + +## Purpose + +These scripts are meant to expand the capabilities of JAMF Pro utilizing the Extension Attribute mechanism. JAMF's EA documentation can be found [here](http://docs.jamf.com/10.0.0/jamf-pro/administrator-guide/Computer_Extension_Attributes.html). Using the information returned by an EA, you can build [smart groups](http://docs.jamf.com/10.0.0/jamf-pro/administrator-guide/Smart_Computer_Groups.html). Being a member of a specific smart group can cause additional actions to take place. For example, if the Bluetooth battery level is low, an email could be sent to the user remining them to change the batteries. + +Please feel free to use the code provided to build your own scripts. + +## The scripts + +### Bluetooth device battery level + +Detects keyboards, mice and trackpads. Reports if the battery for a device is less than 30%. + +![Bluetooth battery display](imgs/bluetooth.png) + + + +### Disk free space reporter + +Returns the name, free space, total space and percentage of drive used for each disk attached to a machine. + +![](imgs/diskspace.png) + + + +### Estimated date of manufacture + +Parses a machines serial number to estimate date of manufacture. Borrows heavily from [this script](https://github.com/pudquick/pyMacWarranty/blob/master/getwarranty.py). + +![](imgs/manufacturedate.png) + + + +### Estimated Age + +Similar to the Estimated date of manufacture script, but returns a simpler value. Also borrows heavily from [this script](https://github.com/pudquick/pyMacWarranty/blob/master/getwarranty.py). + +![](imgs/estimatedage.png) + + + +### SMARTmon check + +This EA was written to check all of the disks attached to the local machine. It returns a string containing a single character for each disk. The following table describes the characters and their meanings: + +| Symbol | Meaning | +| ------- | ---------------------------------------- | +| . | No errors detected on that disk. | +| Numeral | An error was detected on that disk. | +| ? | SMARTmon suffered an error while checking that disk. | + +Example reports: + +| Sample reports | | +| -------------- | ---------------------------------------- | +| . | A single disk was checked and no errors were detected. | +| 0... | Four disks were checked and disk0 is returning SMART errors. | +| ..? | Three disks were available and disk2 had a SMARTmon error. | + +Note: This EA requires that [SMARTmon tools](https://www.smartmontools.org/) is installed on each client. + + + +### Time Machine Status + +This EA checks if Time Machine itself is configured, whether a Time Machine volume is available, and the current capacity of the Time Machine volume. + +| Possible returns | Meaning | +| -------------------------------- | ---------------------------------------- | +| Good 10/31 Good 24% free of 713G | Time Machine is configured and working as of 10/31 and the drive has 24% of 713 GB available. | +| Last Backup: 11/02 Not SCL drive | Time Machine is configured and working, but the drive being used is not standard. | +| Not configured, no drive | Time Machine is not configured and no standard drive is attached. | +| Not configured, drive available | Time Machine is not configured and there is a standard drive attached. | + +![](imgs/timemachine.png) + + + +###Attached Displays + +This EA returns the number and information about the displays attached to a machine. + +Here is the data returned for each display: +* Model/Name +* Primary (if set) +* Built-in (if built into machine) +* Retina (if capable) +* Current resolution, refresh rate and maximum resolution + +| Possible returns | Meaning | +| ---------------------------------------- | ---------------------------------------- | +| 3: iMac, Primary, Built-in, Retina, 2048 x 1152 (4096 x 2304); VS248, 1920 x 1080 @ 60 Hz (1920 x 1080); ASUS VS247, 1920 x 1080 @ 60 Hz (1920 x 1080) | 3 displays attached: iMac built-in, VS248 and VS247. | +| 2: iMac, Built-in, Retina, 2560 x 1440 (5120 x 2880); ASUS VH236H, Primary, 1920 x 1080 @ 60 Hz (1920 x 1080) | 2 displays attached: iMac built-in, VH236H primary display. | +| 1: SHARP HDMI, Primary, 1920 x 1080 @ 60 Hz (1920 x 1080) | Single Sharp display. | + + +###External Encrypted Disks + +This EA was written to [assist another JAMF user](https://www.jamf.com/jamf-nation/discussions/25854/inventory-report-external-hard-drive). It returns the number of attached hard drives, and the number of encrypted drives. + + + +## Notes + + + +## Update History + +| Date | Version | Notes | +| ---------- | ------- | ---------------- | +| 2017.11.24 | 1.0.0 | Initial release. | diff --git a/attached_displays.py b/attached_displays.py new file mode 100755 index 0000000..4ff8c23 --- /dev/null +++ b/attached_displays.py @@ -0,0 +1,123 @@ +#!/usr/bin/python +""" +This should not be blank. +""" + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# attached_displays.py ######################################################### +# +# A Python script/Jamf Pro Extension Attribute to inventory and report on +# attached displays. +# +# 1.0.0 2017.09.08 Initial release. tjm +# +################################################################################ + +# Notes ######################################################################## +# +# The output is set up to split three times. Once on ':' will give you the count +# of displays and the description string. And then splitting the description +# string on ':' will give you individual displays. Finally on ',' will give +# features. You can also split the resolution if you need to, for height, +# width, etc. +# +# 2: iMac, Built-in, Retina, 2560 x 1440 (5120 x 2880); ASUS VH236H, Primary, 1920 x 1080 @ 60 Hz (1920 x 1080) +# ^ ^ +# | 1. split on ':" | +# | 2. split on ';' +# Continue spliting on ',' for indiviual features +# Current resolution is displayed, Maximum resolution available in parentheses +# +################################################################################ + +from __future__ import print_function +import subprocess +import plistlib + + +def main(): + """ + This should not be blank. + """ + + count_displays = 0 + master_string = "" + + raw_displays = subprocess.check_output(["system_profiler", "SPDisplaysDataType", "-xml"]) + plist_displays = plistlib.readPlistFromString(raw_displays) + list_of_displays = plist_displays[0]['_items'] + + for item in list_of_displays: + sublist = item['spdisplays_ndrvs'] + count_displays = str(len(sublist)) + + for subitem in sublist: + feature_list = [] + + try: + name_string = subitem['_name'] + except: + name_string = "" + + # Build list of resolution strings + try: + resolution_string = subitem['_spdisplays_resolution'] + except: + resolution_string = "" + + try: + resolution_string = resolution_string + " (" + subitem['_spdisplays_pixels'] + ")" + except: + resolution_string = resolution_string + "" + + # Build list of individual features + try: + display_type = subitem['spdisplays_display_type'] + except: + display_type = "" + + try: + display_main_raw = subitem['spdisplays_main'] + if 'yes' in display_main_raw: + feature_list.append("Primary") + except: + pass + + if 'built' in display_type: + feature_list.append("Built-in") + + if 'retina' in display_type: + feature_list.append("Retina") + + if 'spdisplays_on' in subitem['spdisplays_mirror']: + feature_list.append("Mirrored") + + if feature_list: + output_string = name_string + ", " + ", ".join(feature_list) + ", " + resolution_string + else: + output_string = name_string + ", " + resolution_string + + if master_string: + master_string = master_string + "; " + output_string + else: + master_string = output_string + + master_string = count_displays + ": " + master_string + print("" + master_string + "") + + +if __name__ == '__main__': + main() diff --git a/bluetooth_device_battery_level.py b/bluetooth_device_battery_level.py new file mode 100755 index 0000000..e349e3a --- /dev/null +++ b/bluetooth_device_battery_level.py @@ -0,0 +1,79 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# bluetooth_device_battery.py ################################################# +# +# A Python script monitor and report Bluetooth device battery levels. +# +# 1.0.0 2016.03.xx Initial release tjm +# +# +# +################################################################################ + +# Notes ######################################################################## +# +# +# +# +# +# +################################################################################ + +from __future__ import print_function +import subprocess +import re + +def main(): + potential_devices = ["AppleBluetoothHIDKeyboard", "BNBTrackpadDevice", "BNBMouseDevice"] + output_string = None + + bluetooth_power_state = subprocess.check_output(["defaults", "read", "/Library/Preferences/com.apple.Bluetooth.plist", "ControllerPowerState"]) + + # exit if bluetooth is off + if "0" in bluetooth_power_state: + quit() + + for device in potential_devices: + raw_output = subprocess.check_output(["/usr/sbin/ioreg", "-r", "-c", device]) + + if raw_output == '': + continue + else: + match = re.search('.*"BatteryPercent" = (.*)\n', raw_output) + + if int(match.group(1)) < 30: + if "AppleBluetoothHIDKeyboard" in device: + device_output = "BlueTooth Keyboard at " + match.group(1) + "%" + elif "BNBTrackpadDevice" in device: + device_output = "BlueTooth Trackpad at " + match.group(1) + "%" + elif "BNBMouseDevice" in device: + device_output = "BlueTooth Mouse at " + match.group(1) + "%" + else: + continue + else: + continue + + if output_string is None: + output_string = device_output + else: + output_string = output_string + " " + device_output + + if output_string is not None: + print("" + output_string + "") + +if __name__ == '__main__': + main() diff --git a/disk_free_space_reporter.py b/disk_free_space_reporter.py new file mode 100755 index 0000000..8b4f3f6 --- /dev/null +++ b/disk_free_space_reporter.py @@ -0,0 +1,78 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# disk_free_space.py ########################################################### +# +# A Python script monitor and report disk free space. +# +# 1.0.0 2016.03.xx Initial release tjm +# +# +# +################################################################################ + +# Notes ######################################################################## +# +# +# +# +# +################################################################################ + +from __future__ import print_function +import subprocess + +def main(): + formatted_drive_list = None + divisor = 1953125 + + raw_disks = subprocess.check_output(["/bin/df", "-lhP"]) + + split_disks = raw_disks.split("\n") + split_disks.pop(0) + split_disks = [x for x in split_disks if x] + + for disk in iter(split_disks): + low_space_condition = False + split_single_disk = disk.split(" ") + split_single_disk = [x for x in split_single_disk if x] + disk_total = int(split_single_disk[1]) / divisor + disk_used = int(split_single_disk[2]) / divisor + disk_percentage = int(split_single_disk[-2].split("%")[0]) + disk_name = split_single_disk[-1].split("/")[-1] + + if disk_name == "": + if disk_total - disk_used < 50: + disk_name = '/' + low_space_condition = True + elif disk_name == "Data": + if disk_total - disk_used < 15: + low_space_condition = True + else: + if disk_percentage > 80: + low_space_condition = True + + if low_space_condition: + if formatted_drive_list == '': + formatted_drive_list = formatted_drive_list + disk_name + ":" + str(disk_used) + "G/" + str(disk_total) + "G (" + str(disk_percentage) + "%)" + else: + formatted_drive_list = formatted_drive_list + " " + disk_name + ":" + str(disk_used) + "G/" + str(disk_total) + "G (" + str(disk_percentage) + "%)" + + + print("" + formatted_drive_list + "") + +if __name__ == '__main__': + main() diff --git a/estimated_age.py b/estimated_age.py new file mode 100755 index 0000000..5f063b8 --- /dev/null +++ b/estimated_age.py @@ -0,0 +1,100 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# estimated_age.py ############################################################# +# +# A Python script to report estimated age of machine. +# +# 1.0.0 2016.11.xx Initial release. tjm +# +# +################################################################################ + +# Notes ######################################################################## +# +# This script uses aggressively borrowed code from: +# +# https://github.com/pudquick/pyMacWarranty/blob/master/getwarranty.py +# +# +################################################################################ + +from __future__ import print_function +import subprocess +import re +import datetime + +def offline_estimated_manufacture(serial): + # http://www.macrumors.com/2010/04/16/apple-tweaks-serial-number-format-with-new-macbook-pro/ + est_date = u'' + if 10 < len(serial) < 13: + if len(serial) == 11: + # Old format + year = serial[2].lower() + est_year = 2000 + ' 3456789012'.index(year) + week = int(serial[3:5]) - 1 + year_time = datetime.date(year=est_year, month=1, day=1) + if week: + week_dif = datetime.timedelta(weeks=week) + year_time += week_dif + est_date = u'' + year_time.strftime('%Y-%m-%d') + else: + # New format + alpha_year = 'cdfghjklmnpqrstvwxyz' + year = serial[3].lower() + est_year = 2010 + (alpha_year.index(year) / 2) + # 1st or 2nd half of the year + est_half = alpha_year.index(year) % 2 + week = serial[4].lower() + alpha_week = ' 123456789cdfghjklmnpqrtvwxy' + est_week = alpha_week.index(week) + (est_half * 26) - 1 + year_time = datetime.date(year=est_year, month=1, day=1) + if est_week: + week_dif = datetime.timedelta(weeks=est_week) + year_time += week_dif + est_date = u'' + year_time.strftime('%Y-%m-%d') + return year_time + +def cvt_days(days): + years, days = divmod(days, 365) + if years == 0: + return "< 1 Year" + elif years == 1: + if days < 180: + return "1 Year" + else: + return "2 Years" + else: + if days < 180: + return "%i Years" % years + else: + return "%i Years" % (years + 1) + +def main(): + serial_raw = subprocess.check_output(['system_profiler', 'SPHardwareDataType']) + serial_raw = re.search('Serial.*: (.*)\n', serial_raw) + serial_number = serial_raw.group(1) + + est_date = offline_estimated_manufacture(serial_number) + today = datetime.date.today() + + diff = today - est_date + diff_days = diff.days + + print("" + cvt_days(diff_days) + "") + +if __name__ == '__main__': + main() diff --git a/estimated_date_of_manufacture.py b/estimated_date_of_manufacture.py new file mode 100755 index 0000000..b2f4b0a --- /dev/null +++ b/estimated_date_of_manufacture.py @@ -0,0 +1,81 @@ +#!/usr/bin/python + +# Copyright (c) 2016 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# estimated_date_of__manufacture.py ############################################ +# +# A Python script to report estimated manufacture date. +# +# 1.0.0 2016.03.xx Initial release tjm +# +# +################################################################################ + +# Notes ######################################################################## +# +# This script uses aggressively borrowed code from: +# +# https://github.com/pudquick/pyMacWarranty/blob/master/getwarranty.py +# +# +################################################################################ + +from __future__ import print_function +import subprocess +import re +import datetime + +def offline_estimated_manufacture(serial): + est_date = u'' + if 10 < len(serial) < 13: + if len(serial) == 11: + # Old format + year = serial[2].lower() + est_year = 2000 + ' 3456789012'.index(year) + week = int(serial[3:5]) - 1 + year_time = datetime.date(year=est_year, month=1, day=1) + if week: + week_dif = datetime.timedelta(weeks=week) + year_time += week_dif + est_date = u'' + year_time.strftime('%Y-%m-%d') + else: + # New format + alpha_year = 'cdfghjklmnpqrstvwxyz' + year = serial[3].lower() + est_year = 2010 + (alpha_year.index(year) / 2) + # 1st or 2nd half of the year + est_half = alpha_year.index(year) % 2 + week = serial[4].lower() + alpha_week = ' 123456789cdfghjklmnpqrtvwxy' + est_week = alpha_week.index(week) + (est_half * 26) - 1 + year_time = datetime.date(year=est_year, month=1, day=1) + if est_week: + week_dif = datetime.timedelta(weeks=est_week) + year_time += week_dif + est_date = u'' + year_time.strftime('%Y-%m-%d') + return est_date + + +def main(): + serial_raw = subprocess.check_output(['system_profiler', 'SPHardwareDataType']) + serial_raw = re.search('Serial.*: (.*)\n', serial_raw) + serial_number = serial_raw.group(1) + + est_date = offline_estimated_manufacture(serial_number) + + print("" + est_date + "") + +if __name__ == '__main__': + main() diff --git a/external_encrypted_disks.py b/external_encrypted_disks.py new file mode 100755 index 0000000..ebe2bdc --- /dev/null +++ b/external_encrypted_disks.py @@ -0,0 +1,56 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# ea_external_encrypted_disks.py ############################################### +# +# A Python script report external disks and encryption status. +# +# 1.0.0 2017.10.24 Initial release. tjm +# +################################################################################ + +# Notes ######################################################################## +# Example output: +# 3 external drives. 1 encrypted. +# +# Offline encrypted (ejected, but still attached) drives will cause odd results. +# Checking for physical and external is probably overkill... +# +################################################################################ + +from __future__ import print_function +import subprocess + +def main(): + raw_disklist = subprocess.check_output(["/usr/sbin/diskutil", "list"]) + raw_disklist = raw_disklist.split("\n") + + external_disks = 0 + encrypted_disks = 0 + + for item in raw_disklist: + if "/dev/disk" in item and "physical" in item and "external" in item: + external_disks += 1 + elif "Encrypted" in item: + encrypted_disks += 1 + + if external_disks >= 2: + print("" + str(external_disks) + " external drives. " + str(encrypted_disks) + " encrypted.") + elif external_disks: + print("External Drive Present. " + str(encrypted_disks) + " encrypted.") + +if __name__ == '__main__': + main() diff --git a/imgs/bluetooth.png b/imgs/bluetooth.png new file mode 100644 index 0000000000000000000000000000000000000000..a0db1c44a89c7a862b6ab2bfa980a2692b689107 GIT binary patch literal 17614 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%0DhhmmHL#9aT+(t_~YTKGaFat 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 IIVCg!0JyX(Q2+n{ literal 0 HcmV?d00001 diff --git a/imgs/estimatedage.png b/imgs/estimatedage.png new file mode 100644 index 0000000000000000000000000000000000000000..b09a7f94a3f7fdf059a359c5f0a8d1e6f621f657 GIT binary patch literal 7840 zcmb_#MKMt~zI*T~$A-DpFNh1_PA@6#xKW$jM5o0{}2auQoq2;_JWhJpKRxKqs=5 zkWiJAkf2g^bGEW|umk{PBU93lK4{1h4(+FWNK}QziGSmR`&IkE5IY`|_x+pqj2!U6 zpF3HYT0Cn_q_m|R>|rd_aMV~>f;*k@)YKLRU$~2k1uN`0k<^ruGAqBy#xTy4nQCRx7?Y%q^HXQ9DhG~9krvF=Ns0i z?B82I1@L%Kh~}aJ-oOcDr%jHB`Jw|1(wI~60Ae;F{zfm#IzxZnO|rY7|Jt&@{KRTftdEC2zdtO{?zpT?+=k-aH8 z97`5iz#1)67>clU9+JiOg+wTwk`?clq!i|!ZsG_Q<#y%c<7P{KI=ZPWzeUT;l)2QG zb2<5J8;yK+4pdG!H+_FkgMO3MPf}lk)Fe3G*j5ksp&roC+D%fhz1RxgvtD*wTvOEJnaP z`}Y7O*+9Tq&`F+kiBw{NG<>dW9`YkfB-X{JRRl)6yFBdsZuE~SD*EyHC9EGBh7nb$ z_qW?xu%KZwy~UI)u`NPSj=9)M!8vA*bRtP~+Hma3a1WRKLoyvYv0GJxp;TajjO(XR>0r&2L4kw2Lo zmmjwui@p?kP2|BwZoeQRJRTriVBqj;f+T40EC_0zwg|sWViLNZNY|2|kQ>0n2W+I| z#x=7Hc#)bK-tYae2lN!e3nFazlHmfBK?s4%H{;e9h)&fhfGmd{`L|*6lxzXm0Q{2P z?0h)%K$MzLb2s>^9<j;H#^!G(m))b62?zp26_h|NOyX`m5UZ=xk>YGqLq z!;!IZXr!#D(Gt`xcFfQmM>iNJ9`bU{qZsaCPU%WB(ZAfnYLIIRft?t*JQKL(^u_HWtRBofv%jV7KzfnS z!@WZ0g;#mcPyL08N|6>1cNDoDWe8<|bNzts3MW#MU^@6W;*Aw5M-+cjOLR*ZBw|U- zfx#2|qa0l#=1BOi(r0>CS%j}I?^Px?v8oo^+q$HAZMIVBLtlDev&^ znC^&Ma|@(73L)wR??9vIqo|{7^5nlzza`D6Xcp_Kc9x#cu^jpyA|8q#3LN?!>f__% zo8x1poHM;o@n$0ZfLU&!>izX1p-8;G2w{eP=4->R2H^(874j8*!E7hxo5JE5wBJ7t zQm*Q+K3!p<)Az;VOl)%OagGwtN0&!ym*Hu0X$H)Xlu4CYmdR*Vmw1+|&5g~&&hy)W z=SJt1OV-qnG_A{oN@U9S%YYgi#r|qft%!1c2DCaM#kI2L#e=#rnDm3(rih%aV_{>4 zW8g7mrGla`s}`$NtI|D~ajkI*Rt#3_O3BIty?raV7PP{X_B)QxtSRvRVkRs3|xM4j= z?Mn4d#ZO(VjL?E=EoDk6CNoZxg9a{mc*3DOj$)KJuvn%#;Fyk;TJkB&p13e zqB)j3P%hUV)0_}2%`bJ5I0_1ST$N3a7k00-FYPa#)^+daZLu$y21#W1k;>T1RGGK# zcrdhSM9dl#>lH6f@J{&dS57n=rnBuB5VUi*`MP?5Q(7q8Pu#dX6u_&;o<9s{g$Mn< zJRo2N%LEP?#QDU<pnj`86zwq$->4WbzohgXOS;qha!X_rocBM+QT!z zJEQs&nUT>Tm!ck^c%WnxuV70fME>0@r($R2(=9}| zMX>S3BgEd@(AW9d?ztZQG$u!R;>C8h*XQ8R$W_fz~V;z!P zq8sL~MDVPeN(8s$azRlkqDHZbBjIX9)Ic3*vctn$I1zaS>Pr`(?(Y~x4?1j+W&I{9 zM~Q!rmrCfLp2~mn+x_~W;DD8@!kQ)fyn^xT@3b$siqNq^UFrJ0NgwXjfIqPU!&z4X zF<_-Vwv1H)p!@pz-Q3;sWq`3sx5;&|7g`d*0_%)1x3k)iO1`KjKG)~B1I+{%zm?yU%tSmM9VWeO8XRYns5nHN2nxnpoAgG|tu@JI))tut=&|ui|^e1+Td>(%f-%==22+d1mEv2RWj_}5q$?FKp zw)SKhXA|e(e7s&H-#j|%=kuWTAzyQ*tm+B(rkNaBQ1#=~pUqf_3W;x@zMCFw5q1|n z`CQ8OCkz%sWw0o?gqrU7FClU~>cWL>#q{;kTAAvr{$|IKgM!shpSM$X<+X)l8LVNGxFRe45GF6Pvx>N(E zFSjEVplNn&?M78juC@Zt?LSV3^bPgPt6L099WQOl?I~yd56e#HxfX+~vb!n#pDtob zNKg21oz}Z}&Qp(hPybvB33wT8uy(8lIIsKlJ|!aAVU1E83Rm3r9mYv;YA=t-h{x$s z3<-BFem{ZS(Y=i9Pe`d8sQkzw7Ag0I-ga~`e=R>52qnx04geq8qh3C|fG?SUXb(MK zJd}T9Xf3{M+`aC}v~>1ZhkEZnR@L$q-Iy9X8NWOvVhK|I@ppe&dVF^_ix+)we!L|=MN(xb-r}^mBUX+bHQ-h z#Gs&ORya6gPw`qWfX%SR`opetsP*H?ikn^QH$?x20GQJk2enAAxZc;N0*Z^QE*JnH zc>A})$f?tvy}l%}Y(MC@>nJG-nmaqPnOZoTS+YSKU0%Hb01!m*)pWFUH>H9&Iyiv^ zA;L8O@DO~p|8@gusQ%&NZZAxuqohhD;p}Ef#lyzU#!e%GN<~ElaEe0s;a+c1|ECC+n*RE7;q~-4w#=1g8Bb$^YY#v;>>G z*}AyfIy+JQaq7*R)d$&7XNN>uBi&e$64m#lsHzhyVXK@}G?V6{-85NFLt*4*aiye+7bofA#;@eEzvu z|LA>PEfG`@@ZT#hf*NQ>6!W?nWVVtjA6{G7zdQ3<$X+YszuH$Dk?ki7Ln;7(a4#n* z{s97WoSh%At%E&O9P3dbv1d>=<55v=PR{U=>4WPZya!6Ege#fMqPw_w>$IU0lu=oH)X`9XPz$0GQX$9DYI-5>p#a^A|2* zi)~5K1Oku)15IHWJHmq`$dO-B-Wd&&7yw?ZhaCpbsIMm<6aE#cLK5Jp0I*ah=>XJf z(@j+**jL2ZG5nVln_UqQw#e>M0{0i;8STC@0+5O51AFa>_~(NDB2=K;DG798us4eAA4>aPQ)0k<68y{mDiia6m5B$ENFE`knF9O`ZJN!Ptcol8K5TQ z+O>&qwdrJ?4p>cH z365;0T$eThHs-YX3nx~PjIO3o4&#rvx^o3K54y=HA2dAQm)iMvl)yaFZ89;ZOXR{6 zH2Ya{?$!RjpN`6i`i{wfeJ3$}<0MJM+HbM6K4AaS%glQA(K}jy{VGV!pHFz>O;R7j zpAgrLL#)A%9U~5sloQqU6QlmZlFPKHHcdzG=5G;Hvp;^v_%U<;y&NK4I3e(qz{{i$ zhbp7}LE%kVy~B$B=N;#ggBC?n_(!eT^j@>CG2 zh@$5?k@mUY%K2Dx;{`LIUpUeP9BDE;%zAnsaPsvgN~O$9s?b<;=34Ziw$3ZO0o@;H zU5~4f{wuq8#))@id#Qv&Z6`f$;tq#Bq&3>U_vO(2`{Ih7$v5^PldjQ%A9u6EJLy<| zq`O?vUnr*cH=yqf0%+UgB{Z|sV+7s(Sqs-i9J1zx4SgRKUmWoS-P@6WyQTS*n@CcM z8ahw3>_kXwFYL8H=Vq;Pedcpb5Z;VZ8uK9jWi!xenbYltIZ`Mp+Ax0=KZUuE?I83l#-uyzK2)lwnE3Shn7HoJiHuZ?3iTovR(_ogDH+GFzIbv>i&IuOwFl@pbd=>>w}B zpUgb&<5+ahjPH67KwSzBrYLLU>}_q~NQE~w4_km)W7d|KWF|7{uA&YD%$ngwZFW}A zxa|&sA9}rYOAzA2dEd_3b$Jtv=o8 zxQ-@Oc;5Gni1402=ZD4S9bi45M?}hQ#jc47KQLmxdoe%YwhG zee{B^ZLQ^it%C9cKKN-~dw6+N2UkA|cp@-5V;}`KBcZ~d!8yAf8b{dg8HTX4B5;78~7rjVug|0Xx^yjU9d@#>DbRyblUQE%+rmX9nvwTu)c# zuUVC8YU&1;P}(W%7OYK)EPv-Y>e;LkWO#~V2x?7bw%^r-+Rt?ooFBr(4fO2h@=sMI z7#iz69P63!v3@v3u0M=P-mgxH^uhs0J8xfDIrzc#lZp|A?~;lI0yu>G`=KUU59Imw_F3eoR6jU}&A93&wG|jO z$~%BciHcZcPvjJB{_vKD;<~A-nh2SlBsAu+5#kALrDt++3N7rK+LTNMSZL|BTlGBX z*mi=1w|a2^cp%V<4Y9aOSpZQD(?gR65x*+bvqD9~TJtRP;rs}@N^N!PrHS}-&S)Rm z!!e%64|9BCnQc9P++|*8lkmw)hMs-@m={yn{ej@m10tt}QGdkc4K`gfslfWqJ+$8* zdF$=3BW@Sz3~4nPo#`qo@o2Q@@;AV=gy!*$t+8>oWmSm;0uqUBBw4$PdWTB6;C8#( z(e+~`B}DeZ5VGj1cO93j%-F!eTqS(?)(9nrYkS9`6VK45QNmJ&km)<3)^H=`Kh5io z;gH4xL&Gd2P$ddM8j3v|B+`VfbH}ke6*APRFG$P~nTUR2I66FvJ<39RdeosIFk^P- zmdFQGgld0vtdi^Cd~0z9^5O{zT1dgFnC3iX(h^22wmb`uFDib5Efh7{;Wr#Bu#R@V zIh~r1{|v)CD*v;(rE6@F-l%;WPa%LwpwX~}Ils!@pma+<%-{8wS+jc$=VcOAc!6Es z(TesMMEJb!OF12zT{`$i;*$be(rhgkBS}SYjaE!Rqyg|%s={41+$Ay4FqpY1fePHg z{iWwYZ@0`fTn^m9lpiuF=;O9WlqL*}@KzJFPq{zuy|N7)TY&|So+myg(pfn&OYwC; zC`1X5dNal&3}dx1Z6e2;HI|$FUU-m~?oN1+Ki^jBT&pQW(}_-6H#Xq4GCbgJRZ#jSA#XP9Ck`zY1xU!yFaN+%Od*(^xti zK<=JwR&JnurbE`Ncv3%@WHazYKF@}LjHCelPqP~4vwTZZzx&QPl_u*P-F8C6Ku;MJ zJVy3RrYM6-`Md%6XZ}B`RatZ#Tt=-yMK$Ya*kWBf8BrP_kMdSr^+1~E<1{hgXR`j zq*Bxr%ts83dpn{KJbP`inD!~ZjU7bIx3a+$Le$~8!w4vJ%taV!PbOB$X~WkuLhDU* z^!q)*kby*w5x1YR@k1f**?48M9A#2fdbs&h5_=9jIn;?G4c|i*nrJ4eP)k^RtptVq z1DBGNzT;XYIez_=>&o2*-|)3XD|Jk-sB7o&!{^+o^k1AIAsvWfmwhq(>cvMz-jNIh zdInvo@zx{UvzRJvQ*W!*<9`miaw6>s!f0EAORM%SoXBLxhAHw#&5DE6377 zBuwNdDr8;x(IRSgHgomZg{>RvxhIefWSa*Q6k#q!7|6YEK2${$G#>M{7v3(zkMC)- zu{>?}C;}d99XEvG_!u{!*?e`Rzf{$8as4O9nhC0nJdAO(R40^Ot~i^6=D9b=(gy3#^<_G8 z%cD;2%lNuyD)Y}s??B~!v*N;}wx`hfzNc(&L9m~eijMVtN7>^StE%hEOL1ZH21KvJ zt*xAf&)uTq-5Wcn3YA91Lzi2&b}vxnW|v~FyYd9lAoriw;udpi<~Lce#~s&&K3 z+Gi-z_4)bYp|dDa{`*GJ=aOd^>1w#cuhcoz{H7*l_eU7CVt$WxYgXM-q@sBndNGQA z#QIG=<3AmuApT`}fYkhR4>#L;u+sW>dfR|71=^qYn z*LG0FlQ^FjXkGe{A={m%JHGY>Pgmz^PwPtdlO>cTKDW8|TyAwQ5csCgfeh=FdQd{f zo7sSFjqbZy(Fr?({?_|v;{a_+&_T|?aQ6}-Y!0N^wAfjGv~PAYy;!6Kj@~Xem*c1$ zd`ZcEeP$-|k{LY0+-?dFI(J%v7`ev<%9v!nCSEIA>zJc}iR%f+IqPpX-SM6lhNTE{ zq}h!0%JjTc{|FC)C6(^MJq?f9m%2fI6%+X?#&Km_;RNRl*?|Z~rGu0=hj5K{6K9G3 puLN5@V53YAZO#8dqMjERIRj>PN`H>Q*UKhAPD)v_>b*(u{{R&i!b|`F literal 0 HcmV?d00001 diff --git a/imgs/manufacturedate.png b/imgs/manufacturedate.png new file mode 100644 index 0000000000000000000000000000000000000000..e05a0e8b895bbdae785565e5df06b5d02ab1d642 GIT binary patch literal 11425 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 E0CWEt6951J literal 0 HcmV?d00001 diff --git a/imgs/timemachine.png b/imgs/timemachine.png new file mode 100644 index 0000000000000000000000000000000000000000..d52b73eb84f8a951ca4f136cfbe4b4a757b33c02 GIT binary patch literal 13071 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 WW-9H7=<}cxKvGmrq)JH7|9=7Yfr5?z literal 0 HcmV?d00001 diff --git a/smartmon_check.py b/smartmon_check.py new file mode 100755 index 0000000..c3908a0 --- /dev/null +++ b/smartmon_check.py @@ -0,0 +1,78 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# SMART_EA.py ################################################# +# +# A Python script monitor and report SMART details from disks. +# +# 1.0.0 2016.03.xx Initial release. tjm +# 1.1.0 2016.12.07 report devices with SMART disabled. tjm +# 1.2.0 2017.04.07 Adjusted method of drive discovery. tjm +# No longer checking external drives. +# +# +################################################################################ + +# Notes ######################################################################## +# +# Requires smartmon tools +# +# External SMART report unavailable in MacOS +# +# A checked drive will have a character showing it's status: +# +# . SMART status is okay +# # The drive number will appear if a SMART error is detected +# ? If smartmon couldn't open the device +# +################################################################################ + +from __future__ import print_function +import subprocess + +def main(): + ouput_disklist = "" + + raw_disklist = subprocess.check_output(["/usr/sbin/diskutil", "list",]) + raw_disklist = raw_disklist.split("\n") + + disk_list = [] + for item in raw_disklist: + if "/dev/disk" in item and "physical" in item and "external" not in item: + item = item.split(" (") + disk_list.append(item[0]) + + for index, drive_name in enumerate(disk_list): + try: + check_smart = subprocess.check_output(["/usr/local/sbin/smartctl", "-a", drive_name]) + if "SMART Disabled." in check_smart: + # could turn smart on here... + ouput_disklist = ouput_disklist + "X" + else: + smart_output = subprocess.check_call(["/usr/local/sbin/smartctl", "-H", "--quietmode=errorsonly", drive_name]) + # print smart_output + if smart_output == 0: + ouput_disklist = ouput_disklist + "." + else: + ouput_disklist = ouput_disklist + str(index) + except Exception as exception_message: + # print(exception_message) + ouput_disklist = ouput_disklist + "?" + + print("" + ouput_disklist + "") + +if __name__ == '__main__': + main() diff --git a/time_machine_status.py b/time_machine_status.py new file mode 100755 index 0000000..8042084 --- /dev/null +++ b/time_machine_status.py @@ -0,0 +1,100 @@ +#!/usr/bin/python + +# Copyright (c) 2017 University of Utah Student Computing Labs. ################ +# All Rights Reserved. +# +# Permission to use, copy, modify, and distribute this software and +# its documentation for any purpose and without fee is hereby granted, +# provided that the above copyright notice appears in all copies and +# that both that copyright notice and this permission notice appear +# in supporting documentation, and that the name of The University +# of Utah not be used in advertising or publicity pertaining to +# distribution of the software without specific, written prior +# permission. This software is supplied as is without expressed or +# implied warranties of any kind. +################################################################################ + +# time_machine_status.py ####################################################### +# +# A Python script monitor and report Time Machine settings. +# +# 1.0.0 2016.11.xx Initial release. tjm +# +# +# +################################################################################ + +# Notes ######################################################################## +# +# +# +# +# +################################################################################ + +from __future__ import print_function +import subprocess +import os +import datetime + +def main(): + tm_drive = "/Volumes/Time Machine" + tm_config = False + tm_d_avail = False + + if os.path.isdir(tm_drive): + tm_d_avail = True + + dest_info = subprocess.check_output(['/usr/bin/tmutil', 'destinationinfo']) + + if "tmutil: No" not in dest_info: + tm_config = True + + if tm_config: + last_backup_raw = subprocess.check_output(['/usr/bin/tmutil', 'latestbackup']) + last_backup_raw = last_backup_raw.split('/')[-1] + year, month, day, time = last_backup_raw.split('-') + time = time.split('\n')[0] + # last_backup_date = month + day + year + ':' + time + last_backup_date = month + "/" + day + + if tm_d_avail: + today = datetime.date.today() + last_backup = datetime.date(year=int(year), month=int(month), day=int(day)) + backup_elapsed = today - last_backup + if backup_elapsed.days > 30: + last_backup_mod = "Bad " + else: + last_backup_mod = "Good " + + drive_size_raw = subprocess.check_output(["/bin/df", tm_drive]).split("\n")[1].split(" ") + drive_size_raw = [x for x in drive_size_raw if x] + tm_d_used = drive_size_raw[4].split("%")[0] + + if int(tm_d_used) > 90: + tm_d_mod = " Bad " + else: + tm_d_mod = " Good " + + tm_d_total = float(drive_size_raw[3])/(1024 ** 2) + if tm_d_total > 1000: + tm_d_total = tm_d_total/1024 + tm_d_total = "%0.2fT" % tm_d_total + else: + tm_d_total = str(int(tm_d_total)) + "G" + + return_string = last_backup_mod + last_backup_date + tm_d_mod + tm_d_used + "% free of " + tm_d_total + + else: + return_string = 'Last Backup: ' + last_backup_date + " Not SCL drive" + + else: + if tm_d_avail: + return_string = 'Not configured, drive available' + else: + return_string = 'Not configured, no drive' + + print("" + return_string + "") + +if __name__ == '__main__': + main()