297 lines
10 KiB
Bash
Executable File
297 lines
10 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#===============================================================================
|
|
#
|
|
# DIRECTORY:
|
|
# ---
|
|
#
|
|
# FILE:
|
|
# ./applications_plugin.sh
|
|
#
|
|
# USAGE:
|
|
# . applications_plugin.sh
|
|
# OR
|
|
# source applications_plugin.sh
|
|
#
|
|
# DESCRIPTION:
|
|
# Applications_plugin plugin (library) to generate content with simple template engine.
|
|
#
|
|
# BUGS:
|
|
# ---
|
|
#
|
|
# TESTS:
|
|
# - shellcheck -s bash -e SC2034 ./applications_plugin.sh
|
|
# - shellcheck -s ksh -e SC2034 ./applications_plugin.sh
|
|
# - shellcheck -s dash -e SC2034 ./applications_plugin.sh
|
|
#
|
|
# AUTHOR:
|
|
# Patrick Neumann, patrick@neumannsland.de
|
|
#
|
|
# COAUTHOR(S):
|
|
# Odin Heitmann, odin.heitmann@gmail.com
|
|
#
|
|
# COMPANY:
|
|
# (privately)
|
|
#
|
|
# VERSION:
|
|
# 1.0
|
|
#
|
|
# LINK TO THE MOST CURRENT VERSION:
|
|
# (Sorry, we bet, I'm not allowed to publish it over GitHub!)
|
|
#
|
|
# CREATED:
|
|
# 2018-06-01
|
|
#
|
|
# COPYRIGHT (C):
|
|
# 2018 - Patrick Neumann & Odin Heitmann
|
|
#
|
|
# LICENSE:
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# WARRANTY:
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# NOTES:
|
|
# ---
|
|
#
|
|
# TODO:
|
|
# ---
|
|
#
|
|
# HISTORY:
|
|
# 1.0 - P. N. & O. H. - Initial (for the trainers eyes only) release
|
|
#
|
|
#===============================================================================
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# Check if functions library is loaded first.
|
|
#-------------------------------------------------------------------------------
|
|
if [ "${FUNCTIONS_LOADED}" != "true" ] ; then
|
|
printf "\\n\\033[01;31;40mERROR: functions library not loaded... EXIT!!!\\033[00m\\n\\n"
|
|
exit 200
|
|
fi
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# Check if temblate engine library is loaded first.
|
|
#-------------------------------------------------------------------------------
|
|
if [ "${TEMPLATE_ENGINE_LOADED}" != "true" ] ; then
|
|
error_exit "template_engine.sh not loaded" 200
|
|
fi
|
|
|
|
#=== CONFIGURATION (static) ====================================================
|
|
#assign_binary "xyz" # (un)common
|
|
|
|
#=== FUNCTION ==================================================================
|
|
# NAME: process_plists
|
|
# DESCRIPTION: ...
|
|
# PARAMETER1 : string (file)
|
|
#===============================================================================
|
|
process_plists () {
|
|
# Apps are not part of the iTunes Backup!
|
|
plist_bin2xml "${1}" "/tmp/iTunesMetadata.plist"
|
|
local APP_ID="$( ${BIN_GREP} --fixed-strings --after-context=1 "softwareVersionBundleId" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
local APP_NAME="$( ${BIN_GREP} --fixed-strings --after-context=1 "bundleDisplayName" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
local APP_VERSION="$( ${BIN_GREP} --fixed-strings --after-context=1 "bundleVersion" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
local APP_DEVELOPER="$( ${BIN_GREP} --fixed-strings --after-context=1 "artistName" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
local APP_PURCHASED="$( ${BIN_GREP} --fixed-strings --after-context=1 "purchaseDate" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
local APP_APPLEID="$( ${BIN_GREP} --fixed-strings --after-context=1 "AppleID" /tmp/iTunesMetadata.plist \
|
|
| ${BIN_TAIL} -n 1 \
|
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
|
# In dash, string replacement is not supported
|
|
# Because in dash, string replacement is not supported we can not use:
|
|
# echo ${1/${IOS_BACKUP}/\/private\/var}
|
|
${BIN_PRINTF} "<li><a href='${APP_ID}-iTunesMetadata.plist' target='_blank'><code>$( ${BIN_PRINTF} "${1}" | ${BIN_SED} "s|${IOS_BACKUP}|/private/var|" )</code></a></li>\\n" >> /tmp/apps_sources.html
|
|
${BIN_PRINTF} "<tr>\\n
|
|
<td>${APP_ID}</td>\\n
|
|
<td>${APP_NAME}</td>\\n
|
|
<td>${APP_VERSION}</td>\\n
|
|
<td>${APP_DEVELOPER}</td>\\n
|
|
<td>${APP_PURCHASED}</td>\\n
|
|
<td>${APP_APPLEID}</td>\\n
|
|
</tr>\\n" >> /tmp/apps_list.html
|
|
${BIN_MV} /tmp/iTunesMetadata.plist "${FOLDER}/${APP_ID}-iTunesMetadata.plist"
|
|
}
|
|
|
|
#=== FUNCTION ==================================================================
|
|
# NAME: get_applications_list
|
|
# DESCRIPTION: "Grep" information and store into vars.
|
|
# PARAMETERS: none (global vars will be used.)
|
|
#===============================================================================
|
|
get_applications_list () {
|
|
# Default applications visible by a user taken from iOS 10.3.3
|
|
readonly DEFAULT_APPS_LIST1="<li>Phone</li>
|
|
<li>Safari</li>
|
|
<li>Mail</li>
|
|
<li>Music</li>
|
|
<li>Messages</li>
|
|
<li>Calendar</li>
|
|
<li>Photos</li>
|
|
<li>Camera</li>"
|
|
|
|
readonly DEFAULT_APPS_LIST2="<li>Weather</li>
|
|
<li>Clock</li>
|
|
<li>Maps</li>
|
|
<li>Videos</li>
|
|
<li>Wallet</li>
|
|
<li>Notes</li>
|
|
<li>Reminders</li>
|
|
<li>Stocks</li>"
|
|
|
|
readonly DEFAULT_APPS_LIST3="<li>iTunes</li>
|
|
<li>App Store</li>
|
|
<li>iBooks</li>
|
|
<li>Health</li>
|
|
<li>Home</li>
|
|
<li>Settings</li>
|
|
<li>FaceTime</li>
|
|
<li>Calculator</li>"
|
|
|
|
readonly DEFAULT_APPS_LIST4="<li>Podcasts</li>
|
|
<li>Watch</li>
|
|
<li>Compass</li>
|
|
<li>Tips</li>
|
|
<li>Voice Memos</li>
|
|
<li>Contacts</li>
|
|
<li>Find Friends</li>
|
|
<li>Find iPhone</li>"
|
|
|
|
# Some possible sources for informations:
|
|
# - Phone: /private/var/mobile/Library/CallHistory/CallHistory.storedata
|
|
# or: 5a4935c78a5255723f707230a451d79c540d2741
|
|
#
|
|
# - Safari: /private/var/mobile/Library/Safari/Bookmarks.db
|
|
# or: d1f062e2da26192a6625d968274bfda8d07821e4
|
|
#
|
|
# - Mail: "/private/var/mobile/Library/Envelope Index"
|
|
# or: ???
|
|
#
|
|
# - Messages: /private/var/mobile/Library/SMS/sms.db
|
|
# or: 3d0d7e5fb2ce288813306e4d4636395e047a3d28
|
|
#
|
|
# - Calendar: /private/var/mobile/Library/Calendar/Calendar.sqlitedb
|
|
# or: 2041457d5fe04d39d0ab481178355df6781e6858
|
|
#
|
|
# - Notes: /private/var/mobile/Library/Notes/notes.sqlite
|
|
# or: ca3bc056d4da0bbf88b5fb3be254f3b7147e639c
|
|
#
|
|
# - iTunes Store: /private/var/mobile/Library/com.apple.itunessotred/iTunesMetadata/itunessored2.sqlitedb
|
|
# or: ???
|
|
#
|
|
# - Contacts: /private/var/mobile/Library/AddressBook/AddressBook.sqlitedb
|
|
# or: 31bb7ba8914766d4ba40d6dfb6113c8b614be442
|
|
|
|
readonly APP_DIR="mobile/Containers/Bundle/Application"
|
|
|
|
if ! [ -d "${IOS_BACKUP}/${APP_DIR}" ] ; then
|
|
error "${IOS_BACKUP}/${APP_DIR} not found"
|
|
readonly APPS_LIST_HTML="<tr><td class='highlight' colspan='6'>ERROR: app directory not found!</td></tr>"
|
|
else
|
|
|
|
# Not 100% save but easy! Will break if newlines are in the path to the plist!
|
|
${BIN_FIND} "${IOS_BACKUP}"/mobile/Containers/Bundle/Application -name "iTunesMetadata.plist" \
|
|
| while read -r file ; do process_plists "${file}" ; done
|
|
|
|
APPS_SOURCES_HTML="$( ${BIN_CAT} /tmp/apps_sources.html )"
|
|
${BIN_RM} /tmp/apps_sources.html
|
|
|
|
if [ -z "${APPS_SOURCES_HTML}" ] ; then
|
|
APPS_SOURCES_HTML="<li>none</li>"
|
|
fi
|
|
|
|
readonly APPS_LIST_HTML="$( ${BIN_CAT} /tmp/apps_list.html )"
|
|
${BIN_RM} /tmp/apps_list.html
|
|
|
|
fi
|
|
|
|
if [ "${DEBUG}" = "on" ] ; then
|
|
${BIN_PRINTF} "INFO: applications_plugin processed.\\n" 1>&2
|
|
fi
|
|
}
|
|
|
|
#-------------------------------------------------------------------------------
|
|
# Partial template for applications information for the simple template engine.
|
|
#-------------------------------------------------------------------------------
|
|
# SC2034: all "unused" vars are verified!
|
|
APPLICATIONS_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
|
<h2>Applications</h2>
|
|
<h3>Preinstalled</h3>
|
|
<div class='ym-grid ym-equalize linearize-level-1'>
|
|
<div class='ym-g50 ym-gl'>
|
|
<div class='ym-grid'>
|
|
<div class='ym-g50 ym-gl'>
|
|
<div class='ym-gbox'>
|
|
<ul>
|
|
${DEFAULT_APPS_LIST1}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ym-g50 ym-gr'>
|
|
<div class='ym-gbox'>
|
|
<ul>
|
|
${DEFAULT_APPS_LIST2}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class='ym-g50 ym-gr'>
|
|
<div class='ym-grid'>
|
|
<div class='ym-g50 ym-gl'>
|
|
<div class='ym-gbox'>
|
|
<ul>
|
|
${DEFAULT_APPS_LIST3}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class='ym-g50 ym-gr'>
|
|
<div class='ym-gbox'>
|
|
<ul>
|
|
${DEFAULT_APPS_LIST4}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<h4>Sources</h4>
|
|
<ul class="file">
|
|
${APPS_SOURCES_HTML}
|
|
</ul>
|
|
<h3>Installed by user</h3>
|
|
<table>
|
|
<tr>
|
|
<th>AppID</th>
|
|
<th>Name</th>
|
|
<th>Version</th>
|
|
<th>Developer</th>
|
|
<th>Purchased</th>
|
|
<th>AppleID</th>
|
|
</tr>
|
|
${APPS_LIST_HTML}
|
|
</table>
|
|
EOF
|
|
)
|
|
|
|
readonly APPLICATIONS_PLUGIN_LOADED="true"
|
|
|
|
if [ "${DEBUG}" = "on" ] ; then
|
|
${BIN_PRINTF} "INFO: applications_plugin.sh loaded.\\n" 1>&2
|
|
fi
|
|
# Do not use "exit" at the end of a sourced library! |