Maps SWID script
This commit is contained in:
parent
14cd7eb3a6
commit
af40a71e00
@ -40,6 +40,7 @@ The guides are organized in the `guides` directory. Each PDF file in this direct
|
||||
|------------------|------------------------------------------------------|
|
||||
| `fat32format.txt` | Application for formatting USB drives to FAT32. |
|
||||
| `copie_scr.sh` | Script for pulling the 1b file out of CIC systems. |
|
||||
| `maps_swid.sh` | CIC/NBT System get FSCShort/SWID from Maps archive |
|
||||
|
||||
## License
|
||||
|
||||
|
250
tools/maps_swid.sh
Normal file
250
tools/maps_swid.sh
Normal file
@ -0,0 +1,250 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Set variables
|
||||
INFO_MAP_FILENAME="Info_Map.imp"
|
||||
VERBOSE=0
|
||||
GENERATEXML=0
|
||||
MAP_FOLDER=""
|
||||
ARCHIVE_FILE=""
|
||||
DIRECT_FILE=""
|
||||
LOG_FILE="./script.log"
|
||||
DEFAULT=""
|
||||
DEPENDENCIES=("7z" "hexdump" "awk")
|
||||
|
||||
# Functions declaration
|
||||
|
||||
# Check if all required commands are available
|
||||
check_dependencies() {
|
||||
for cmd in "${DEPENDENCIES[@]}"; do
|
||||
if ! command -v "$cmd" &> /dev/null; then
|
||||
echo "ERROR: Required command '$cmd' is not installed. Please install it and try again."
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Log message to console and file
|
||||
log_message() {
|
||||
if [[ $VERBOSE -eq 1 ]]; then
|
||||
echo "$1" | tee -a "$LOG_FILE"
|
||||
else
|
||||
echo "$1" >> "$LOG_FILE"
|
||||
fi
|
||||
}
|
||||
|
||||
# Clean up temporary files when script exits
|
||||
cleanup() {
|
||||
if [[ -f "/tmp/$INFO_MAP_FILENAME" ]]; then
|
||||
rm "/tmp/$INFO_MAP_FILENAME"
|
||||
fi
|
||||
log_message "Cleaned up temporary files."
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# Progress bar for long operations
|
||||
show_progress() {
|
||||
for i in {1..4}; do
|
||||
sleep 1
|
||||
case $i in
|
||||
1) echo -ne 'Processing: [# ] (0%)\r' ;;
|
||||
2) echo -ne 'Processing: [##### ] (25%)\r' ;;
|
||||
3) echo -ne 'Processing: [########## ] (50%)\r' ;;
|
||||
4) echo -ne 'Processing: [############### ] (75%)\r' ;;
|
||||
esac
|
||||
done
|
||||
echo -ne 'Processing: [####################### ] (100%)\r\n'
|
||||
}
|
||||
|
||||
# Parse Info_Map.imp file
|
||||
parseInfoMapFile() {
|
||||
log_message "Parsing file..."
|
||||
|
||||
MAP_NAME=$(hexdump -C "$INFOMAP_FILE" | awk -F"|" '{ print $2 }' | tr -d "\n" | cut -c 21-200)
|
||||
MAP_SWID_FscShort=$(hexdump -C "$INFOMAP_FILE" | awk 'NR==1 {print toupper($10$11$12$13)}')
|
||||
MAP_REGION=$(hexdump -C "$INFOMAP_FILE" | awk 'NR==1 {print "0x" toupper($11)}')
|
||||
MAP_YEAR=$(hexdump -C "$INFOMAP_FILE" | awk 'NR==1 {print "0x" toupper($13)}')
|
||||
log_message "Parsing completed [OK]"
|
||||
}
|
||||
|
||||
# Display map information
|
||||
showMapInfos() {
|
||||
echo -e "\n===================== Map Information ========================="
|
||||
echo -e "Map Name : \"$MAP_NAME\""
|
||||
echo -e "SWID_FscShort : \"$MAP_SWID_FscShort\""
|
||||
echo -e "Map Region : \"$MAP_REGION\""
|
||||
echo -e "Map Year : \"$MAP_YEAR\""
|
||||
echo -e "===============================================================\n"
|
||||
}
|
||||
|
||||
# Show the XML entry to add
|
||||
showLookupXMLEntry() {
|
||||
LONG_MAP_NAME="$MAP_NAME (SWID_FscShort=$MAP_SWID_FscShort, MapRegion=$MAP_REGION, MapYear=$MAP_YEAR)"
|
||||
echo -e "\n===================== XML Generation ==========================="
|
||||
echo -e "Add this entry at the end of the maps list in your Lookup.xml file:\n"
|
||||
echo -e "<SgbmId id=\"NAVD_000024A8_255_007_034\" SWID_FscShort=\"$MAP_SWID_FscShort\" name=\"$LONG_MAP_NAME\" supplier=\"NTQ\" sop=\"01.05.2021\" version=\"10_09\" MapOrderNumberBMW=\"\" MapOrderNumberMINI=\"\" MapOrderNumberRR=\"\" successorMapOrderNumberBMW=\"\" successorMapOrderNumberMINI=\"\" successorMapOrderNumberRR=\"\" NextNo=\"01826\">\n\t<EcuVariant CompatibilityIdentifier=\"NBTevo-HB\" Format=\"CIC\" />\n\t<SwUpdate SwUpdateEntry=\"\"/>\n</SgbmId>"
|
||||
echo -e "\n===============================================================\n"
|
||||
}
|
||||
|
||||
# Validate input file permissions
|
||||
validate_file() {
|
||||
if [[ ! -r "$1" ]]; then
|
||||
echo "ERROR: Cannot read file $1. Check permissions."
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Process an archive file
|
||||
processArchiveFile() {
|
||||
if [[ ! -f "$ARCHIVE_FILE" ]]; then
|
||||
log_message "ERROR: Archive file \"$ARCHIVE_FILE\" does not exist"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
log_message "File archive exists"
|
||||
|
||||
PATH_TO_INFOMAP_FILE=$(7z l "$ARCHIVE_FILE" | grep "$INFO_MAP_FILENAME" | grep -v "LIGHT" | awk '{print $NF}')
|
||||
|
||||
log_message "Looking for \"$INFO_MAP_FILENAME\" in the archive... [OK] - $PATH_TO_INFOMAP_FILE"
|
||||
|
||||
filename=$(basename -- "$ARCHIVE_FILE")
|
||||
extension="${filename##*.}"
|
||||
|
||||
case "$extension" in
|
||||
"7z"|"7Z")
|
||||
log_message "Extracting \"$INFO_MAP_FILENAME\" from 7zip archive..."
|
||||
show_progress
|
||||
7z -y e "$ARCHIVE_FILE" -o"/tmp" "$PATH_TO_INFOMAP_FILE"
|
||||
;;
|
||||
"zip"|"ZIP"|"tar")
|
||||
show_progress
|
||||
7z -y e "$ARCHIVE_FILE" -o"/tmp" "$PATH_TO_INFOMAP_FILE" > /dev/null
|
||||
;;
|
||||
*)
|
||||
log_message "Unsupported archive format: $extension"
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -f "/tmp/$INFO_MAP_FILENAME" ]]; then
|
||||
INFOMAP_FILE="/tmp/$INFO_MAP_FILENAME"
|
||||
else
|
||||
log_message "ERROR: \"$INFO_MAP_FILENAME\" not found in /tmp"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Process map folder
|
||||
processFolder() {
|
||||
log_message "Processing folder \"$MAP_FOLDER\"..."
|
||||
|
||||
if [[ -d "$MAP_FOLDER/1" ]]; then
|
||||
INFOMAP_FILE=$(find "$MAP_FOLDER/1" -name "$INFO_MAP_FILENAME" | grep -v "LIGHT" | head -n 1)
|
||||
if [[ -z "$INFOMAP_FILE" ]]; then
|
||||
log_message "ERROR: \"$INFO_MAP_FILENAME\" not found in folder(s) 1/INFO*"
|
||||
exit 2
|
||||
fi
|
||||
else
|
||||
log_message "ERROR: Folder \"$MAP_FOLDER\" does not contain expected map files"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Batch process for multiple maps
|
||||
process_batch() {
|
||||
for file in "$1"/*; do
|
||||
if [[ -d "$file" ]]; then
|
||||
log_message "Processing folder: $file"
|
||||
processFolder "$file"
|
||||
elif [[ -f "$file" ]]; then
|
||||
log_message "Processing archive: $file"
|
||||
processArchiveFile "$file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Set working directory
|
||||
setWorkDir() {
|
||||
if [[ -d "$MAP_FOLDER" ]]; then
|
||||
cd "$MAP_FOLDER" || exit 1
|
||||
log_message "Using map folder \"$MAP_FOLDER\"... [OK]"
|
||||
else
|
||||
log_message "ERROR: Given folder \"$MAP_FOLDER\" does not exist"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
# Prompt for confirmation before overwriting
|
||||
prompt_for_confirmation() {
|
||||
read -p "File $1 exists. Overwrite? (y/n): " choice
|
||||
case "$choice" in
|
||||
y|Y ) log_message "Overwriting...";;
|
||||
n|N ) log_message "Skipping..."; exit 0;;
|
||||
* ) log_message "Invalid choice"; exit 1;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Show usage/help message
|
||||
show_help() {
|
||||
echo "Usage: InfoMap.sh [OPTIONS]"
|
||||
echo "Extract hex information from downloaded BMW / Mini / RR Maps"
|
||||
echo "Options:"
|
||||
echo " -d <dir> Specify the map folder to process."
|
||||
echo " -z <file> Specify the archive file to process (zip, 7z, etc.)."
|
||||
echo " -f <file> Specify the Info_Map.imp file directly."
|
||||
echo " -v Enable verbose mode."
|
||||
echo " -x Generate XML entry."
|
||||
echo " -b <dir> Batch process multiple folders or archives in the directory."
|
||||
echo " -h Show this help message."
|
||||
}
|
||||
|
||||
############# Main Program Starts #############
|
||||
|
||||
# Show help if no arguments are provided
|
||||
if [[ $# -eq 0 ]]; then
|
||||
show_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
POSITIONAL_ARGS=()
|
||||
|
||||
while getopts ":d:z:f:xb:vh" option; do
|
||||
case $option in
|
||||
d) MAP_FOLDER="$OPTARG" ;;
|
||||
z) ARCHIVE_FILE="$OPTARG" ;;
|
||||
f) DIRECT_FILE="$OPTARG" ;;
|
||||
v) VERBOSE=1 ;;
|
||||
x) GENERATEXML=1 ;;
|
||||
b) process_batch "$OPTARG"; exit 0 ;;
|
||||
h) show_help; exit 0 ;;
|
||||
*) echo "Invalid option: -$OPTARG"; show_help; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND-1))
|
||||
|
||||
# Check dependencies
|
||||
check_dependencies
|
||||
|
||||
# Processing logic based on provided arguments
|
||||
if [[ -n "$DIRECT_FILE" ]]; then
|
||||
validate_file "$DIRECT_FILE"
|
||||
INFOMAP_FILE="$DIRECT_FILE"
|
||||
elif [[ -n "$MAP_FOLDER" ]]; then
|
||||
setWorkDir
|
||||
processFolder
|
||||
elif [[ -n "$ARCHIVE_FILE" ]]; then
|
||||
processArchiveFile
|
||||
else
|
||||
log_message "No valid input provided"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Parsing Info_Map.imp file
|
||||
parseInfoMapFile
|
||||
|
||||
# Display map information
|
||||
showMapInfos
|
||||
|
||||
# Generate XML entry if required
|
||||
if [[ $GENERATEXML -eq 1 ]]; then
|
||||
showLookupXMLEntry
|
||||
fi
|
Loading…
Reference in New Issue
Block a user