# by joevt Dec 30, 2020 checkkext () { local thekextpath="$1" if [[ -d "$thekextpath" ]]; then if [[ -f "$thekextpath/Contents/Info.plist" ]]; then local kextname="$(basename "$thekextpath")" if [[ "$kextname" =~ ".*\.kext" ]]; then local kextidentifier="" kextidentifier="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$thekextpath/Contents/Info.plist" 2> /dev/null)" local theerr=$? if (( theerr == 0 )); then return 0 else echo "# Missing CFBundleIdentifier" 1>&2 return 1 fi else echo "# That's not a kext" 1>&2 return 1 fi else echo "# Missing Info.plist" 1>&2 return 1 fi else echo "# Expected a kext folder" 1>&2 return 1 fi } unloadkext () { local thekextpath="$1" checkkext "$thekextpath" || return 1 local kextname="$(basename "$thekextpath")" local kextsrcdir="$(dirname "$thekextpath")" local kexttmpdir="$(mktemp -d)" local kextinstalldir="/Library/Extensions" local kextidentifier="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$thekextpath/Contents/Info.plist")" echo "# kextname: $kextname" echo "# kextidentifier: $kextidentifier" if ( kextstat | grep -q "$kextidentifier" ); then while ( kextstat | grep -q "$kextidentifier" ); do echo "# Unloading $kextname" sleep 1 sudo kextunload -b "$kextidentifier" done echo "# $kextname is unloaded" else echo "# $kextname is not loaded" fi } installkext () { local doload=0 if [[ "$1" == "-l" ]]; then doload=1 shift 1 fi local thekextpath="$1" checkkext "$thekextpath" || return 1 local kextname="$(basename "$thekextpath")" local kextsrcdir="$(dirname "$thekextpath")" local kexttmpdir="$(mktemp -d)" local kextinstalldir="/Library/Extensions" local kextidentifier="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$thekextpath/Contents/Info.plist")" if ((doload)); then unloadkext "$thekextpath" else echo "# kextname: $kextname" echo "# kextidentifier: $kextidentifier" fi mount | grep ' on / ' | grep -q 'read-only' && sudo mount -uw / sudo cp -R "$thekextpath" "$kexttmpdir/$kextname" sudo chown -R root:wheel "$kexttmpdir/$kextname" sudo find "$kexttmpdir/$kextname" -type d -exec /bin/chmod 0755 {} \; sudo find "$kexttmpdir/$kextname" -type f -exec /bin/chmod 0644 {} \; if [[ -n "$kextinstalldir" ]]; then [[ -d "/System/Library/Extensions/$kextname" ]] && sudo rm -R "/System/Library/Extensions/$kextname" [[ -d "/Library/Extensions/$kextname" ]] && sudo rm -R "/Library/Extensions/$kextname" sudo mv "$kexttmpdir/$kextname" "$kextinstalldir" if ((doload)); then sudo kextutil "$kextinstalldir/$kextname" fi else if ((doload)); then sudo kextutil "$kexttmpdir/$kextname" fi fi if ((doload)); then kextstat | grep "$kextidentifier" fi } removekext () { local thekextpath="$1" [[ -d "$thekextpath" ]] && sudo rm -R "$thekextpath" } rebuildkextcache () { sudo kextcache -i / }