Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
f7c3d53
#ITC-3595 Import Module: Add support for FlowChief (initial commit)
ibering Sep 24, 2025
93180ae
ITC-3595 Refactor External Monitoring Systems to use Enum for system_…
nook24 Sep 25, 2025
36a9353
ITC-3595 Add FlowChief node selection for external monitoring systems
nook24 Sep 25, 2025
da88101
#ITC-3595 Import Module: Add support for FlowChief: External monitori…
ibering Sep 26, 2025
1ac4f98
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Sep 26, 2025
933c1c0
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
nook24 Sep 26, 2025
76b8595
#ITC-3595 Import Module: Add support for FlowChief: External monitori…
ibering Sep 26, 2025
20567c0
Merge branch 'ITC-3595' of https://github.com/openITCOCKPIT/openITCOC…
ibering Sep 26, 2025
2a8f218
ITC-3595 Implement submit
nook24 Sep 26, 2025
55d1cee
#ITC-3595 Import Module: Add support for FlowChief: External monitori…
ibering Sep 26, 2025
aa41951
Merge branch 'ITC-3595' of https://github.com/openITCOCKPIT/openITCOC…
ibering Sep 26, 2025
5c1c58b
ITC-3595 Save sub-tree selection per flowchief system
nook24 Sep 26, 2025
ba30dff
ITC-3595 Replace wrong link to ExternalMonitorings (instead of Extern…
nook24 Sep 26, 2025
0cd1500
* Add Hyper-V wizard front-end.
Jan-Nox Sep 29, 2025
e57deb1
ITC-3595 Add host_prefix to external monitoring for FlowChief
nook24 Sep 30, 2025
8e221d0
* Change field to the correct value
Jan-Nox Sep 30, 2025
cf7178f
Merge remote-tracking branch 'origin' into ITC-3567
Jan-Nox Sep 30, 2025
4e51012
* Add BroadcomProxy Front-End
Jan-Nox Oct 1, 2025
259440e
* Add Wizard front-end
Jan-Nox Oct 8, 2025
99bd8db
* Add new Routes.
Jan-Nox Oct 8, 2025
5c7c9d6
* Fix case
Jan-Nox Oct 8, 2025
5b92e1d
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Oct 13, 2025
f204632
#ITC-3610 Host - edit_details bug when shared
ibering Oct 14, 2025
569fd90
* Add new wizard and module for Cisco WLC
Jan-Nox Oct 14, 2025
5ff0dfb
#ITC-3595 Import Module: Add support for FlowChief: External monitori…
ibering Oct 15, 2025
a800e65
#ITC-3612 Append to hostgroup/servicegroup search won't load new elem…
ibering Oct 15, 2025
312396e
#ITC-3612 Append to hostgroup/servicegroup search won't load new elem…
ibering Oct 15, 2025
b575774
Merge branch 'main' of https://github.com/openITCOCKPIT/openITCOCKPIT…
nook24 Oct 16, 2025
97c51b6
Merge pull request #411 from openITCOCKPIT/ITC-3595
nook24 Oct 16, 2025
5363fc2
Merge pull request #408 from openITCOCKPIT/ITC-3610
nook24 Oct 16, 2025
354a095
Merge pull request #409 from openITCOCKPIT/ITC-3612
nook24 Oct 16, 2025
0fbaf16
apexcharts to last MIT Version, bump ngx-toastr to 19.1.0
dietmarj Oct 17, 2025
20008c6
#ITC-3595 Import Module: Add support for FlowChief: FlowchiefNodeSele…
ibering Oct 17, 2025
9be03d9
ITC-3498 Add tool to check 3rdparty licenses while build
nook24 Oct 20, 2025
aaad834
Merge pull request #412 from openITCOCKPIT/ITC-3618
nook24 Oct 20, 2025
ff4aff5
Update package-lock.json
nook24 Oct 20, 2025
1868de7
#ITC-3615 Apexcharts: License Problem (initial commit)
ibering Oct 20, 2025
08a3a95
#ITC-3615 Apexcharts: License Problem (replaced with echarts)
ibering Oct 21, 2025
d57ed30
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Oct 21, 2025
0d469f6
#ITC-3615 Apexcharts: License Problem (removed apexcharts)
ibering Oct 21, 2025
6266b21
Merge remote-tracking branch 'origin' into ITC-3553
Jan-Nox Oct 21, 2025
8c4e17d
Merge remote-tracking branch 'origin' into ITC-3568
Jan-Nox Oct 21, 2025
6d38064
ITC-3615 Fix update of eChart implementation
nook24 Oct 21, 2025
5bb28cf
Merge pull request #413 from openITCOCKPIT/ITC-3615
nook24 Oct 21, 2025
54c7d8e
flowchiefNodeSelection (info alert added)
ibering Oct 21, 2025
bde658f
ITC-3617 Refactor checking of duplicate service name to keep the last…
nook24 Oct 21, 2025
21d6499
Merge remote-tracking branch 'origin' into ITC-3602
Jan-Nox Oct 22, 2025
4bb8f61
Merge remote-tracking branch 'origin' into ITC-3553
Jan-Nox Oct 22, 2025
e0a228c
* Merge branch 'ITC-3602' into ITC-3553
Jan-Nox Oct 22, 2025
f1c134d
* Move all pages, services, wizards from both CiscoNetworkModule and …
Jan-Nox Oct 22, 2025
f8f8e3e
Add ID 'dashboardToggleFullscreenBtn' to the full screen button so ex…
nook24 Oct 22, 2025
49d8dc0
ITC-3181 Add '?kiosk' as query parameter so that every page can be lo…
nook24 Oct 22, 2025
298e44a
ITC-3181 Removed unused kioskMode
nook24 Oct 22, 2025
ecc6579
Merge remote-tracking branch 'origin' into ITC-3567
Jan-Nox Oct 23, 2025
bf1c652
Merge remote-tracking branch 'origin' into ITC-3568
Jan-Nox Oct 23, 2025
01689fb
#ITC-3578 ServiceCapacityManagementModule - Resourcegroup add/edit (…
ibering Oct 23, 2025
8c5ac6b
ITC-3625 Add new field verify_autossl_expiry to Agent Config Step
nook24 Oct 23, 2025
6d5b1c6
ITC-3413 OA-60 ITC-3625 Add tls-security-level settings into Agent Co…
nook24 Oct 23, 2025
a6e7f3a
#ITC-3578 ServiceCapacityManagementModule - Resourcegroup index view …
ibering Oct 24, 2025
f8c010c
Merge pull request #403 from openITCOCKPIT/ITC-3568
abergen-itn Oct 27, 2025
67f86b6
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Oct 27, 2025
18d4802
ITC-3616 Show upcoming host and service downtimes in browser view
nook24 Oct 28, 2025
e22c2c2
Merge pull request #415 from openITCOCKPIT/ITC-3181
ibering Oct 28, 2025
5908687
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
nook24 Oct 28, 2025
7bfb793
ITC-3553 - removed unused code
abergen-itn Oct 28, 2025
79eaf52
ITC-3578 Do NOT cache the timezone response in cachedTimezoneconfigur…
nook24 Oct 28, 2025
4bb9882
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
abergen-itn Oct 28, 2025
cfd685a
Merge pull request #405 from openITCOCKPIT/ITC-3553
abergen-itn Oct 28, 2025
d62e804
Merge branch 'ITC-3578' of https://github.com/openITCOCKPIT/openITCOC…
ibering Oct 29, 2025
c96e0c8
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Oct 29, 2025
4bcb06c
ITC-3578 ServiceCapacityManagementModule (refactor timeperiod-details…
ibering Oct 29, 2025
63c6a45
Merge pull request #418 from openITCOCKPIT/ITC-3616
ibering Oct 29, 2025
30a1906
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
ibering Oct 29, 2025
62e2ded
ITC-3578 ServiceCapacityManagementModule (Service Capacity Management…
ibering Oct 29, 2025
5e62701
Merge pull request #419 from openITCOCKPIT/ITC-3578
nook24 Oct 29, 2025
63e97bb
Merge pull request #416 from openITCOCKPIT/ITC-3625
ibering Oct 29, 2025
a5f7259
ITC-3567 - fixed typos and removed unused code
abergen-itn Oct 29, 2025
5f24b13
autoreports generate view (style issues: word-break added (long servi…
ibering Oct 30, 2025
061482d
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
abergen-itn Oct 30, 2025
d912a9c
Merge pull request #401 from openITCOCKPIT/ITC-3567
abergen-itn Oct 30, 2025
e05786d
Merge branch 'development' of https://github.com/openITCOCKPIT/openIT…
nook24 Oct 31, 2025
f3ce8ef
ITC-3617 Do not change the host name in the duplicate hostname warnin…
nook24 Oct 31, 2025
4ad34a4
ITC-3634 Refactor handline of map loading to not reload the entire pa…
nook24 Oct 31, 2025
7f55863
Merge pull request #421 from openITCOCKPIT/ITC-3634
ibering Nov 3, 2025
06ac1f1
Merge pull request #414 from openITCOCKPIT/ITC-3617
ibering Nov 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,379 changes: 1,150 additions & 229 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
"watch": "ng build --watch --configuration development",
"test": "ng test",
"i18n:extract": "transloco-keys-manager extract",
"i18n:find": "transloco-keys-manager find"
"i18n:find": "transloco-keys-manager find",
"check:licenses": "node parse-3rdpartylicenses.js dist/frontend-angular/3rdpartylicenses.txt"
},
"private": true,
"dependencies": {
Expand Down Expand Up @@ -77,13 +78,12 @@
"leaflet": "^1.9.4",
"lodash": "^4.17.21",
"luxon": "^3.7.1",
"ng-apexcharts": "^2.0.0",
"ngx-color-picker": "^20.1.1",
"ngx-cookie-service": "^20.0.1",
"ngx-echarts": "^20.0.1",
"ngx-resize-observer": "^3.1.0",
"ngx-scrollbar": "^18.0.0",
"ngx-toastr": "^19.0.0",
"ngx-toastr": "^19.1.0",
"prettier": "^3.6.2",
"primeng": "^20.0.1",
"rxjs": "~7.8.2",
Expand Down
146 changes: 146 additions & 0 deletions parse-3rdpartylicenses.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
/**
* MIT License
*
* Copyright (c) 2025 Daniel Ziegler
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* 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.
*/

const fs = require('fs');
const path = require('path');
const {forEach} = require('lodash');

/**
* Parses the 3rdpartylicenses.txt file.
* @param {string} filePath - Path to the license file.
* @returns {Array<{package: string, license: string, licenseText: string}>} Array of license entries.
*/
function parse3rdPartyLicenses(filePath) {
const content = fs.readFileSync(filePath, 'utf-8');
const blocks = content.split(/^-{80,}$/m).map(b => b.trim()).filter(Boolean);

const entries = [];

for(const block of blocks) {
// Try to extract package name (first line), license (second line), rest is license text
const lines = block.split(/\r?\n/).map(l => l.trim());
if(lines.length < 2) {
continue;
}

const pkg = lines[0].replace('Package: ', '').trim();
const license = lines[1].replace('License: ', '').replaceAll('"', '').replaceAll('\'', '').trim();
const licenseText = lines.slice(2).join('\n');
entries.push({package: pkg, license, licenseText});
}
return entries;
}

/**
* @param {string} license
* @param allowedLicenses
* @returns {boolean}
*/
function isAllowedLicense(license, allowedLicenses) {
return allowedLicenses.includes(license);
}

/**
*
* @param {string} packageName
* @param {string} licenseText
* @returns {boolean}
*/
function deepLicenseCheck(packageName, licenseText) {
switch(packageName) {
case "primeng":
case "@primeng/themes":
return licenseText.includes("The MIT License (MIT)");

// FontAwesome special cases
case "Font Awesome Free License":
return licenseText.includes("Font Awesome Free is free, open source, and GPL friendly.");

case "# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)":
return licenseText.includes("Attribution 4.0 International License");

case "# Fonts: SIL OFL 1.1 License":
return licenseText.includes("In the Font Awesome Free download, the SIL OFL license applies to all icons");

case "# Code: MIT License (https://opensource.org/licenses/MIT)":
return licenseText.includes("In the Font Awesome Free download, the MIT license applies to all non-font and");

case "# Attribution":
return licenseText.includes("Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font");

case "# Brand Icons":
return licenseText.includes("All brand icons are trademarks of their respective owners. The use of these");

}

return false;
}

if(require.main === module) {
const filePath = process.argv[2] || path.join(__dirname, '3rdpartylicenses.txt');
if(!fs.existsSync(filePath)) {
console.error('File not found:', filePath);
process.exit(1);
}

const allowedLicenses = [
'MIT',
'ISC',
'Apache-2.0',
'(Apache-2.0 OR MIT)', // vis-timeline
'0BSD',
'BSD-2-Clause',
'BSD-3-Clause',
'(CC-BY-4.0 AND MIT)' // FontAwesome
];

const packages = parse3rdPartyLicenses(filePath);

let errors = {};
forEach(packages, (pkg) => {
if(!isAllowedLicense(pkg.license, allowedLicenses)) {
errors[pkg.package] = pkg;
// Strange license found - further investigation needed
if(!deepLicenseCheck(pkg.package, pkg.licenseText)) {
console.error(`Package "${pkg.package}" has a non-allowed license: "${pkg.license}"`);
process.exit(1);
} else {
// Clear error
delete errors[pkg.package];
}
}
});

if(Object.keys(errors).length > 0) {
console.error('License check failed for the following packages:');
forEach(errors, (err) => {
console.error(`- ${err.package}: ${err.license}`);
});
process.exit(1);
}

console.log('All package licenses are allowed.');

}

39 changes: 28 additions & 11 deletions src/app/app.component.html
Original file line number Diff line number Diff line change
@@ -1,22 +1,37 @@
<oitc-global-loader></oitc-global-loader>
<div class="main-container">
<!--sidebar-->
<oitc-coreui-navbar *ngIf="(this.LayoutService.layout$ | async) == LayoutOptions.Default">
</oitc-coreui-navbar>
@if (( this.LayoutService.layout$ | async ) == LayoutOptions.Default) {
<oitc-coreui-navbar></oitc-coreui-navbar>
}
<div id="right" class="column">
<div class="top-right" *ngIf="(this.LayoutService.layout$ | async) == LayoutOptions.Default">
<!--app-header-->
<oitc-coreui-header [cShadowOnScroll]="'sm'"
[messageOfTheDay]="messageOfTheDay"
class="w-100 shadow-sm p-0"
position="sticky"
sidebarId="sidebar1"/>
</div>
@if (( this.LayoutService.layout$ | async ) == LayoutOptions.Default) {
<div class="top-right">
<!--app-header-->
<oitc-coreui-header [cShadowOnScroll]="'sm'"
[messageOfTheDay]="messageOfTheDay"
class="w-100 shadow-sm p-0"
position="sticky"
sidebarId="sidebar1"/>
</div>
}
<div class="d-flex bottom">
<!--main-->
<!--app-body-->
<c-container [fluid]="true" id="mainContentContainer"
[ngClass]="{'p-0': (this.LayoutService.layout$ | async) == LayoutOptions.Blank}">
@if (( this.LayoutService.layout$ | async ) == LayoutOptions.Kiosk) {
<ng-container *transloco="let t">
<div class="kiosk-mode-bar position-absolute start-50 translate-middle-x top-0">
<button
class="btn btn-outline-info btn-xs"
(click)="this.LayoutService.setLayout(LayoutOptions.Default)"
type="button">
{{ t('Exit Kiosk Mode') }}
</button>
</div>
</ng-container>
}
<!-- Content will be here -->
<router-outlet/>
</c-container>
Expand All @@ -25,5 +40,7 @@
</div>
</div>

<oitc-message-of-the-day-modal [messageOfTheDay]="messageOfTheDay"/>
@if (( this.LayoutService.layout$ | async ) != LayoutOptions.Kiosk) {
<oitc-message-of-the-day-modal [messageOfTheDay]="messageOfTheDay"></oitc-message-of-the-day-modal>
}
</div>
20 changes: 14 additions & 6 deletions src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
Renderer2,
signal
} from '@angular/core';
import { NavigationEnd, Router, RouterOutlet } from '@angular/router';
import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router';
import { FaIconLibrary, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
import { fas } from '@fortawesome/free-solid-svg-icons';
import { far } from '@fortawesome/free-regular-svg-icons';
Expand All @@ -22,7 +22,7 @@ import { HistoryService } from './history.service';
import { CoreuiHeaderComponent } from './layouts/coreui/coreui-header/coreui-header.component';
import { CoreuiNavbarComponent } from './layouts/coreui/coreui-navbar/coreui-navbar.component';
import { GlobalLoaderComponent } from './layouts/coreui/global-loader/global-loader.component';
import { AsyncPipe, NgClass, NgIf } from '@angular/common';
import { AsyncPipe, NgClass } from '@angular/common';
import { Subscription } from 'rxjs';
import { toObservable } from '@angular/core/rxjs-interop';
import { LayoutOptions, LayoutService } from './layouts/coreui/layout.service';
Expand All @@ -36,7 +36,8 @@ import { AuthService } from './auth/auth.service';
import { TitleService } from './services/title.service';
import { SystemnameService } from './services/systemname.service';
import { PermissionsService } from './permissions/permissions.service';
import { TimezoneConfiguration, TimezoneService } from './services/timezone.service';
import { TimezoneService } from './services/timezone.service';
import { TranslocoDirective } from '@jsverse/transloco';

@Component({
selector: 'oitc-root',
Expand All @@ -48,17 +49,17 @@ import { TimezoneConfiguration, TimezoneService } from './services/timezone.serv
CoreuiNavbarComponent,
GlobalLoaderComponent,
ShadowOnScrollDirective,
NgIf,
AsyncPipe,
NgClass,
MessageOfTheDayModalComponent
MessageOfTheDayModalComponent,
TranslocoDirective
],
templateUrl: './app.component.html',
styleUrl: './app.component.css',
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AppComponent implements OnInit, OnDestroy, AfterViewInit {

// Inject HistoryService to keep track of the previous URLs
private historyService: HistoryService = inject(HistoryService);

Expand All @@ -80,6 +81,7 @@ export class AppComponent implements OnInit, OnDestroy, AfterViewInit {

constructor(library: FaIconLibrary,
private router: Router,
private route: ActivatedRoute,
private IconSetService: IconSetService,
// private selectConfig: NgSelectConfig,
// private TranslocoService: TranslocoService,
Expand Down Expand Up @@ -119,6 +121,12 @@ export class AppComponent implements OnInit, OnDestroy, AfterViewInit {
}
}));

this.subscription.add(this.route.queryParams.subscribe(params => {
if (params && params.hasOwnProperty('kiosk')) {
this.LayoutService.setLayout(LayoutOptions.Kiosk);
}
}));

// Fetch the message of the day
this.watchMessageOfTheDay();

Expand Down
8 changes: 7 additions & 1 deletion src/app/app.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ import { servicenowModuleRoutes } from './modules/servicenow_module/servicenow_m
import { dellModuleRoutes } from './modules/dell_module/dell_module.routes';
import { proxmoxModuleRoutes } from './modules/proxmox_module/proxmox_module.routes';
import { ms365ModuleRoutes } from './modules/ms365_module/ms365_module.routes';
import { mshypervModuleRoutes } from './modules/mshyperv_module/mshyperv_module.routes';
import { ciscoModuleRoutes } from './modules/cisco_module/cisco_module.routes';
import { broadcomProxyModuleRoutes } from './modules/broadcomproxy_module/broadcomproxy_module.routes';

@Component({
selector: 'legacy-redirect',
Expand Down Expand Up @@ -101,7 +104,10 @@ const moduleRoutes: Routes = [
...servicenowModuleRoutes,
...dellModuleRoutes,
...proxmoxModuleRoutes,
...ms365ModuleRoutes
...ms365ModuleRoutes,
...mshypervModuleRoutes,
...ciscoModuleRoutes,
...broadcomProxyModuleRoutes
];
/*** Core routes ***/
const coreRoutes: Routes = [{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
<!--The content below is only a placeholder and can be replaced.-->
<apx-chart
#chart
[series]="chartOptions.series!"
[chart]="chartOptions.chart!"
[plotOptions]="chartOptions.plotOptions!"
[labels]="chartOptions.labels!"
[legend]="chartOptions.legend!"
[colors]="chartOptions.colors!"
[grid]="apexGridOptions"
></apx-chart>
<div [style.max-height.px]="widgetHeight" [style.height.px]="widgetHeight" class="overflow-hidden">
<div echarts [options]="chartOptions"
[theme]="theme"
(chartInit)="onChartInit($event)"
class="w-100"></div>
</div>
Loading