added ios2html libraries folder
This commit is contained in:
1 parent
ca5a313fe0
commit
0f7263c03b
13 files changed
+2911
No files matched your search
Executable
+152
@@ -0,0 +1,152 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./accounts_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . accounts_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source accounts_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Accounts plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034 ./accounts_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034 ./accounts_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034 ./accounts_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: get_accounts_list
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_accounts_list () {
|
||||||
|
# "943624fd13e27b800cc6d9ce1100c22356ee365c" in iTunes Backup.
|
||||||
|
readonly ACCOUNTS_SQLITE="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "Accounts3.sqlite" )"
|
||||||
|
|
||||||
|
if [ -z "${ACCOUNTS_SQLITE}" ] ; then
|
||||||
|
readonly ACCOUNTS_SOURCE="<code>Accounts3.sqlite not found</code>"
|
||||||
|
error "Accounts3.sqlite not found"
|
||||||
|
readonly ACCOUNTS_LIST="<tr><td class='highlight' colspan='4'>ERROR: database not found!</td></tr>"
|
||||||
|
else
|
||||||
|
readonly ACCOUNTS_SOURCE="<a href='Accounts3.sqlite' target='_blank'><code>${ACCOUNTS_SQLITE/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
# * -> don't forget to copy write ahead log!
|
||||||
|
${BIN_CP} "${ACCOUNTS_SQLITE}"* "${FOLDER}/"
|
||||||
|
|
||||||
|
readonly ACCOUNTS_LIST="$( ${BIN_SQLITE3} -html "${FOLDER}/Accounts3.sqlite" \
|
||||||
|
"SELECT a.Z_PK, \
|
||||||
|
DATETIME(a.ZDATE+978307200, 'unixepoch'), \
|
||||||
|
t.ZACCOUNTTYPEDESCRIPTION, \
|
||||||
|
a.ZUSERNAME \
|
||||||
|
FROM ZACCOUNT AS a, \
|
||||||
|
ZACCOUNTTYPE AS t \
|
||||||
|
WHERE a.ZACCOUNTTYPE=t.Z_PK;" )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: accounts_plugin processed.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
ACCOUNTS_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Accounts</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${ACCOUNTS_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Username</th>
|
||||||
|
</tr>
|
||||||
|
${ACCOUNTS_LIST}
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly ACCOUNTS_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: accounts_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+158
@@ -0,0 +1,158 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./addressbook_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . addressbook_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source addressbook_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# AddressBook plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034 ./AddressBook_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034 ./AddressBook_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034 ./AddressBook_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: get_addressbook_list
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_addressbook_list () {
|
||||||
|
# "8e281be6657d4523710d96341b6f86ba89b56df7" in iTunes Backup.
|
||||||
|
readonly ADDRESSBOOK_SQLITE="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "AddressBook.sqlitedb" )"
|
||||||
|
|
||||||
|
if [ -z "${ADDRESSBOOK_SQLITE}" ] ; then
|
||||||
|
readonly ADDRESSBOOK_SOURCE="<code>AddressBook.sqlitedb not found</code>"
|
||||||
|
error "AddressBook.sqlitedb not found"
|
||||||
|
readonly ADDRESSBOOK_PERSON="<tr><td class='highlight' colspan='4'>ERROR: database not found!</td></tr>"
|
||||||
|
else
|
||||||
|
readonly ADDRESSBOOK_SOURCE="<a href='AddressBook.sqlitedb' target='_blank'><code>${ADDRESSBOOK_SQLITE/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
# Don't forget to copy write ahead log!
|
||||||
|
${BIN_CP} "${ADDRESSBOOK_SQLITE}"* "${FOLDER}/"
|
||||||
|
|
||||||
|
readonly readonly ADDRESSBOOK_PERSON="$( ${BIN_SQLITE3} -html "${FOLDER}/AddressBook.sqlitedb" \
|
||||||
|
"SELECT
|
||||||
|
person.ROWID,
|
||||||
|
person.First,
|
||||||
|
person.Middle,
|
||||||
|
person.Last,
|
||||||
|
multivalue.value
|
||||||
|
FROM
|
||||||
|
ABPerson AS person,
|
||||||
|
ABMultiValue AS multivalue
|
||||||
|
WHERE
|
||||||
|
multivalue.record_id=person.ROWID;" )"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: addressaook_plugin processed.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
ADDRESSBOOK_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>AddressBook / Contacts</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${ADDRESSBOOK_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Contacts</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>First name</th>
|
||||||
|
<th>Middle name</th>
|
||||||
|
<th>Last name</th>
|
||||||
|
<th>Value</th>
|
||||||
|
</tr>
|
||||||
|
${ADDRESSBOOK_PERSON}
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly ADDRESSBOOK_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: addressaook_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+297
@@ -0,0 +1,297 @@
|
|||||||
|
#!/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!
|
||||||
Executable
+198
@@ -0,0 +1,198 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./configuration_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . configuration_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source configuration_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Configuration plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e 2034 ./configuration_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e 2034 ./configuration_plugin.sh
|
||||||
|
# - shellcheck -s dash -e 2034 ./configuration_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: get_configuration_info
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_configuration_info () {
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
# There are two data_ark.plist:
|
||||||
|
# - mobile/Library/mad/data_ark.plist
|
||||||
|
# - root/Library/Lockdown/data_ark.plist
|
||||||
|
readonly DATA_ARK_PLIST="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -path "*Lockdown/data_ark.plist" )"
|
||||||
|
|
||||||
|
if [ -z "${DATA_ARK_PLIST}" ] ; then
|
||||||
|
readonly DATA_ARK_SOURCE="<code>data_ark.plist not found</code>"
|
||||||
|
error "data_ark.plist not found"
|
||||||
|
readonly DEVICE_NAME="unknown"
|
||||||
|
readonly TIME_ZONE="unknown"
|
||||||
|
readonly LOCALE="unknown"
|
||||||
|
else
|
||||||
|
readonly DATA_ARK_SOURCE="<a href='data_ark.plist' target='_blank'><code>${DATA_ARK_PLIST/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
plist_bin2xml "${DATA_ARK_PLIST}" "${FOLDER}/data_ark.plist"
|
||||||
|
|
||||||
|
readonly DEVICE_NAME="$( ${BIN_GREP} --fixed-strings --after-context=1 "DeviceName" "${FOLDER}/data_ark.plist" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
readonly TIME_ZONE="$( ${BIN_GREP} --fixed-strings --after-context=1 "TimeZone" "${FOLDER}/data_ark.plist" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
|
||||||
|
readonly LOCALE="$( ${BIN_GREP} --fixed-strings --after-context=1 "com.apple.international-Locale" "${FOLDER}/data_ark.plist" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#--- next source ---
|
||||||
|
|
||||||
|
# "7ddb1ea8c09e5baae5e2d2ecac604a4e4e3087de" in iTunes Backup.
|
||||||
|
LOCK_BACKGROUND="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "LockBackgroundThumbnail.jpg" )" # <- could be modified later!
|
||||||
|
|
||||||
|
if [ -z "${LOCK_BACKGROUND}" ] ; then
|
||||||
|
readonly LOCK_BACKGROUND="LockBackgroundThumbnail.jpg not found"
|
||||||
|
readonly LOCK_BACKGROUND_SOURCE="<code>${LOCK_BACKGROUND}</code>"
|
||||||
|
error "LockBackgroundThumbnail.jpg not found"
|
||||||
|
else
|
||||||
|
readonly LOCK_BACKGROUND_SOURCE="<a href='LockBackgroundThumbnail.jpg' target='_blank'><code>${LOCK_BACKGROUND/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
${BIN_CP} "${LOCK_BACKGROUND}" "${FOLDER}/"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: LockBackgroundThumbnail.jpg copied\\n" 1>&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "DEVICE_NAME: %s\\n" "${DEVICE_NAME}" 1>&2
|
||||||
|
${BIN_PRINTF} "TIME_ZONE: %s\\n" "${TIME_ZONE}" 1>&2
|
||||||
|
${BIN_PRINTF} "LOCALE: %s\\n" "${LOCALE}" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
CONFIGURATION_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Configuration</h2>
|
||||||
|
<div class='ym-grid'>
|
||||||
|
<div class='ym-g75 ym-gl'>
|
||||||
|
<div class='ym-gbox'>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${DATA_ARK_SOURCE}</li>
|
||||||
|
<li>${LOCK_BACKGROUND_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Device Name:</td>
|
||||||
|
<td>${DEVICE_NAME}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Time Zone:</td>
|
||||||
|
<td>${TIME_ZONE}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Locale:</td>
|
||||||
|
<td>${LOCALE}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='ym-g25 ym-gr'>
|
||||||
|
<div class='ym-gbox'>
|
||||||
|
<h3>Background</h3>
|
||||||
|
<img alt='${LOCK_BACKGROUND}' class='center' src='LockBackgroundThumbnail.jpg' title='Lock Background Image' height='240'>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly CONFIGURATION_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: configuration_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+541
@@ -0,0 +1,541 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./functions.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . functions.sh
|
||||||
|
# OR
|
||||||
|
# source functions.sh
|
||||||
|
#
|
||||||
|
# OPTIONS:
|
||||||
|
# none
|
||||||
|
#
|
||||||
|
# EXIT STATES:
|
||||||
|
# 101 = uncommon binary not installed
|
||||||
|
# 102 = logfile not defined/supplied
|
||||||
|
# 103 = dir for logfile not writable
|
||||||
|
# 104 = logfile already exists but is not writable
|
||||||
|
# 105 = common binary not installed
|
||||||
|
# 106 = your os is not supported (yet)
|
||||||
|
# 107 = illegal browser command supplied
|
||||||
|
# 108 = no case number supplied
|
||||||
|
# 109 = folder not defined/supplied
|
||||||
|
# 110 = folder already exists
|
||||||
|
# 111 = unable to create folder
|
||||||
|
# 112 = ios_backup not supplied
|
||||||
|
# 113 = ios_backup does not exist
|
||||||
|
# 114 = ios_backup is not a directory
|
||||||
|
# 115 = ios_backup is empty
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Global functions (and configuration library) for scripts.
|
||||||
|
#
|
||||||
|
# REQUIREMENTS:
|
||||||
|
# which, uname, basename, ps, grep, awk, sed, dirname, tee, ...
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034,SC2016,SC2027,SC2086 ./functions.sh
|
||||||
|
# - shellcheck -s bksh -e SC2034,SC2016,SC2027,SC2086 ./functions.sh
|
||||||
|
# - shellcheck -s dash -e SC2034,SC2016,SC2027,SC2086 ./functions.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, I 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:
|
||||||
|
# - check if HOLE directory (ios_backup) is read-only
|
||||||
|
# - find a more portable solution for [[ in abspath
|
||||||
|
#
|
||||||
|
# HISTORY:
|
||||||
|
# 1.0 - P. N. & O. H. - Initial (for the trainers eyes only) release
|
||||||
|
#
|
||||||
|
#===============================================================================
|
||||||
|
|
||||||
|
# Relative paths are more portable but less secure.
|
||||||
|
# Absolute paths are more secure but less portable.
|
||||||
|
readonly BIN_WHICH="/usr/bin/which" # common
|
||||||
|
|
||||||
|
readonly BIN_AWK="$( ${BIN_WHICH} "awk" )" # common
|
||||||
|
readonly BIN_BASENAME="$( ${BIN_WHICH} "basename" )" # common
|
||||||
|
readonly BIN_DIRNAME="$( ${BIN_WHICH} "dirname" )" # common
|
||||||
|
readonly BIN_GREP="$( ${BIN_WHICH} "grep" )" # common
|
||||||
|
readonly BIN_PS="$( ${BIN_WHICH} "ps" )" # common
|
||||||
|
readonly BIN_TEE="$( ${BIN_WHICH} "tee" )" # common
|
||||||
|
readonly BIN_UNAME="$( ${BIN_WHICH} "uname" )" # common
|
||||||
|
readonly BIN_TR="$( ${BIN_WHICH} "tr" )" # common
|
||||||
|
readonly BIN_LS="$( ${BIN_WHICH} "ls" )" # common
|
||||||
|
readonly BIN_MKDIR="$( ${BIN_WHICH} "mkdir" )" # common
|
||||||
|
readonly BIN_CUT="$( ${BIN_WHICH} "cut" )" # common
|
||||||
|
readonly BIN_RM="$( ${BIN_WHICH} "rm" )" # common
|
||||||
|
readonly BIN_RMDIR="$( ${BIN_WHICH} "rmdir" )" # common
|
||||||
|
readonly BIN_PWD="$( ${BIN_WHICH} "pwd" )" # common
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Check existence of uncommon binaries.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
#[ -z "${BIN_BC}" ] && error_exit "please install bc and retry" 2
|
||||||
|
|
||||||
|
# Changeable defaults:
|
||||||
|
DEFAULT_SHELL="bash"
|
||||||
|
ECHO_FUNC="display_and_log"
|
||||||
|
GET_HELP="no"
|
||||||
|
DISABLE_LOGGING="no"
|
||||||
|
DISABLE_STDOUT="no"
|
||||||
|
GET_VERSION_ONLY="no"
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Detect the shell in which we are running and set shell depended vars.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2016: shellcheck fails if awk/sed is used!
|
||||||
|
readonly PROCESS="$( ${BIN_BASENAME} "$( ${BIN_PS} -axco pid,command \
|
||||||
|
| ${BIN_GREP} "$$" \
|
||||||
|
| ${BIN_GREP} -v "grep" \
|
||||||
|
| ${BIN_AWK} '{ print $2; }' )" )"
|
||||||
|
|
||||||
|
# Why conditinal command should be prefered over test:
|
||||||
|
# https://google-styleguide.googlecode.com/svn/trunk/shell.xml#Test,_[_and_[[
|
||||||
|
# and why you don't, if you would support "dash":
|
||||||
|
# http://mywiki.wooledge.org/Bashism
|
||||||
|
if [ "${PROCESS}" = "$( ${BIN_BASENAME} "${0}" )" ] ; then
|
||||||
|
readonly CURRENT_SHELL="${DEFAULT_SHELL}"
|
||||||
|
else
|
||||||
|
readonly CURRENT_SHELL="${PROCESS}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Linux can have alle shells and "/bin/echo" has no limitations.
|
||||||
|
# Darwin (14.5.0) has bash 3.2.57, zsh 5.0.5, ksh 93 and tcsh 6.17.00
|
||||||
|
# - kshs and tcshs builtin echo does not support "-e" and/or "-n"!
|
||||||
|
# - "/bin/echo" does not support "-e"!
|
||||||
|
# FreeBSD can have all shells, but "/bin/echo" has the same limitations!
|
||||||
|
# Solution: use printf instead!
|
||||||
|
# Worth readable Link: http://hyperpolyglot.org/unix-shells#echo-note
|
||||||
|
if [ "${CURRENT_SHELL}" = "zsh" ] ; then
|
||||||
|
# zsh does not split a string into words separated by spaces by default!
|
||||||
|
setopt shwordsplit
|
||||||
|
# zshs "which" find the builtin without "-p"!
|
||||||
|
readonly BIN_PRINTF="$( which -p printf )"
|
||||||
|
else
|
||||||
|
readonly BIN_PRINTF="$( which printf )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "CURRENT_SHELL: %s\\n" "${CURRENT_SHELL}" 1>&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Detect operating system name and set os depended vars.
|
||||||
|
# (eg. "sed -E" on macOS is the same as "sed -r" on Linux)
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
readonly OS_NAME="$( ${BIN_UNAME} -s )"
|
||||||
|
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) readonly BIN_ID="$( ${BIN_WHICH} "id" )" # common
|
||||||
|
readonly BIN_OPEN="$( ${BIN_WHICH} "open" )" # common
|
||||||
|
readonly SED_EXT_REGEXP="-E"
|
||||||
|
readonly DARWIN_FIND_REGEXP_TYPE="-E "
|
||||||
|
readonly DATE_DISPLAY="-j -f %s "
|
||||||
|
;;
|
||||||
|
Linux) readonly BIN_GETENT="$( ${BIN_WHICH} "getent" )" # common
|
||||||
|
readonly SED_EXT_REGEXP="--regexp-extended"
|
||||||
|
readonly DATE_DISPLAY="-d @"
|
||||||
|
;;
|
||||||
|
FreeBSD) readonly BIN_GETENT="$( ${BIN_WHICH} "getent" )" # common
|
||||||
|
readonly SED_EXT_REGEXP="-E"
|
||||||
|
readonly DATE_DISPLAY="-j -f %s "
|
||||||
|
readonly LINUX_FIND_REGEXP_TYPE="-regextype posix-extended "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
# printf has to be assinged before!
|
||||||
|
${BIN_PRINTF} "OS_NAME: %s\\n" "${OS_NAME}" 1>&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_logfile
|
||||||
|
# DESCRIPTION: Checks if a logfile is set and can be created.
|
||||||
|
# (needed in "log" and "display_and_log"!)
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
# Do not use "function" if you want to support dash:
|
||||||
|
# http://mywiki.wooledge.org/Bashism
|
||||||
|
check_logfile () {
|
||||||
|
if [ -z "${LOG_FILE}" ] ; then
|
||||||
|
# "error_exit" will be defined later!
|
||||||
|
${BIN_PRINTF} "\\033[01;31;40mERROR: logfile not defined/supplied... EXIT!!!\\033[00m\\n"
|
||||||
|
exit 102
|
||||||
|
fi
|
||||||
|
if ! [ -w "$( ${BIN_DIRNAME} "${LOG_FILE}" )" ] ; then
|
||||||
|
${BIN_PRINTF} "\\033[01;31;40mERROR: dir for logfile not writable... EXIT!!!\\033[00m\\n"
|
||||||
|
exit 103
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -e "${LOG_FILE}" ] ; then
|
||||||
|
if ! [ -w "${LOG_FILE}" ] ; then
|
||||||
|
${BIN_PRINTF} "\\033[01;31;40mERROR: logfile already exists but is not writable... EXIT!!!\\033[00m\\n"
|
||||||
|
exit 104
|
||||||
|
else
|
||||||
|
${BIN_PRINTF} "\\nlogfile does already exist, overwrite? \
|
||||||
|
(type YES in UPPER letters and hit return!) : "
|
||||||
|
read -r answer
|
||||||
|
if [ "${answer}" != "YES" ] ; then
|
||||||
|
${BIN_PRINTF} "\\033[01;34;40mHINT: move the old logfile to a save place and try again... EXIT!!!\\033[00m\\n"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
# clear logfile
|
||||||
|
${BIN_PRINTF} "" > "${LOG_FILE}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: display
|
||||||
|
# DESCRIPTION: Wrapper for "echo -n -e".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
display () {
|
||||||
|
${BIN_PRINTF} "${1}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: log
|
||||||
|
# DESCRIPTION: Wrapper for "echo -n -e" incl. redirection into logfile.
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
log () {
|
||||||
|
${BIN_PRINTF} "${1}" >> "${LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: display_and_log
|
||||||
|
# DESCRIPTION: Wrapper for "echo -n -e" incl. output to stdout AND redirection
|
||||||
|
# into logfile.
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
display_and_log () {
|
||||||
|
${BIN_PRINTF} "${1}" | ${BIN_TEE} -a "${LOG_FILE}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: quiet
|
||||||
|
# DESCRIPTION: Wrapper for "echo -n -e" incl. redirection into "nirvana".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
quiet () {
|
||||||
|
${BIN_PRINTF} "${1}" > /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: error
|
||||||
|
# DESCRIPTION: Display red error messages starting with "ERROR:".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
error () {
|
||||||
|
# TODO: stderr too!?
|
||||||
|
"${ECHO_FUNC}" "\\033[01;31;40mERROR: ${1}!!!\\033[00m\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: error_exit
|
||||||
|
# DESCRIPTION: Display red error messages surrounded by "ERROR:" and "EXIT!!!".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
# PARAMETER 2: exit state (integer)
|
||||||
|
# PARAMETER 3: command (optional)
|
||||||
|
#===============================================================================
|
||||||
|
error_exit () {
|
||||||
|
"${BIN_PRINTF}" "\\n\\033[01;31;40mERROR: ${1}... EXIT!!!\\033[00m\\n\\n"
|
||||||
|
|
||||||
|
# Execute command/function before exit
|
||||||
|
if [ -n "${3}" ] ; then
|
||||||
|
${3}
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up before exit
|
||||||
|
${BIN_RM} "${LOG_FILE}"
|
||||||
|
${BIN_RMDIR} "${FOLDER}"
|
||||||
|
|
||||||
|
if ! [ "${2}" -eq "${2}" ] 2> /dev/null ; then
|
||||||
|
exit "${2}"
|
||||||
|
else
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: hint
|
||||||
|
# DESCRIPTION: Display blue hint messages starting with "HINT:".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
hint () {
|
||||||
|
"${ECHO_FUNC}" "\\033[01;34;40m${1}\\033[00m\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: success
|
||||||
|
# DESCRIPTION: Display green success messages starting with "SUCCESS:".
|
||||||
|
# PARAMETER 1: message (string)
|
||||||
|
#===============================================================================
|
||||||
|
success () {
|
||||||
|
"${ECHO_FUNC}" "\\033[01;32;40mSUCCESS: ${1}!\\033[00m\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: assign_binary
|
||||||
|
# DESCRIPTION: check if binary exists and store the absolute path in a var.
|
||||||
|
# PARAMETER 1: command (string)
|
||||||
|
#===============================================================================
|
||||||
|
assign_binary () {
|
||||||
|
# Because in dash, string indexing is not supported we can not use:
|
||||||
|
# "${1:0:1}" = "/"
|
||||||
|
if [ "$( ${BIN_PRINTF} "${1}" | ${BIN_CUT} -c 1 )" = "/" ] ; then
|
||||||
|
# Absolute paths are more secure but less portable.
|
||||||
|
if ! [ -e "${1}" ] ; then
|
||||||
|
error_exit "${1} not installed" 105
|
||||||
|
fi
|
||||||
|
local var="BIN_$( ${BIN_PRINTF} "$( ${BIN_BASENAME} "${1}" )" \
|
||||||
|
| ${BIN_TR} "[[:lower:]]" "[[:upper:]]" \
|
||||||
|
| ${BIN_TR} -d '.' )"
|
||||||
|
eval "readonly $var=\${1}"
|
||||||
|
else
|
||||||
|
# Relative paths are more portable but less secure.
|
||||||
|
local var="BIN_$( ${BIN_PRINTF} "${1}" \
|
||||||
|
| ${BIN_TR} "[[:lower:]]" "[[:upper:]]" \
|
||||||
|
| ${BIN_TR} -d '.' )"
|
||||||
|
# SC2027 & SC2086: It's not a bug... it's a feature!
|
||||||
|
eval "readonly $var=\$( ${BIN_WHICH} "${1}" )"
|
||||||
|
if [ -z "$( eval "${BIN_PRINTF} \$$var" )" ] ; then
|
||||||
|
error_exit "${1} not installed" 105
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_browser
|
||||||
|
# DESCRIPTION: Check for browser (default: firefox) and store in var.
|
||||||
|
# (If no Desktop Environment is installed, try "true" as "a browser".)
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
check_browser () {
|
||||||
|
if [ -z "${BROWSER}" ] ; then
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) readonly BROWSER="Firefox"
|
||||||
|
;;
|
||||||
|
Linux|FreeBSD) BROWSER="firefox"
|
||||||
|
;;
|
||||||
|
*) error_exit "your os is not supported (yet)" 106
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) if ! [ -d "/Applications/${BROWSER}.app" ] ; then
|
||||||
|
error_exit "illegal browser command (${BROWSER}) supplied" 107
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
Linux|FreeBSD) readonly BROWSER="$( ${BIN_WHICH} "${BROWSER}" )"
|
||||||
|
if ! [ -x "${BROWSER}" ] ; then
|
||||||
|
error_exit "illegal browser command (${BROWSER}) supplied" 107
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
hint "Defined/supplied browser:\\n ${BROWSER}\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_case_number
|
||||||
|
# DESCRIPTION: Check if case number is given and store in var.
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
check_case_number () {
|
||||||
|
if [ -z "${CASE_NUMBER}" ] ; then
|
||||||
|
${BIN_PRINTF} "\\nNo case number supplied but mandatory - type case numer in and hit return: "
|
||||||
|
read -r case_number
|
||||||
|
if [ -n "${case_number}" ] ; then
|
||||||
|
readonly CASE_NUMBER="${case_number}"
|
||||||
|
${BIN_PRINTF} "\\n"
|
||||||
|
else
|
||||||
|
error_exit "no case number supplied" 108 usage
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
hint "Supplied case number:\\n ${CASE_NUMBER}\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: abspath
|
||||||
|
# DESCRIPTION: generate absolute path from relative path
|
||||||
|
# PARAMETERS 1: string (relative or absolute path to directory or file)
|
||||||
|
# SOURCE:
|
||||||
|
# https://stackoverflow.com/questions/3915040/bash-fish-command-to-print-absolute-path-to-a-file#23002317
|
||||||
|
#===============================================================================
|
||||||
|
abspath () {
|
||||||
|
if [ -d "${1}" ]; then
|
||||||
|
# dir
|
||||||
|
( cd "${1}"; ${BIN_PWD} )
|
||||||
|
elif [ -f "${1}" ]; then
|
||||||
|
# file
|
||||||
|
if [[ ${1} = /* ]]; then
|
||||||
|
echo "${1}"
|
||||||
|
elif [[ ${1} == */* ]]; then
|
||||||
|
echo "$( cd "${1%/*}"; ${BIN_PWD} )/${1##*/}"
|
||||||
|
else
|
||||||
|
echo "$( ${BIN_PWD} )/${1}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_folder
|
||||||
|
# DESCRIPTION: Check if folder does not exist, could be created in the given
|
||||||
|
# location and store in var.
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
check_folder () {
|
||||||
|
if [ -z "${FOLDER}" ] ; then
|
||||||
|
error_exit "folder not defined/supplied" 109 usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -d "${FOLDER}" ] ; then
|
||||||
|
# I prefer to check for an existing report folder from a previous call
|
||||||
|
# over "just" check if the folder is empty.
|
||||||
|
error_exit "directory (${FOLDER}) already exists" 110
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -w "$( ${BIN_DIRNAME} "${FOLDER}" )" ] ; then
|
||||||
|
error_exit "unable to create directory (${FOLDER})" 111
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create folder before abspath
|
||||||
|
${BIN_MKDIR} "${FOLDER}"
|
||||||
|
# because abspath checks for existence!
|
||||||
|
readonly FOLDER="$( abspath "${FOLDER}" )"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_officer
|
||||||
|
# DESCRIPTION: Check if name of officer is given otherwise use
|
||||||
|
# /etc/passwd or OpenDirectory.
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
check_officer () {
|
||||||
|
if [ -z "${OFFICER}" ] ; then
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) OFFICER="$( ${BIN_ID} -F )"
|
||||||
|
;;
|
||||||
|
Linux|FreeBSD) OFFICER="$( ${BIN_GETENT} passwd "${LOGNAME}" \
|
||||||
|
| cut -d ":" -f 5 | cut -d "," -f 1 )"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
# Sometimes the system don't know the fullname of the user.
|
||||||
|
# The default in Bash on Ubuntu on Windows 10 is "".
|
||||||
|
if [ -z "${OFFICER}" ] || [ "${OFFICER}" = "\"\"" ] ; then
|
||||||
|
readonly OFFICER="unknown"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
hint "Guessed/supplied officers name:\\n ${OFFICER}\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: remove_final_dashes
|
||||||
|
# DESCRIPTION: Check if ios_backup has one or more final dash(es) and
|
||||||
|
# remove them.
|
||||||
|
# PARAMETER 1: string (eg. path to source)
|
||||||
|
#===============================================================================
|
||||||
|
remove_final_dashes () {
|
||||||
|
# Because in dash, string indexing is not supported we can not use:
|
||||||
|
# "${STRING:(-1)}" = "/" and STRING="${STRING:0:(-1)}"
|
||||||
|
local STRING="${1}"
|
||||||
|
local LENGTH="${#STRING}"
|
||||||
|
while [ "$( ${BIN_PRINTF} "${STRING}" | ${BIN_CUT} -c "${LENGTH}" )" = "/" ] ; do
|
||||||
|
STRING="$( ${BIN_PRINTF} "${STRING}" | ${BIN_CUT} -c 1-$(( LENGTH - 1 )) )"
|
||||||
|
LENGTH="$(( LENGTH - 1 ))"
|
||||||
|
done
|
||||||
|
${BIN_PRINTF} "%s\\n" "${STRING}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: check_source
|
||||||
|
# DESCRIPTION: Check if ios_backup is given and store in var.
|
||||||
|
# Otherwise EXIT!
|
||||||
|
# PARAMETERS: none (a global var will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
check_source () {
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "SOURCE: ${1}\\n" 1>&2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "${1}" ] ; then
|
||||||
|
error_exit "ios_backup not supplied" 112 usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -e "${1}" ] ; then
|
||||||
|
error_exit "ios_backup (${1}) does not exist" 113
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -d "${1}" ] ; then
|
||||||
|
error_exit "ios_backup (${1}) is not a directory" 114
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$( ${BIN_LS} "${1}" )" ] ; then
|
||||||
|
error_exit "ios_backup (${1}) is empty" 115
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO: check if hole directory is read-only
|
||||||
|
|
||||||
|
IOS_BACKUP="$( remove_final_dashes "${1}" )"
|
||||||
|
readonly IOS_BACKUP="$( abspath "${IOS_BACKUP}" )"
|
||||||
|
|
||||||
|
hint "Supplied iOS backup folder:\\n ${IOS_BACKUP}\\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly FUNCTIONS_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: functions.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+269
@@ -0,0 +1,269 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./hardware_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . hardware_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source hardware_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Haredware plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
#
|
||||||
|
# AUTHOR:
|
||||||
|
# Patrick Neumann, patrick@neumannsland.de
|
||||||
|
#
|
||||||
|
# COAUTHOR(S):
|
||||||
|
# Odin Heitmann, odin.heitmann@gmail.com
|
||||||
|
#
|
||||||
|
# COMPANY:
|
||||||
|
# (privately)
|
||||||
|
#
|
||||||
|
# VERSION:
|
||||||
|
# 1.1
|
||||||
|
#
|
||||||
|
# LINK TO THE MOST CURRENT VERSION:
|
||||||
|
# (Sorry, we bet, I'm not allowed to publish it over GitHub!)
|
||||||
|
#
|
||||||
|
# CREATED:
|
||||||
|
# 2018-06-05
|
||||||
|
#
|
||||||
|
# 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:
|
||||||
|
# - Capacity
|
||||||
|
# - Carrier
|
||||||
|
# - Bluethooth MAC
|
||||||
|
# - IMEI
|
||||||
|
# - ICCID
|
||||||
|
# - Modem Firmware
|
||||||
|
#
|
||||||
|
# HISTORY:
|
||||||
|
# 1.0 - P. N. & O. H. - Initial (for the trainers eyes only) release
|
||||||
|
# 1.1 - P. N. - added network plugin
|
||||||
|
#
|
||||||
|
#===============================================================================
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# 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
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# iPhone images.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
readonly IPHONE_BASE64="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 truncated
|
||||||
|
readonly IPHONE3G_BASE64="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 truncated
|
||||||
|
readonly IPHONE3GS_BASE64="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 truncated
|
||||||
|
readonly IPHONE4_BASE64="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 truncated
|
||||||
|
readonly IPHONE4S_BASE64="/9j/4AAQSkZJRgABAQEASABIAAD/2wBDABgREhUSDxgVFBUbGhgdJDwnJCEhJEo1OCw8WE1cW1ZNVVNhbYt2YWeDaFNVeaV6g4+UnJ2cXnSrt6mXtYuZnJX/2wBDARobGyQgJEcnJ0eVZFVklZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZX/wgARCADwAH4DAREAAhEBAxEB/8QAGgAAAgMBAQAAAAAAAAAAAAAAAAECAwUEBv/EABgBAQEBAQEAAAAAAAAAAAAAAAABAgME/9oADAMBAAIQAxAAAAHVEcxEAAYAIALDoAiefOYAADoNIAABAaRxGCAAMBmmTAAAiaBxmKAATEWlx0EgABHecZjAAAAF53AAAI0TlMZLEBBREhnarACRUukchmM6GsIiMBgWzUwGByTWivIZyacx0Nc7LdozT1iyc3x6z780tK3JnmkvKZqd/LjfbzydvXslEqmK+Hbo9HOtai84DUXiOFNOSMjtdoAxEwEMz11TlM470aiTlYFmUN2SFzLNWpmTWscpnGpc06xCat57SNbcafTIQ6c7PJ2r9fHPx02DlM41WYawpoztwqllLRBvm7CazM72TlM41CMSpJFZoEVkjlcFmVbtHKZxo4sSVj06CgiXnOPnurGbd4zumts5TONnmtlq1OXa4pKjtOIs68o8+t/LeX0xuHKZxpIlaCxJIEVkgRWZlG6cxmmhmkrss3LCuHc2FRGamVmWbpzGYdmNqJakui22qQ1xtuappc+lRYcBvHMZZ3w5ouY6tiwR3lJINPO4EzON45jLO5ErQEskSgIAomeu+cxlGjnM85r1p9JZZXNCWWV51PG3LGzL1N85jJO/nxvOct9Gu7nvh3iGs2xVUvJ7a86s1yzO3P0BzGSd/PnZmR3q3pXrnXNJJazDO48fTPFWueb1z6A5jILUaoYxANIgrFFNegOcxgAAAAAAAAPQnOYwAACGIYAAAehKTEAAAZeM5xAAAeiJnnisAACQEQAAOk3hlZwkQAYAAABM7iR//8QAJxAAAQMCBgMBAQEBAQAAAAAAAQACAxEzBBITFCEyECAxIkEwI0L/2gAIAQEAAQUCRNEcRGFuY1uY1uY1uY1uGLXatdi3DVuGrcNQmjPkmgllMh9YTR/r9THaZWKdSP3zt9nctjNY8X09K8A0OomftAU9T8htYvr7xGjvU/IrWL6AVWmVkKyLIshWmUI3KioqKiyFFRWsX0i5fkqjGtNaa01kWRBnGVZVkVKJ/wBitYvrDcbycqP0NcVXktITUJBnKzZW6jkTUSdorWLtwXPj9QL+x9fssiHzJ+l9bQ0/knaK1i/mHuUCoFT2HiniXvFaxfTD3Xvyouo8O/SofACJaCKekveK1i+mHu5QUWgKMUJVSmr/AM5Q5GgBPNQh9muRWsXbw92tEUAjVVQr4qq19JrkVrF28PdNFUIIkBZmocoqoQXHma7FaxdvD3TFnO3Qj00O6N2maT8KmWTgPDsyaama7FaxdvD3G/E9Zg1+qxZg6Qyac2tHRr9SU0zxnn+zXYrWLtwXPJAVB4IVAgPFB4muxW8XbguEr9IFBUCKCoEfSa7FbxduG45f0IVzVNK/sVzVVf251BXhpqpbkVvF24e9CRzXxV3mrvAqsnNVLcit4u3F3/0k7xW8Xbj7NAKyhOoE0AjK1OACaARlanUCY0EERhPaGp/eK3i7bOzSWkguJqo+HVT+XDhHlOTahGif8f2it4u2zsFz4DuFVV8E+BUJzqp3aK1i7YNDqFapWqVqlazlqlapWs5apWqVquWoUTUw2sXb/wBobWLt+3FD7w2sUP8Al6hUVEfvrFbc3M17Cx3rmIRJPtDGXu8OYHo4ULarararararararararapuGAIAaF//EACYRAAICAQQBBAIDAAAAAAAAAAABAhESECAhMTADE0BBMmBCUWH/2gAIAQMBAT8B/UrLLMiyyyyy9zLZzpycnJbF4HpWkJJIzR6jUhd0VotHtk6ke6iDt7Lp2Zx7O34Gk+zCJSXXxEil/elnIntZYnr9ERq9G6ZmiPe1owEq042yjZiyMa81fAX4kxeZpXyel9kvipFD80dGLooZJ8mX0RfPhyLE6LG7JQyMP9Iwx+Q2ZCdjlRkJ2OVGQmJGI1tk6kU30Q7P56L8mT7LxR6fZ6a40ntlGzAjGhqz2yEaJxtntshGiE6RmiTv9j//xAAkEQACAgICAgICAwAAAAAAAAAAAQIREjEQICEwA0ATYCJBQv/aAAgBAgEBPwH9Uoor1r6L2UIZQicsY2Jy2J2r9E5VI/KiDt9JLKNGM9C8KvQ0mYoSr6N8Jk5YoVvXFFoa7vlHyRTIPFUj+7EriYSslrtY3xXEla8cp0ZDd+/JF9Wyxd2/5FUR31lviPeN4+D5vDRHf1WyxdEihr0PfC2LXDI6KJa9FFCQmWNilRkOV/YbMhOxKzEaoSsxGhsyE76ydMq9ENn+eHohoqyeiey2fG/PWUbMGRjQmZDdilRmSdko2P42Qjj+x//EACoQAAEDAwMDBAEFAAAAAAAAAAABEBECITEgQXEwMuESQGGhsSJRYoGR/9oACAEBAAY/Ai5kyZMmW3N9Hc8nxq51/wAfw3PQzqUReh2oba6ePYU8ewp4fKm7bm5lTKm+lSngloaCxE0yXb0tJNhFFKeHkwKrKq4TAhY9UXaCCBSnjRuWbNT5qfdlKeBGwIkWX/RaV2LGzxclNClPDyTvpxLJoUp4fBh+wu2FfDKU8aMtc7n7tKlPDzJ3fRMyLw39NCwR8HqXZ1KeNSydyEp+xK4VCfUgq7QfqwKylPGjDYMPhsGDApTxo26OGUp41wK0Q9luylPGiYMNj7bB5axPp+2Up466lPGq7WLtYuXUsKU8aJTozu9PGjDRBh8P2vTw+EbCGEbCGEbCGEbCNTx7CnoSvQp49ghBC9X4e6FvyeTyeTyeTyeTyeTyXLN//8QAJhAAAgECBQUBAQEBAAAAAAAAAAERITEQQWFxoSBRgbHw4ZEwwf/aAAgBAQABPyEQktBkHpkgT7NvwfZH0Q8hP+M3P4zc/jLKnmhfBb2yH2uldVF2dTSSGpGLUy9MFDV+lGClNNZCck4iaaldKwtDXpFvpyIKxE4CCOiRoKWF03Njhv8AHovfqubHHFskQUJGq5LuiXdCc4WHITW4pKSZMn3E2xSmjih6ELDWBtcwY2riOcke+CfcCbI4oinueZ5EqJaKUHFC0i1sNAlJId2NU10VFlGop6cipd6Y6iBsHINbIjqo7CVmeF4otblSbFYg8hmKW7dnsEmgOGP+iwI5tJZFO1CrgcNShqRsztsMVE7Bz4o0/JZ2Y8yfBWC1PJVWbWxL/QiXm9yqd2tiszyEs23uNYCWF4rDWNmOtR9xtS5OQc1i1JjbmIeTVKbmHAhqWykDbDMql4qUi78YOGOfFFssbMuSqPGlO6SZhQTVUUCV2TDOp2HVS1sxIRZjBQmR3gPFFosbMVqoqzFSxUpa7RsbSLRJ0E2lF5JqhWKHiSXFwtow/FFosbMZLtI0f9GTs0y4IPox0kppjJXaR8GQdnI2jhuJHS75FheILRY2Y605WJlOzVLHepUVY42KW2iWN2SsOLpNHQSMR0ckUjg1nPBK0jC8QWtyzsz3YWoUiJSlE4FItlQUkHJSPDJ8e4QUma2CHRhEqzD8QW9y3sxqpC7v6JDF5YdJKygQ7qcLANJ3wRJK2D8Z6Le5b2ZC0uS2fQa5TyIM2hlkRd8KKsSRSRNcDxnot7lrYk2ouaG7a3L34oPLW6oZpWLQNnWoNZeXJOzmNm1ZoOU1qRTNmqRtTw/Gei3uWdhuIWlGJLndxzMuHkzsOzKBnaBJuWpFJqLBpq6gaUVLsRVRsWzdcBxnot7lvqWdbHnr3GeizuWxRWTdFggmEjc/pEMTAbgqExMmZeSe0ihPBOM9FnfCSGsih1piO4eRNM2NyFboeZOm70KiU03EbcIZME7bVaiJtC6cZ6LO5ZHyiSh3k6QROyNDp2+RhSyKrOaUCluFWS1FIogvHEeizuVrCNNc4gGgucYzQX9eIB9SyYJBnAD0rXrn/B5g7FjfqYlcLxQRUamvXwBNLt1XCohqTZCQ09RIW+wpz5jl4H1KwZdH1Lbim4lCjBVExID79R9+o+/UR+/JH78EfvwR+/BH78EfvwR+/BLKvJGEjD//2gAMAwEAAgADAAAAEAAAAJJJABJJJAAAABJIAAJJAJJIJJAAAJJJJJJJAAe3e3tm4Byc7bryWAr+tchlmJxsw/x+6JW370H74BKLabD2wBBa/wDpI+CT33/tUiSSaWGytMCRWygSZ8SRhiySOoSSyyUg+CQD1UtvyQQTmfr/AIkgEIPwPkkAAMJhgJFgknlQpT6AkIsbXAxgkaiRaSyggIgABtCkEkkgEkkAEkkggkkEEkkgEkkEEkkkEkkkAkgAAAAA/8QAJBEAAwACAgEEAgMAAAAAAAAAAAERITEQIEEwQFFgYXGRseH/2gAIAQMBAT8Q+otxUkkkgntCl6PEUL8CsTbSP0G03wM4VlZWVi1zqLcIPMJNo/A/5EiiFpNNDUcNC8Frl6JzGnQ9zYuGVMYsMlbGLhi5ZpB+BC1HSEXqJKVmBpSoofIiGl4dHDhIsKdWaLHMeuT5liFPWaURJY5j1utBs/I/YTxODYnCjGtUzHKOzfWEZO6Z6Gmt9kyjfD65MqZtQq9Vw+H1csZJkXFfaoao0ExRIg1BuFE76EzI7TVCiNixIhBFwKN6CeIaNQdKcL9eAtrS5ArK+4i5y1k56yCd6KuFVeMOshjdoukxvAqHB1gSxLf9f6NQl2NQVRTrRRMtM2OM/JYGW26NsmYtlbbYhyaG7S7KdoQhfqv/xAAiEQADAAICAgIDAQAAAAAAAAAAAREhMRAgMFFhcUBBYJH/2gAIAQIBALine truncated
|
||||||
|
readonly IPHONE5_BASE64="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 truncated
|
||||||
|
readonly IPHONE5C_BASE64="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 truncated
|
||||||
|
readonly IPHONE5S_BASE64="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 truncated
|
||||||
|
readonly IPHONE6_BASE64="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 truncated
|
||||||
|
readonly IPHONE6PLUS_BASE64="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 truncated
|
||||||
|
readonly IPHONE6S_BASE64="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 truncated
|
||||||
|
readonly IPHONE6SPLUS_BASE64="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 truncated
|
||||||
|
readonly IPHONE7_BASE64="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"
|
||||||
|
readonly IPHONE7PLUS_BASE64="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"
|
||||||
|
readonly IPHONE8_BASE64="/9j/4AAQSkZJRgABAQEASABIAAD/2wBDABgREhUSDxgVFBUbGhgdJDwnJCEhJEo1OCw8WE1cW1ZNVVNhbYt2YWeDaFNVeaV6g4+UnJ2cXnSrt6mXtYuZnJX/2wBDARobGyQgJEcnJ0eVZFVklZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZX/wgARCADwAHYDAREAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAIBAwQF/8QAGQEBAAMBAQAAAAAAAAAAAAAAAAECAwQF/9oADAMBAAIQAxAAAAHonIMoAAAAABJtOqcs5QASAABAAAx2zEc8AJAAAgAADqlRktRItESEyJkkIJTEgEVdOIzlvTyUU0zZbQmZl7Wm6L1myUzFoqSmfRxVj9HFEzky3oz0JlrWa0l4LVmZEwiK06PNakjXm0aZVL48eiulyZa0tdFqzZKy2zKN3NaopmujTC/XLPTXHj0REzMzaZvBYyVmkQ3c8qVT1015Nu/LZpTHlvny1EzaZsJTZE1lG7ntWPXuovSuOPf0caTOLDprrclKS8FobSJrHQ575zZXpzN6L4E8W3flz11yY7rEiZvDaw16mc78L0m+NqI2ztab81t/Pu1yyZ70Z6xEzeH2q1ojOd+F6ze1SL5a7VWvTfk06ecszky3WLEn3o1ojO2/C9Z0GkLURrnrql5qvxadODLTZYmqmjaVfarUbcNKzoNIWhOWu1MaRrFduB7c0GTHdtIu6c7Mp0c+tZ0GkLQmqL0xolrJeKrcGjTkwc/UWaOrK3FdhtWdBpCypiJojV5pRbVNKF/Ny5XSLaerKzKLsN6ze1EqssTVF7ZoszXrbPOVU8efHTVvk1WjHas3NhKpWJRYhfbJdJyW2zX8/PzXe1bLU2561m1sJiJRZUpFtE5NembTXLfmy862+VuTTOlZsbkSqYSkWVNk0vnKnS1M0wRXU5qsOrXelZrjoEqlUrEqs811zzzMYb6WZ81MbZLabY56zTHQLQlYlUpFrbU125mRzN+mpE0vXWmynLWaI6RZYlUrEqsHR04smm+eu0BMVxnrpyVl1eoWVKxKrJElpstSubASBGWqvHWW164WWJVZUxM260qpYAJAjLVHHWY4sJgACTSWAAAQjpK1HPAAAkCRQAAOqScogAAcUYQAAY7ZqOSZCAAAAAAY3HUP/8QAJRAAAgEDBAIDAQEBAAAAAAAAAAECAxESICExMgQQEzBBIjNC/9oACAEBAAEFApzUFU8iTPkZmzNmbM2Zs+RmbM2fIz5ZFPyGJ3XkS3+xbPx2V/upc1zBltFixYsWMSxYplTrbaS+tlMri3TRJfXTKruov1JEl9UXYqdbkJepIf0oqqyav6hK6ZNfR+RVyp1aJITs07qSJLW+KZU622aJIhKzJItvpfFMrKx/zJepIpyGSQ+dD4plcXDQ16asQlkqi2el8UyuLqSQ/XV9olvS9NfzTK4uox+1/L/WvSES/wA6ZXF19SXq3rhvq+UIqdKZXF10WGhohxPlEe0+lMri49shumi23EqnqHaf+dMri40RdpfrRJE/Sez60yuLjSt4/kya/lkUT2hTK4uNNPn9qLZRypEI3KruUyuLjTDs+ZK6pu03GnFymrS4plcXGmny+L7T3lb1LrTK4uNMXaS4nLRPrTK5+as3bRPrTK5+abbaZ9aZXPkkZyM5GbMmZyM5mTMmZMyZkzJlMr/dS58iO+nlD0rd+PElFTVTx5J/G0YGBgYGJgYGBgz42UvHYlZf/8QAIxEAAgEEAQQDAQAAAAAAAAAAAAECAxARIDESEyFRMDJBUP/aAAgBAwEBPwH+d1ozfBgxfBgwYvnyRfx5u+RMi9Xo3pJWiyL+Biu4E42ixbvScMrKGiccCIvd6RfgqU8+USjkawyLIvdXixFSn+oqQzaLM7K6Iu1Sn+oqQ/REWLVaJidqtMnHDIPyLVXVosTGitSMdLMmbOy51QnZrJWpD4E7O0edosyJklkqU8C5FwMZHn4MiZJZK0OmWSHAxked0S8MTMleHVEp2lwR5+CSyrZF5QliWLNC5+F+HaDJrFQZJlNfvwz4HwQfkr/Yk/AxQ6YXW0+BcCeGV1nyPyU6WPLJ8XW1TgXJg6cxFTSMFT63W0llGCEP3Sr9brfoWc61frdbZ2q/W/XI65Hcl7O5L2dyfs7kvZ1yO5P2dyfs7k/Z3JezuS9jnJ8/z//EACQRAAIBAwUAAgMBAAAAAAAAAAABAhARMQMSICEwEzIiQVBR/9oACAECAQE/Af521lq2NrNjPjkfHI+OR8bNjNr4SXFcp4qnSS4rjqfWqo0NcFwRq/WtyLpJD53J4rkwRlSS5onjh9hOwmMa4oRqY4YMkXYRJcEKmpjinYffZCVJIdIipPHKLsNftEZEsDomRdJ45xZjsTuqWpCmpjwTMCGqaeaamPBCox5NPNJ48VRdomuyORmpjxQiOTUXQsm7sn35IZPFEyT68kPBmIyKJu87eSonYsSltRBfvxVEy14n5s2f6W8VS3ZHpDlR+KpgvV+Ni/F+CQl6WLUv/V//xAAgEAABAwQDAQEAAAAAAAAAAAAAAQIwESBxgRAxQWEh/9oACAEBAAY/Aqrz4eHh4eHh4eHnH6VQX5MqD8zaHZm0LNodmbQs6zuSdZtCzaHIJZSHQ7IllUh0OyJbVINDsiXfL9DsiQVsU0OyJArbFNDsiRr840OyJGv3jQ7IkKLZodkS+nC2aHZgTihWpRvGh2ZtDsw0t0OzBS7Q7M2h2Ts7OzvjuDQ/MFbtC/bscUuVxRT847Q7Q7Q7Q7Q7Q7Q85/fwoh//xAAmEAACAQIFBAMBAQAAAAAAAAAAAREQMSAhUWHwQXGRoTCB4cHR/9oACAEBAAE/IfARDSE/GQ26eDb8Db8Db8Db8Db8DZ8Db8Db8DZ8BItBPjNsxarDJvqYoZD0IwtAzNb3Rd8wzXLQaZqjbKkEEiZImTJExsi/jQ9osUWoohfAu40onhJsGsTHYu40GNvqyCC6JSB/C7DIRFuv0ez/AEUbkuVdIfwOxYu3+G0D/pGnqZpnehJ+FYZCIt/h7v8ATIRLmrjpkKmRIiB4lQu40Pf/AKOS9iBnVR24uqbB3oqKhdxoIRFkxLwU2oOqjrxCJplyiFWu40pvSwVODuFCmZFFWv40pvQL0ko0yJWURKwCMyy7jSm9CiyhRoakZmUT3ImO5eILDl3GlN6AxPpQiRhqS1oLKBYcvL6K7jSm9QYx5oeTHJEbJ0NLAkG4tHvl3GlN6wx1ZldUTIZdQXORXHzNA1muZdxpTelRjGQTGohqZBnFqo6ATlJdxpTelVjGNFqi4TKkEMoT7S7jSm9KrGMa0ShhmSC9UNS4GtnYkPRF3GlNZ7VYxloyO+iVRnTrkMDImzTHUul3GlNZ7YGMewzPsJMzIuaIkF4u40prPbAxshmMhkxwXC7jSmVnarGx0SMNcLuNKZWdqtjYlIsRcLuNMWUi36CRXcG+b5vm+b42KGy7jQu+AdsRG+WhFpJisrrRYsJIEXDsqZJQkrVDuGkS/Ql+hL9CX6E/2JfoS/Qlr5G8hOd0XWVvcQrISP/aAAwDAQACAAMAAAAQAgAAAAAkkgEgkkAkkAAEkkkcGMnqQwAIPTwCzAL3oGa0QBdimPJ7kUjiWcbAE+laC15AsG7AV6ojPme7aKEeLOIAyQA3troX4AchMW6eoGgONbbMA0hMFM2oDhyvMR1AFCw2SrAAkZdoS3ANeNXJoQA/ONumkASl4jX+QHgZ08hMAId4XrxgHV+418wAc+MVvvYDWboJJJEkkgAkkkAkkgEkgkEAAAEgE//EACARAQEAAwEAAgMBAQAAAAAAAAEAEBExISBBUFFhcYH/2gAIAQMBAT8Q/HoHmNW1vKLVq2t7eUZ6YR3gYZ9nBDLqdnJ0rVhGIYYY3qMQ+52XG02zAw4Yi6h7n9Up7DrGtmBhmLhCM6fpfU2/s5LWMwMx5LKH3O4GIANM+ptLbTO5ZZbrOrUtlujR/t6OsZ4jmGWbvLw9MR9SWrcJcGGcd5OZpNlp9L/GxF5bwmO/gPMgCXg6let4wMGeRHs9OIYhfaWxN0cuZZZESfeDxgEXsnrSexc4c8kRHjDsjRt5GdSFFucXNzyciLWHZa26hVJeankPHwzmCIvCh2bicdtIwbH9WvOTmCIiH/SfG9tWwhq9NWzeRzBERHqWw3lhosRtbcOt4WeIIgiLpekWoYAC+iJfdH25HkEEEEEepxUag5QfWeIggggtoShtjtatWoe8jwgggggtynxO+R4QQQQS6lb+XfIH3f2+C03wL3fykmwul+P/AP/EAB8RAQEBAAMAAwEBAQAAAAAAAAEAERAhMSAwQVBhUf/aAAgBAgEBPxD+fKOMtQnzSnQNeTzhTIhhlDbwybDvzsSbyjDDKHhg2OLlZDtoWXAwyhttnLtyZ6eE7tSGcDDDbbHwY5z9hVbF7xvAw2w3b4fjt4/2ZW5DSyeRiEPgpCrSQOluxlpaSdz7zEfFSRQBi/BvbB29PHqHy2S1cBsR2DuCwbQ+ck2fTJrHAZvBmwMPkTmO16sJ9vwg+YnCl+Q43Yjil1vz6NiXc9mzjLU8Mum6Y+bHDv1dMXsngnSJYX6D2PZ3RG7Xxkd/2yy/v1O7TeiF0bYg/PpJYw6JdLZ2x6SYr1+ollPl/IAyXscH0/8AN42uhBybSe7z9Kxk2EGvtpttvP0moRbxtsuvo0gCXXfhs+c4WFhYsR15aev6v//EACcQAQACAQMDBQEBAAMAAAAAAAEAETEhcbFBUWEQIIGRocHwMNHx/9oACAEBAAE/EMyHHcYhUHZIP7FLT5/8SEIQgCEAM3RtpxKhE9Ut+H/uJ1YWRaboaf7fj2GrRERpKZ4GeR9RRkfb4wddoolZX8n+RvwOX2qrbLe7Le7LXr7tE/L4gCgRFJLine truncated
|
||||||
|
readonly IPHONE8PLUS_BASE64="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 truncated
|
||||||
|
readonly IPHONESE_BASE64="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 truncated
|
||||||
|
readonly IPHONEX_BASE64="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 truncated
|
||||||
|
readonly SORRY="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 truncated
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: get_hardware_info
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_hardware_info () {
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
# There are two general.log:
|
||||||
|
# - logs/AppleSupport/general.log <--- we prefer this one!
|
||||||
|
# - mobile/Library/Logs/AppleSupport/general.log
|
||||||
|
GENERAL_LOG="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -path "*logs/AppleSupport/general.log" )"
|
||||||
|
|
||||||
|
if [ -z "${GENERAL_LOG}" ] ; then
|
||||||
|
readonly GENERAL_SOURCE="<code>general.log not found</code>"
|
||||||
|
error "general.log not found"
|
||||||
|
readonly MODEL_IDENTIFIER="unknown"
|
||||||
|
BOARD_CONFIG="unknown" # <- could be modified later!
|
||||||
|
MODEL_NUMBER="unknown" # <- could be modified later!
|
||||||
|
readonly COMMON_NAME="unknown"
|
||||||
|
readonly SERIAL_NUMBER="unknown"
|
||||||
|
readonly PHOTO="SORRY"
|
||||||
|
else
|
||||||
|
readonly GENERAL_SOURCE="<a href='general.log' target='_blank'><code>${GENERAL_LOG/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
${BIN_CP} "${GENERAL_LOG}" "${FOLDER}/"
|
||||||
|
|
||||||
|
# SC2016: shellcheck fails if awk/sed is used!
|
||||||
|
readonly MODEL_IDENTIFIER="$( ${BIN_AWK} '/Model:/ { print $2; }' "${FOLDER}/general.log" )"
|
||||||
|
|
||||||
|
[ -f "$( ${BIN_DIRNAME} "${0}" )/lib/iphone_hardware_map.tsv" ] || error_exit "iphone_hardware_map.tsv not found" 201
|
||||||
|
|
||||||
|
# Could be modified later!
|
||||||
|
BOARD_CONFIG="$( ${BIN_GREP} --fixed-strings --word-regexp "${MODEL_IDENTIFIER}" $( ${BIN_DIRNAME} "${0}" )/lib/iphone_hardware_map.tsv \
|
||||||
|
| ${BIN_HEAD} -n 1 \
|
||||||
|
| ${BIN_CUT} -f 3 \
|
||||||
|
| ${BIN_TR} "_" " " )"
|
||||||
|
[ -z "${BOARD_CONFIG}" ] && BOARD_CONFIG="<span title='Not found in our map - please ask for an update!'>unknown</span>"
|
||||||
|
|
||||||
|
# Could be modified later!
|
||||||
|
MODEL_NUMBER="$( ${BIN_GREP} --fixed-strings --word-regexp "${MODEL_IDENTIFIER}" $( ${BIN_DIRNAME} "${0}" )/lib/iphone_hardware_map.tsv \
|
||||||
|
| ${BIN_HEAD} -n 1 \
|
||||||
|
| ${BIN_CUT} -f 2 \
|
||||||
|
| ${BIN_TR} "_" " " )"
|
||||||
|
|
||||||
|
[ -z "${MODEL_NUMBER}" ] && MODEL_NUMBER="<span title='Not found in our map - please ask for an update!'>unknown</span>"
|
||||||
|
COMMON_NAME="$( ${BIN_GREP} --fixed-strings --word-regexp "${MODEL_IDENTIFIER}" $( ${BIN_DIRNAME} "${0}" )/lib/iphone_hardware_map.tsv \
|
||||||
|
| ${BIN_HEAD} -n 1 \
|
||||||
|
| ${BIN_CUT} -f 4 \
|
||||||
|
| ${BIN_TR} "_" " " )"
|
||||||
|
[ -z "${COMMON_NAME}" ] && readonly COMMON_NAME="<span title='Not found in our map - please ask for an update!'>unknown</span>"
|
||||||
|
|
||||||
|
readonly SERIAL_NUMBER="$( ${BIN_AWK} '/Serial Number:/ { print $3; }' "${FOLDER}/general.log" )"
|
||||||
|
|
||||||
|
readonly PHOTO="$( ${BIN_PRINTF} "${COMMON_NAME}" | ${BIN_TR} -d " " | ${BIN_TR} "[[:lower:]]" "[[:upper:]]" )_BASE64"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$( eval "${BIN_ECHO} -n \$${PHOTO}" )" ] ; then
|
||||||
|
eval "${BIN_ECHO} -n \$${PHOTO}" | ${BIN_BASE64} --decode > "${FOLDER}/photo.jpg"
|
||||||
|
else
|
||||||
|
${BIN_ECHO} -n "${SORRY}" | ${BIN_BASE64} --decode > "${FOLDER}/photo.jpg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#--- next source ---
|
||||||
|
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
# http://newosxbook.com/articles/guesstalt.html
|
||||||
|
readonly MOBILE_GESTALT_PLIST="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "com.apple.MobileGestalt.plist" )"
|
||||||
|
|
||||||
|
if [ -z "${MOBILE_GESTALT_PLIST}" ] ; then
|
||||||
|
readonly MOBILE_GESTALT_SOURCE="<code>com.apple.MobileGestalt.plist not found</code>"
|
||||||
|
error "com.apple.MobileGestalt.plist not found"
|
||||||
|
else
|
||||||
|
readonly MOBILE_GESTALT_SOURCE="<a href='com.apple.MobileGestalt.plist' target='_blank'><code>${MOBILE_GESTALT_PLIST/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
plist_bin2xml "${MOBILE_GESTALT_PLIST}" "${FOLDER}/com.apple.MobileGestalt.plist"
|
||||||
|
|
||||||
|
readonly MODEL_NUMBER="$( ${BIN_GREP} --fixed-strings --after-context=1 "97JDvERpVwO+GHtthIh7hA" "${FOLDER}/com.apple.MobileGestalt.plist" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
readonly BOARD_CONFIG="$( ${BIN_GREP} --fixed-strings --after-context=1 "/YYygAofPDbhrwToVsXdeA" "${FOLDER}/com.apple.MobileGestalt.plist" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "MODEL_IDENTIFIER: %s\\n" "${MODEL_IDENTIFIER}" 1>&2
|
||||||
|
${BIN_PRINTF} "MODEL_NUMBER: %s\\n" "${MODEL_NUMBER}" 1>&2
|
||||||
|
${BIN_PRINTF} "BOARD_CONFIG: %s\\n" "${BOARD_CONFIG}" 1>&2
|
||||||
|
${BIN_PRINTF} "COMMON_NAME: %s\\n" "${COMMON_NAME}" 1>&2
|
||||||
|
${BIN_PRINTF} "SERIAL_NUMBER: %s\\n" "${SERIAL_NUMBER}" 1>&2
|
||||||
|
${BIN_PRINTF} "PHOTO: %s\\n" "${PHOTO}" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
HARDWARE_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Hardware</h2>
|
||||||
|
<div class='ym-grid'>
|
||||||
|
<div class='ym-g75 ym-gl'>
|
||||||
|
<div class='ym-gbox'>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${GENERAL_SOURCE}</li>
|
||||||
|
<li>${MOBILE_GESTALT_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Model Identifier:</td>
|
||||||
|
<td>${MODEL_IDENTIFIER}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Model Number(s):</td>
|
||||||
|
<td>${MODEL_NUMBER}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Board Config:</td>
|
||||||
|
<td>${BOARD_CONFIG}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Common Name:</td>
|
||||||
|
<td>${COMMON_NAME}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Serial Number:</td>
|
||||||
|
<td>${SERIAL_NUMBER}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='ym-g25 ym-gr'>
|
||||||
|
<div class='ym-gbox'>
|
||||||
|
<h3>Photo</h3>
|
||||||
|
<img alt='Photo of the device' class='center' src='photo.jpg' title='Photo of the device' height='240'>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly HARDWARE_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: hardware_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# "Model Identifier" "Model Number" "Board Config" "Common Name"
|
||||||
|
iPhone1,1 A1203 M68AP iPhone
|
||||||
|
iPhone1,2 A1241_or_A1324 N82AP iPhone_3G
|
||||||
|
iPhone2,1 A1303_or_A1325 N88AP iPhone_3GS
|
||||||
|
iPhone3,1 A1332 N90AP iPhone_4
|
||||||
|
iPhone3,2 A1349 N90BAP iPhone_4
|
||||||
|
iPhone3,3 A1332 N92AP iPhone_4
|
||||||
|
iPhone4,1 A1387_or_vA1431 N94AP iPhone_4s
|
||||||
|
iPhone5,1 A1428_or_A1429 N41AP iPhone_5
|
||||||
|
iPhone5,2 A1429_or_A1442 N42AP iPhone_5
|
||||||
|
iPhone5,3 A1456_or_A1532 N48AP iPhone_5c
|
||||||
|
iPhone5,4 A1507,_A1516,_A1526_or_A1529 N49AP iPhone_5c
|
||||||
|
iPhone6,1 A1453_or_A1533 N51AP iPhone_5s
|
||||||
|
iPhone6,2 A1457,_A1518,_A1528_or_A1530 N53AP iPhone_5s
|
||||||
|
iPhone7,1 A1633,_A1688,_A1691_or_A1700 N61AP iPhone_6
|
||||||
|
iPhone7,2 A1522,_A1522,_A1524_or_A1593 N56AP iPhone_6_Plus
|
||||||
|
iPhone8,1 A1633,_A1688,_A1691_or_A1700 N71AP_or_N71mAP iPhone_6s
|
||||||
|
iPhone8,2 A1634,_A1687,_A1690_or_A1699 N66AP_or_N66mAP iPhone_6s_Plus
|
||||||
|
iPhone8,4 A1662,_A1723_or_A1724 N69AP_or_N69uAP iPhone_SE
|
||||||
|
iPhone9,1 A1660,_A1778,_A1779_or_A1780 D10AP iPhone_7
|
||||||
|
iPhone9,3 A1660,_A1778,_A1779_or_A1780 D101AP iPhone_7
|
||||||
|
iPhone9,2 A1661,_A1784,_A1785_or_A1786 D11AP iPhone_7_Plus
|
||||||
|
iPhone9,4 A1661,_A1784,_A1785_or_A178 D111AP iPhone_7_Plus
|
||||||
|
iPhone10,1 A1863,_A1905,_A1906_or_A1907 D20AP iPhone_8
|
||||||
|
iPhone10,4 A1863,_A1905,_A1906_or_A1907 D201AP iPhone_8
|
||||||
|
iPhone10,2 A1864,_A1897,_A1898_or_A1899 D21AP iPhone_8_Plus
|
||||||
|
iPhone10,5 A1864,_A1897,_A1898_or_A1899 D211AP iPhone_8_Plus
|
||||||
|
iPhone10,3 A1865,_A1901_or_A1902 D22AP iPhone_X
|
||||||
|
iPhone10,6 A1901,_A1901_or_A1902 D221AP iPhone_X
|
||||||
|
Can't render this file because it contains an unexpected character in line 1 and column 3.
|
@@ -0,0 +1,133 @@
|
|||||||
|
# iPhone iOS version -> Build number
|
||||||
|
1.0 1A543a
|
||||||
|
1.0.1 1C25
|
||||||
|
1.0.2 1C28
|
||||||
|
1.1.1 3A109
|
||||||
|
1.1.2 3B48b
|
||||||
|
1.1.3 4A93
|
||||||
|
1.1.4 4A102
|
||||||
|
2.0 5A345
|
||||||
|
2.0 5A347
|
||||||
|
2.0.1 5B108
|
||||||
|
2.0.2 5C1
|
||||||
|
2.1 5F136
|
||||||
|
2.2 5G77
|
||||||
|
2.2.1 5H11
|
||||||
|
3.0 7A341
|
||||||
|
3.0.1 7A400
|
||||||
|
3.1 7C144
|
||||||
|
3.1.2 7D11
|
||||||
|
3.1.3 7E18
|
||||||
|
4.0 8A293
|
||||||
|
4.0.1 8A306
|
||||||
|
4.0.2 8A400
|
||||||
|
4.1 8B117
|
||||||
|
4.2.1 8C148a
|
||||||
|
4.2.5 8E128
|
||||||
|
4.2.6 8E200
|
||||||
|
4.2.7 8E303
|
||||||
|
4.2.8 8E40
|
||||||
|
4.2.9 8E501
|
||||||
|
4.2.10 8E600
|
||||||
|
4.3 8F190
|
||||||
|
4.3.1 8G4
|
||||||
|
4.3.2 8H7
|
||||||
|
4.3.3 8J2
|
||||||
|
4.3.4 8K2
|
||||||
|
4.3.5 8L1
|
||||||
|
5.0 9A334
|
||||||
|
5.0.1 9A405
|
||||||
|
5.0.1 9A406
|
||||||
|
5.1 9B176
|
||||||
|
5.1 9B179
|
||||||
|
5.1.1 9B206
|
||||||
|
5.1.1 9B208
|
||||||
|
6.0 10A403
|
||||||
|
6.0 10A405
|
||||||
|
6.0.1 10A523
|
||||||
|
6.0.1 10A525
|
||||||
|
6.0.2 10A551
|
||||||
|
6.1 10B141
|
||||||
|
6.1 10B142
|
||||||
|
6.1 10B143
|
||||||
|
6.1 10B144
|
||||||
|
6.1.1 10B145
|
||||||
|
6.1.2 10B146
|
||||||
|
6.1.3 10B329
|
||||||
|
6.1.4 10B350
|
||||||
|
6.1.6 10B500
|
||||||
|
7.0 11A465
|
||||||
|
7.0 11A466
|
||||||
|
7.0.1 11A470a
|
||||||
|
7.0.2 11A501
|
||||||
|
7.0.3 11B511
|
||||||
|
7.0.4 11B553
|
||||||
|
7.0.4 11B554a
|
||||||
|
7.0.5 11B601
|
||||||
|
7.0.6 11B651
|
||||||
|
7.1 11D167
|
||||||
|
7.1 11D169
|
||||||
|
7.1.1 11D201
|
||||||
|
7.1.2 11D257
|
||||||
|
8.0 12A365
|
||||||
|
8.0 12A366
|
||||||
|
8.0.1 12A402
|
||||||
|
8.0.2 12A405
|
||||||
|
8.1 12B410
|
||||||
|
8.1 12B411
|
||||||
|
8.1.1 12B435
|
||||||
|
8.1.1 12B436
|
||||||
|
8.1.2 12B440
|
||||||
|
8.1.3 12B466
|
||||||
|
8.2 12D508
|
||||||
|
8.3 12F69
|
||||||
|
8.3 12F70
|
||||||
|
8.4 12H143
|
||||||
|
8.4.1 12H321
|
||||||
|
9.0 13A342
|
||||||
|
9.0 13A343
|
||||||
|
9.0 13A344
|
||||||
|
9.0.1 13A404
|
||||||
|
9.0.1 13A405
|
||||||
|
9.0.2 13A452
|
||||||
|
9.1 13B139
|
||||||
|
9.1 13B143
|
||||||
|
9.2 13C75
|
||||||
|
9.2.1 13D15
|
||||||
|
9.2.1 13D20
|
||||||
|
9.3 13E233
|
||||||
|
9.3 13E234
|
||||||
|
9.3 13E237
|
||||||
|
9.3.1 13E238
|
||||||
|
9.3.2 13F69
|
||||||
|
9.3.3 13G34
|
||||||
|
9.3.4 13G35
|
||||||
|
9.3.5 13G36
|
||||||
|
10.0.1 14A403
|
||||||
|
10.0.2 14A456
|
||||||
|
10.0.3 14A551
|
||||||
|
10.1 14B72
|
||||||
|
10.1 14B72c
|
||||||
|
10.1.1 14B100
|
||||||
|
10.1.1 14B150
|
||||||
|
10.2 14C92
|
||||||
|
10.2.1 14D27
|
||||||
|
10.3 14E277
|
||||||
|
10.3.1 14E304
|
||||||
|
10.3.2 14F89
|
||||||
|
10.3.3 14G60
|
||||||
|
11.0 15A372
|
||||||
|
11.0.1 15A402
|
||||||
|
11.0.2 15A421
|
||||||
|
11.0.3 15A432
|
||||||
|
11.1 15B93
|
||||||
|
11.1.1 15B150
|
||||||
|
11.1.2 15B202
|
||||||
|
11.2 15C113
|
||||||
|
11.2 15C114
|
||||||
|
11.2.1 15C153
|
||||||
|
11.2.2 15C202
|
||||||
|
11.2.5 15D60
|
||||||
|
11.2.6 15D100
|
||||||
|
11.3 15E216
|
||||||
|
11.3.1 15E302
|
||||||
|
Executable
+179
@@ -0,0 +1,179 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./kik_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . kik_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source kik_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Kik messenger plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034 ./kik_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034 ./kik_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034 ./kik_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: get_kik_list
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_kik_list () {
|
||||||
|
# "8e281be6657d4523710d96341b6f86ba89b56df7" in iTunes Backup.
|
||||||
|
readonly KIK_SQLITE="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "kik.sqlite" )"
|
||||||
|
|
||||||
|
if ! [ -f "${KIK_SQLITE}" ] ; then
|
||||||
|
readonly KIK_SOURCE="<code>kik.sqlite not found</code>"
|
||||||
|
error "kik.sqlite not found"
|
||||||
|
readonly KIK_CONTACTS="<tr><td class='highlight' colspan='4'>ERROR: database not found!</td></tr>"
|
||||||
|
readonly KIK_MESSAGES="<tr><td class='highlight' colspan='5'>ERROR: database not found!</td></tr>"
|
||||||
|
else
|
||||||
|
KIK_SOURCE="<a href='kik.sqlite' target='_blank'><code>${KIK_SQLITE/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
# Don't forget to copy write ahead log!
|
||||||
|
${BIN_CP} "${KIK_SQLITE}"* "${FOLDER}/"
|
||||||
|
|
||||||
|
readonly KIK_CONTACTS="$( ${BIN_SQLITE3} -html "${FOLDER}/kik.sqlite" \
|
||||||
|
"SELECT
|
||||||
|
Z_PK,
|
||||||
|
ZDISPLAYNAME,
|
||||||
|
ZFIRSTNAME,
|
||||||
|
ZLASTNAME,
|
||||||
|
ZUSERNAME
|
||||||
|
FROM
|
||||||
|
ZKIKUSER;" )"
|
||||||
|
|
||||||
|
readonly KIK_MESSAGES="$( ${BIN_SQLITE3} -html "${FOLDER}/kik.sqlite" \
|
||||||
|
"SELECT
|
||||||
|
m.Z_PK,
|
||||||
|
CASE WHEN m.ZTYPE=1 THEN 'received' WHEN m.ZTYPE=2 THEN 'sent' ELSE '(system)' END,
|
||||||
|
u.ZUSERNAME,
|
||||||
|
DATETIME(m.ZTIMESTAMP+978307200, 'unixepoch'),
|
||||||
|
m.ZBODY
|
||||||
|
FROM
|
||||||
|
ZKIKMESSAGE AS m,
|
||||||
|
ZKIKUSER AS u
|
||||||
|
WHERE
|
||||||
|
m.ZUSER=u.Z_PK;" )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: kik_plugin processed.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
KIK_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Kik Messenger</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${KIK_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Contacts</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Displayname</th>
|
||||||
|
<th>Firstname</th>
|
||||||
|
<th>Lastname</th>
|
||||||
|
<th>Username</th>
|
||||||
|
</tr>
|
||||||
|
${KIK_CONTACTS}
|
||||||
|
</table>
|
||||||
|
<h3>Messages</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Direction</th>
|
||||||
|
<th>Username</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Message</th>
|
||||||
|
</tr>
|
||||||
|
${KIK_MESSAGES}
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly KIK_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: kik_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+211
@@ -0,0 +1,211 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./network_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . network_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source network_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Network plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034,SC2016 ./hardware_plugin.sh
|
||||||
|
#
|
||||||
|
# AUTHOR:
|
||||||
|
# Patrick Neumann, patrick@neumannsland.de
|
||||||
|
#
|
||||||
|
# COAUTHOR(S):
|
||||||
|
# Odin Heitmann, odin.heitmann@gmail.com
|
||||||
|
#
|
||||||
|
# COMPANY:
|
||||||
|
# (privately)
|
||||||
|
#
|
||||||
|
# VERSION:
|
||||||
|
# 1.1
|
||||||
|
#
|
||||||
|
# LINK TO THE MOST CURRENT VERSION:
|
||||||
|
# (Sorry, we bet, I'm not allowed to publish it over GitHub!)
|
||||||
|
#
|
||||||
|
# CREATED:
|
||||||
|
# 2018-06-05
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# 1.1 - P. N. - added network plugin
|
||||||
|
#
|
||||||
|
#===============================================================================
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# 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: get_hardware_info
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_network_info () {
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
readonly NETWORK_INTERFACES_PLIST="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "NetworkInterfaces.plist" )"
|
||||||
|
|
||||||
|
if [ -z "${NETWORK_INTERFACES_PLIST}" ] ; then
|
||||||
|
readonly NETWORK_INTERFACES_SOURCE="<code>NetworkInterfaces.plist not found</code>"
|
||||||
|
error "NetworkInterfaces.plist not found"
|
||||||
|
readonly MAC_ADDRESS="unknown"
|
||||||
|
else
|
||||||
|
readonly NETWORK_INTERFACES_SOURCE="<a href='NetworkInterfaces.plist' target='_blank'><code>${NETWORK_INTERFACES_PLIST/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
plist_bin2xml "${NETWORK_INTERFACES_PLIST}" "${FOLDER}/NetworkInterfaces.plist"
|
||||||
|
|
||||||
|
readonly MAC_ADDRESS="$( ${BIN_GREP} --fixed-strings --after-context=3 "IOMACAddress" "${FOLDER}/NetworkInterfaces.plist" \
|
||||||
|
| ${BIN_GREP} --invert-match "<" \
|
||||||
|
| ${BIN_HEAD} -n 1 \
|
||||||
|
| ${BIN_TR} -d [[:space:]] \
|
||||||
|
| ${BIN_BASE64} --decode \
|
||||||
|
| ${BIN_XXD} -plain \
|
||||||
|
| ${BIN_SED} 's/\(..\)/\1:/g;s/:$//' )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#--- next source ---
|
||||||
|
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
# db/dhcpclient/leases/en0-1,c0:f2:fb:b8:8a:63
|
||||||
|
readonly DHCPC_LEASES_PLIST="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "en0-1,${MAC_ADDRESS}" )"
|
||||||
|
|
||||||
|
if [ -z "${DHCPC_LEASES_PLIST}" ] ; then
|
||||||
|
readonly DHCPC_LEASES_SOURCE="<code>en0-1,${MAC_ADDRESS} not found</code>"
|
||||||
|
error "en0-1,${MAC_ADDRESS} not found"
|
||||||
|
else
|
||||||
|
readonly DHCPC_LEASES_SOURCE="<a href='en0-1,${MAC_ADDRESS}' target='_blank'><code>${DHCPC_LEASES_PLIST/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
plist_bin2xml "${DHCPC_LEASES_PLIST}" "${FOLDER}/en0-1,${MAC_ADDRESS}"
|
||||||
|
|
||||||
|
readonly CLIENT_IP="$( ${BIN_GREP} --fixed-strings --after-context=1 "<key>IPAddress</key>" "${FOLDER}/en0-1,${MAC_ADDRESS}" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
readonly LEASE_START_DATE="$( ${BIN_GREP} --fixed-strings --after-context=1 "LeaseStartDate" "${FOLDER}/en0-1,${MAC_ADDRESS}" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
readonly BSSID="$( ${BIN_GREP} --fixed-strings --after-context=3 "RouterHardwareAddress" "${FOLDER}/en0-1,${MAC_ADDRESS}" \
|
||||||
|
| ${BIN_GREP} --invert-match "<" \
|
||||||
|
| ${BIN_HEAD} -n 1 \
|
||||||
|
| ${BIN_TR} -d [[:space:]] \
|
||||||
|
| ${BIN_BASE64} --decode \
|
||||||
|
| ${BIN_XXD} -plain \
|
||||||
|
| ${BIN_SED} 's/\(..\)/\1:/g;s/:$//' )"
|
||||||
|
|
||||||
|
readonly ROUTER_IP="$( ${BIN_GREP} --fixed-strings --after-context=1 "<key>RouterIPAddress</key>" "${FOLDER}/en0-1,${MAC_ADDRESS}" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
|
||||||
|
readonly ESSID="$( ${BIN_GREP} --fixed-strings --after-context=1 "SSID" "${FOLDER}/en0-1,${MAC_ADDRESS}" \
|
||||||
|
| ${BIN_TAIL} -n 1 \
|
||||||
|
| ${BIN_SED} "${SED_EXT_REGEXP}" 's|[[:space:]]*</?string>||g' )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "MAC_ADDRESS: %s\\n" "${MAC_ADDRESS}" 1>&2
|
||||||
|
${BIN_PRINTF} "CLIENT_IP: %s\\n" "${CLIENT_IP}" 1>&2
|
||||||
|
${BIN_PRINTF} "LEASE_START_DATE: %s\\n" "${LEASE_START_DATE}" 1>&2
|
||||||
|
${BIN_PRINTF} "BSSID: %s\\n" "${BSSID}" 1>&2
|
||||||
|
${BIN_PRINTF} "ROUTER_IP: %s\\n" "${ROUTER_IP}" 1>&2
|
||||||
|
${BIN_PRINTF} "ESSID: %s\\n" "${ESSID}" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for network information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
NETWORK_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Network</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${NETWORK_INTERFACES_SOURCE}</li>
|
||||||
|
<li>${DHCPC_LEASES_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>MAC Address (Wi-Fi):</td>
|
||||||
|
<td>${MAC_ADDRESS}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Client IP Address:</td>
|
||||||
|
<td>${CLIENT_IP}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Lease start date:</td>
|
||||||
|
<td>${LEASE_START_DATE}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>BSSID:</td>
|
||||||
|
<td>${BSSID}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Router IP Address:</td>
|
||||||
|
<td>${ROUTER_IP}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>(E)SSID:</td>
|
||||||
|
<td>${ESSID}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly NETWORK_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: network_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+177
@@ -0,0 +1,177 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./os_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . os_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source os_plugin.sh
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Operating system plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034,SC2016 ./os_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034,SC2016 ./os_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034,SC2016 ./os_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) ====================================================
|
||||||
|
# See template engine library!
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: get_os_info
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_os_info () {
|
||||||
|
# NOT in iTunes Backup!
|
||||||
|
readonly LOCKDOWND_LOG="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "lockdownd.log" )"
|
||||||
|
|
||||||
|
if [ -z "${LOCKDOWND_LOG}" ] ; then
|
||||||
|
readonly LOCKDOWND_SOURCE="<code>lockdownd.log not found</code>"
|
||||||
|
error "lockdownd.log not found"
|
||||||
|
readonly BUILD_NUMBER="unknown"
|
||||||
|
readonly OS_VERSION="unknown"
|
||||||
|
else
|
||||||
|
readonly LOCKDOWND_SOURCE="<a href='lockdownd.log' target='_blank'><code>${LOCKDOWND_LOG/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
${BIN_CP} "${LOCKDOWND_LOG}" "${FOLDER}/"
|
||||||
|
|
||||||
|
# SC2016: shellcheck fails if awk/sed is used!
|
||||||
|
readonly BUILD_NUMBER="$( ${BIN_AWK} '/Build=/ { print $NF; }' "${FOLDER}/lockdownd.log" | ${BIN_HEAD} -n 1 )"
|
||||||
|
|
||||||
|
[ -f "$( ${BIN_DIRNAME} "${0}" )/lib/iphone_os_map.tsv" ] || error_exit "iphone_os_map.tsv not found" 201
|
||||||
|
|
||||||
|
OS_VERSION="$( ${BIN_GREP} --fixed-strings --word-regexp "${BUILD_NUMBER}" $( ${BIN_DIRNAME} "${0}" )/lib/iphone_os_map.tsv \
|
||||||
|
| ${BIN_CUT} -f 1 )"
|
||||||
|
[ -z "${OS_VERSION}" ] && readonly OS_VERSION="<span title='Not found in our map - please ask for an update!'>unknown</span>"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#--- next source ---
|
||||||
|
|
||||||
|
# EVENTUALLY in iTunes Backup!?
|
||||||
|
# There are three com.saurik.Cydia named folders:
|
||||||
|
# - mobile/Library/Caches/Snapshots/com.saurik.Cydia
|
||||||
|
# - mobile/Library/Caches/Snapshots/com.saurik.Cydia/com.saurik.Cydia
|
||||||
|
# - mobile/Library/Caches/com.saurik.Cydia
|
||||||
|
CACHE_CYDIA="$( ${BIN_FIND} "${IOS_BACKUP}" -type d -path "*Caches/com.saurik.Cydia" )"
|
||||||
|
|
||||||
|
JAILBREAK="no"
|
||||||
|
if [ -n "${CACHE_CYDIA}" ] ; then
|
||||||
|
if [ -n "$( ${BIN_LS} "${CACHE_CYDIA}" )" ] ; then
|
||||||
|
readonly JAILBREAK="yes"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
[ "${JAILBREAK}" = "no" ] && readonly CACHE_CYDIA="com.saurik.Cydia not found"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "OS_VERSION: %s\\n" "${OS_VERSION}" 1>&2
|
||||||
|
${BIN_PRINTF} "BUILD_NUMBER: %s\\n" "${BUILD_NUMBER}" 1>&2
|
||||||
|
${BIN_PRINTF} "JAILBREAK: %s\\n" "${JAILBREAK}" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
OS_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Operating System</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${LOCKDOWND_SOURCE}</li>
|
||||||
|
<li><code>${CACHE_CYDIA/${IOS_BACKUP}/\/private\/var}</code></li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>iOS Version:</td>
|
||||||
|
<td>${OS_VERSION}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Build Number:</td>
|
||||||
|
<td>${BUILD_NUMBER}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Jailbreak detected:</td>
|
||||||
|
<td>${JAILBREAK}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly OS_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: os_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+161
@@ -0,0 +1,161 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./sms_plugin.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . sms_plugin.sh
|
||||||
|
# OR
|
||||||
|
# source sms_plugin.sh
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# SMS/iMessage plugin (library) to generate content with simple template engine.
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2034 ./sms_plugin.sh
|
||||||
|
# - shellcheck -s ksh -e SC2034 ./sms_plugin.sh
|
||||||
|
# - shellcheck -s dash -e SC2034 ./sms_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: get_sms_list
|
||||||
|
# DESCRIPTION: "Grep" information and store into vars.
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
get_sms_list () {
|
||||||
|
# "3d0d7e5fb2ce288813306e4d4636395e047a3d28" in iTunes Backup.
|
||||||
|
readonly SMS_SQLITE="$( ${BIN_FIND} "${IOS_BACKUP}" -type f -name "sms.db" )"
|
||||||
|
|
||||||
|
if [ -z "${SMS_SQLITE}" ] ; then
|
||||||
|
readonly SMS_SOURCE="<code>sms.db not found</code>"
|
||||||
|
error "sms.db not found"
|
||||||
|
readonly SMS_LIST="<tr><td class='highlight' colspan='7'>ERROR: database not found!</td></tr>"
|
||||||
|
else
|
||||||
|
readonly SMS_SOURCE="<a href='sms.db' target='_blank'><code>${SMS_SQLITE/${IOS_BACKUP}/\/private\/var}</code></a>"
|
||||||
|
# * -> Don't forget to copy write ahead log!
|
||||||
|
${BIN_CP} "${SMS_SQLITE}"* "${FOLDER}/"
|
||||||
|
|
||||||
|
readonly SMS_LIST="$( ${BIN_SQLITE3} -html "${FOLDER}/sms.db" \
|
||||||
|
"SELECT
|
||||||
|
m.ROWID,
|
||||||
|
m.text,
|
||||||
|
m.service,
|
||||||
|
DATETIME(m.date+978307200, 'unixepoch'),
|
||||||
|
REPLACE (m.account, 'p:', ''),
|
||||||
|
CASE WHEN m.is_from_me=0 THEN '<-' ELSE '->' END,
|
||||||
|
h.id
|
||||||
|
FROM
|
||||||
|
message AS m, handle AS h
|
||||||
|
WHERE
|
||||||
|
m.handle_id=h.ROWID;" )"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: sms_plugin processed.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for hardware information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
SMS_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>SMS/iMessage</h2>
|
||||||
|
<h4>Sources</h4>
|
||||||
|
<ul class="file">
|
||||||
|
<li>${SMS_SOURCE}</li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Text</th>
|
||||||
|
<th>Service</th>
|
||||||
|
<th>Date</th>
|
||||||
|
<th>Me</th>
|
||||||
|
<th>Direction</th>
|
||||||
|
<th>Other</th>
|
||||||
|
</tr>
|
||||||
|
${SMS_LIST}
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly SMS_PLUGIN_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: sms_plugin.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Executable
+406
@@ -0,0 +1,406 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
#===============================================================================
|
||||||
|
#
|
||||||
|
# DIRECTORY:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# FILE:
|
||||||
|
# ./template_engine.sh
|
||||||
|
#
|
||||||
|
# USAGE:
|
||||||
|
# . template_engine.sh
|
||||||
|
# OR
|
||||||
|
# source template_engine.sh
|
||||||
|
#
|
||||||
|
# EXIT STATES:
|
||||||
|
# 201 = functions library not loaded
|
||||||
|
# 202 = libplist (Linux/FreeBSD) not installed
|
||||||
|
# 203 = base64 not installed
|
||||||
|
# 204 = vim (xxd) not installed
|
||||||
|
# 205 = sqlite3 not installed
|
||||||
|
# 206 = os not supported (yet)
|
||||||
|
#
|
||||||
|
# DESCRIPTION:
|
||||||
|
# Simple template engine (library) with templates for basic content.
|
||||||
|
#
|
||||||
|
# REQUIREMENTS:
|
||||||
|
# cat, base64, mkdir, ...
|
||||||
|
#
|
||||||
|
# BUGS:
|
||||||
|
# ---
|
||||||
|
#
|
||||||
|
# TESTS:
|
||||||
|
# - shellcheck -s bash -e SC2086,SC2034 ./template_engine.sh
|
||||||
|
# - shellcheck -s ksh -e SC2086,SC2034 ./template_engine.sh
|
||||||
|
# - shellcheck -s dash -e SC2086,SC2034 ./template_engine.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 201
|
||||||
|
fi
|
||||||
|
|
||||||
|
#=== CONFIGURATION (static) ====================================================
|
||||||
|
assign_binary "echo" # common
|
||||||
|
assign_binary "base64" # uncommon: FreeBSD
|
||||||
|
assign_binary "cat" # common
|
||||||
|
assign_binary "file" # common
|
||||||
|
# for plugins:
|
||||||
|
assign_binary "cp" # common
|
||||||
|
assign_binary "head" # common
|
||||||
|
assign_binary "tail" # common
|
||||||
|
assign_binary "xxd" # uncommon: Arch Linux/FreeBSD
|
||||||
|
assign_binary "find" # common
|
||||||
|
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) assign_binary "plutil" # common only macOS
|
||||||
|
;;
|
||||||
|
Linux|FreeBSD) assign_binary "plistutil"
|
||||||
|
[ -z "${BIN_PLISTUTIL}" ] && error_exit "please install libplist and retry" 202
|
||||||
|
;;
|
||||||
|
*) error_exit "Sorry, your os is actually not supported\\!"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Because sqlite3 from macOS 10.13.4 does not remove *-wal and *-shm files
|
||||||
|
# after exit it is better to use that one from Homebrew (if installed):
|
||||||
|
readonly HOMEBREW_SQLITE="/usr/local/opt/sqlite/bin"
|
||||||
|
if [ -d "${HOMEBREW_SQLITE}" ] && [ -n "${PATH##*${HOMEBREW_SQLITE}*}" ] ; then
|
||||||
|
export PATH="/usr/local/opt/sqlite/bin:${PATH}"
|
||||||
|
fi
|
||||||
|
assign_binary "sqlite3" # uncommon: FreeBSD
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Check existence of uncommon binaries.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
[ -z "${BIN_BASE64}" ] && error_exit "please install base64 and retry" 203
|
||||||
|
[ -z "${BIN_XXD}" ] && error_exit "please install vim (xxd) and retry" 204
|
||||||
|
[ -z "${BIN_SQLITE3}" ] && error_exit "please install vim (xxd) and retry" 205
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# "The template engine"
|
||||||
|
# (inspired by: http://pempek.net/articles/2013/07/08/bash-sh-as-template-engine/)
|
||||||
|
#===============================================================================
|
||||||
|
render_template() {
|
||||||
|
# with no options echo from each shell will do it
|
||||||
|
eval "echo \"${1}\""
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: init_folder
|
||||||
|
# DESCRIPTION: create folder with initial content (html, css, jpg and images)
|
||||||
|
# PARAMETERS: none (global vars will be used.)
|
||||||
|
#===============================================================================
|
||||||
|
init_folder () {
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create the favicon.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Into base64 converted binary data could be "a little bit longer".
|
||||||
|
# "echo" expects longer argument list then printf.
|
||||||
|
# Freeing some memory afterwards could not be amiss.
|
||||||
|
FAVICON_BASE64="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ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAWgAAAPoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8eHh7/nJyc/5CQkP9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//kZGR/5ubm/8eHh7/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+gAAAGAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA7AAAA5gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/0hISP+hoaH/gICA/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//4CAgP+hoaH/SEhI/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOYAAAA6AAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACIAAACwAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/VlZW/5qamv9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//m5ub/1VVVf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACxAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAF0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP9JSUn/nJyc/39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//5ubm/9ISEj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAYgAAABgAAAAAAAAAAAAAAAAAAAAAAAAAKQAAAM8AAAD/AAAA/wAAAP8AAAD/AAAA/x8fH/+ioqL/f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/9/f3//f39//39/f/+ZmZn/HBwc/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAzwAAACkAAAAAAAAAAAAAAAAAAAASAAAAaQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5ycnP+AgID/aGho/0hISP9HR0f/VFRU/3p6ev9/f3//cXFx/1BQUP9ISEj/ZWVl/1ZWVv9ERET/QkJC/0JCQv9CQkL/SEhI/0BAQP9AQED/XV1d/39/f/9/f3//f39//15eXv8+Pj7/Pj4+/0hISP91dXX/m5ub/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAGEAAAATAAAAAAAAAAAAAAAjAAAAuwAAAP8cHBz/AQEB/wAAAP8AAAD/W1tb/5CQkP9/f3//TU1N/4KCgv+AgID/ICAg/3Fxcf9sbGz/QUFB/3Z2dv8/Pz//NjY2/29vb/+Xl5f/mZmZ/5mZmf+ZmZn/MTEx/5mZmf9gYGD/Ozs7/3x8fP99fX3/f39//0dHR/+pqan/qamp/yMjI/9ra2v/kZGR/1lZWf8AAAD/AAAA/wQEBP8HBwf/AAAA/wAAALYAAAAjAAAAAAAAAAAAAABDAAAA+gAAAP+Dg4P/sbGx/2dnZ/8CAgL/oKCg/39/f/9/f3//TU1N//Dw8P/w8PD/Hx8f/0xMTP89PT3/t7e3//////9zc3P/p6en///////V1dX/w8PD/8PDw//Dw8P/S0tL//////+hoaH/KCgo/zIyMv85OTn/XFxc/0xMTP///////////ysrK/9ra2v/f39//5+fn/8BAQH/UVFR/4qKiv+Kior/AAAA/wAAAPoAAABDAAAAAAAAABcAAAB2AAAA/xkZGf+Ojo7/xsbG/xcXF/9SUlL/kpKS/39/f/9/f3//TU1N//Dw8P/39/f/eHh4/0BAQP/V1dX///////////9zc3P/2NjY/8jIyP8xMTH/Wlpa/1lZWf9ZWVn/Wlpa///////n5+f/vb29/7q6uv+UlJT/JiYm/0ZGRv///////////ysrK/9ra2v/f39//5KSkv9QUFD/WFhY/8nJyf+ZmZn/BAQE/wAAAP8AAAB3AAAAGwAAABwAAACtAAAA/x8fH/9ZWVn/V1dX/ygoKP+QkJD/f39//39/f/9/f3//TU1N//Dw8P///////////2lpaf+Dg4P/tLS0//////9zc3P/2dnZ/8vLy/8ZGRn/Jycn/ycnJ/8nJyf/QUFB/7u7u/+7u7v/u7u7/7u7u/+7u7v/YGBg/zExMf///////////ysrK/9ra2v/f39//39/f/+Pj4//HBwc/1BQUP+Tk5P/Ozs7/wAAAP8AALine truncated
|
||||||
|
${BIN_ECHO} -n "${FAVICON_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/favicon.ico"
|
||||||
|
FAVICON_BASE64=
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create the logo.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
LOGO_BASE64="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 truncated
|
||||||
|
${BIN_ECHO} -n "${LOGO_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/logo_72x72.png"
|
||||||
|
LOGO_BASE64=
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create the CSS files (customized YAML).
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
IEHACKS_BASE64="LyogWWV0IEFub3RoZXIgTXVsdGljb2x1bW4gTGF5b3V0IC0gaHR0cDovL3d3dy55YW1sLmRlICovCkBtZWRpYSBhbGx7Ym9keXtvXHZlcmZsb3c6dmlzaWJsZX1hcnRpY2xlLGFzaWRlLGRldGFpbHMsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixtYWluLG5hdixzZWN0aW9ue3pvb206MX1hdWRpbyxjYW52YXMsdmlkZW97KmRpc3BsYXk6aW5saW5lOyp6b29tOjF9aW1ney1tcy1pbnRlcnBvbGF0aW9uLW1vZGU6YmljdWJpYzt6b29tOjF9KiBodG1sIGlmcmFtZSwqIGh0bWwgZnJhbWV7b3ZlcmZsb3c6YXV0b30qIGh0bWwgaW5wdXQsKiBodG1sIGZyYW1lc2V0e292ZXJmbG93OmhpZGRlbn0qIGh0bWwgdGV4dGFyZWF7b3ZlcmZsb3c6c2Nyb2xsO292ZXJmbG93LXg6aGlkZGVufWJvZHksI21haW57cG9zaXRpb246cmVsYXRpdmV9KiBodG1sIGJvZHl7cG9zaXRpb246c3RhdGljfS55bS1jbGVhcmZpeHt6b29tOjF9KiBodG1sIC55bS1jb2wxLCogaHRtbCAueW0tY29sMiwqIGh0bWwgLnltLWNvbDN7cG9zaXRpb246cmVsYXRpdmV9Ym9keXtoZWlnaHQ6MSV9LnltLXdyYXBwZXIsLnltLXdib3gsI2hlYWRlciwjbmF2LCNtYWluLCNmb290ZXJ7em9vbToxfSogaHRtbCAueW0td3JhcHBlciwqIGh0bWwgLnltLXdib3h7aGVpZ2h0OjElO2hlaVxnaHQ6YXV0b30qIGh0bWwgI2hlYWRlciwqIGh0bWwgI25hdiwqIGh0bWwgI21haW4sKiBodG1sICNmb290ZXJ7d2lkdGg6MTAwJTt3aWRcdGg6YXV0b30ueW0tZ2JveCwueW0tZ2JveC1sZWZ0LC55bS1nYm94LXJpZ2h0e2hlaWdodDoxJX0qIGh0bWwgdWwsKiBodG1sIG9sLCogaHRtbCBkbHtwb3NpdGlvbjpyZWxhdGl2ZX1ib2R5IG9sIGxpe2Rpc3BsYXk6bGlzdC1pdGVtfSogaHRtbCAuZmxleGlibGV7em9vbToxfWJ1dHRvbixpbnB1dHsqb3ZlcmZsb3c6dmlzaWJsZSFpbXBvcnRhbnR9dGFibGUgYnV0dG9uLHRhYmxlIGlucHV0eypvdmVyZmxvdzphdXRvfWZpZWxkc2V0LGxlZ2VuZHtwb3NpdGlvbjpyZWxhdGl2ZX0ueW0tZm9ybSwueW0tZm9ybSBkaXYsLnltLWZvcm0gZGl2ICp7em9vbToxfS55bS1mb3JtIGlucHV0LC55bS1mb3JtIHRleHRhcmVhe3dpZHRoOjY4JTtwYWRkaW5nLWxlZnQ6MSUhaW1wb3J0YW50O3BhZGRpbmctcmlnaHQ6MSUhaW1wb3J0YW50fS55bS1mb3JtIHNlbGVjdHt3aWR0aDo3MCU7cGFkZGluZy1sZWZ0OjElIWltcG9ydGFudDtwYWRkaW5nLXJpZ2h0OjElIWltcG9ydGFudH0ueW0tZm9ybSAueW0tZmJveC13cmFwe2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbi1yaWdodDotNXB4fS55bS1mYm94LXdyYXAgaW5wdXQsLnltLWZib3gtd3JhcCB0ZXh0YXJlYSwueW0tZnVsbCBpbnB1dCwueW0tZnVsbCB0ZXh0YXJlYXt3aWR0aDo5OCU7bWFyZ2luLXJpZ2h0Oi0zcHh9LnltLWZib3gtd3JhcCBzZWxlY3QsLnltLWZ1bGwgc2VsZWN0e3dpZHRoOjEwMCU7bWFyZ2luLXJpZ2h0Oi0zcHh9KiBodG1sIC55bS1mb3JtIC55bS1mYm94LWNoZWNrIGlucHV0e2Rpc3BsYXk6aW5saW5lIWltcG9ydGFudDt3aWR0aDphdXRvIWltcG9ydGFudDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50IWltcG9ydGFudDtib3JkZXI6MCBub25lIWltcG9ydGFudDtwYWRkaW5nOjAhaW1wb3J0YW50fSogaHRtbCAueW0tZm9ybSAueW0tZmJveC13cmFwIC55bS1mYm94LWNoZWNrIGlucHV0e21hcmdpbi1sZWZ0OjB9aHRtbCAueW0taWUtY2xlYXJpbmd7cG9zaXRpb246c3RhdGljO2Rpc3BsYXk6YmxvY2s7XGNsZWFyOmJvdGg7d2lkdGg6MTAwJTtsaW5lLWhlaWdodDowO2ZvbnQtc2l6ZTowO21hcmdpbjotMnB4IDAgLTFlbSAxcHh9KiBodG1sIC55bS1pZS1jbGVhcmluZ3ttYXJnaW46LTJweCAwIC0xZW0gMH0ueW0tY2JveHttYXJnaW4tYm90dG9tOi0ycHh9aHRtbHttYXJnaW4tcmlnaHQ6MXB4fSogaHRtbHttYXJnaW4tcmlnaHQ6MH0ueW0tY29sM3twb3NpdGlvbjpyZWxhdGl2ZX19QG1lZGlhIHNjcmVlbixwcm9qZWN0aW9uey55bS1jb2wxLC55bS1jb2wye2Rpc3BsYXk6aW5saW5lfS55bS1ncmlke292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmJsb2NrfSogaHRtbCAueW0tZ3JpZHtvdmVyZmxvdzp2aXNpYmxlfS55bS1nbCwueW0tZ3J7ZGlzcGxheTppbmxpbmV9LnltLWVxdWFsaXplIC55bS1nbHtmbG9hdDpsZWZ0O2Rpc3BsYXk6aW5saW5lO3BhZGRpbmctYm90dG9tOjMyNzY3cHg7bWFyZ2luLWJvdHRvbTotMzI3NjdweH0ueW0tZXF1YWxpemUgLnltLWdye2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0Oi01cHg7ZGlzcGxheTppbmxpbmU7cGFkZGluZy1ib3R0b206MzI3NjdweDttYXJnaW4tYm90dG9tOi0zMjc2N3B4fS5uby1pZS1wYWRkaW5nIC55bS1nbCwubm8taWUtcGFkZGluZyAueW0tZ3J7cGFkZGluZy1ib3R0b206MDttYXJnaW4tYm90dG9tOjB9KiBodG1sIC55bS1jYm94LWxlZnQsKiBodG1sIC55bS1jYm94LXJpZ2h0LCogaHRtbCAueW0tY2JveHt3b3JkLXdyYXA6YnJlYWstd29yZH0qIGh0bWwgLnltLWdib3gsKiBodG1sIC55bS1nYm94LWxlZnQsKiBodG1sIC55bS1nYm94LXJpZ2h0e3dvcmQtd3JhcDpicmVhay13b3JkO29cdmVyZmxvdzpoaWRkZW59fUBtZWRpYSBwcmludHsueW0tZ2JveCwueW0tZ2JveC1sZWZ0LC55bS1nYm94LXJpZ2h0LC55bS1jb2wze2hlaWdodDoxJX19"
|
||||||
|
${BIN_ECHO} -n "${IEHACKS_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/iehacks.min.css"
|
||||||
|
IEHACKS_BASE64=
|
||||||
|
|
||||||
|
THEME_BASE64="LyogWWV0IEFub3RoZXIgTXVsdGljb2x1bW4gTGF5b3V0IC0gaHR0cDovL3d3dy55YW1sLmRlICovCkBpbXBvcnQgdXJsKGh0dHA6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PURyb2lkK1NlcmlmOjQwMCw0MDBpdGFsaWMsNzAwfERyb2lkK1NhbnM6NzAwKTsKQG1lZGlhIGFsbHsqe21hcmdpbjowO3BhZGRpbmc6MH1vcHRpb257cGFkZGluZy1sZWZ0Oi40ZW19c2VsZWN0e3BhZGRpbmc6MXB4fSogaHRtbCBib2R5ICp7b3ZlcmZsb3c6dmlzaWJsZX1ib2R5e2ZvbnQtc2l6ZToxMDAlO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMDAwO3RleHQtYWxpZ246bGVmdH1kaXY6dGFyZ2V0LGgxOnRhcmdldCxoMjp0YXJnZXQsaDM6dGFyZ2V0LGg0OnRhcmdldCxoNTp0YXJnZXQsaDY6dGFyZ2V0e291dGxpbmU6MCBub25lfWFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLG1haW4sbmF2LHNlY3Rpb24sc3VtbWFyeXtkaXNwbGF5OmJsb2NrfWF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9ja31hdWRpbzpub3QoW2NvbnRyb2xzXSl7ZGlzcGxheTpub25lfVtoaWRkZW5de2Rpc3BsYXk6bm9uZX1odG1sey1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCV9aW5wdXRbdHlwZT1jaGVja2JveF0saW5wdXRbdHlwZT1yYWRpb117Ym94LXNpemluZzpib3JkZXItYm94O3BhZGRpbmc6MH1pbnB1dFt0eXBlPXNlYXJjaF17LXdlYmtpdC1hcHBlYXJhbmNlOnRleHRmaWVsZDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3h9aW5wdXRbdHlwZT1zZWFyY2hdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uLGlucHV0W3R5cGU9c2VhcmNoXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX1zdmc6bm90KDpyb290KXtvdmVyZmxvdzpoaWRkZW59ZmlndXJle21hcmdpbjowfWZpZWxkc2V0LGltZ3tib3JkZXI6MCBzb2xpZH11bCxvbCxkbHttYXJnaW46MCAwIDFlbSAxZW19bGl7bGluZS1oZWlnaHQ6MS41ZW07bWFyZ2luLWxlZnQ6LjhlbX1kdHtmb250LXdlaWdodDo3MDB9ZGR7bWFyZ2luOjAgMCAxZW0gLjhlbX1ibG9ja3F1b3Rle21hcmdpbjowIDAgMWVtIC44ZW19cXtxdW90ZXM6bm9uZX1ibG9ja3F1b3RlOmJlZm9yZSxibG9ja3F1b3RlOmFmdGVyLHE6YmVmb3JlLHE6YWZ0ZXJ7Y29udGVudDoiIjtjb250ZW50Om5vbmV9dGFibGV7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlci1zcGFjaW5nOjB9LnltLWNsZWFyZml4OmJlZm9yZXtjb250ZW50OiIiO2Rpc3BsYXk6dGFibGV9LnltLWNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7Y29udGVudDoiLiI7ZGlzcGxheTpibG9jaztmb250LXNpemU6MDtoZWlnaHQ6MDt2aXNpYmlsaXR5OmhpZGRlbn0ueW0tY29udGFpbi1kdHtkaXNwbGF5OnRhYmxlO3RhYmxlLWxheW91dDpmaXhlZDt3aWR0aDoxMDAlfS55bS1jb250YWluLW9oe2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOjEwMCV9LnltLWNvbnRhaW4tZmx7ZmxvYXQ6bGVmdDt3aWR0aDoxMDAlfS55bS1jb2x1bW57ZGlzcGxheTp0YWJsZTt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJX0ueW0tY29sMXtmbG9hdDpsZWZ0O3dpZHRoOjIwJX0ueW0tY29sMntmbG9hdDpyaWdodDt3aWR0aDoyMCV9LnltLWNvbDN7d2lkdGg6YXV0bzttYXJnaW46MCAyMCV9LnltLWNib3h7cGFkZGluZzowIDEwcHh9LnltLWNib3gtbGVmdHtwYWRkaW5nOjAgMTBweCAwIDB9LnltLWNib3gtcmlnaHR7cGFkZGluZzowIDAgMCAxMHB4fS55bS1pZS1jbGVhcmluZ3tkaXNwbGF5Om5vbmV9LnltLWdyaWR7ZGlzcGxheTp0YWJsZTt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJTtsaXN0LXN0eWxlLXR5cGU6bm9uZTtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ueW0tZ2x7ZmxvYXQ6bGVmdDttYXJnaW46MH0ueW0tZ3J7ZmxvYXQ6cmlnaHQ7bWFyZ2luOjAgMCAwIC01cHh9LnltLWcyMHt3aWR0aDoyMCV9LnltLWc0MHt3aWR0aDo0MCV9LnltLWc2MHt3aWR0aDo2MCV9LnltLWc4MHt3aWR0aDo4MCV9LnltLWcyNXt3aWR0aDoyNSV9LnltLWczM3t3aWR0aDozMy4zMzMlfS55bS1nNTB7d2lkdGg6NTAlfS55bS1nNjZ7d2lkdGg6NjYuNjY2JX0ueW0tZzc1e3dpZHRoOjc1JX0ueW0tZzM4e3dpZHRoOjM4LjIlfS55bS1nNjJ7d2lkdGg6NjEuOCV9LnltLWdib3h7cGFkZGluZzowIDEwcHh9LnltLWdib3gtbGVmdHtwYWRkaW5nOjAgMTBweCAwIDB9LnltLWdib3gtcmlnaHR7cGFkZGluZzowIDAgMCAxMHB4fS55bS1lcXVhbGl6ZXtvdmVyZmxvdzpoaWRkZW59LnltLWVxdWFsaXplPltjbGFzcyo9eW0tZ117ZGlzcGxheTp0YWJsZS1jZWxsO2Zsb2F0Om5vbmU7bWFyZ2luOjA7dmVydGljYWwtYWxpZ246dG9wfS55bS1lcXVhbGl6ZT5bY2xhc3MqPXltLWddPltjbGFzcyo9eW0tZ2JveF17cGFkZGluZy1ib3R0b206MTAwMDBweDttYXJnaW4tYm90dG9tOi0xMDAwMHB4fS55bS1mb3JtLC55bS1mb3JtIGZpZWxkc2V0e292ZXJmbG93OmhpZGRlbn0ueW0tZm9ybSBkaXZ7cG9zaXRpb246cmVsYXRpdmV9LnltLWZvcm0gbGFiZWwsLnltLWZvcm0gLnltLWxhYmVsLC55bS1mb3JtIC55bS1tZXNzYWdle3Bvc2l0aW9uOnJlbGF0aXZlO2xpbmUtaGVpZ2h0OjEuNTtkaXNwbGF5OmJsb2NrfS55bS1mb3JtIC55bS1tZXNzYWdle2NsZWFyOmJvdGh9LnltLWZvcm0gLnltLWZib3gtY2hlY2sgbGFiZWx7ZGlzcGxheTppbmxpbmV9LnltLWZvcm0gaW5wdXQsLnltLWZvcm0gdGV4dGFyZWF7Y3Vyc29yOnRleHR9LnltLWZvcm0gLnltLWZib3gtY2hlY2sgaW5wdXQsLnltLWZvcm0gaW5wdXRbdHlwZT1pbWFnZV0sLnltLWZvcm0gaW5wdXRbdHlwZT1yYWRpb10sLnltLWZvcm0gaW5wdXRbdHlwZT1jaGVja2JveF0sLnltLWZvcm0gc2VsZWN0LC55bS1mb3JtIGxhYmVse2N1cnNvcjpwb2ludGVyfS55bS1mb3JtIHRleHRhcmVhe292ZXJmbG93OmF1dG99LnltLWZvcm0gaW5wdXQuaGlkZGVuLC55bS1mb3JtIGlucHV0W3R5cGU9aGlkZGVuXXtkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS55bS1mb3JtIC55bS1mYm94OmJlZm9yZSwueW0tZm9ybSAueW0tZmJveC10ZXh0OmJlZm9yZSwueW0tZm9ybSAueW0tZmJveC1zZWxlY3Q6YmVmb3JlLC55bS1mb3JtIC55bS1mYm94LWNoZWNrOmJlZm9yZSwueW0tZm9ybSAueW0tZmJveC1idXR0b246YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZX0ueW0tZm9ybSAueW0tZmJveDphZnRlciwueW0tZm9ybSAueW0tZmJveC10ZXh0OmFmdGVyLC55bS1mb3JtIC55bS1mYm94LXNlbGVjdDphZnRlciwueW0tZm9ybSAueW0tZmJveC1jaGVjazphZnRlciwueW0tZm9ybSAueW0tZmJveC1idXR0b246YWZ0ZXJ7Y2xlYXI6Ym90aDtjb250ZW50OiIuIjtkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTowO2hlaWdodDowO3Zpc2liaWxpdHk6aGlkZGVufS55bS1mb3JtIC55bS1mYm94LWNoZWNrIGlucHV0OmZvY3VzLC55bS1mb3JtIC55bS1mYm94LWNoZWNrIGlucHV0OmhvdmVyLC55bS1mb3JtIC55bS1mYm94LWNoZWNrIGlucHV0OmFjdGl2ZSwueW0tZm9ybSBpbnB1dFt0eXBlPXJhZGlvXTpmb2N1cywueW0tZm9ybSBpbnB1dFt0eXBlPXJhZGlvXTpob3ZlciwueW0Line truncated
|
||||||
|
${BIN_ECHO} -n "${THEME_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/theme.css"
|
||||||
|
THEME_BASE64=
|
||||||
|
|
||||||
|
${BIN_CAT} <<EOF >> "${FOLDER}/theme.css"
|
||||||
|
/* Individual customizations */
|
||||||
|
.ym-wrapper {
|
||||||
|
max-width: 74em;
|
||||||
|
}
|
||||||
|
header {
|
||||||
|
background: #fff;
|
||||||
|
padding: 0em;
|
||||||
|
background: rgba(0,0,0,0)
|
||||||
|
url("logo_72x72.png")
|
||||||
|
no-repeat scroll left center;
|
||||||
|
padding-left: 84px;
|
||||||
|
height: 72px;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
header h1 {
|
||||||
|
padding-top: 7px;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.ym-hlist {
|
||||||
|
border-top: 1px solid;
|
||||||
|
background: #fff;
|
||||||
|
border-bottom: 1px solid;
|
||||||
|
}
|
||||||
|
.ym-hlist ul li a:focus,
|
||||||
|
.ym-hlist ul li a:hover,
|
||||||
|
.ym-hlist ul li a:active {
|
||||||
|
background: rgba(0, 0, 0, 0.25);
|
||||||
|
}
|
||||||
|
.ym-hlist ul li.active strong,
|
||||||
|
.ym-hlist ul li.active a:focus,
|
||||||
|
.ym-hlist ul li.active a:hover,
|
||||||
|
.ym-hlist ul li.active a:active {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.ym-hlist ul li.active {
|
||||||
|
background: rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
.ym-hlist ul li a,
|
||||||
|
.ym-hlist ul li strong {
|
||||||
|
color: #000;
|
||||||
|
text-shadow: 0 0px 0px;
|
||||||
|
}
|
||||||
|
.ym-hlist ul li a:focus,
|
||||||
|
.ym-hlist ul li a:hover,
|
||||||
|
.ym-hlist ul li a:active {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.cmd li {
|
||||||
|
list-style-type: "$ ";
|
||||||
|
}
|
||||||
|
.file li {
|
||||||
|
list-style-image: url('file.png');
|
||||||
|
}
|
||||||
|
footer {
|
||||||
|
border-top: 1px solid;
|
||||||
|
background: #fff;
|
||||||
|
color: #000;
|
||||||
|
padding: 0em;
|
||||||
|
}
|
||||||
|
footer p {
|
||||||
|
padding-top: 7px;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create the JS files (HTML5 support for older Microsoft Internet Explorer
|
||||||
|
# and skiplink support for Apple Safari).
|
||||||
|
# (Skiplinks actually seems to be broken, eventually the next YAML release
|
||||||
|
# will fix this?)
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
HTML5SHIV_BASE64="LyoqCiogQHByZXNlcnZlIEhUTUw1IFNoaXYgMy43LjMgfCBAYWZhcmthcyBAamRhbHRvbiBAam9uX25lYWwgQHJlbSB8IE1JVC9HUEwyIExpY2Vuc2VkCiovCiFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXt2YXIgYz1hLmNyZWF0ZUVsZW1lbnQoInAiKSxkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8YS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGMuaW5uZXJIVE1MPSJ4PHN0eWxlPiIrYisiPC9zdHlsZT4iLGQuaW5zZXJ0QmVmb3JlKGMubGFzdENoaWxkLGQuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gZCgpe3ZhciBhPXQuZWxlbWVudHM7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhP2Euc3BsaXQoIiAiKTphfWZ1bmN0aW9uIGUoYSxiKXt2YXIgYz10LmVsZW1lbnRzOyJzdHJpbmciIT10eXBlb2YgYyYmKGM9Yy5qb2luKCIgIikpLCJzdHJpbmciIT10eXBlb2YgYSYmKGE9YS5qb2luKCIgIikpLHQuZWxlbWVudHM9YysiICIrYSxqKGIpfWZ1bmN0aW9uIGYoYSl7dmFyIGI9c1thW3FdXTtyZXR1cm4gYnx8KGI9e30scisrLGFbcV09cixzW3JdPWIpLGJ9ZnVuY3Rpb24gZyhhLGMsZCl7aWYoY3x8KGM9YiksbClyZXR1cm4gYy5jcmVhdGVFbGVtZW50KGEpO2R8fChkPWYoYykpO3ZhciBlO3JldHVybiBlPWQuY2FjaGVbYV0/ZC5jYWNoZVthXS5jbG9uZU5vZGUoKTpwLnRlc3QoYSk/KGQuY2FjaGVbYV09ZC5jcmVhdGVFbGVtKGEpKS5jbG9uZU5vZGUoKTpkLmNyZWF0ZUVsZW0oYSksIWUuY2FuSGF2ZUNoaWxkcmVufHxvLnRlc3QoYSl8fGUudGFnVXJuP2U6ZC5mcmFnLmFwcGVuZENoaWxkKGUpfWZ1bmN0aW9uIGgoYSxjKXtpZihhfHwoYT1iKSxsKXJldHVybiBhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtjPWN8fGYoYSk7Zm9yKHZhciBlPWMuZnJhZy5jbG9uZU5vZGUoKSxnPTAsaD1kKCksaT1oLmxlbmd0aDtpPmc7ZysrKWUuY3JlYXRlRWxlbWVudChoW2ddKTtyZXR1cm4gZX1mdW5jdGlvbiBpKGEsYil7Yi5jYWNoZXx8KGIuY2FjaGU9e30sYi5jcmVhdGVFbGVtPWEuY3JlYXRlRWxlbWVudCxiLmNyZWF0ZUZyYWc9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50LGIuZnJhZz1iLmNyZWF0ZUZyYWcoKSksYS5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGMpe3JldHVybiB0LnNoaXZNZXRob2RzP2coYyxhLGIpOmIuY3JlYXRlRWxlbShjKX0sYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50PUZ1bmN0aW9uKCJoLGYiLCJyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1mLmNsb25lTm9kZSgpLGM9bi5jcmVhdGVFbGVtZW50O2guc2hpdk1ldGhvZHMmJigiK2QoKS5qb2luKCkucmVwbGFjZSgvW1x3XC06XSsvZyxmdW5jdGlvbihhKXtyZXR1cm4gYi5jcmVhdGVFbGVtKGEpLGIuZnJhZy5jcmVhdGVFbGVtZW50KGEpLCdjKCInK2ErJyIpJ30pKyIpO3JldHVybiBufSIpKHQsYi5mcmFnKX1mdW5jdGlvbiBqKGEpe2F8fChhPWIpO3ZhciBkPWYoYSk7cmV0dXJuIXQuc2hpdkNTU3x8a3x8ZC5oYXNDU1N8fChkLmhhc0NTUz0hIWMoYSwiYXJ0aWNsZSxhc2lkZSxkaWFsb2csZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbWFpbixuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfW1hcmt7YmFja2dyb3VuZDojRkYwO2NvbG9yOiMwMDB9dGVtcGxhdGV7ZGlzcGxheTpub25lfSIpKSxsfHxpKGEsZCksYX12YXIgayxsLG09IjMuNy4zIixuPWEuaHRtbDV8fHt9LG89L148fF4oPzpidXR0b258bWFwfHNlbGVjdHx0ZXh0YXJlYXxvYmplY3R8aWZyYW1lfG9wdGlvbnxvcHRncm91cCkkL2kscD0vXig/OmF8Ynxjb2RlfGRpdnxmaWVsZHNldHxoMXxoMnxoM3xoNHxoNXxoNnxpfGxhYmVsfGxpfG9sfHB8cXxzcGFufHN0cm9uZ3xzdHlsZXx0YWJsZXx0Ym9keXx0ZHx0aHx0cnx1bCkkL2kscT0iX2h0bWw1c2hpdiIscj0wLHM9e307IWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPWIuY3JlYXRlRWxlbWVudCgiYSIpO2EuaW5uZXJIVE1MPSI8eHl6PjwveHl6PiIsaz0iaGlkZGVuImluIGEsbD0xPT1hLmNoaWxkTm9kZXMubGVuZ3RofHxmdW5jdGlvbigpe2IuY3JlYXRlRWxlbWVudCgiYSIpO3ZhciBhPWIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYS5jbG9uZU5vZGV8fCJ1bmRlZmluZWQiPT10eXBlb2YgYS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwidW5kZWZpbmVkIj09dHlwZW9mIGEuY3JlYXRlRWxlbWVudH0oKX1jYXRjaChjKXtrPSEwLGw9ITB9fSgpO3ZhciB0PXtlbGVtZW50czpuLmVsZW1lbnRzfHwiYWJiciBhcnRpY2xlIGFzaWRlIGF1ZGlvIGJkaSBjYW52YXMgZGF0YSBkYXRhbGlzdCBkZXRhaWxzIGRpYWxvZyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYWluIG1hcmsgbWV0ZXIgbmF2IG91dHB1dCBwaWN0dXJlIHByb2dyZXNzIHNlY3Rpb24gc3VtbWFyeSB0ZW1wbGF0ZSB0aW1lIHZpZGVvIix2ZXJzaW9uOm0sc2hpdkNTUzpuLnNoaXZDU1MhPT0hMSxzdXBwb3J0c1Vua25vd25FbGVtZW50czpsLHNoaXZNZXRob2RzOm4uc2hpdk1ldGhvZHMhPT0hMSx0eXBlOiJkZWZhdWx0IixzaGl2RG9jdW1lbnQ6aixjcmVhdGVFbGVtZW50OmcsY3JlYXRlRG9jdW1lbnRGcmFnbWVudDpoLGFkZEVsZW1lbnRzOmV9O2EuaHRtbDU9dCxqKGIpLCJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXQpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxkb2N1bWVudCk7"
|
||||||
|
${BIN_ECHO} -n "${HTML5SHIV_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/html5shiv.min.js"
|
||||||
|
HTML5SHIV_BASE64=
|
||||||
|
|
||||||
|
FOCUSFIX_BASE64="LyogWWV0IEFub3RoZXIgTXVsdGljb2x1bW4gTGF5b3V0IC0gaHR0cDovL3d3dy55YW1sLmRlICovCihmdW5jdGlvbigpe3ZhciBZQU1MX2ZvY3VzRml4PXtza2lwQ2xhc3M6J3ltLXNraXAnLGluaXQ6ZnVuY3Rpb24oKXt2YXIgdXNlckFnZW50PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTt2YXIgaXNfd2Via2l0PXVzZXJBZ2VudC5pbmRleE9mKCd3ZWJraXQnKT4tMTt2YXIgaXNfaWU9dXNlckFnZW50LmluZGV4T2YoJ21zaWUnKT4tMTtpZihpc193ZWJraXR8fGlzX2llKXt2YXIgYm9keT1kb2N1bWVudC5ib2R5LGhhbmRsZXI9WUFNTF9mb2N1c0ZpeC5jbGljaztpZihib2R5LmFkZEV2ZW50TGlzdGVuZXIpe2JvZHkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGhhbmRsZXIsITEpfWVsc2UgaWYoYm9keS5hdHRhY2hFdmVudCl7Ym9keS5hdHRhY2hFdmVudCgnb25jbGljaycsaGFuZGxlcil9fX0sdHJpbTpmdW5jdGlvbihzdHIpe3JldHVybiBzdHIucmVwbGFjZSgvXlxzXHMqLywnJykucmVwbGFjZSgvXHNccyokLywnJyl9LGNsaWNrOmZ1bmN0aW9uKGUpe2U9ZXx8d2luZG93LmV2ZW50O3ZhciB0YXJnZXQ9ZS50YXJnZXR8fGUuc3JjRWxlbWVudDt2YXIgYT10YXJnZXQuY2xhc3NOYW1lLnNwbGl0KCcgJyk7Zm9yKHZhciBpPTA7aTxhLmxlbmd0aDtpKyspe3ZhciBjbHM9WUFNTF9mb2N1c0ZpeC50cmltKGFbaV0pO2lmKGNscz09PVlBTUxfZm9jdXNGaXguc2tpcENsYXNzKXtZQU1MX2ZvY3VzRml4LmZvY3VzKHRhcmdldCk7YnJlYWt9fX0sZm9jdXM6ZnVuY3Rpb24obGluayl7aWYobGluay5ocmVmKXt2YXIgaHJlZj1saW5rLmhyZWYsaWQ9aHJlZi5zdWJzdHIoaHJlZi5pbmRleE9mKCcjJykrMSksdGFyZ2V0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtpZih0YXJnZXQpe3RhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0YXJnZXQuZm9jdXMoKX19fX07WUFNTF9mb2N1c0ZpeC5pbml0KCl9KSgp"
|
||||||
|
${BIN_ECHO} -n "${FOCUSFIX_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/yaml-focusfix.min.js"
|
||||||
|
FOCUSFIX_BASE64=
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create robots.txt for later use on a public web server.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
${BIN_CAT} <<EOF > "${FOLDER}/robots.txt"
|
||||||
|
User-Agent: *
|
||||||
|
Disallow: /
|
||||||
|
EOF
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create file.png for indivualized unordered lists.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
FILE_BASE64="iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAWBJREFUeNqEUj1LxEAQnd1MVA4lyIEWx6UIKEGUExGsbC3tLfwJ/hT/g7VlCnubqxXBwg/Q4hQP/LhKL5nZuBsvuGfW5MGyuzM7jzdvVuR5DgYnZ+f99ai7Vt5t9K9unu4HLweI3qWYxI6PDosdy0fhcntxO44CcOBzPA7mfEyuHwf7ntQk4jcnywOxIlfxOCNYaLVgb6cXbkTdhJXq2SIlNMC0xIqhHczDbi8OVzpLSUa0WebRfmigLHqj1EcPZnwf7gbDIrYVRyEinurj6jTBHyI7pqVrFQqEbt6TEmZ9v1NRAJNC1xTYxIQh/MmRUlmFQE3qWOW1nqB2TWk1/3tgJV0waVvkFIEeZbHq4ElyKzAmEXOx6gnEVJuWBzmkRJBRPYGZBDsVaOlpSgVJE2yVaAe/0kx/3azBRO0VsbMFZE3CDSZKweZfYIVg+DZ6v7h9GDVOwZPw/PoxKu/fAgwALbDAXf7DdQkAAAAASUVORK5CYII="
|
||||||
|
${BIN_ECHO} -n "${FILE_BASE64}" | ${BIN_BASE64} --decode > "${FOLDER}/file.png"
|
||||||
|
FILE_BASE64=
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Create text file with usage of the script.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2086: a unix command should never contains spaces!
|
||||||
|
./${0} -h > "${FOLDER}/ios2html.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
#=== FUNCTION ==================================================================
|
||||||
|
# NAME: plist_bin2xml
|
||||||
|
# DESCRIPTION: Converts a binary or xml plist on macOS into the report folder
|
||||||
|
# or converts a binary plist on Linux into xml or just copy
|
||||||
|
# it if already xml.
|
||||||
|
# PARAMETER 1: string (source)
|
||||||
|
# PARAMETER 2: string (destination)
|
||||||
|
#===============================================================================
|
||||||
|
plist_bin2xml () {
|
||||||
|
case "${OS_NAME}" in
|
||||||
|
Darwin) ${BIN_PLUTIL} -convert xml1 "${1}" -o "${2}"
|
||||||
|
;;
|
||||||
|
Linux|FreeBSD) if [ "$( ${BIN_FILE} --brief "${1}" )" = "Apple binary property list" ] ; then
|
||||||
|
${BIN_PLISTUTIL} --infile "${1}" --outfile "${2}"
|
||||||
|
else
|
||||||
|
${BIN_CP} "${1}" "${2}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*) error_exit "your os is not supported (yet)" 206
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Global header template for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# SC2034: all "unused" vars are verified!
|
||||||
|
# zsh: readonly is not valid in this context:
|
||||||
|
HEADER=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang='en'>
|
||||||
|
<head>
|
||||||
|
<meta charset='utf-8'>
|
||||||
|
<meta http-equiv='content-language' content='en'>
|
||||||
|
<title>${HEAD_TITLE}</title>
|
||||||
|
<meta name='author' content='Patrick Neumann'>
|
||||||
|
<meta name='author' content='co-authored by Odin Heitmann'>
|
||||||
|
<meta name='publisher' content='Patrick Neumann'>
|
||||||
|
<meta name='copyright' content='Patrick Neumann'>
|
||||||
|
<meta name='description' content='Processed iOS Backup'>
|
||||||
|
<meta name='robots' content='noindex, nofollow'>
|
||||||
|
<link href='${prefix}favicon.ico' rel='icon'>
|
||||||
|
<link href='${prefix}theme.css' rel='stylesheet' type='text/css'>
|
||||||
|
<!--[if lte IE 7]>
|
||||||
|
<link href='${prefix}iehacks.min.css' rel='stylesheet' type='text/css'>
|
||||||
|
<![endif]-->
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src='${prefix}html5shiv.min.js' type='text/javascript'></script>
|
||||||
|
<![endif]-->
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<ul class='ym-skiplinks'>
|
||||||
|
<li><a class='ym-skip' href='#nav'>Skip to navigation (Press Enter)</a></li>
|
||||||
|
<li><a class='ym-skip' href='#main'>Skip to main content (Press Enter)</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class='ym-wrapper'>
|
||||||
|
<div class='ym-wbox'>
|
||||||
|
<header>
|
||||||
|
<h1>${HEADER_H1}</h1>
|
||||||
|
<span>${HEADER_SUBTITLE}</span>
|
||||||
|
</header>
|
||||||
|
<nav id='nav' class='ym-hlist'>
|
||||||
|
<ul>
|
||||||
|
${top_nav}
|
||||||
|
${LOGFILE_LINK}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<main id='main'>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Partial template for the case information for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
CASE_INFORMATION=$( ${BIN_CAT} <<'EOF'
|
||||||
|
<h2>Case</h2>
|
||||||
|
<h4>Commands</h4>
|
||||||
|
<ul class="cmd">
|
||||||
|
<li><a href='https://docs.python.org/2/library/time.html#time.time' target='_blank'><code>python2.7 incl. time module</code></a></li>
|
||||||
|
<li><a href='http://ss64.com/bash/date.html' target='_blank'><code>date</code></a></li>
|
||||||
|
</ul>
|
||||||
|
<h3>Information</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Backup:</td>
|
||||||
|
<td>${IOS_BACKUP}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Report:</td>
|
||||||
|
<td>${FOLDER}/index.html</td>
|
||||||
|
</tr>
|
||||||
|
${LOGFILE_INFO}
|
||||||
|
<tr>
|
||||||
|
<td>Case Number:</td>
|
||||||
|
<td>${CASE_NUMBER}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Officer:</td>
|
||||||
|
<td>${OFFICER}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Date:</td>
|
||||||
|
<td>${DATE}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
# Global footer template for the simple template engine.
|
||||||
|
#-------------------------------------------------------------------------------
|
||||||
|
FOOTER=$( ${BIN_CAT} <<'EOF'
|
||||||
|
</main>
|
||||||
|
<footer>
|
||||||
|
<p>Generated with the <a href='ios2html.txt' target='_blank'><code>${SCRIPTNAME}</code></a> shell script by <a href='mailto:%70atri%63k%40neumann%73%6Cand%2Ede'>P. Neumann</a> and <a href='mailto:odi%6E.heitma%6En@g%6Dail.com'>O. Heitmann</a> – Layout based on <a href='http://www.yaml.de'>YAML</a></p>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src='./yaml-focusfix.min.js' type='text/javascript'></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
|
||||||
|
readonly TEMPLATE_ENGINE_LOADED="true"
|
||||||
|
|
||||||
|
if [ "${DEBUG}" = "on" ] ; then
|
||||||
|
${BIN_PRINTF} "INFO: template_engine.sh loaded.\\n" 1>&2
|
||||||
|
fi
|
||||||
|
# Do not use "exit" at the end of a sourced library!
|
||||||
Reference in new issue
Block a user