2016-07-28 23:44:24 +00:00
/ *
Node - OpenDroneMap Node . js App and REST API to access OpenDroneMap .
2016-07-18 22:56:27 +00:00
Copyright ( C ) 2016 Node - OpenDroneMap Contributors
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 .
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/>.
* /
2016-07-08 20:44:48 +00:00
"use strict" ;
2016-09-25 00:07:02 +00:00
let fs = require ( 'fs' ) ;
2021-05-23 16:33:09 +00:00
let os = require ( 'os' ) ;
2016-09-25 00:07:02 +00:00
let path = require ( 'path' ) ;
2016-08-02 16:07:54 +00:00
let assert = require ( 'assert' ) ;
2016-07-08 20:44:48 +00:00
let spawn = require ( 'child_process' ) . spawn ;
2016-07-29 00:31:30 +00:00
let config = require ( '../config.js' ) ;
2016-07-30 18:30:56 +00:00
let logger = require ( './logger' ) ;
2020-08-03 19:07:20 +00:00
let utils = require ( './utils' ) ;
2016-09-25 00:07:02 +00:00
2016-07-08 20:44:48 +00:00
module . exports = {
2019-01-04 16:36:14 +00:00
run : function ( options , projectName , done , outputReceived ) {
assert ( projectName !== undefined , "projectName must be specified" ) ;
assert ( options [ "project-path" ] !== undefined , "project-path must be defined" ) ;
2021-05-23 16:33:09 +00:00
const command = path . join ( config . odm _path , os . platform ( ) === "win32" ? "run.bat" : "run.sh" ) ,
2019-01-04 16:36:14 +00:00
params = [ ] ;
for ( var name in options ) {
let value = options [ name ] ;
// Skip false booleans
if ( value === false ) continue ;
params . push ( "--" + name ) ;
// We don't specify "--time true" (just "--time")
if ( typeof value !== 'boolean' ) {
params . push ( value ) ;
}
}
params . push ( projectName ) ;
logger . info ( ` About to run: ${ command } ${ params . join ( " " ) } ` ) ;
if ( config . test ) {
logger . info ( "Test mode is on, command will not execute" ) ;
let outputTestFile = path . join ( ".." , "tests" , "odm_output.txt" ) ;
fs . readFile ( path . resolve ( _ _dirname , outputTestFile ) , 'utf8' , ( err , text ) => {
if ( ! err ) {
let lines = text . split ( "\n" ) ;
lines . forEach ( line => outputReceived ( line ) ) ;
done ( null , 0 , null ) ;
} else {
logger . warn ( ` Error: ${ err . message } ` ) ;
done ( err ) ;
}
} ) ;
return ; // Skip rest
}
// Launch
let childProcess = spawn ( command , params , { cwd : config . odm _path } ) ;
childProcess
. on ( 'exit' , ( code , signal ) => done ( null , code , signal ) )
. on ( 'error' , done ) ;
childProcess . stdout . on ( 'data' , chunk => outputReceived ( chunk . toString ( ) ) ) ;
childProcess . stderr . on ( 'data' , chunk => outputReceived ( chunk . toString ( ) ) ) ;
return childProcess ;
} ,
getVersion : function ( done ) {
fs . readFile ( path . join ( config . odm _path , 'VERSION' ) , { encoding : 'utf8' } , ( err , content ) => {
if ( err ) done ( null , "?" ) ;
else done ( null , content . split ( "\n" ) . map ( l => l . trim ( ) ) [ 0 ] ) ;
} ) ;
} ,
2020-12-07 13:44:09 +00:00
getEngine : function ( done ) {
fs . readFile ( path . join ( config . odm _path , 'ENGINE' ) , { encoding : 'utf8' } , ( err , content ) => {
if ( err ) done ( null , "odm" ) ; // Assumed
else done ( null , content . split ( "\n" ) . map ( l => l . trim ( ) ) [ 0 ] ) ;
} ) ;
} ,
2019-01-04 16:36:14 +00:00
getJsonOptions : function ( done ) {
// In test mode, we don't call ODM,
// instead we return a mock
if ( config . test ) {
let optionsTestFile = path . join ( ".." , "tests" , "odm_options.json" ) ;
fs . readFile ( path . resolve ( _ _dirname , optionsTestFile ) , 'utf8' , ( err , json ) => {
if ( ! err ) {
try {
let options = JSON . parse ( json ) ;
done ( null , options ) ;
} catch ( e ) {
logger . warn ( ` Invalid test options ${ optionsTestFile } : ${ err . message } ` ) ;
done ( e ) ;
}
} else {
logger . warn ( ` Error: ${ err . message } ` ) ;
done ( err ) ;
}
} ) ;
return ; // Skip rest
}
2020-09-09 18:42:55 +00:00
const getOdmOptions = ( pythonExe , done ) => {
// Launch
const env = utils . clone ( process . env ) ;
env . ODM _OPTIONS _TMP _FILE = utils . tmpPath ( ".json" ) ;
2021-05-23 16:33:09 +00:00
env . ODM _PATH = config . odm _path ;
2020-09-09 18:42:55 +00:00
let childProcess = spawn ( pythonExe , [ path . join ( _ _dirname , ".." , "helpers" , "odmOptionsToJson.py" ) ,
"--project-path" , config . odm _path , "bogusname" ] , { env } ) ;
// Cleanup on done
let handleResult = ( err , result ) => {
fs . exists ( env . ODM _OPTIONS _TMP _FILE , exists => {
if ( exists ) fs . unlink ( env . ODM _OPTIONS _TMP _FILE , err => {
if ( err ) console . warning ( ` Cannot cleanup ${ env . ODM _OPTIONS _TMP _FILE } ` ) ;
} ) ;
2020-08-03 19:15:46 +00:00
} ) ;
2020-09-09 18:42:55 +00:00
// Don't wait
done ( err , result ) ;
} ;
childProcess
. on ( 'exit' , ( code , signal ) => {
try {
fs . readFile ( env . ODM _OPTIONS _TMP _FILE , { encoding : "utf8" } , ( err , data ) => {
if ( err ) handleResult ( new Error ( ` Cannot read list of options from ODM (from temporary file). Is ODM installed in ${ config . odm _path } ? ` ) ) ;
else {
let json = JSON . parse ( data ) ;
handleResult ( null , json ) ;
}
} ) ;
} catch ( err ) {
handleResult ( new Error ( ` Could not load list of options from ODM. Is ODM installed in ${ config . odm _path } ? Make sure that OpenDroneMap is installed and that --odm_path is set properly: ${ err . message } ` ) ) ;
}
} )
. on ( 'error' , handleResult ) ;
}
2021-05-23 16:33:09 +00:00
if ( os . platform ( ) === "win32" ) {
getOdmOptions ( "helpers\\odm_python.bat" , done ) ;
} else {
// Try Python3 first
getOdmOptions ( "python3" , ( err , result ) => {
if ( err ) getOdmOptions ( "python" , done ) ;
else done ( null , result ) ;
} ) ;
}
2019-01-04 16:36:14 +00:00
}
2016-07-08 20:44:48 +00:00
} ;