Skip to content

Instantly share code, notes, and snippets.

View brunerd's full-sized avatar

Joel Bruner brunerd

View GitHub Profile
# jamflog - Copyright (c) 2021 Joel Bruner, Licensed under the MIT License
# a way to log to stdout and /var/log/jamf.log (or elsewhere) and have it match Jamf's log style
function jamflog(){
[ -n "${-//[^x]/}" ] && { local xTrace=1; set +x; } &>/dev/null
local logFile="${2:-/var/log/jamf.log}"
#if it exists but we cannot write to the log or it does not exist, unset and tee simply echoes
[ -e "${logFile}" -a ! -w "${logFile}" ] && unset logFile
#this will tee to jamf.log in the jamf log format: <Day> <Month> DD HH:MM:SS <Computer Name> ProcessName[PID]: <Message>
builtin echo "$(/bin/date +'%a %b %d %H:%M:%S') ${jamflog_myComputerName:="$(/usr/sbin/scutil --get ComputerName)"} ${jamflog_myName:="$(/usr/bin/basename "${0%.*}")"}[${myPID:=$$}]: ${1}" | /usr/bin/tee -a "${logFile}" 2>/dev/null
@brunerd
brunerd / inZoomMeeting.sh
Created February 15, 2022 04:14
Simple shell script function to determine if a Zoom meeting is in progress
#!/bin/sh
#inZoomMeeting (20220214) Copyright (c) 2021 Joel Bruner (https://github.com/brunerd)
#Licensed under the MIT License
function inZoomMeeting {
#if this process exists, there is a meeting, return 0 (sucess), otherwise 1 (fail)
pgrep "CptHost" &>/dev/null && return 0 || return 1
}
if inZoomMeeting; then
@brunerd
brunerd / kcpasswordDecode.sh
Last active November 17, 2022 14:34
De-obfuscates macOS /etc/kcpassword file used for automatic login
#!/bin/bash
#kcpasswordDecode (20220729) Copyright (c) 2021 Joel Bruner (https://github.com/brunerd)
#Licensed under the MIT License
#specify file as input
#kcpasswordDecode.sh /etc/kcpassword
#given a filepath XOR to the it back and truncate padding
function kcpasswordDecode() (
filepath="${1}"
@brunerd
brunerd / kcpasswordEncode.sh
Last active July 31, 2022 11:46
Encode a string for use in macOS /etc/kcpassword using shell, printf, sed, awk and xxd
#!/bin/bash
#kcpasswordEncode (20220610) Copyright (c) 2021 Joel Bruner (https://github.com/brunerd)
#Licensed under the MIT License
#given a string creates data for /etc/kcpassword
function kcpasswordEncode () (
#ascii string
thisString="${1}"
@brunerd
brunerd / kcpasswordEncode_perl.sh
Created August 24, 2021 04:32
Encode password for macOS /etc/kcpassword (does not handle blank passwords)
#!/bin/bash
function kcpasswordEncode_perl {
local PASSWORD="${1}";
#one-liner variation of Gavin Brock's kcpassword.pl
perl -ne 'sub kcpassword_xor { my ($pass)=@_; my @key=qw( 125 137 82 35 210 188 221 234 163 185 31 ); my $key=pack "C*", @key; my $key_len=length $key; for (my $n=0; $n<length($pass); $n+=$key_len) { substr($pass,$n,$key_len) ^= $key; }; return $pass; }; $userinput = $_; chomp ($userinput); print(kcpassword_xor($userinput));' <<< "${PASSWORD}"
}
kcpasswordEncode_perl "${1}"
@brunerd
brunerd / CFAbsoluteTime_Unix_Epoch.sh
Created August 2, 2021 23:44
Working with CFAbsoluteTime and epoch time in shell
#work with CFAbsoluteTime in shell
#https://developer.apple.com/documentation/corefoundation/cfabsolutetime
#https://developer.apple.com/documentation/corefoundation/1543542-cfabsolutetimegetcurrent
#get epoch time for CFAbsoluteTime 0 (978307200)
#same as the constant kCFAbsoluteTimeIntervalSince1970 in https://github.com/opensource-apple/CF/blob/master/CFDate.c
/bin/date -j -f "%b %d %T %Z %Y" "Jan 1 00:00:00 GMT 2001" "+%s"
#Now in CFAbsoluteTime
echo $(( $(date +"%s") - 978307200 ))
@brunerd
brunerd / macOSScreenLockDetection.sh
Created March 20, 2021 16:46
Detect the macOS CoreGraphics Screen Lock status of the console user via ioreg
#!/bin/sh
#Joel Bruner (https://github.com/brunerd)
function screenIsLocked { [ "$(/usr/libexec/PlistBuddy -c "print :IOConsoleUsers:0:CGSSessionScreenIsLocked" /dev/stdin 2>/dev/null <<< "$(ioreg -n Root -d1 -a)")" = "true" ] && return 0 || return 1; }
function screenIsUnlocked { [ "$(/usr/libexec/PlistBuddy -c "print :IOConsoleUsers:0:CGSSessionScreenIsLocked" /dev/stdin 2>/dev/null <<< "$(ioreg -n Root -d1 -a)")" != "true" ] && return 0 || return 1; }
if screenIsLocked; then
echo "Screen locked"
fi
@brunerd
brunerd / macOSCompatibilityMatrix.csv
Last active January 27, 2021 05:59
CSV of macOS compatibility and Apple Hardware (Intel and Apple Silicon) and VMs created with macOSCompatibility.sh
ModelID 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13 10.14 10.15 11
iMac4,1 10.4 10.5 10.6
iMac4,2 10.4 10.5 10.6
iMac5,1 10.4 10.5 10.6 10.7
iMac5,2 10.4 10.5 10.6 10.7
iMac6,1 10.4 10.5 10.6 10.7
iMac7,1 10.4 10.5 10.6 10.7 10.8 10.9 10.10 10.11
iMac8,1 10.5 10.6 10.7 10.8 10.9 10.10 10.11
iMac9,1 10.5 10.6 10.7 10.8 10.9 10.10 10.11
iMac10,1 10.6 10.7 10.8 10.9 10.10 10.11 10.12 10.13
@brunerd
brunerd / csv2csv.function.min.no_help.sh
Last active December 18, 2020 21:53
Minified, functionalized version of Lorance Stinson's csv2csv shell utility minus the help, truly a one-liner
#!/bin/sh
# csv2csv.function.min.no_help
# csv2csv by Lorance Stinson, 2007
# This file is in the public domain.
# For more information email LoranceStinson+csv@gmail.com.
# Or see http://lorance.freeshell.org/csvutils/
# Additions by Joel Bruner, 2020 (https://github.com/brunerd)
#csv2csv function minified
function csv2csv { IFS=$' \t\n'; local NL=$'\n'; local TAB=$'\t';local CSV_ESCAPE=${CSV_ESCAPE:='"'}; local CSV_SEPARATOR=${CSV_SEPARATOR:=","}; local CSV_QUOTE=${CSV_QUOTE:='"'}; local OCSV_ESCAPE=${CSV_ESCAPE:='"'}; local OCSV_SEPARATOR=${CSV_SEPARATOR:=","}; local OCSV_QUOTE=${CSV_QUOTE:='"'}; local FILE="-"; local NL_TEXT=""; local NUM_COLS=""; local OUTPUT=""; local QUOTE_LEVEL="0"; local SKIP_ROWS="0"; local TAB_TEXT=""; while [ "$#" -gt 0 ] ; do case "$1" in -c) [ "$2" ] && local COL_LIST="$2" || usage="$1 requires an argument."; shift 2;; -e) [ "$2" ] && CSV_ESCAPE="$2" || usage="$1 requires an argument."; shift 2;; -E) [ "$2" ] && OCSV_ESCAPE="$2" || usage="$1 requires an argument."; shift 2;; -h
@brunerd
brunerd / csv2csv.function.min.sh
Last active December 18, 2020 21:53
Minified, functionalized version of Lorance Stinson's csv2csv shell utility
#!/bin/sh
# csv2csv.function.min
# csv2csv by Lorance Stinson, 2007
# This file is in the public domain.
# For more information email LoranceStinson+csv@gmail.com.
# Or see http://lorance.freeshell.org/csvutils/
# Additions by Joel Bruner, 2020 (https://github.com/brunerd)
#csv2csv function minified
function csv2csv { IFS=$' \t\n'; local NL=$'\n'; local TAB=$'\t';local CSV_ESCAPE=${CSV_ESCAPE:='"'}; local CSV_SEPARATOR=${CSV_SEPARATOR:=","}; local CSV_QUOTE=${CSV_QUOTE:='"'}; local OCSV_ESCAPE=${CSV_ESCAPE:='"'}; local OCSV_SEPARATOR=${CSV_SEPARATOR:=","}; local OCSV_QUOTE=${CSV_QUOTE:='"'}; local FILE="-"; local NL_TEXT=""; local NUM_COLS=""; local OUTPUT=""; local QUOTE_LEVEL="0"; local SKIP_ROWS="0"; local TAB_TEXT=""; while [ "$#" -gt 0 ] ; do case "$1" in -c) [ "$2" ] && local COL_LIST="$2" || usage="$1 requires an argument."; shift 2;; -e) [ "$2" ] && CSV_ESCAPE="$2" || usage="$1 requires an argument."; shift 2;; -E) [ "$2" ] && OCSV_ESCAPE="$2" || usage="$1 requires an argument."; shift 2;; -h) usage=