From d90bc2cbe0d9312a8c5ee8d9127123aed9b885b3 Mon Sep 17 00:00:00 2001 From: accius Date: Sat, 31 Jan 2026 23:53:01 -0500 Subject: [PATCH] docker fix for missing service files --- iturhfprop-service/Dockerfile | 38 ++++++++++++++++++++--------------- iturhfprop-service/server.js | 29 +++++++++++--------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/iturhfprop-service/Dockerfile b/iturhfprop-service/Dockerfile index 01dee44..5630bb4 100644 --- a/iturhfprop-service/Dockerfile +++ b/iturhfprop-service/Dockerfile @@ -25,20 +25,27 @@ RUN curl -L -o ITURHFProp "https://github.com/ITU-R-Study-Group-3/ITU-R-HF/relea # Download source to get Data files RUN curl -L -o source.tar.gz "https://github.com/ITU-R-Study-Group-3/ITU-R-HF/archive/refs/tags/v14.3.tar.gz" \ && tar -xzf source.tar.gz \ - && echo "=== Top level ===" && ls -la ITU-R-HF-14.3/ \ - && echo "=== Finding Data ===" && find ITU-R-HF-14.3 -type d -name "Data" \ - && echo "=== Finding IonMap ===" && find ITU-R-HF-14.3 -type d -name "IonMap" + && echo "=== Finding all Data directories ===" \ + && find ITU-R-HF-14.3 -type d -name "Data" \ + && echo "=== Finding ionos files ===" \ + && find ITU-R-HF-14.3 -name "ionos*.bin" \ + && echo "=== Finding ant files ===" \ + && find ITU-R-HF-14.3 -name "*.ant" \ + && echo "=== Finding COEFF files ===" \ + && find ITU-R-HF-14.3 -name "COEFF*.BIN" | head -5 -# Move Data directories - try multiple possible locations -RUN if [ -d "ITU-R-HF-14.3/P533/Data" ]; then cp -r ITU-R-HF-14.3/P533/Data .; \ - elif [ -d "ITU-R-HF-14.3/Data" ]; then cp -r ITU-R-HF-14.3/Data .; \ - else echo "ERROR: Data not found!" && exit 1; fi - -# IonMap might be inside P533 or at root level -RUN if [ -d "ITU-R-HF-14.3/P533/IonMap" ]; then cp -r ITU-R-HF-14.3/P533/IonMap .; \ - elif [ -d "ITU-R-HF-14.3/IonMap" ]; then cp -r ITU-R-HF-14.3/IonMap .; \ - elif [ -d "ITU-R-HF-14.3/P533/Src/IonMap" ]; then cp -r ITU-R-HF-14.3/P533/Src/IonMap .; \ - else echo "WARNING: IonMap not found, checking if embedded in Data..." && ls -la Data/; fi +# Create Data directory and copy ALL required files from various locations +RUN mkdir -p Data \ + && echo "=== Copying COEFF files ===" \ + && find ITU-R-HF-14.3 -name "COEFF*.BIN" -exec cp {} Data/ \; \ + && find ITU-R-HF-14.3 -name "COEFF*.txt" -exec cp {} Data/ \; \ + && echo "=== Copying ionos files ===" \ + && find ITU-R-HF-14.3 -name "ionos*.bin" -exec cp {} Data/ \; \ + && echo "=== Copying antenna files ===" \ + && find ITU-R-HF-14.3 -name "*.ant" -exec cp {} Data/ \; \ + && echo "=== Copying any other data files ===" \ + && find ITU-R-HF-14.3 -name "P372*.txt" -exec cp {} Data/ \; 2>/dev/null || true \ + && find ITU-R-HF-14.3 -name "*.csv" -exec cp {} Data/ \; 2>/dev/null || true # Cleanup RUN rm -rf ITU-R-HF-14.3 source.tar.gz @@ -46,10 +53,9 @@ RUN rm -rf ITU-R-HF-14.3 source.tar.gz # Set library path so ITURHFProp can find shared libs ENV LD_LIBRARY_PATH=/opt/iturhfprop:$LD_LIBRARY_PATH -# Verify installation +# Verify installation - show all files in Data RUN echo "=== Binary files ===" && ls -la /opt/iturhfprop/*.so /opt/iturhfprop/ITURHFProp \ - && echo "=== Data directory ===" && ls /opt/iturhfprop/Data/ | head -10 \ - && echo "=== IonMap directory ===" && ls /opt/iturhfprop/IonMap/ | head -5 + && echo "=== Data directory contents ===" && ls -la /opt/iturhfprop/Data/ # Set up the API service WORKDIR /app diff --git a/iturhfprop-service/server.js b/iturhfprop-service/server.js index 6ff13d1..17fe053 100644 --- a/iturhfprop-service/server.js +++ b/iturhfprop-service/server.js @@ -77,12 +77,10 @@ function generateInputFile(params) { // Format frequencies const freqList = frequencies.map(f => f.toFixed(3)).join(' '); - // ITURHFProp input file format - const input = `PathName "OpenHamClock Prediction" -PathTXName "TX" + // ITURHFProp input file format - minimal version without external antenna files + const input = `PathName "OpenHamClock" Path.L_tx.lat ${txLat.toFixed(4)} Path.L_tx.lng ${txLon.toFixed(4)} -PathRXName "RX" Path.L_rx.lat ${rxLat.toFixed(4)} Path.L_rx.lng ${rxLon.toFixed(4)} Path.year ${year} @@ -97,12 +95,6 @@ Path.Relr ${requiredReliability} Path.ManMadeNoise ${manMadeNoise} Path.Modulation ANALOG Path.SorL SHORTPATH -TXAntFilePath ${ITURHFPROP_DATA}/Data/Isotropic.ant -RXAntFilePath ${ITURHFPROP_DATA}/Data/Isotropic.ant -TXAnt.Alt 0.0 -TXAnt.Gain ${txGain.toFixed(1)} -RXAnt.Alt 0.0 -RXAnt.Gain ${rxGain.toFixed(1)} DataFilePath ${ITURHFPROP_DATA}/Data/ `; @@ -263,14 +255,16 @@ app.get('/api/health', (req, res) => { const binaryExists = fs.existsSync(ITURHFPROP_PATH); const dataExists = fs.existsSync(ITURHFPROP_DATA); const dataSubExists = fs.existsSync(ITURHFPROP_DATA + '/Data'); - const ionMapExists = fs.existsSync(ITURHFPROP_DATA + '/IonMap'); // Check for shared libraries const libp533Exists = fs.existsSync('/opt/iturhfprop/libp533.so'); const libp372Exists = fs.existsSync('/opt/iturhfprop/libp372.so'); + // Check for ionospheric data (ionos12.bin in Data folder) + const ionosDataExists = fs.existsSync(ITURHFPROP_DATA + '/Data/ionos12.bin'); + res.json({ - status: binaryExists && dataSubExists && ionMapExists && libp533Exists ? 'healthy' : 'degraded', + status: binaryExists && dataSubExists && libp533Exists && ionosDataExists ? 'healthy' : 'degraded', service: 'iturhfprop', version: '1.0.0', engine: 'ITURHFProp (ITU-R P.533-14)', @@ -278,7 +272,7 @@ app.get('/api/health', (req, res) => { libp533: libp533Exists ? 'found' : 'missing', libp372: libp372Exists ? 'found' : 'missing', dataDir: dataSubExists ? 'found' : 'missing', - ionMapDir: ionMapExists ? 'found' : 'missing', + ionosData: ionosDataExists ? 'found' : 'missing', paths: { binary: ITURHFPROP_PATH, data: ITURHFPROP_DATA @@ -321,17 +315,18 @@ app.get('/api/diag', async (req, res) => { // Check data files try { - const dataFiles = fs.readdirSync(ITURHFPROP_DATA + '/Data').slice(0, 10); + const dataFiles = fs.readdirSync(ITURHFPROP_DATA + '/Data').slice(0, 15); results.data.dataDir = dataFiles; } catch (e) { results.data.dataDir = { error: e.message }; } + // Check for ionospheric data try { - const ionFiles = fs.readdirSync(ITURHFPROP_DATA + '/IonMap').slice(0, 5); - results.data.ionMapDir = ionFiles; + const ionosExists = fs.existsSync(ITURHFPROP_DATA + '/Data/ionos12.bin'); + results.data.ionosData = ionosExists ? 'found' : 'missing'; } catch (e) { - results.data.ionMapDir = { error: e.message }; + results.data.ionosData = { error: e.message }; } // Try running ldd on the binary