@@ -75,7 +75,7 @@ interface GetLogFilesResult {
7575}
7676interface UploadTask {
7777 adapter : string ;
78- msg : ioBroker . SendableMessage ;
78+ msg ? : ioBroker . SendableMessage ;
7979}
8080
8181interface RebuildArgs {
@@ -224,8 +224,6 @@ let diskWarningLevel = DEFAULT_DISK_WARNING_LEVEL;
224224let updateIPsTimer : NodeJS . Timeout | null = null ;
225225let lastDiagSend : null | number = null ;
226226
227- const uploadTasks : UploadTask [ ] = [ ] ;
228-
229227const config = getConfig ( ) ;
230228
231229/**
@@ -1924,23 +1922,21 @@ async function getVersionFromHost(hostId: ioBroker.ObjectIDs.Host): Promise<Host
19241922}
19251923
19261924/**
1927- * Upload all adapters which are currently in `uploadTasks` queue
1925+ * Upload given adapter
1926+ *
1927+ * @param task The upload task information containing name and an optional message
19281928 */
1929- async function startAdapterUpload ( ) : Promise < void > {
1930- if ( ! uploadTasks . length ) {
1931- return ;
1932- }
1933-
1929+ async function uploadAdapter ( task : UploadTask ) : Promise < void > {
19341930 if ( ! upload ) {
19351931 upload = new Upload ( {
19361932 states : states ! ,
19371933 objects : objects !
19381934 } ) ;
19391935 }
19401936
1941- const msg = uploadTasks [ 0 ] . msg ;
1937+ const msg = task . msg ;
19421938
1943- const logger = msg . from
1939+ const logger = msg ? .from
19441940 ? {
19451941 log : ( text : string ) =>
19461942 // @ts -expect-error formally text is not allowed in Message, why not wrapped in message payload property?
@@ -1954,18 +1950,13 @@ async function startAdapterUpload(): Promise<void> {
19541950 }
19551951 : undefined ;
19561952
1957- // @ts -expect-error yes the logger is missing some levels
1958- await upload . uploadAdapter ( uploadTasks [ 0 ] . adapter , true , true , '' , logger ) ;
1959- // @ts -expect-error the logger is missing some levels
1960- await upload . upgradeAdapterObjects ( uploadTasks [ 0 ] . adapter , undefined , logger ) ;
1961- // @ts -expect-error yes the logger is missing some levels
1962- await upload . uploadAdapter ( uploadTasks [ 0 ] . adapter , false , true , '' , logger ) ;
1953+ await upload . uploadAdapter ( task . adapter , true , true , '' , logger ) ;
1954+ await upload . upgradeAdapterObjects ( task . adapter , undefined , logger ) ;
1955+ await upload . uploadAdapter ( task . adapter , false , true , '' , logger ) ;
19631956 // send response to requester
1964- msg . callback && msg . from && sendTo ( msg . from , msg . command , { result : 'done' } , msg . callback ) ;
1965-
1966- uploadTasks . shift ( ) ;
1967-
1968- setImmediate ( startAdapterUpload ) ;
1957+ if ( msg ?. callback && msg . from ) {
1958+ sendTo ( msg . from , msg . command , { result : 'done' } , msg . callback ) ;
1959+ }
19691960}
19701961
19711962/**
@@ -2803,9 +2794,7 @@ async function processMessage(msg: ioBroker.SendableMessage): Promise<null | voi
28032794
28042795 case 'upload' : {
28052796 if ( msg . message ) {
2806- uploadTasks . push ( { adapter : msg . message , msg } ) ;
2807- // start upload if no tasks running
2808- uploadTasks . length === 1 && startAdapterUpload ( ) ;
2797+ uploadAdapter ( { adapter : msg . message , msg } ) ;
28092798 } else {
28102799 logger . error ( `${ hostLogPrefix } No adapter name is specified for upload command from ${ msg . from } ` ) ;
28112800 }
@@ -3797,26 +3786,8 @@ async function startInstance(id: ioBroker.ObjectIDs.Instance, wakeUp = false): P
37973786 }
37983787 }
37993788
3800- const isBlocked = await blocklistManager . isAdapterVersionBlocked ( {
3801- version : instance . common . version ,
3802- adapterName : instance . common . name
3803- } ) ;
3804-
3805- if ( isBlocked ) {
3806- const message = `Do not start instance "${ id } ", because the version "${ instance . common . version } " has been blocked by the developer` ;
3807- logger . error ( `${ hostLogPrefix } ${ message } ` ) ;
3808-
3809- await notificationHandler . addMessage ( {
3810- scope : 'system' ,
3811- category : 'blockedVersions' ,
3812- message,
3813- instance : SYSTEM_HOST_PREFIX + hostname
3814- } ) ;
3815- return ;
3816- }
3817-
38183789 const adapterDir = tools . getAdapterDir ( name ) ;
3819- if ( ! fs . existsSync ( adapterDir ! ) ) {
3790+ if ( adapterDir === null || ! fs . existsSync ( adapterDir ) ) {
38203791 proc . downloadRetry = proc . downloadRetry || 0 ;
38213792 logger . debug ( `${ hostLogPrefix } startInstance Queue ${ id } for installation` ) ;
38223793 installQueue . push ( {
@@ -3859,6 +3830,50 @@ async function startInstance(id: ioBroker.ObjectIDs.Instance, wakeUp = false): P
38593830 }
38603831 }
38613832
3833+ try {
3834+ // check if the io-package content is uploaded to the database
3835+ const ioPack = fs . readJSONSync ( path . join ( adapterDir , 'io-package.json' ) ) ;
3836+
3837+ if ( ioPack . common . version !== instance . common . version ) {
3838+ logger . warn ( `${ hostLogPrefix } Detected missing upload of adapter "${ name } " - starting upload now.` ) ;
3839+ await uploadAdapter ( { adapter : name } ) ;
3840+ return ;
3841+ }
3842+ } catch ( e ) {
3843+ logger . error (
3844+ `${ hostLogPrefix } startInstance ${ name } .${ instanceNo } : Error while ensuring adapter is uploaded: ${ e . message } `
3845+ ) ;
3846+ }
3847+
3848+ const isBlocked = await blocklistManager . isAdapterVersionBlocked ( {
3849+ version : instance . common . version ,
3850+ adapterName : instance . common . name
3851+ } ) ;
3852+
3853+ if ( isBlocked ) {
3854+ const message = `Do not start instance "${ id } ", because the version "${ instance . common . version } " has been blocked by the developer` ;
3855+ logger . error ( `${ hostLogPrefix } ${ message } ` ) ;
3856+
3857+ await notificationHandler . addMessage ( {
3858+ scope : 'system' ,
3859+ category : 'blockedVersions' ,
3860+ message,
3861+ instance : SYSTEM_HOST_PREFIX + hostname
3862+ } ) ;
3863+ return ;
3864+ }
3865+
3866+ // Check if all required adapters installed and have a valid version
3867+ if ( instance . common . dependencies || instance . common . globalDependencies ) {
3868+ try {
3869+ await checkVersions ( id , instance . common . dependencies , instance . common . globalDependencies ) ;
3870+ } catch ( e ) {
3871+ logger . error ( `${ hostLogPrefix } startInstance ${ id } ${ e . message } ` ) ;
3872+ // Do not start this instance
3873+ return ;
3874+ }
3875+ }
3876+
38623877 // workaround for old vis
38633878 if ( instance . common . onlyWWW && name === 'vis' ) {
38643879 instance . common . onlyWWW = false ;
@@ -3886,7 +3901,7 @@ async function startInstance(id: ioBroker.ObjectIDs.Instance, wakeUp = false): P
38863901 // read node.js engine requirements
38873902 try {
38883903 // read directly from disk and not via require to allow "on the fly" updates of adapters.
3889- const packJSON = fs . readJSONSync ( ` ${ adapterDir } / package.json` ) ;
3904+ const packJSON = fs . readJSONSync ( path . join ( adapterDir , ' package.json' ) ) ;
38903905 proc . engine = packJSON ?. engines ?. node ;
38913906 } catch {
38923907 logger . error (
@@ -3901,16 +3916,14 @@ async function startInstance(id: ioBroker.ObjectIDs.Instance, wakeUp = false): P
39013916 `${ hostLogPrefix } startInstance ${ name } .${ instanceNo } : required Node.js version ${ proc . engine } , actual version ${ process . version } `
39023917 ) ;
39033918 // disable instance
3904- objects ! . getObject ( id , ( err , obj ) => {
3905- if ( obj && obj . common && obj . common . enabled ) {
3906- obj . common . enabled = false ;
3907- objects ! . setObject ( obj . _id , obj , _err =>
3908- logger . warn (
3909- `${ hostLogPrefix } startInstance ${ name } .${ instanceNo } : instance disabled because of Node.js version mismatch`
3910- )
3911- ) ;
3912- }
3913- } ) ;
3919+ const obj = await objects ! . getObject ( id ) ;
3920+ if ( obj ?. common ?. enabled ) {
3921+ obj . common . enabled = false ;
3922+ await objects ! . setObject ( obj . _id , obj ) ;
3923+ logger . warn (
3924+ `${ hostLogPrefix } startInstance ${ name } .${ instanceNo } : instance disabled because of Node.js version mismatch`
3925+ ) ;
3926+ }
39143927 return ;
39153928 }
39163929 }
0 commit comments