Slack

[bash]Slackアップデート 少し修正


【スクリプトエディタで開く】|

#!/bin/bash
#com.cocolog-nifty.quicktimer.icefloe
#ユーザードメインにインストール

########################################
##実行パス
SCRIPT_PATH="${BASH_SOURCE[0]}"
/bin/echo "実行中のスクリプト"
/bin/echo "\"$SCRIPT_PATH\""

########################################
##ローカルにインストールされたものをゴミ箱に
CHK_APP_PATH="/Applications/Slack.app"
TRASH_DIR=$(/usr/bin/mktemp -d "$HOME/.Trash/SLACK.XXXXXXXX")
/bin/chmod 777 "$TRASH_DIR"
/bin/mv "$CHK_APP_PATH" "$TRASH_DIR"

if [ -e "$CHK_APP_PATH" ]; then
  /bin/echo "【エラー】$CHK_APP_PATHが存在します以下のコマンドをターミナルで実行してください"
  /bin/echo "/usr/bin/sudo /bin/mv \"/Applications/Slack.app\" \"$HOME/.Trash\""
  exit 1
fi

########################################
##OS
PLIST_PATH="/System/Library/CoreServices/SystemVersion.plist"
STR_OS_VER=$(/usr/bin/defaults read "$PLIST_PATH" ProductVersion)
/bin/echo "OS VERSION :" "$STR_OS_VER"
STR_MAJOR_VERSION="${STR_OS_VER%%.*}"
/bin/echo "STR_MAJOR_VERSION :" "$STR_MAJOR_VERSION"
STR_MINOR_VERSION="${STR_OS_VER#*.}"
/bin/echo "STR_MINOR_VERSION :" "$STR_MINOR_VERSION"

########################################
##ユーザー
USER_WHOAMI=$(/usr/bin/whoami)
/bin/echo "実行したユーザーは:$USER_WHOAMI"
CURRENT_USER=$(/bin/echo "$HOME" | /usr/bin/awk -F'/' '{print $NF}')
/bin/echo "実行ユーザー:" "$CURRENT_USER"

########################################
###ダウンロード起動時に削除する項目
USER_TEMP_DIR=$(/usr/bin/mktemp -d)
/bin/echo "起動時に削除されるディレクトリ:" "$USER_TEMP_DIR"

########################################
##デバイス
#起動ディスクの名前を取得する
/usr/bin/touch "$USER_TEMP_DIR/diskutil.plist"
/usr/sbin/diskutil info -plist / >"$USER_TEMP_DIR/diskutil.plist"
STARTUPDISK_NAME=$(/usr/bin/defaults read "$USER_TEMP_DIR/diskutil.plist" VolumeName)
/bin/echo "ボリューム名:" "$STARTUPDISK_NAME"

STR_DEVICE_UUID=$(/usr/sbin/ioreg -c IOPlatformExpertDevice | grep IOPlatformUUID | awk -F'"' '{print $4}')
/bin/echo "デバイスUUID: " "$STR_DEVICE_UUID"

############################################################
##基本メンテナンス
##ライブラリの不可視属性を解除
/usr/bin/chflags nohidden "/Users/$CURRENT_USER/Library"
/usr/bin/SetFile -a v "/Users/$CURRENT_USER/Library"
## Managed Itemsフォルダを作る
/bin/mkdir -p "/Users/$CURRENT_USER/Library/Managed Items"
/bin/chmod 755 "/Users/$CURRENT_USER/Library/Managed Items"
/usr/sbin/chown "$CURRENT_USER" "/Users/$CURRENT_USER/Library/Managed Items"
/usr/bin/touch "/Users/$CURRENT_USER/Library/Managed Items/.localized"

########################################
## HOME
########################################
## Developer
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Developer"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
## bin
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/bin"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
##アクセス権チェック
/bin/chmod 700 "/Users/$CURRENT_USER/Library"
/bin/chmod 700 "/Users/$CURRENT_USER/Movies"
/bin/chmod 700 /"Users/$CURRENT_USER/Music"
/bin/chmod 700 "/Users/$CURRENT_USER/Pictures"
/bin/chmod 700 "/Users/$CURRENT_USER/Downloads"
/bin/chmod 700 "/Users/$CURRENT_USER/Documents"
/bin/chmod 700 "/Users/$CURRENT_USER/Desktop"
##全ローカルユーザーに対して実施したい処理があれば追加する
/bin/echo "ユーザーディレクトリチェックDONE"
########################################
## Public
########################################
/bin/chmod 755 "/Users/$CURRENT_USER/Public"
##
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Drop Box"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 733 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf nobody "$STR_CHECK_DIR_PATH"
##########
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Documents"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf admin "$STR_CHECK_DIR_PATH"
##
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Downloads"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf admin "$STR_CHECK_DIR_PATH"
##
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Favorites"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf admin "$STR_CHECK_DIR_PATH"
##########
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Groups"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 770 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf staff "$STR_CHECK_DIR_PATH"
##
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Shared"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 750 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf staff "$STR_CHECK_DIR_PATH"
##########
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Guest"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 777 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf nobody "$STR_CHECK_DIR_PATH"
##
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Public/Shared Items"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 775 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
/usr/bin/chgrp -Rf nobody "$STR_CHECK_DIR_PATH"

########################################
## Applications
########################################
## Applications
STR_CHECK_DIR_PATH="/Users/$CURRENT_USER/Applications"
/bin/mkdir -p "$STR_CHECK_DIR_PATH"
/bin/chmod 700 "$STR_CHECK_DIR_PATH"
/usr/bin/touch "$STR_CHECK_DIR_PATH/.localized"
##サブフォルダを作る
LIST_SUB_DIR_NAME=("Demos" "Desktop" "Developer" "Documents" "Downloads" "Favorites" "Groups" "Library" "Movies" "Music" "Pictures" "Public" "Shared" "Sites" "System" "Users" "Utilities")
##リストの数だけ処理
for ITEM_DIR_NAME in "${LIST_SUB_DIR_NAME[@]}"; do
  /bin/mkdir -p "$STR_CHECK_DIR_PATH/${ITEM_DIR_NAME}"
  /bin/chmod 700 "$STR_CHECK_DIR_PATH/${ITEM_DIR_NAME}"
  /usr/bin/touch "$STR_CHECK_DIR_PATH/${ITEM_DIR_NAME}/.localized"
done
########################################
##シンボリックリンクを作る
if [[ ! -e "/Users/$CURRENT_USER/Applications/Applications" ]]; then
  /bin/ln -s "/Applications" "/Users/$CURRENT_USER/Applications/Applications"
fi
if [[ ! -e "/Users/$CURRENT_USER/Applications/Utilities/Finder Applications" ]]; then
  /bin/ln -s "/System/Library/CoreServices/Finder.app/Contents/Applications" "/Users/$CURRENT_USER/Applications/Utilities/Finder Applications"
fi
if [[ ! -e "/Users/$CURRENT_USER/Applications/Utilities/Finder Libraries" ]]; then
  /bin/ln -s "/System/Library/CoreServices/Finder.app/Contents/Resources/MyLibraries" "/Users/$CURRENT_USER/Applications/Utilities/Finder Libraries"
fi
if [[ ! -e "/Users/$CURRENT_USER/Applications/Utilities/System Applications" ]]; then
  /bin/ln -s "/System/Library/CoreServices/Applications" "/Users/$CURRENT_USER/Applications/Utilities/System Applications"
fi
if [[ ! -e "/Users/$CURRENT_USER/Applications/Utilities/System Utilities" ]]; then
  /bin/ln -s "/Applications/Utilities" "/Users/$CURRENT_USER/Applications/Utilities/System Utilities"
fi

########################################
###ダウンロード>>起動時に削除する項目
###CPUタイプでの分岐
ARCHITEC=$(/usr/bin/arch)
/bin/echo "Running on $ARCHITEC"
if [ "$ARCHITEC" == "arm64" ]; then
  ###ARM用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx-silicon"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
else
  ###INTEL用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
fi
##全ユーザー実行可能にしておく
/bin/chmod 755 "$USER_TEMP_DIR/$DL_FILE_NAME"
/bin/echo "ダウンロードOK"

########################################
###アプリケーションの終了
###コンソールユーザーにのみ処理する
CONSOLE_USER=$(/bin/echo "show State:/Users/ConsoleUser" | /usr/sbin/scutil | /usr/bin/awk '/Name :/ { print $3 }')
/bin/echo "CONSOLE_USER:$CONSOLE_USER"
if [ -z "$CONSOLE_USER" ]; then
  /bin/echo "コンソールユーザーが無い=電源入れてログインウィンドウ状態"
else
  #####OSAスクリプトはエラーすることも多い(初回インストール時はエラーになる)
  if ! /usr/bin/osascript -e "tell application id \"com.tinyspeck.slackmacgap\" to quit"; then
    ##念の為 KILLもする
    /usr/bin/killall "Slack" 2>/dev/null
    /usr/bin/killall "Slack Helper" 2>/dev/null
    /usr/bin/killall "Slack Helper (GPU)" 2>/dev/null
    /usr/bin/killall "Slack Helper (Renderer)" 2>/dev/null
  fi
fi
/bin/sleep 2
########################################
#####古いファイルをゴミ箱に USER
function DO_MOVE_TO_TRASH() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に USER
DO_MOVE_TO_TRASH "/Applications/Slack.app"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Applications/Slack.app"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Applications/Groups/Slack.app"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Cache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Code Cache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/DawnCache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/GPUCache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/logs"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/IndexedDB"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/File System"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Service Worker/CacheStorage"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Service Worker/ScriptCache"

DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/Slack"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/com.tinyspeck.slackmacgap.helper"

DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/HTTPStorages/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/HTTPStorages/com.tinyspeck.slackmacgap.binarycookies"

/bin/echo "ユーザーキャッシュ削除DONE"
############################################################
###/var/folde T
MKTEMP_DIR=$(/usr/bin/mktemp -d)
TEMP_DIR_T="$(/usr/bin/dirname "$MKTEMP_DIR")"
function DO_MOVE_TO_TRASH_T() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.T.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に
DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap.binarycookies"
/bin/echo "ユーザーキャッシュT DONE"
############################################################
###/var/folder C
TEMP_DIR="$(/usr/bin/dirname "$TEMP_DIR_T")"
TEMP_DIR_C="${TEMP_DIR}/C"
function DO_MOVE_TO_TRASH_C() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.C.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に
DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap.binarycookies"
/bin/echo "ユーザーキャッシュ C DONE"

############################################################
######### DITTOコピーインストール
/bin/echo "インストール開始:DITTO:" "$CURRENT_USER"
###ディスクをマウント
/usr/bin/hdiutil attach "$USER_TEMP_DIR/$DL_FILE_NAME" -noverify -nobrowse -noautoopen
sleep 2
####コピーして
/usr/bin/ditto "/Volumes/Slack/Slack.app" "/Users/$CURRENT_USER/Applications/Groups/Slack.app"
sleep 2
###ディスクをアンマウント
/usr/bin/hdiutil detach /Volumes/Slack -force

################################################
###設定項目
STR_BUNDLEID="com.tinyspeck.slackmacgap"
STR_APP_PATH="$HOME/Applications/Groups/Slack.app"
###アプリケーション名を取得
STR_APP_NAME=$(/usr/bin/defaults read "$STR_APP_PATH/Contents/Info.plist" CFBundleDisplayName)
if [ -z "$STR_APP_NAME" ]; then
  STR_APP_NAME=$(/usr/bin/defaults read "$STR_APP_PATH/Contents/Info.plist" CFBundleName)
fi
/bin/echo "アプリケーション名:$STR_APP_NAME"
################################################
### DOCKに登録済みかゴミ箱に入れる前に調べておく
##Dockの登録数を調べる
JSON_PERSISENT_APPS=$(/usr/bin/defaults read com.apple.dock persistent-apps)
NUN_CNT_ITEM=$(/bin/echo "$JSON_PERSISENT_APPS" | grep -o "tile-data" | wc -l)
/bin/echo "Dock登録数:$NUN_CNT_ITEM"
##Dockの登録数だけ繰り返し
NUM_CNT=0 #カウンタ初期化
NUM_POSITION="NULL" #ポジション番号にNULL文字を入れる
###対象のバンドルIDがDockに登録されているか順番に調べる
while [ $NUM_CNT -lt "$NUN_CNT_ITEM" ]; do
  ##順番にバンドルIDを取得して
  STR_CHK_BUNDLEID=$(/usr/libexec/PlistBuddy -c "Print:persistent-apps:$NUM_CNT:tile-data:bundle-identifier" "$HOME/Library/Preferences/com.apple.dock.plist")
  ##対象のバンドルIDだったら
  if [ "$STR_CHK_BUNDLEID" = "$STR_BUNDLEID" ]; then
    /bin/echo "DockのポジションNO: $NUM_CNT バンドルID:$STR_CHK_BUNDLEID"
    ##位置情報ポジションを記憶しておく
    NUM_POSITION=$NUM_CNT
  fi
  NUM_CNT=$((NUM_CNT + 1))
done

##結果 対象のバンドルIDが無ければ
if [ "$NUM_POSITION" = "NULL" ]; then
  /bin/echo "Dockに未登録です"
  PLIST_DICT="<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>$STR_APP_PATH</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
  /usr/bin/defaults write com.apple.dock persistent-apps -array-add "$PLIST_DICT"
else
  ##すでに登録済みの場合は一旦削除
  /bin/echo "Dockの$NUM_POSITION に登録済み 削除してから同じ場所に登録しなおします"
  ##削除して
  /usr/libexec/PlistBuddy -c "Delete:persistent-apps:$NUM_POSITION" "$HOME/Library/Preferences/com.apple.dock.plist"
  ##保存
  /usr/libexec/PlistBuddy -c "Save" "$HOME/Library/Preferences/com.apple.dock.plist"
  ###同じ内容を作成する
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION dict" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:GUID integer $RANDOM$RANDOM" "$HOME/Library/Preferences/com.apple.dock.plist"
  ## 想定値 file-tile directory-tile
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-type string file-tile" "$HOME/Library/Preferences/com.apple.dock.plist"
  ###↑この親Dictに子要素としてtile-dataをDictで追加
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data dict" "$HOME/Library/Preferences/com.apple.dock.plist"
  ###↑子要素のtile-dataにキーと値を入れていく
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:showas integer 0" "$HOME/Library/Preferences/com.apple.dock.plist"
  ## 想定値 2:フォルダ 41:アプリケーション 169 Launchpad とMission Control
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-type integer 41" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:displayas integer 0" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:parent-mod-date integer $(date '+%s')" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-mod-date integer $(date '+%s')" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-label string $STR_APP_NAME" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:is-beta bool false" "$HOME/Library/Preferences/com.apple.dock.plist"
  ###↑この子要素のtile-dataに孫要素でfile-dataをDictで追加
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-data dict" "$HOME/Library/Preferences/com.apple.dock.plist"
  ###値を入れていく
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-data:_CFURLStringType integer 15" "$HOME/Library/Preferences/com.apple.dock.plist"
  /usr/libexec/PlistBuddy -c "add:persistent-apps:$NUM_POSITION:tile-data:file-data:_CFURLString string file://$STR_APP_PATH" "$HOME/Library/Preferences/com.apple.dock.plist"
  ##保存
  /usr/libexec/PlistBuddy -c "Save" "$HOME/Library/Preferences/com.apple.dock.plist"
fi
###
/bin/echo "処理終了 DOCKを再起動します"
/usr/bin/killall "Dock"

exit 0


|

[BASH]SLACKユーザーアップデート(カレントユーザーのみ)


【スクリプトエディタで開く】|

#!/bin/bash
#com.cocolog-nifty.quicktimer.icefloe
########################################
##OS
PLIST_PATH="/System/Library/CoreServices/SystemVersion.plist"
STR_OS_VER=$(/usr/bin/defaults read "$PLIST_PATH" ProductVersion)
/bin/echo "OS VERSION :" "$STR_OS_VER"
STR_MAJOR_VERSION="${STR_OS_VER%%.*}"
/bin/echo "STR_MAJOR_VERSION :" "$STR_MAJOR_VERSION"
STR_MINOR_VERSION="${STR_OS_VER#*.}"
/bin/echo "STR_MINOR_VERSION :" "$STR_MINOR_VERSION"

########################################
##ユーザー
USER_WHOAMI=$(/usr/bin/whoami)
/bin/echo "実行したユーザーは:$USER_WHOAMI"
CURRENT_USER=$(/bin/echo "$HOME" | /usr/bin/awk -F'/' '{print $NF}')
/bin/echo "実行ユーザー:" "$CURRENT_USER"

########################################
##デバイス
USER_TEMP_DIR=$(/usr/bin/mktemp -d)
/bin/echo "起動時に削除されるディレクトリ:" "$USER_TEMP_DIR"
#起動ディスクの名前を取得する
/usr/bin/touch "$USER_TEMP_DIR/diskutil.plist"
/usr/sbin/diskutil info -plist / >"$USER_TEMP_DIR/diskutil.plist"
STARTUPDISK_NAME=$(/usr/bin/defaults read "$USER_TEMP_DIR/diskutil.plist" VolumeName)
/bin/echo "ボリューム名:" "$STARTUPDISK_NAME"

########################################
###ダウンロード起動時に削除する項目

###CPUタイプでの分岐
ARCHITEC=$(/usr/bin/arch)
/bin/echo "Running on $ARCHITEC"
if [ "$ARCHITEC" == "arm64" ]; then
  ###ARM用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx-silicon"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
else
  ###INTEL用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$USER_TEMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
fi
##全ユーザー実行可能にしておく
/bin/chmod 755 "$USER_TEMP_DIR/$DL_FILE_NAME"
/bin/echo "ダウンロードOK"

########################################
###アプリケーションの終了
###コンソールユーザーにのみ処理する
CONSOLE_USER=$(/bin/echo "show State:/Users/ConsoleUser" | /usr/sbin/scutil | /usr/bin/awk '/Name :/ { print $3 }')
/bin/echo "CONSOLE_USER:$CONSOLE_USER"
if [ -z "$CONSOLE_USER" ]; then
  /bin/echo "コンソールユーザーが無い=電源入れてログインウィンドウ状態"
else
  #####OSAスクリプトはエラーすることも多い(初回インストール時はエラーになる)
  if ! /usr/bin/osascript -e "tell application id \"com.tinyspeck.slackmacgap\" to quit"; then
    ##念の為 KILLもする
    /usr/bin/killall "Slack" 2>/dev/null
    /usr/bin/killall "Slack Helper" 2>/dev/null
    /usr/bin/killall "Slack Helper (GPU)" 2>/dev/null
    /usr/bin/killall "Slack Helper (Renderer)" 2>/dev/null
  fi
fi
/bin/sleep 2

############################################################
##基本メンテナンス

##ライブラリの不可視属性を解除
/usr/bin/chflags nohidden "/Users/$CURRENT_USER/Library"
/usr/bin/SetFile -a v "/Users/$CURRENT_USER/Library"
##ユーザーアプリケーションフォルダを作る
/bin/mkdir -p "/Users/$CURRENT_USER/Applications"
/bin/chmod 700 "/Users/$CURRENT_USER/Applications"
/usr/sbin/chown "$CURRENT_USER" "/Users/$CURRENT_USER/Applications"
/usr/bin/touch "/Users/$CURRENT_USER/Applications/.localized"
##ユーザーユーティリティフォルダを作る
/bin/mkdir -p "/Users/$CURRENT_USER/Applications/Utilities"
/bin/chmod 755 "/Users/$CURRENT_USER/Applications/Utilities"
/usr/sbin/chown "$CURRENT_USER" "/Users/$CURRENT_USER/Applications/Utilities"
/usr/bin/touch "/Users/$CURRENT_USER/Applications/Utilities/.localized"
## Managed Itemsフォルダを作る
/bin/mkdir -p "/Users/$CURRENT_USER/Library/Managed Items"
/bin/chmod 755 "/Users/$CURRENT_USER/Library/Managed Items"
/usr/sbin/chown "$CURRENT_USER" "/Users/$CURRENT_USER/Library/Managed Items"
/usr/bin/touch "/Users/$CURRENT_USER/Library/Managed Items/.localized"
##アクセス権チェック
/bin/chmod 700 "/Users/$CURRENT_USER/Library"
/bin/chmod 700 "/Users/$CURRENT_USER/Movies"
/bin/chmod 700 /"Users/$CURRENT_USER/Music"
/bin/chmod 700 "/Users/$CURRENT_USER/Pictures"
/bin/chmod 700 "/Users/$CURRENT_USER/Downloads"
/bin/chmod 700 "/Users/$CURRENT_USER/Documents"
/bin/chmod 700 "/Users/$CURRENT_USER/Desktop"
##全ローカルユーザーに対して実施したい処理があれば追加する
/bin/echo "ユーザーディレクトリチェックDONE"

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

#####古いファイルをゴミ箱に USER
function DO_MOVE_TO_TRASH() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に USER
DO_MOVE_TO_TRASH "/Applications/Slack.app"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Applications/Slack.app"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Cache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Code Cache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/DawnCache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/GPUCache"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/logs"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/IndexedDB"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/File System"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Service Worker/CacheStorage"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Application Support/Slack/Service Worker/ScriptCache"

DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/Slack"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/Caches/com.tinyspeck.slackmacgap.helper"

DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/HTTPStorages/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH "/Users/$CURRENT_USER/Library/HTTPStorages/com.tinyspeck.slackmacgap.binarycookies"

/bin/echo "ユーザーキャッシュ削除DONE"
############################################################
###/var/folde T
MKTEMP_DIR=$(/usr/bin/mktemp -d)
TEMP_DIR_T="$(/usr/bin/dirname "$MKTEMP_DIR")"
function DO_MOVE_TO_TRASH_T() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.T.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に
DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap.binarycookies"
/bin/echo "ユーザーキャッシュT DONE"
############################################################
###/var/folder C
TEMP_DIR="$(/usr/bin/dirname "$TEMP_DIR_T")"
TEMP_DIR_C="${TEMP_DIR}/C"
function DO_MOVE_TO_TRASH_C() {
  if [ -e "$1" ]; then
    TRASH_DIR=$(/usr/bin/mktemp -d "/Users/$CURRENT_USER/.Trash/SLACK.C.XXXXXXXX")
    /bin/chmod 777 "$TRASH_DIR"
    /bin/mv "$1" "$TRASH_DIR"
  fi
}
#####古いファイルをゴミ箱に
DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap"
DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap.binarycookies"
/bin/echo "ユーザーキャッシュ C DONE"

############################################################
######### DITTOコピーインストール
/bin/echo "インストール開始:DITTO:" "$CURRENT_USER"
###ディスクをマウント
/usr/bin/hdiutil attach "$USER_TEMP_DIR/$DL_FILE_NAME" -noverify -nobrowse -noautoopen
sleep 2
####コピーして
/usr/bin/ditto "/Volumes/Slack/Slack.app" "/Users/$CURRENT_USER/Applications/Slack.app"
sleep 2
###ディスクをアンマウント
/usr/bin/hdiutil detach /Volumes/Slack -force
###Dockに追加して
/usr/bin/defaults write com.apple.dock persistent-apps -array-add "<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>$HOME/Applications/Slack.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
###反映させて
/usr/bin/killall cfprefsd
###Dockを再起動
/usr/bin/killall Dock

exit 0


|

[URLForApplicationToOpenURL]デフォルトのブラウザ


【スクリプトエディタで開く】|

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
(*
error number -128
com.cocolog-nifty.quicktimer.icefloe
*)
#
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
##自分環境がos12なので2.8にしているだけです
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions

property refMe : a reference to current application

###設定項目ドキュメントのURL
###(スキームだけでも取得できる)
set strScheme to "slack://"

###ワークスペース初期化
set appShardWorkspace to refMe's NSWorkspace's sharedWorkspace()
###NSURL
set ocidLocalHostURL to refMe's NSURL's URLWithString:(strScheme)
###URLタイプのデフォルトアプリケーション
set ocidAppPathURL to appShardWorkspace's URLForApplicationToOpenURL:(ocidLocalHostURL)
###アプリケーションの名前
set listResponse to (ocidAppPathURL's getResourceValue:(reference) forKey:(refMe's NSURLNameKey) |error|:(missing value))
set strAppName to (item 2 of listResponse) as text
log "デフォルトブラウザの名前は:" & strAppName & "です"
####パス
set aliasAppPath to ocidAppPathURL's absoluteURL() as alias
log "デフォルトブラウザのパスは:" & aliasAppPath & "です"
####バンドルID取得
set ocidAppBunndle to (refMe's NSBundle's bundleWithURL:(ocidAppPathURL))
set ocidBunndleID to ocidAppBunndle's bundleIdentifier
set strBundleID to ocidBunndleID as text
log "デフォルトブラウザのBunndleIDは:" & strBundleID & "です"




【スクリプトエディタで開く】|

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
(*
error number -128
com.cocolog-nifty.quicktimer.icefloe
*)
#
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
##自分環境がos12なので2.8にしているだけです
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions

property refMe : a reference to current application

###設定項目ドキュメントのURL
set strScheme to "http://localhost"

###ワークスペース初期化
set appShardWorkspace to refMe's NSWorkspace's sharedWorkspace()
###NSURL
set ocidLocalHostURL to refMe's NSURL's URLWithString:(strScheme)
###URLタイプのデフォルトアプリケーション
set ocidAppPathURL to appShardWorkspace's URLForApplicationToOpenURL:(ocidLocalHostURL)
###アプリケーションの名前
set listResponse to (ocidAppPathURL's getResourceValue:(reference) forKey:(refMe's NSURLNameKey) |error|:(missing value))
set strAppName to (item 2 of listResponse) as text
log "デフォルトブラウザの名前は:" & strAppName & "です"
####パス
set aliasAppPath to ocidAppPathURL's absoluteURL() as alias
log "デフォルトブラウザのパスは:" & aliasAppPath & "です"
####バンドルID取得
set ocidAppBunndle to (refMe's NSBundle's bundleWithURL:(ocidAppPathURL))
set ocidBunndleID to ocidAppBunndle's bundleIdentifier
set strBundleID to ocidBunndleID as text
log "デフォルトブラウザのBunndleIDは:" & strBundleID & "です"



|

[bash]インストール(全ローカルユーザー対象)

最新版をダウンロードして入れ替え

【スクリプトエディタで開く】|

#!/bin/bash
#com.cocolog-nifty.quicktimer.icefloe
########################################
###管理者インストールしているか?チェック
USER_WHOAMI=$(/usr/bin/whoami)
/bin/echo "実行したユーザーは:$USER_WHOAMI"
if [ "$USER_WHOAMI" != "root" ]; then
  /bin/echo "このスクリプトを実行するには管理者権限が必要です。"
  /bin/echo "sudo で実行してください"
  exit 1
else
  ###実行しているユーザー名
  SUDO_USER=$(/bin/echo "$HOME" | /usr/bin/awk -F'/' '{print $NF}')
  /bin/echo "実行ユーザー:" "$SUDO_USER"
fi
########################################
###全ユーザーで使う起動時に削除する項目
/bin/mkdir -p "/private/tmp/TemporaryItems/Trash"
LOCAL_TMP_DIR=$(/usr/bin/mktemp -d "/private/tmp/TemporaryItems/XXXXXXXX")
/bin/chmod -Rf 777 "/private/tmp/TemporaryItems"
/bin/echo "LOCAL_TMP_DIR:CURL:" "$LOCAL_TMP_DIR"
###CPUタイプでの分岐
ARCHITEC=$(/usr/bin/arch)
/bin/echo "Running on $ARCHITEC"
if [ "$ARCHITEC" == "arm64" ]; then
  ###ARM用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx-silicon"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$LOCAL_TMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$LOCAL_TMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
else
  ###INTEL用のダウンロードURL
  STR_URL="https://slack.com/ssb/download-osx"
  ###ファイル名を取得
  DL_FILE_NAME=$(/usr/bin/curl -s -L -I -o /dev/null -w '%{url_effective}' "$STR_URL" | /usr/bin/rev | /usr/bin/cut -d'/' -f1 | /usr/bin/rev)
  /bin/echo "DL_FILE_NAME:$DL_FILE_NAME"
  ###ダウンロード
  if ! /usr/bin/curl -L -o "$LOCAL_TMP_DIR/$DL_FILE_NAME" "$STR_URL" --connect-timeout 20; then
    /bin/echo "ファイルのダウンロードに失敗しました HTTP1.1で再トライします"
    if ! /usr/bin/curl -L -o "$LOCAL_TMP_DIR/$DL_FILE_NAME" "$STR_URL" --http1.1 --connect-timeout 20; then
      /bin/echo "ファイルのダウンロードに失敗しました"
      exit 1
    fi
  fi
fi
##全ユーザー実行可能にしておく
/bin/chmod 755 "$LOCAL_TMP_DIR/$DL_FILE_NAME"
/bin/echo "ダウンロードOK"

########################################
###アプリケーションの終了
###コンソールユーザーにのみ処理する
CONSOLE_USER=$(/bin/echo "show State:/Users/ConsoleUser" | /usr/sbin/scutil | /usr/bin/awk '/Name :/ { print $3 }')
/bin/echo "CONSOLE_USER:$CONSOLE_USER"
if [ -z "$CONSOLE_USER" ]; then
  /bin/echo "コンソールユーザーが無い=電源入れてログインウィンドウ状態"
else
  #####OSAスクリプトはエラーすることも多い(初回インストール時はエラーになる)
  if ! /usr/bin/sudo -u "$CONSOLE_USER" /usr/bin/osascript -e "tell application id \"com.tinyspeck.slackmacgap\" to quit"; then
    ##念の為 KILLもする
    /usr/bin/killall "Slack" 2>/dev/null
    /usr/bin/killall "Slack Helper" 2>/dev/null
    /usr/bin/killall "Slack Helper (GPU)" 2>/dev/null
    /usr/bin/killall "Slack Helper (Renderer)" 2>/dev/null
  fi
fi
/bin/sleep 2
############################################################
###ローカルのユーザーアカウントを取得
TEXT_RESULT=$(/usr/bin/dscl localhost -list /Local/Default/Users PrimaryGroupID | /usr/bin/awk '$2 == 20 { print $1 }')
###リストにする
read -d '\\n' -r -a LIST_USER <<<"$TEXT_RESULT"
###リスト内の項目数
NUM_CNT=${#LIST_USER[@]}
/bin/echo "ユーザー数:" "$NUM_CNT"

############################################################
##リストの内容を順番に処理
for ITEM_LIST in "${LIST_USER[@]}"; do
  /bin/echo "LIST_USER:MKDIR:" "${ITEM_LIST}"
  ##ライブラリの不可視属性を解除
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/chflags nohidden "/Users/${ITEM_LIST}/Library"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/SetFile -a v "/Users/${ITEM_LIST}/Library"
  ##ユーザーアプリケーションフォルダを作る
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/mkdir -p "/Users/${ITEM_LIST}/Applications"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Applications"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/sbin/chown "${ITEM_LIST}" "/Users/${ITEM_LIST}/Applications"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/touch "/Users/${ITEM_LIST}/Applications/.localized"
  ##ユーザーユーティリティフォルダを作る
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/mkdir -p "/Users/${ITEM_LIST}/Applications/Utilities"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 755 "/Users/${ITEM_LIST}/Applications/Utilities"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/sbin/chown "${ITEM_LIST}" "/Users/${ITEM_LIST}/Applications/Utilities"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/touch "/Users/${ITEM_LIST}/Applications/Utilities/.localized"
  ## Managed Itemsフォルダを作る
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/mkdir -p "/Users/${ITEM_LIST}/Library/Managed Items"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 755 "/Users/${ITEM_LIST}/Library/Managed Items"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/sbin/chown "${ITEM_LIST}" "/Users/${ITEM_LIST}/Library/Managed Items"
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/touch "/Users/${ITEM_LIST}/Library/Managed Items/.localized"
  ##アクセス権チェック
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Library"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Movies"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 /"Users/${ITEM_LIST}/Music"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Pictures"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Downloads"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Documents"
  /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 700 "/Users/${ITEM_LIST}/Desktop"
  ##全ローカルユーザーに対して実施したい処理があれば追加する
  /bin/echo "ユーザーディレクトリチェックDONE"
done
############################################################
for ITEM_LIST in "${LIST_USER[@]}"; do
  /bin/echo "LIST_USER:CLEAR:" "${ITEM_LIST}"
  #####古いファイルをゴミ箱に USER
  function DO_MOVE_TO_TRASH() {
    if [ -e "$1" ]; then
      TRASH_DIR=$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/mktemp -d "/Users/${ITEM_LIST}/.Trash/XXXXXXXX")
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 777 "$TRASH_DIR"
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/mv "$1" "$TRASH_DIR"
    fi
}
  #####古いファイルをゴミ箱に USER
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Applications/Slack.app"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/Cache"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/Code Cache"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/DawnCache"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/GPUCache"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/logs"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/IndexedDB"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/File System"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/Service Worker/CacheStorage"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Application Support/Slack/Service Worker/ScriptCache"

  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Caches/Slack"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Caches/com.tinyspeck.slackmacgap"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/Caches/com.tinyspeck.slackmacgap.helper"

  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/HTTPStorages/com.tinyspeck.slackmacgap"
  DO_MOVE_TO_TRASH "/Users/${ITEM_LIST}/Library/HTTPStorages/com.tinyspeck.slackmacgap.binarycookies"

  /bin/echo "ユーザーキャッシュ削除DONE"
  ############################################################
  ###/var/folde T
  MKTEMP_DIR=$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/mktemp -d)
  TEMP_DIR_T="$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/dirname "$MKTEMP_DIR")"
  function DO_MOVE_TO_TRASH_T() {
    if [ -e "$1" ]; then
      TRASH_DIR=$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/mktemp -d "/Users/${ITEM_LIST}/.Trash/XXXXXXXX")
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 777 "$TRASH_DIR"
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/mv "$1" "$TRASH_DIR"
    fi
}
  #####古いファイルをゴミ箱に
  DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap"
  DO_MOVE_TO_TRASH_T "$TEMP_DIR_T/com.tinyspeck.slackmacgap.binarycookies"
  /bin/echo "ユーザーキャッシュT DONE"
  ############################################################
  ###/var/folder C
  TEMP_DIR="$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/dirname "$TEMP_DIR_T")"
  TEMP_DIR_C="${TEMP_DIR}/C"
  function DO_MOVE_TO_TRASH_C() {
    if [ -e "$1" ]; then
      TRASH_DIR=$(/usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/mktemp -d "/Users/${ITEM_LIST}/.Trash/XXXXXXXX")
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/chmod 777 "$TRASH_DIR"
      /usr/bin/sudo -u "${ITEM_LIST}" /bin/mv "$1" "$TRASH_DIR"
    fi
}
  #####古いファイルをゴミ箱に
  DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap"
  DO_MOVE_TO_TRASH_C "$TEMP_DIR_C/com.tinyspeck.slackmacgap.binarycookies"
  /bin/echo "ユーザーキャッシュ C DONE"
done

############################################################
#########
for ITEM_LIST in "${LIST_USER[@]}"; do
  /bin/echo "LIST_USER:DITTO:" "${ITEM_LIST}"
  ###ディスクをマウント
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/hdiutil attach "$LOCAL_TMP_DIR/$DL_FILE_NAME" -noverify -nobrowse -noautoopen
  sleep 2
  ####コピーして
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/ditto "/Volumes/Slack/Slack.app" "/Users/${ITEM_LIST}/Applications/Slack.app"
  sleep 2
  ###ディスクをアンマウント
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/hdiutil detach /Volumes/Slack -force
  ###Dockに追加して
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/defaults write com.apple.dock persistent-apps -array-add "<dict><key>tile-data</key><dict><key>file-data</key><dict><key>_CFURLString</key><string>$HOME/Applications/Slack.app</string><key>_CFURLStringType</key><integer>0</integer></dict></dict></dict>"
  ###反映させて
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/killall cfprefsd
  ###Dockを再起動
  /usr/bin/sudo -u "${ITEM_LIST}" /usr/bin/killall Dock
done

############################################
###Applicationsにインストールされている場合
if [ -e "/Applications/Slack.app" ]; then
  /usr/bin/sudo /bin/chmod -Rf 777 "/Applications/Slack.app"
  TRASH_DIR=$(/usr/bin/sudo -u "$SUDO_USER" /usr/bin/mktemp -d "/Users/$SUDO_USER/.Trash/XXXXXXXX")
  /usr/bin/sudo -u "$SUDO_USER" /bin/chmod 777 "$TRASH_DIR"
  /usr/bin/sudo -u "$SUDO_USER" /bin/mv "/Applications/Slack.app" "$TRASH_DIR"
  /bin/echo "アプリケーション DONE"
fi

###TCC設定を行わない場合は削除して
/usr/bin/tccutil reset All com.tinyspeck.slackmacgap

exit 0

|

UTIからアプリケーションのインストール先を求める

【スクリプトエディタで開く】

#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
#
#
#
# com.cocolog-nifty.quicktimer.icefloe
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
##自分環境がos12なので2.8にしているだけです
use AppleScript version "2.8"
use framework "Foundation"
use framework "AppKit"
use scripting additions


property refMe : a reference to current application

###対象のアプリケーションのUTI
set strUTI to "com.skype.skype" as text


####UTIからアプリケーションのインストール先を求める
set ocidAppBundle to refMe's NSBundle's bundleWithIdentifier:strUTI
if ocidAppBundle is missing value then
  set appNSWorkspace to refMe's NSWorkspace's sharedWorkspace()
  set ocidAppBundlePathURL to (appNSWorkspace's URLForApplicationWithBundleIdentifier:strUTI)
else
  set ocidAppBundleStr to ocidAppBundle's bundlePath()
  set ocidAppBundlePath to ocidAppBundleStr's stringByStandardizingPath
  set ocidAppBundlePathURL to (refMe's NSURL's fileURLWithPath:ocidAppBundlePath)
end if
log ocidAppBundlePathURL as alias
return ocidAppBundlePathURL as alias


|

[admin]インストール済みアプリケーションのバージョンを求める


-->application file
####起動させないなら
tell application "Finder"
    set aliasAppPath to (application file id "com.tinyspeck.slackmacgap") as alias
end tell

tell application "Finder"
    set strAppPath to POSIX path of (application file id "com.tinyspeck.slackmacgap" as alias) as text
end tell

set strPlistPath to strAppPath & "Contents/Info.plist"
set strCommandText to "/usr/bin/defaults read \"" & strPlistPath & "\" CFBundleShortVersionString"
set strAppVer to do shell script strCommandText

log strAppVer
-->    (*4.29.149*)


use framework "Foundation"
use scripting additions


property refMe : a reference to current application

set strUTI to "com.google.Chrome" as text


tell application "Finder"
    set fileAppPath to application file id strUTI
    set aliasAppPath to fileAppPath as alias
    set strAppPath to POSIX path of aliasAppPath as text
end tell

set ocidAppBundle to refMe's NSBundle's bundleWithPath:strAppPath
set ocidAppName to ocidAppBundle's objectForInfoDictionaryKey:"CFBundleDisplayName"
log ocidAppName as text
-->(*Google Chrome*)


set ocidAppVer to ocidAppBundle's objectForInfoDictionaryKey:"CFBundleShortVersionString"
log ocidAppVer as text
-->(*110.0.5481.177*)

|

[AppleScript]com.apple.TCC.configuration-profile-policyの作成補助

com.apple.TCC.configuration-profile-policyの
↓この部分を作成します

                        <dict>

                            <key>Allowed</key>

                            <true/>

                            <key>Identifier</key>

                            <string>com.tinyspeck.slackmacgap</string>

                            <key>IdentifierType</key>

                            <string>bundleID</string>

                            <key>Comment</key>

                            <string>Services com.tinyspeck.slackmacgap</string>

                            <key>CodeRequirement</key>

                            <string>identifier "com.tinyspeck.slackmacgap" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = BQR82RBBHL</string>

                        </dict>


ダウンロード - coderequirement.scpt.zip


#!/usr/bin/env osascript
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7
#
# 
#
#
# com.cocolog-nifty.quicktimer.icefloe
----+----1----+----2----+-----3----+----4----+----5----+----6----+----7


use framework "Foundation"
use AppleScript version "2.4"
use scripting additions
property objMe : a reference to current application
property objNSString : a reference to objMe's NSString


set aliasFile to (choose file with prompt "Appを選んでください" default location (path to applications folder from user domain) of type {"com.apple.application-bundle"} with invisibles without showing package contents and multiple selections allowed) as alias

tell application "Finder"

set objInfo to info for aliasFile
set strAppPath to POSIX path of aliasFile

set strUTI to bundle identifier of objInfo

end tell
set objCapText to objNSString's stringWithString:strUTI
set strCapText to (objCapText's lowercaseString()) as string

set strcodesign to (do shell script "codesign -dr - \"" & strAppPath & "\"") as text
set strcodesign to doReplace(strcodesign, "designated => ", "")
set strcodesign to doReplace(strcodesign, "(", "")
set strcodesign to doReplace(strcodesign, ")", "")


##set strTCC to "<dict>\n<key>Allowed</key><true/>\n<key>Identifier</key>\n<string>" & strCapText & "</string>\n<key>IdentifierType</key>\n<string>bundleID</string>\n<key>Comment</key>\n<string>Services " & strCapText & "</string>\n<key>CodeRequirement</key>\n<string>" & strcodesign & "</string>\n<key>StaticCode</key>\n<false/>\n</dict>\n"


set strTCC to "<dict>\n<key>Allowed</key><true/>\n<key>Identifier</key>\n<string>" & strCapText & "</string>\n<key>IdentifierType</key>\n<string>bundleID</string>\n<key>Comment</key>\n<string>Services " & strCapText & "</string>\n<key>CodeRequirement</key>\n<string>" & strcodesign & "</string>\n</dict>\n"

set the clipboard to strTCC as text

to doReplace(theText, orgStr, newStr)
set oldDelim to AppleScript's text item delimiters
set AppleScript's text item delimiters to orgStr
set tmpList to every text item of theText
set AppleScript's text item delimiters to newStr
set tmpStr to tmpList as text
set AppleScript's text item delimiters to oldDelim
return tmpStr
end doReplace

|

[TCC]ユーザーTCC.dbの値の操作(リセット)bash版

[TCC]ユーザーTCC.dbの値の操作(リセット)
https://quicktimer.cocolog-nifty.com/icefloe/2022/03/post-927f65.html
こちらの記事のbash版


#!/bin/bash



###ここだけ設定項目

strAppPath="$HOME/Applications/Slack.app"


########

strUTI=""

#strUTI=`/usr/bin/defaults read  "${strAppPath}/Contents/Info.plist"  CFBundleIdentifier`

strCommandText="/usr/bin/defaults read  \"${strAppPath}/Contents/Info.plist\"  CFBundleIdentifier"

echo $strCommandText

strUTI=`eval "$strCommandText"`

echo $strUTI

########

/usr/bin/osascript <<END

tell application id  "$strUTI" to quit

END



########対象アプリが起動中の場合の終了処理

strCommandText="echo ${strAppPath##*/}"

strBaseName=`eval $strCommandText`

strCommandText="echo ${strBaseName%.*}"

strBaseName=`eval $strCommandText`

strCommandText="/usr/bin/killall \"${strBaseName}\""

eval $strCommandText


########本処理

##ユーザードメインのTCCdbのパス

strTCCdbPath="$HOME/Library/Application Support/com.apple.TCC/TCC.db"

##サービス一覧を収納

listService=("kTCCServiceSystemPolicySysAdminFiles" "kTCCServiceAccessibility" "kTCCServiceSystemPolicyAllFiles" "kTCCServiceScreenCapture" "kTCCServicePostEvent" "kTCCServiceAppleEvents" "kTCCServiceAccessibility" "kTCCServiceScreenCapture" "kTCCServicePostEvent" "kTCCServiceAccessibility" "kTCCServiceCamera" "kTCCServiceMicrophone" "kTCCServiceScreenCapture"  "kTCCServiceSystemPolicyAllFiles" "kTCCServiceAddressBook" "kTCCServiceContactsLimited" "kTCCServiceContactsFull" "kTCCServiceCalendar" "kTCCServiceReminders" "kTCCServiceTwitter" "kTCCServiceFacebook" "kTCCServiceSinaWeibo" "kTCCServiceTencentWeibo" "kTCCServiceShareKit" "kTCCServiceLiverpool" "kTCCServiceUbiquity" "kTCCServicePhotos" "kTCCServicePhotosAdd" "kTCCServiceCamera" "kTCCServiceMicrophone" "kTCCServiceWillow" "kTCCServiceMediaLibrary" "kTCCServiceSiri" "kTCCServiceMotion" "kTCCServiceSpeechRecognition" "kTCCServiceUserTracking" "kTCCServiceBluetoothAlways" "kTCCServiceWebKitIntelligentTrackingPrevention" "kTCCServicePrototype3Rights" "kTCCServicePrototype4Rights" "kTCCServiceGameCenterFriends" "kTCCServiceBluetoothPeripheral" "kTCCServiceBluetoothWhileInUse" "kTCCServiceKeyboardNetwork" "kTCCServiceMSO" "kTCCServiceCalls" "kTCCServiceFaceID" "kTCCServiceExposureNotificationRegion" "kTCCServiceFallDetection" "kTCCServiceNearbyInteraction" "kTCCServiceFocusStatus" "kTCCServiceUserAvailability" "kTCCServiceLinkedIn" "kTCCServiceListenEvent" "kTCCServiceSystemPolicyDeveloperFiles" "kTCCServiceDeveloperTool" "kTCCServiceFileProviderPresence" "kTCCServiceFileProviderDomain" "kTCCServiceSystemPolicyRemovableVolumes" "kTCCServiceSystemPolicyNetworkVolumes" "kTCCServiceSystemPolicyDesktopFolder" "kTCCServiceSystemPolicyDownloadsFolder" "kTCCServiceSystemPolicyDocumentsFolder")

#######

for (( i = 0; i < ${#listService[@]}; ++i )); do

logCommand=`/usr/bin/tccutil reset ${listService[$i]/kTCCService/} ${strUTI}`

echo $logCommand

done



exit

ダウンロード - tccutilreset.sh.zip

|

その他のカテゴリー

Accessibility Acrobat Acrobat 2020 Acrobat AddOn Acrobat Annotation Acrobat ARMDC Acrobat AV2 Acrobat BookMark Acrobat Classic Acrobat DC Acrobat Dialog Acrobat Distiller Acrobat Form Acrobat JS Acrobat Manifest Acrobat Menu Acrobat Open Acrobat Plugin Acrobat Preferences Acrobat Preflight Acrobat python Acrobat Reader Acrobat SCA Acrobat SCA Updater Acrobat Sequ Acrobat Sign Acrobat Stamps Acrobat Watermark Acrobat Windows Acrobat Windows Reader Admin Admin Account Admin Apachectl Admin configCode Admin Device Management Admin LaunchServices Admin Locationd Admin loginitem Admin Maintenance Admin Mobileconfig Admin Permission Admin Pkg Admin Power Management Admin Printer Admin SetUp Admin SMB Admin Support Admin System Information Admin Tools Admin Users Admin Volumes Adobe Adobe FDKO Adobe RemoteUpdateManager AppKit Apple AppleScript AppleScript do shell script AppleScript List AppleScript ObjC AppleScript Osax AppleScript PDF AppleScript Pictures AppleScript record AppleScript Script Editor AppleScript Script Menu AppleScript Shortcuts AppleScript Shortcuts Events AppleScript System Events AppleScript System Events Plist AppleScript Video Applications AppStore Archive Attributes Automator BackUp Barcode Barcode QR Barcode QR Decode Bash Basic Basic Path Bluetooth BOX Browser Calendar CD/DVD Choose Chrome CIImage CityCode CloudStorage Color com.apple.LaunchServices.OpenWith Console Contacts CotEditor CURL current application Date&Time delimiters Desktop Device Diff Disk Dock DropBox Droplet eMail Encode % Encode Decode Encode UTF8 Error EXIFData ffmpeg File Finder Firefox Folder FolderAction Fonts GIF github Guide HTML HTML Entity Icon Illustrator Image Events Image2PDF ImageOptim iPhone iWork Javascript Jedit Json Label Leading Zero List locationd LRC lsappinfo LSSharedFileList m3u8 Mail MakePDF Map Math Media Media AVAsset Media AVconvert Media AVFoundation Media AVURLAsset Media Movie Media Music Memo Messages Microsoft Microsoft Edge Microsoft Excel Mouse Music NetWork Notes NSArray NSArray Sort NSBezierPath NSBitmapImageRep NSBundle NSCFBoolean NSCharacterSet NSColor NSColorList NSData NSDecimalNumber NSDictionary NSError NSEvent NSFileAttributes NSFileManager NSFileManager enumeratorAtURL NSFont NSFontManager NSGraphicsContext NSImage NSIndex NSKeyedArchiver NSKeyedUnarchiver NSLocale NSMutableArray NSMutableDictionary NSMutableString NSNotFound NSNumber NSOpenPanel NSPasteboard NSpoint NSPredicate NSPrintOperation NSRange NSRect NSRegularExpression NSRunningApplication NSScreen NSSize NSString NSString stringByApplyingTransform NSStringCompareOptions NSTask NSTimeZone NSURL NSURL File NSURLBookmark NSURLComponents NSURLResourceKey NSURLSession NSUserDefaults NSUUID NSView NSWorkspace Numbers OAuth OneDrive PDF PDFAnnotation PDFAnnotationWidget PDFContext PDFDisplayBox PDFDocumentPermissions PDFImageRep PDFKit PDFnUP PDFOutline perl Photoshop PlistBuddy pluginkit postalcode PostScript prefPane Preview Python QuickLook QuickTime ReadMe Regular Expression Reminders ReName Repeat RTF Safari SaveFile ScreenCapture ScreenSaver SF Symbols character id SF Symbols Entity sips Skype Slack Sound Spotlight sqlite SRT StandardAdditions Swift System Settings TCC TemporaryItems Terminal Text Text CSV Text MD Text TSV TextEdit Tools Translate Trash Twitter Typography UI Unit Conversion UTType valueForKeyPath Video VisionKit Visual Studio Code Wacom webarchive webp Wifi Windows XML XML EPUB XML OPML XML Plist XML RSS XML savedSearch XML SVG XML TTML XML webloc XML XMP YouTube zoom