New update available

openmediavault 5.5.20

  • Improved PHP and Python block device and filesystem implementation. Re-add usage of /dev/disk/by-uuid device files for all filesystems (except BTRFS) to workaround problems with JMicron based USB enclosures.
  • Issue #894: Disabled cron jobs are still executed.
  • Issue #896: Improve UDEV rule to fix issues with JMS567 SATA 6Gb/s bridge based USB enclosures.

New update available

openmediavault 5.5.19

  • Issue #884: Do not bind session to IP address anymore.

New update available

openmediavault 5.5.18

  • Update locales.
  • Fix bug in omv-mkaptidx.
  • Hardening omv.deploy.initramfs state to prevent an Salt render error if there is no initramfs package installed.
  • Disable accepting router advertisements for static IPv6 network interfaces.
  • Modify network interface RRD graph title.
  • Issue #873: FTP IdentLookup setting is not honored in configuration file.
  • Issue #875: Avahi is not refreshed after adding new NFS share.
  • Issue #877: Add F2FS file system support.
  • Issue #881: Improve RPC to execute cron jobs.

Dynamically inject routes in lazy loaded modules using Angular 11

If you would like to dynamically inject routes in lazy loaded modules in your Angular 11 app, then you need to do the following.

Make sure your service that is responsible for loading the route configuration via HTTP from the server is loading while the app is bootstrapped. This way we can be sure the route configuration is available after the app is bootstrapped.

const routes: Routes = [
  ...,
  { path: '**', redirectTo: '/404' }
];

@NgModule({
  exports: [RouterModule],
  imports: [
    RouterModule.forRoot(routes, {
      useHash: true
    })
  ],
  providers: [
    RouteConfigService,
    {
      provide: APP_INITIALIZER,
      useFactory: (routeConfigService: RouteConfigService) => {
        return () => {
          return routeConfigService.load().toPromise();
        };
      },
      multi: true,
      deps: [RouteConfigService]
    }
  ]
})
export class AppRoutingModule {}

You also need to ensure that your service is a singleton across the whole app.

@NgModule({
  declarations: [],
  imports: [...],
  exports: [...]
})
export class CoreModule {
  static forRoot(): ModuleWithProviders<CoreModule> {
    return {
      ngModule: CoreModule,
      providers: [
        RouteConfigService
      ]
    };
  }
}
@NgModule({
  declarations: [AppComponent],
  imports: [
    ...
    CoreModule.forRoot(),
    AppRoutingModule
  ],
  providers: [...],
  bootstrap: [AppComponent]
})
export class AppModule {}

And finally append the following provider in your lazy loaded module.

const routes: Routes = [
  ...
];

@NgModule({
  exports: [RouterModule],
  imports: [RouterModule.forChild(routes)],
  providers: [
    {
      provide: ROUTES,
      multi: true,
      useFactory: (routeConfigService: RouteConfigService) => {
        routeConfigService.inject('someArgsToIdentifyWhatToInject', routes);
        return routes;
      },
      deps: [RouteConfigService]
    }
  ]
})
export class MyLayzRoutingModule {}
@NgModule({
  declarations: [
    ...
  ],
  imports: [
    ...,
    MyLayzRoutingModule
  ]
})
export class LazyModule {}