Skip to content

Instantly share code, notes, and snippets.

@ML-unife
Last active February 24, 2026 08:53
Show Gist options
  • Select an option

  • Save ML-unife/7472f67c9f11be585b751f0197196d7a to your computer and use it in GitHub Desktop.

Select an option

Save ML-unife/7472f67c9f11be585b751f0197196d7a to your computer and use it in GitHub Desktop.
Utilizzo:
ekahau_add_survey.sh /path/to/project.esx /path/to/report.esx
Descrizione:
Travasa il survey presente in "report.esx" prodotto con WiProber nel
progetto Ekahau "project.esx".
Le immagini dei piani nei due progetti devono avere la stessa risoluzione.
Consigliato usare lo stesso file, in questo caso lo script identifica
automaticamente a quale piano del progetto si riferisce il survey.
Diversamente lo script richiede quale sia il piano di interesse.
Viene creata una copia di backup del progetto originario nella stessa
cartella in cui si trova il file.
Requisiti: comando jq (Command-line JSON processor)
sudo apt install jq
#!/bin/bash
# funzione unisci FILE del progetto e del survey applicando il filtro specificato
function json_merge() {
local FILE=$1
local FILTER=$2
# copia il vecchio survey se presente in FILE_1
if [ -e "${PROJECT_TEMP_DIR}/${FILE}" ]
then
cp "${PROJECT_TEMP_DIR}/${FILE}" "${TEMP_DIR}/${FILE}_1"
fi
# copia il nuovo survey in FILE_2
cp "${SURVEY_TEMP_DIR}/${FILE}" "${TEMP_DIR}/${FILE}_2"
# unisci tutto con filtro
jq -s "$FILTER" "${TEMP_DIR}/${FILE}"* > "${TEMP_DIR}/new_${FILE}"
mv "${TEMP_DIR}/new_${FILE}" "${PROJECT_TEMP_DIR}/${FILE}"
}
# gestisci gli errori
set -euo pipefail
err_handler() {
echo "Errore script alla linea $(caller)" >&2
}
TEMP_DIR=$(mktemp -d)
trap err_handler ERR
trap "rm -rf $TEMP_DIR" EXIT
# errore se parametri mancanti
if [ $# -lt 2 ]
then
echo -e "Usage: $0 progetto.esx survey.esx"
exit
fi
# file passati come parametro
PROJECT=$(realpath "$1")
SURVEY=$(realpath "$2")
PROJECT_PATH=$(dirname "$PROJECT")
PROJECT_FILE=$(basename "$PROJECT")
PROJECT_NAME=${PROJECT_FILE%.*}
PROJECT_TEMP_DIR="${TEMP_DIR}/${PROJECT_NAME}"
SURVEY_PATH=$(dirname "$SURVEY")
SURVEY_FILE=$(basename "$SURVEY")
SURVEY_NAME=${SURVEY_FILE%.*}
SURVEY_TEMP_DIR="${TEMP_DIR}/${SURVEY_NAME}"
# scompatta progetto e survey in directory temporanee di lavoro
unzip -q "$PROJECT" -d "$PROJECT_TEMP_DIR"
unzip -q "$SURVEY" -d "$SURVEY_TEMP_DIR"
SURVEY_IMGFILE=image-$(jq -r '.floorPlans[0].imageId' "${SURVEY_TEMP_DIR}/floorPlans.json")
SURVEY_IMGMD5=($(md5sum "${SURVEY_TEMP_DIR}/${SURVEY_IMGFILE}"))
# ricava automaticamente il piano del progetto in cui è stato effettuato il survey
PROJECT_FLOORID=0
for ID in $( jq -r '.floorPlans[].imageId' "${PROJECT_TEMP_DIR}/floorPlans.json" )
do
PROJECT_IMGFILE=image-${ID}
PROJECT_IMGMD5=($(md5sum "${PROJECT_TEMP_DIR}/${PROJECT_IMGFILE}"))
if [ $PROJECT_IMGMD5 = $SURVEY_IMGMD5 ]
then
# ricavo id del piano
PROJECT_FLOORID=$(jq ".floorPlans[] | select( .imageId == \"$ID\" ) | .id" "${PROJECT_TEMP_DIR}/floorPlans.json" )
PROJECT_FLOORNAME=$(jq ".floorPlans[] | select( .imageId == \"$ID\" ) | .name" "${PROJECT_TEMP_DIR}/floorPlans.json" )
echo "Survey relativo il piano $PROJECT_FLOORNAME"
fi
done
# se non trovato, chiedi all'utente a quale piano si riferisce
if [ $PROJECT_FLOORID = 0 ]
then
echo -e "Non ho trovato il piano in cui è stato prodotto $SURVEY_FILE\n"
# copia i nomi dei piani in un array
declare -a FLOORNAME
readarray -t FLOORNAME < <(jq '.floorPlans[].name' "${PROJECT_TEMP_DIR}/floorPlans.json" | sort)
# stampa i nomi dei piani
echo "$PROJECT_FILE ha questi piani:"
for (( I=0; I< "${#FLOORNAME[@]}" ; I++ ))
do
echo "$I ${FLOORNAME[$I]}"
done
# chiedi quale aggiornare
echo -e -n "\nIl survey quale piano riguarda? "
read SEL
# ottieni l'id del piano selezionato
PROJECT_FLOORID=$( jq ".floorPlans[] | select( .name == ${FLOORNAME[$SEL]} ) | .id" "${PROJECT_TEMP_DIR}/floorPlans.json" )
fi
# ottieni id del piano del survey
SURVEY_FLOORID=$( jq ".floorPlans[0].id" "${SURVEY_TEMP_DIR}/floorPlans.json" )
# merge json files
json_merge "surveyLookups.json" "{surveyLookups: (map(.surveyLookups) | add | map(if .floorPlanId == $SURVEY_FLOORID then .floorPlanId = $PROJECT_FLOORID else . end))}"
json_merge "wifiAdapterInformations.json" "{wifiAdapterInformations: (map(.wifiAdapterInformations) | add | unique_by(.id))}"
json_merge "measuredRadios.json" "{measuredRadios: (map(.measuredRadios) | add)}"
json_merge "accessPointMeasurements.json" "{accessPointMeasurements: (map(.accessPointMeasurements) | add)}"
json_merge "accessPoints.json" "{accessPoints: (map(.accessPoints) | add | map(if .floorPlanId == $SURVEY_FLOORID then .floorPlanId = $PROJECT_FLOORID else . end))}"
# travasa i survey-* nel progetto modificando l'identificativo del piano
cd $SURVEY_TEMP_DIR
for FILE in survey-*
do
jq ".surveys[].floorPlanId = $PROJECT_FLOORID" "$FILE" > "${PROJECT_TEMP_DIR}/${FILE}"
done
# travasa i track-*
cp -a track-* "${PROJECT_TEMP_DIR}/"
echo
# crea backup esx
BACKUP_FILE="${PROJECT_NAME}_$(date +%s).esx"
mv -v "${PROJECT_PATH}/${PROJECT_FILE}" "${PROJECT_PATH}/${BACKUP_FILE}"
# crea nuovo file esx
DEST_FILE="${PROJECT_PATH}/${PROJECT_FILE}"
echo "Aggiorno progetto $PROJECT_FILE"
cd $PROJECT_TEMP_DIR
rm -f "$DEST_FILE"
zip -q "$DEST_FILE" *
exit
@ML-unife
Copy link
Copy Markdown
Author

Questo script è un utility non ufficiale e non è in alcun modo affiliato,
autorizzato, mantenuto, sponsorizzato o approvato da Ekahau o dagli sviluppatori
di WiProber.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment