├── src └── GPONMonitor │ ├── bundleconfig.json.bindings │ ├── Views │ ├── _ViewStart.cshtml │ ├── _ViewImports.cshtml │ └── Shared │ │ └── Error.cshtml │ ├── wwwroot │ ├── favicon.ico │ ├── lib │ │ ├── twitter-bootstrap │ │ │ └── scss │ │ │ │ ├── utilities │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _overflow.scss │ │ │ │ ├── _interactions.scss │ │ │ │ ├── _screenreaders.scss │ │ │ │ ├── _visibility.scss │ │ │ │ ├── _shadows.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _align.scss │ │ │ │ ├── _background.scss │ │ │ │ ├── _stretched-link.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _embed.scss │ │ │ │ ├── _borders.scss │ │ │ │ ├── _text.scss │ │ │ │ ├── _spacing.scss │ │ │ │ └── _flex.scss │ │ │ │ ├── _media.scss │ │ │ │ ├── mixins │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _lists.scss │ │ │ │ ├── _text-truncate.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _visibility.scss │ │ │ │ ├── _alert.scss │ │ │ │ ├── _text-hide.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _deprecate.scss │ │ │ │ ├── _transition.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _hover.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _caret.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid.scss │ │ │ │ └── _grid-framework.scss │ │ │ │ ├── _transitions.scss │ │ │ │ ├── bootstrap-reboot.scss │ │ │ │ ├── _jumbotron.scss │ │ │ │ ├── _utilities.scss │ │ │ │ ├── _root.scss │ │ │ │ ├── bootstrap-grid.scss │ │ │ │ ├── _close.scss │ │ │ │ ├── bootstrap.scss │ │ │ │ ├── _code.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _toasts.scss │ │ │ │ ├── _images.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _progress.scss │ │ │ │ ├── _alert.scss │ │ │ │ ├── _breadcrumb.scss │ │ │ │ ├── _spinners.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _nav.scss │ │ │ │ ├── _type.scss │ │ │ │ ├── _tooltip.scss │ │ │ │ └── _buttons.scss │ │ └── font-awesome │ │ │ ├── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ └── fa-solid-900.woff2 │ │ │ └── css │ │ │ ├── solid.min.css │ │ │ ├── brands.min.css │ │ │ ├── regular.min.css │ │ │ ├── brands.css │ │ │ ├── solid.css │ │ │ └── regular.css │ ├── images │ │ └── ONU │ │ │ ├── H640G.png │ │ │ ├── H645B.png │ │ │ ├── H645G.png │ │ │ ├── H660GM.png │ │ │ ├── H660GW.png │ │ │ ├── H660RM.png │ │ │ ├── H665-C.png │ │ │ ├── H665.png │ │ │ ├── H665G.png │ │ │ ├── H680GW.png │ │ │ ├── HL-1B.png │ │ │ ├── HL-1G.png │ │ │ ├── HL-1GC.png │ │ │ ├── HL-1GE.png │ │ │ ├── HL-1GR.png │ │ │ ├── HL-4G.png │ │ │ ├── H660GM-A.png │ │ │ ├── HL-1GE2.png │ │ │ ├── HL-2GRV.png │ │ │ ├── HL-4GMV.png │ │ │ ├── HL-4GMV2.png │ │ │ ├── HL-4GMV3.png │ │ │ ├── HL-4GMV4.png │ │ │ ├── HL-4GMVR.png │ │ │ ├── HL-4GQV.png │ │ │ ├── HL-4GQVS.png │ │ │ ├── HL-4GXV.png │ │ │ ├── HL-GSFP.png │ │ │ ├── H640GW-02.png │ │ │ ├── HL-4BX3V-F.png │ │ │ ├── HL-4GQVS2.png │ │ │ ├── HL-4GXV-F.png │ │ │ ├── LXT-010G-D.png │ │ │ ├── LXT-010H-D.png │ │ │ ├── LXT-010S-H.png │ │ │ ├── LXT-011G-D.png │ │ │ └── LXT-240G-C1.png │ ├── js │ │ └── Services │ │ │ ├── NavbarMediaResize.js │ │ │ ├── OltDescriptionListService.js │ │ │ ├── OnuDetailsService.js │ │ │ ├── TooltipWhenOverflow.js │ │ │ └── OnuDescriptionListSearch.js │ ├── _references.js │ └── css │ │ ├── site.min.css │ │ └── site.css │ ├── Models │ ├── Onu │ │ ├── UnknownOnu.cs │ │ ├── HLGSFPOnu.cs │ │ ├── H645GOnu.cs │ │ ├── H665COnu.cs │ │ ├── H665GOnu.cs │ │ ├── H665Onu.cs │ │ ├── HL1BOnu.cs │ │ ├── HL1GCOnu.cs │ │ ├── HL1GEOnu.cs │ │ ├── HL1GOnu.cs │ │ ├── HL1GROnu.cs │ │ ├── HL1GE2Onu.cs │ │ ├── LXT010GDOnu.cs │ │ ├── LXT010HDOnu.cs │ │ ├── LXT010SHOnu.cs │ │ ├── LXT011GDOnu.cs │ │ ├── H645BOnu.cs │ │ ├── HL2GRVOnu.cs │ │ ├── H640GOnu.cs │ │ ├── HL4GOnu.cs │ │ ├── HL4GXVOnu.cs │ │ ├── HL4BX3VFOnu.cs │ │ ├── HL4GMV3Onu.cs │ │ ├── HL4GMV4Onu.cs │ │ ├── HL4GMVROnu.cs │ │ ├── HL4GQVS2.cs │ │ ├── HL4GQVSOnu.cs │ │ ├── HL4GXVFOnu.cs │ │ ├── H660GMOnu.cs │ │ ├── H660GWOnu.cs │ │ ├── H660RMOnu.cs │ │ ├── H680GWOnu.cs │ │ ├── HL4GMVOnu.cs │ │ ├── HL4GQVOnu.cs │ │ ├── H640GW02Onu.cs │ │ ├── H660GMAOnu.cs │ │ ├── HL4GMV2Onu.cs │ │ ├── LXT240GC1Onu.cs │ │ ├── OnuShortDescription.cs │ │ └── GenericOnu.cs │ ├── SeverityLevel.cs │ ├── Configuration │ │ ├── DevicesConfiguration.cs │ │ ├── SnmpV3Credentials.cs │ │ └── OltConfiguration.cs │ ├── ComplexStateTypes │ │ ├── ReponseDescription.cs │ │ ├── ComplexIntType.cs │ │ ├── ComplexStringType.cs │ │ └── ComplexType.cs │ ├── OnuFactory │ │ ├── HLGSFPOnuFactory.cs │ │ ├── UnknownOnuFactory.cs │ │ ├── IOnuFactory.cs │ │ ├── H665OnuFactory.cs │ │ ├── HL1BOnuFactory.cs │ │ ├── HL1GOnuFactory.cs │ │ ├── H665COnuFactory.cs │ │ ├── H665GOnuFactory.cs │ │ ├── HL1GCOnuFactory.cs │ │ ├── HL1GEOnuFactory.cs │ │ ├── HL1GROnuFactory .cs │ │ ├── H645GOnuFactory.cs │ │ ├── HL1GE2OnuFactory.cs │ │ ├── LXT010GDOnuFactory.cs │ │ ├── LXT010HDOnuFactory.cs │ │ ├── LXT010SHOnuFactory.cs │ │ ├── LXT011GDOnuFactory.cs │ │ ├── H645BOnuFactory.cs │ │ └── HL2GRVOnuFactory.cs │ └── AutoMapperProfile.cs │ ├── appsettings.json │ ├── .config │ └── dotnet-tools.json │ ├── ViewModels │ └── OltConfigurationViewModel.cs │ ├── Exceptions │ ├── SnmpTimeoutException.cs │ └── SnmpConnectionException.cs │ ├── package.json │ ├── Program.cs │ ├── Properties │ ├── launchSettings.json │ └── PublishProfiles │ │ ├── Linux .NET Core publish-publish.ps1 │ │ └── Linux .NET Core publish.pubxml │ ├── Services │ ├── IResponseDescriptionDictionaries.cs │ ├── IOltFormatChecks.cs │ └── IDataService.cs │ ├── libman.json │ ├── web.config │ ├── bundleconfig.json │ ├── Controllers │ ├── API │ │ └── OltApiController.cs │ └── OltController.cs │ ├── Utils │ └── Utils.cs │ ├── GPONMonitor.csproj │ ├── devicesconfiguration.json │ ├── gulpfile.js │ └── Resources │ └── Models.Olt.Olt.pl.Designer.cs ├── screenshot.jpg ├── .dockerignore ├── docker-compose.override.yml ├── docker-compose.tests.yml ├── docker-compose.deploy.yml ├── docker-compose.build.yml ├── Dockerfile.tests ├── README.md ├── Dockerfile ├── docker-compose.dcproj ├── tests └── tests.csproj ├── LICENSE ├── GPONMonitor.sln └── .gitattributes /src/GPONMonitor/bundleconfig.json.bindings: -------------------------------------------------------------------------------- 1 | produceoutput=true -------------------------------------------------------------------------------- /src/GPONMonitor/Views/_ViewStart.cshtml: -------------------------------------------------------------------------------- 1 | @{ 2 | Layout = "_Layout"; 3 | } 4 | -------------------------------------------------------------------------------- /screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/screenshot.jpg -------------------------------------------------------------------------------- /src/GPONMonitor/Views/_ViewImports.cshtml: -------------------------------------------------------------------------------- 1 | @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .dockerignore 2 | .env 3 | .git 4 | .gitignore 5 | .vs 6 | .vscode 7 | */bin 8 | */obj 9 | **/.toolstarget -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/favicon.ico -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_clearfix.scss: -------------------------------------------------------------------------------- 1 | .clearfix { 2 | @include clearfix(); 3 | } 4 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H640G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H640G.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H645B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H645B.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H645G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H645G.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H660GM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H660GM.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H660GW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H660GW.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H660RM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H660RM.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H665-C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H665-C.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H665.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H665.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H665G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H665G.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H680GW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H680GW.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1B.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1G.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1GC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1GC.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1GE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1GE.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1GR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1GR.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4G.png -------------------------------------------------------------------------------- /docker-compose.override.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | 3 | services: 4 | gponmonitor: 5 | environment: 6 | - ASPNETCORE_ENVIRONMENT=Production 7 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H660GM-A.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H660GM-A.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-1GE2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-1GE2.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-2GRV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-2GRV.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GMV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GMV.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GMV2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GMV2.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GMV3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GMV3.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GMV4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GMV4.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GMVR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GMVR.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GQV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GQV.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GQVS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GQVS.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GXV.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GXV.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-GSFP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-GSFP.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/H640GW-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/H640GW-02.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4BX3V-F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4BX3V-F.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GQVS2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GQVS2.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/HL-4GXV-F.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/HL-4GXV-F.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/LXT-010G-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/LXT-010G-D.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/LXT-010H-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/LXT-010H-D.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/LXT-010S-H.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/LXT-010S-H.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/LXT-011G-D.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/LXT-011G-D.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/images/ONU/LXT-240G-C1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/images/ONU/LXT-240G-C1.png -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_media.scss: -------------------------------------------------------------------------------- 1 | .media { 2 | display: flex; 3 | align-items: flex-start; 4 | } 5 | 6 | .media-body { 7 | flex: 1; 8 | } 9 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_clearfix.scss: -------------------------------------------------------------------------------- 1 | @mixin clearfix() { 2 | &::after { 3 | display: block; 4 | clear: both; 5 | content: ""; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bartekkois/GPONMonitor/HEAD/src/GPONMonitor/wwwroot/lib/font-awesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/UnknownOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.OnuFactory; 2 | 3 | namespace GPONMonitor.Models.Onu 4 | { 5 | public class UnknownOnu : GenericOnu, IOnuFactory 6 | { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/GPONMonitor/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ApplicationInsights": { 3 | "InstrumentationKey": "" 4 | }, 5 | "Logging": { 6 | "LogLevel": { 7 | "Default": "Warning" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HLGSFPOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.OnuFactory; 2 | 3 | namespace GPONMonitor.Models.Onu 4 | { 5 | public class HLGSFPOnu : GenericOnu, IOnuFactory 6 | { 7 | 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_overflow.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $overflows { 4 | .overflow-#{$value} { overflow: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_interactions.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $value in $user-selects { 4 | .user-select-#{$value} { user-select: $value !important; } 5 | } 6 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_size.scss: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | @mixin size($width, $height: $width) { 4 | width: $width; 5 | height: $height; 6 | @include deprecate("`size()`", "v4.3.0", "v5"); 7 | } 8 | -------------------------------------------------------------------------------- /src/GPONMonitor/.config/dotnet-tools.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "isRoot": true, 4 | "tools": { 5 | "dotnet-ef": { 6 | "version": "5.0.9", 7 | "commands": [ 8 | "dotnet-ef" 9 | ] 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_screenreaders.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Screenreaders 3 | // 4 | 5 | .sr-only { 6 | @include sr-only(); 7 | } 8 | 9 | .sr-only-focusable { 10 | @include sr-only-focusable(); 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/ViewModels/OltConfigurationViewModel.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.ViewModels 2 | { 3 | public class OltConfigurationViewModel 4 | { 5 | public int Id { get; set; } 6 | public string Name { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_lists.scss: -------------------------------------------------------------------------------- 1 | // Lists 2 | 3 | // Unstyled keeps list items block level, just removes default browser padding and list-style 4 | @mixin list-unstyled() { 5 | padding-left: 0; 6 | list-style: none; 7 | } 8 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/SeverityLevel.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models 2 | { 3 | public enum SeverityLevel 4 | { 5 | Unknown, 6 | Default, 7 | Info, 8 | Success, 9 | Warning, 10 | Danger 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_text-truncate.scss: -------------------------------------------------------------------------------- 1 | // Text truncate 2 | // Requires inline-block or block for proper styling 3 | 4 | @mixin text-truncate() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Configuration/DevicesConfiguration.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace GPONMonitor.Models.Configuration 4 | { 5 | public class DevicesConfiguration 6 | { 7 | public List Devices { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_resize.scss: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | @mixin resizable($direction) { 4 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 5 | resize: $direction; // Options: horizontal, vertical, both 6 | } 7 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Visibility 4 | 5 | @mixin invisible($visibility) { 6 | visibility: $visibility !important; 7 | @include deprecate("`invisible()`", "v4.3.0", "v5"); 8 | } 9 | -------------------------------------------------------------------------------- /docker-compose.tests.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | 3 | services: 4 | gponmonitor.tests: 5 | image: bartekkois/gponmonitor.tests:1.0.17 6 | volumes: 7 | - ./temp:/var/temp 8 | - /etc/localtime:/etc/localtime:ro 9 | build: 10 | context: . 11 | dockerfile: ./Dockerfile.tests 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_visibility.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Visibility utilities 5 | // 6 | 7 | .visible { 8 | visibility: visible !important; 9 | } 10 | 11 | .invisible { 12 | visibility: hidden !important; 13 | } 14 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_shadows.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .shadow-sm { box-shadow: $box-shadow-sm !important; } 4 | .shadow { box-shadow: $box-shadow !important; } 5 | .shadow-lg { box-shadow: $box-shadow-lg !important; } 6 | .shadow-none { box-shadow: none !important; } 7 | -------------------------------------------------------------------------------- /docker-compose.deploy.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | 3 | services: 4 | gponmonitor: 5 | image: bartekkois/gponmonitor:1.0.17 6 | restart: always 7 | volumes: 8 | - /docker/GPONMonitor/devicesconfiguration.json:/app/devicesconfiguration.json:ro 9 | - /etc/localtime:/etc/localtime:ro 10 | ports: 11 | - "5001:8080" 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Views/Shared/Error.cshtml: -------------------------------------------------------------------------------- 1 | @using Microsoft.AspNetCore.Mvc.Localization 2 | @inject IViewLocalizer Localizer 3 | 4 | @{ 5 | ViewData["Title"] = Localizer["Error"]; 6 | } 7 | 8 |

@Localizer["Error"]

9 |

@Localizer["An error occurred while processing your request."]

10 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_alert.scss: -------------------------------------------------------------------------------- 1 | @mixin alert-variant($background, $border, $color) { 2 | color: $color; 3 | @include gradient-bg($background); 4 | border-color: $border; 5 | 6 | hr { 7 | border-top-color: darken($border, 5%); 8 | } 9 | 10 | .alert-link { 11 | color: darken($color, 10%); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /docker-compose.build.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | 3 | services: 4 | gponmonitor: 5 | image: bartekkois/gponmonitor:1.0.17 6 | restart: always 7 | volumes: 8 | - /docker/GPONMonitor/devicesconfiguration.json:/app/devicesconfiguration.json:ro 9 | ports: 10 | - "5001:8080" 11 | build: 12 | context: . 13 | dockerfile: ./Dockerfile 14 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H645GOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H645GOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H665COnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H665COnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H665GOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H665GOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H665Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H665Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1BOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1BOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1GCOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1GCOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1GEOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1GEOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1GOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1GOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1GROnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1GROnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL1GE2Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL1GE2Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/LXT010GDOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class LXT010GDOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/LXT010HDOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class LXT010HDOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/LXT010SHOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class LXT010SHOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/LXT011GDOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class LXT011GDOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Exceptions/SnmpTimeoutException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GPONMonitor.Exceptions 4 | { 5 | public class SnmpTimeoutException : Exception 6 | { 7 | public SnmpTimeoutException(string message) : base(message) 8 | { 9 | Source = "SnmpConnection"; 10 | HelpLink = "https://github.com/bartekkois/GPONMonitor"; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_transitions.scss: -------------------------------------------------------------------------------- 1 | .fade { 2 | @include transition($transition-fade); 3 | 4 | &:not(.show) { 5 | opacity: 0; 6 | } 7 | } 8 | 9 | .collapse { 10 | &:not(.show) { 11 | display: none; 12 | } 13 | } 14 | 15 | .collapsing { 16 | position: relative; 17 | height: 0; 18 | overflow: hidden; 19 | @include transition($transition-collapse); 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Exceptions/SnmpConnectionException.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace GPONMonitor.Exceptions 4 | { 5 | public class SnmpConnectionException : Exception 6 | { 7 | public SnmpConnectionException(string message) : base(message) 8 | { 9 | Source = "SnmpConnection"; 10 | HelpLink = "https://github.com/bartekkois/GPONMonitor"; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_text-hide.scss: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | @mixin text-hide($ignore-warning: false) { 3 | // stylelint-disable-next-line font-family-no-missing-generic-family-keyword 4 | font: 0/0 a; 5 | color: transparent; 6 | text-shadow: none; 7 | background-color: transparent; 8 | border: 0; 9 | 10 | @include deprecate("`text-hide()`", "v4.1.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /Dockerfile.tests: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS testrunner 2 | RUN apk add --no-cache icu-libs 3 | ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false 4 | WORKDIR /src 5 | COPY *.sln . 6 | COPY src/GPONMonitor/*.csproj ./src/GPONMonitor/ 7 | COPY tests/*.csproj ./tests/ 8 | RUN dotnet restore ./GPONMonitor.sln 9 | COPY . . 10 | WORKDIR /src/tests 11 | ENTRYPOINT ["dotnet", "test", "--logger:trx", "--results-directory:/var/temp"] 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/js/Services/NavbarMediaResize.js: -------------------------------------------------------------------------------- 1 | var NavbarMediaResize = (function () { 2 | "use strict"; 3 | 4 | var init = function () { 5 | function autocollapse() { 6 | $('body').css({ paddingTop: $('#main-navbar').height() + 15 }); 7 | } 8 | 9 | $(autocollapse); 10 | $(window).on('resize', autocollapse); 11 | }; 12 | 13 | return { 14 | init: init 15 | }; 16 | }()); -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_badge.scss: -------------------------------------------------------------------------------- 1 | @mixin badge-variant($bg) { 2 | color: color-yiq($bg); 3 | background-color: $bg; 4 | 5 | @at-root a#{&} { 6 | @include hover-focus() { 7 | color: color-yiq($bg); 8 | background-color: darken($bg, 10%); 9 | } 10 | 11 | &:focus, 12 | &.focus { 13 | outline: 0; 14 | box-shadow: 0 0 0 $badge-focus-width rgba($bg, .5); 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Configuration/SnmpV3Credentials.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.Configuration 2 | { 3 | public class SnmpV3Credentials 4 | { 5 | public string AuthenticationUsername { get; set; } 6 | public string AuthenticationType { get; set; } 7 | public string AuthenticationPassword { get; set; } 8 | public string EncryptionType { get; set; } 9 | public string EncryptionPassword { get; set; } 10 | } 11 | } -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_nav-divider.scss: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | @mixin nav-divider($color: $nav-divider-color, $margin-y: $nav-divider-margin-y, $ignore-warning: false) { 6 | height: 0; 7 | margin: $margin-y 0; 8 | overflow: hidden; 9 | border-top: 1px solid $color; 10 | @include deprecate("The `nav-divider()` mixin", "v4.4.0", "v5", $ignore-warning); 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $breakpoint in map-keys($grid-breakpoints) { 4 | @include media-breakpoint-up($breakpoint) { 5 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 6 | 7 | .float#{$infix}-left { float: left !important; } 8 | .float#{$infix}-right { float: right !important; } 9 | .float#{$infix}-none { float: none !important; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/ComplexStateTypes/ReponseDescription.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.ComplexStateTypes 2 | { 3 | public struct ResponseDescription 4 | { 5 | public string Description { get; private set; } 6 | public SeverityLevel Severity { get; private set; } 7 | 8 | public ResponseDescription(string description, SeverityLevel severity) 9 | { 10 | Description = description; 11 | Severity = severity; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_align.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | .align-baseline { vertical-align: baseline !important; } // Browser default 4 | .align-top { vertical-align: top !important; } 5 | .align-middle { vertical-align: middle !important; } 6 | .align-bottom { vertical-align: bottom !important; } 7 | .align-text-bottom { vertical-align: text-bottom !important; } 8 | .align-text-top { vertical-align: text-top !important; } 9 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_float.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @mixin float-left() { 4 | float: left !important; 5 | @include deprecate("The `float-left` mixin", "v4.3.0", "v5"); 6 | } 7 | @mixin float-right() { 8 | float: right !important; 9 | @include deprecate("The `float-right` mixin", "v4.3.0", "v5"); 10 | } 11 | @mixin float-none() { 12 | float: none !important; 13 | @include deprecate("The `float-none` mixin", "v4.3.0", "v5"); 14 | } 15 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H645BOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H645BOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/GPONMonitor/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "1.0.0", 4 | "private": true, 5 | "devDependencies": { 6 | "clean-css": "^4.2.3", 7 | "del": "^5.1.0", 8 | "gulp": "^4.0.2", 9 | "gulp-concat": "^2.6.1", 10 | "gulp-cssmin": "^0.2.0", 11 | "gulp-htmlmin": "^5.0.1", 12 | "gulp-uglify": "^3.0.2", 13 | "lodash.template": ">=4.5.0", 14 | "merge-stream": "^2.0.0" 15 | }, 16 | "dependencies": { 17 | "kind-of": "^6.0.3", 18 | "minimist": "^1.2.5" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/bootstrap-reboot.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Reboot v4.6.0 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) 7 | */ 8 | 9 | @import "functions"; 10 | @import "variables"; 11 | @import "mixins"; 12 | @import "reboot"; 13 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_jumbotron.scss: -------------------------------------------------------------------------------- 1 | .jumbotron { 2 | padding: $jumbotron-padding ($jumbotron-padding / 2); 3 | margin-bottom: $jumbotron-padding; 4 | color: $jumbotron-color; 5 | background-color: $jumbotron-bg; 6 | @include border-radius($border-radius-lg); 7 | 8 | @include media-breakpoint-up(sm) { 9 | padding: ($jumbotron-padding * 2) $jumbotron-padding; 10 | } 11 | } 12 | 13 | .jumbotron-fluid { 14 | padding-right: 0; 15 | padding-left: 0; 16 | @include border-radius(0); 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/js/Services/OltDescriptionListService.js: -------------------------------------------------------------------------------- 1 | var OltDescriptionListService = function () { 2 | "use strict"; 3 | 4 | // GET: api/OltOnuDescriptionList?oltId=1 5 | var getOltDescriptionList = function (oltId, done, fail) { 6 | $.get("api/OltOnuDescriptionList", { oltId: oltId }, "json") 7 | .done(function (result) { done(oltId, result); }) 8 | .fail(function (result) { fail(oltId, result); }); 9 | }; 10 | 11 | return { 12 | getOltDescriptionList: getOltDescriptionList 13 | }; 14 | }(); -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_background.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | @each $color, $value in $theme-colors { 4 | @include bg-variant(".bg-#{$color}", $value, true); 5 | } 6 | 7 | @if $enable-gradients { 8 | @each $color, $value in $theme-colors { 9 | @include bg-gradient-variant(".bg-gradient-#{$color}", $value, true); 10 | } 11 | } 12 | 13 | .bg-white { 14 | background-color: $white !important; 15 | } 16 | 17 | .bg-transparent { 18 | background-color: transparent !important; 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_stretched-link.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Stretched link 3 | // 4 | 5 | .stretched-link { 6 | &::after { 7 | position: absolute; 8 | top: 0; 9 | right: 0; 10 | bottom: 0; 11 | left: 0; 12 | z-index: 1; 13 | // Just in case `pointer-events: none` is set on a parent 14 | pointer-events: auto; 15 | content: ""; 16 | // IE10 bugfix, see https://stackoverflow.com/questions/16947967/ie10-hover-pseudo-class-doesnt-work-without-background-color 17 | background-color: rgba(0, 0, 0, 0); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL2GRVOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL2GRVOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | 13 | public ComplexIntType VoIPLine1State { get; set; } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | @mixin list-group-item-variant($state, $background, $color) { 4 | .list-group-item-#{$state} { 5 | color: $color; 6 | background-color: $background; 7 | 8 | &.list-group-item-action { 9 | @include hover-focus() { 10 | color: $color; 11 | background-color: darken($background, 5%); 12 | } 13 | 14 | &.active { 15 | color: $white; 16 | background-color: $color; 17 | border-color: $color; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/ComplexStateTypes/ComplexIntType.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.ComplexStateTypes 2 | { 3 | public class ComplexIntType : ComplexType 4 | { 5 | public int? Value { get; private set; } 6 | 7 | public ComplexIntType(int? value, string description, SeverityLevel severity) : base(description, severity) 8 | { 9 | Value = value; 10 | } 11 | 12 | public ComplexIntType(int? value, ResponseDescription responseDescription) : base(responseDescription) 13 | { 14 | Value = value; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_text-emphasis.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Typography 4 | 5 | @mixin text-emphasis-variant($parent, $color, $ignore-warning: false) { 6 | #{$parent} { 7 | color: $color !important; 8 | } 9 | @if $emphasized-link-hover-darken-percentage != 0 { 10 | a#{$parent} { 11 | @include hover-focus() { 12 | color: darken($color, $emphasized-link-hover-darken-percentage) !important; 13 | } 14 | } 15 | } 16 | @include deprecate("`text-emphasis-variant()`", "v4.4.0", "v5", $ignore-warning); 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/ComplexStateTypes/ComplexStringType.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.ComplexStateTypes 2 | { 3 | public class ComplexStringType : ComplexType 4 | { 5 | public string Value { get; private set; } 6 | 7 | public ComplexStringType(string value, string description, SeverityLevel severity) : base(description, severity) 8 | { 9 | Value = value; 10 | } 11 | 12 | public ComplexStringType(string value, ResponseDescription responseDescription) : base(responseDescription) 13 | { 14 | Value = value; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_reset-text.scss: -------------------------------------------------------------------------------- 1 | @mixin reset-text() { 2 | font-family: $font-family-base; 3 | // We deliberately do NOT reset font-size or word-wrap. 4 | font-style: normal; 5 | font-weight: $font-weight-normal; 6 | line-height: $line-height-base; 7 | text-align: left; // Fallback for where `start` is not supported 8 | text-align: start; 9 | text-decoration: none; 10 | text-shadow: none; 11 | text-transform: none; 12 | letter-spacing: normal; 13 | word-break: normal; 14 | word-spacing: normal; 15 | white-space: normal; 16 | line-break: auto; 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/_references.js: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | /// 5 | /// 6 | /// 7 | /// 8 | /// 9 | /// 10 | /// -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | @mixin pagination-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) { 4 | .page-link { 5 | padding: $padding-y $padding-x; 6 | @include font-size($font-size); 7 | line-height: $line-height; 8 | } 9 | 10 | .page-item { 11 | &:first-child { 12 | .page-link { 13 | @include border-left-radius($border-radius); 14 | } 15 | } 16 | &:last-child { 17 | .page-link { 18 | @include border-right-radius($border-radius); 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GPON Monitor 2 | ## What is GPON Monitor 3 | GPON Monitor is an ASP.NET Core web application intended for quick diagnostic of [Dasan Networks](http://www.dasannetworks.com) GPON OLTs and related ONTs. 4 | 5 | ![GPON Monitor home page](https://raw.githubusercontent.com/bartekkois/GPONMonitor/master/screenshot.jpg) 6 | 7 | ## Documentation 8 | The GPON Monitor documentation is avaible at [GPON Monitor Wiki](https://github.com/bartekkois/GPONMonitor/wiki/Home) 9 | 10 | ## License 11 | This software is distributed under the BSD License (see [LICENSE](https://github.com/bartekkois/GPONMonitor/blob/master/LICENSE) file). 12 | -------------------------------------------------------------------------------- /src/GPONMonitor/Program.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.AspNetCore.Hosting; 2 | using Microsoft.Extensions.Hosting; 3 | 4 | namespace GPONMonitor 5 | { 6 | public static class Program 7 | { 8 | public static void Main(string[] args) 9 | { 10 | CreateHostBuilder(args).Build().Run(); 11 | } 12 | 13 | public static IHostBuilder CreateHostBuilder(string[] args) => 14 | Host.CreateDefaultBuilder(args) 15 | .ConfigureWebHostDefaults(webBuilder => 16 | { 17 | webBuilder.UseStartup(); 18 | }); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/js/Services/OnuDetailsService.js: -------------------------------------------------------------------------------- 1 | var OnuDetailsService = function () { 2 | "use strict"; 3 | 4 | // GET: api/OnuStateByOltPortIdAndOnuId?oltId=1&oltPortId=2&onuId=3 5 | var getOnuDetails = function (oltId, oltPortId, onuId, done, fail) { 6 | $.get("api/OnuStateByOltPortIdAndOnuId", { oltId: oltId, oltPortId: oltPortId, onuId: onuId }, "json") 7 | .done(function (result) { done(oltId, oltPortId, onuId, result); }) 8 | .fail(function (result) { fail(oltId, oltPortId, onuId, result); }); 9 | }; 10 | 11 | return { 12 | getOnuDetails: getOnuDetails 13 | }; 14 | }(); -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/js/Services/TooltipWhenOverflow.js: -------------------------------------------------------------------------------- 1 | var TooltipWhenOverflow = (function () { 2 | "use strict"; 3 | 4 | var init = function () { 5 | $(document).on("mouseenter", ".onu-list-id, .onu-list-item, .onu-detail-description, .onu-detail-item", function () { 6 | var $this = $(this); 7 | 8 | if (this.offsetWidth < this.scrollWidth) { 9 | $this.attr("title", $this.text()); 10 | } 11 | else { 12 | $this.attr("title", ""); 13 | } 14 | }); 15 | }; 16 | 17 | return { 18 | init: init 19 | }; 20 | }()); -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_sizing.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Width and height 4 | 5 | @each $prop, $abbrev in (width: w, height: h) { 6 | @each $size, $length in $sizes { 7 | .#{$abbrev}-#{$size} { #{$prop}: $length !important; } 8 | } 9 | } 10 | 11 | .mw-100 { max-width: 100% !important; } 12 | .mh-100 { max-height: 100% !important; } 13 | 14 | // Viewport additional helpers 15 | 16 | .min-vw-100 { min-width: 100vw !important; } 17 | .min-vh-100 { min-height: 100vh !important; } 18 | 19 | .vw-100 { width: 100vw !important; } 20 | .vh-100 { height: 100vh !important; } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_utilities.scss: -------------------------------------------------------------------------------- 1 | @import "utilities/align"; 2 | @import "utilities/background"; 3 | @import "utilities/borders"; 4 | @import "utilities/clearfix"; 5 | @import "utilities/display"; 6 | @import "utilities/embed"; 7 | @import "utilities/flex"; 8 | @import "utilities/float"; 9 | @import "utilities/interactions"; 10 | @import "utilities/overflow"; 11 | @import "utilities/position"; 12 | @import "utilities/screenreaders"; 13 | @import "utilities/shadows"; 14 | @import "utilities/sizing"; 15 | @import "utilities/spacing"; 16 | @import "utilities/stretched-link"; 17 | @import "utilities/text"; 18 | @import "utilities/visibility"; 19 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_box-shadow.scss: -------------------------------------------------------------------------------- 1 | @mixin box-shadow($shadow...) { 2 | @if $enable-shadows { 3 | $result: (); 4 | 5 | @if (length($shadow) == 1) { 6 | // We can pass `@include box-shadow(none);` 7 | $result: $shadow; 8 | } @else { 9 | // Filter to avoid invalid properties for example `box-shadow: none, 1px 1px black;` 10 | @for $i from 1 through length($shadow) { 11 | @if nth($shadow, $i) != "none" { 12 | $result: append($result, nth($shadow, $i), "comma"); 13 | } 14 | } 15 | } 16 | @if (length($result) > 0) { 17 | box-shadow: $result; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_position.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Common values 4 | @each $position in $positions { 5 | .position-#{$position} { position: $position !important; } 6 | } 7 | 8 | // Shorthand 9 | 10 | .fixed-top { 11 | position: fixed; 12 | top: 0; 13 | right: 0; 14 | left: 0; 15 | z-index: $zindex-fixed; 16 | } 17 | 18 | .fixed-bottom { 19 | position: fixed; 20 | right: 0; 21 | bottom: 0; 22 | left: 0; 23 | z-index: $zindex-fixed; 24 | } 25 | 26 | .sticky-top { 27 | @supports (position: sticky) { 28 | position: sticky; 29 | top: 0; 30 | z-index: $zindex-sticky; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/dotnet/aspnet:9.0-alpine AS base 2 | RUN apk add --no-cache icu-libs 3 | ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false 4 | WORKDIR /app 5 | EXPOSE 8080 6 | 7 | FROM mcr.microsoft.com/dotnet/sdk:9.0-alpine AS build 8 | WORKDIR /src 9 | COPY src/GPONMonitor/*.csproj ./src/GPONMonitor/ 10 | RUN dotnet restore src/GPONMonitor//GPONMonitor.csproj 11 | COPY . . 12 | RUN dotnet build "src/GPONMonitor/GPONMonitor.csproj" -c Release -o /app 13 | 14 | FROM build AS publish 15 | RUN dotnet publish "src/GPONMonitor/GPONMonitor.csproj" -c Release -o /app 16 | 17 | FROM base AS final 18 | WORKDIR /app 19 | COPY --from=publish /app . 20 | ENTRYPOINT ["dotnet", "GPONMonitor.dll"] 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_display.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // 4 | // Utilities for common `display` values 5 | // 6 | 7 | @each $breakpoint in map-keys($grid-breakpoints) { 8 | @include media-breakpoint-up($breakpoint) { 9 | $infix: breakpoint-infix($breakpoint, $grid-breakpoints); 10 | 11 | @each $value in $displays { 12 | .d#{$infix}-#{$value} { display: $value !important; } 13 | } 14 | } 15 | } 16 | 17 | 18 | // 19 | // Utilities for toggling `display` in print 20 | // 21 | 22 | @media print { 23 | @each $value in $displays { 24 | .d-print-#{$value} { display: $value !important; } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Configuration/OltConfiguration.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.Configuration 2 | { 3 | public class OltConfiguration 4 | { 5 | public int Id { get; set; } 6 | public string Name { get; set; } 7 | public string IpAddress { get; set; } 8 | public string SnmpPort { get; set; } 9 | public string SnmpVersion { get; set; } 10 | public string SnmpCommunity { get; set; } 11 | public string SnmpTimeout { get; set; } 12 | public string CommandProtectionPassword { get; set; } 13 | public SnmpV3Credentials SnmpV3Credentials { get; set; } 14 | public string IpHostWebManagementPort { get; set; } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_root.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | // Custom variable values only support SassScript inside `#{}`. 3 | @each $color, $value in $colors { 4 | --#{$color}: #{$value}; 5 | } 6 | 7 | @each $color, $value in $theme-colors { 8 | --#{$color}: #{$value}; 9 | } 10 | 11 | @each $bp, $value in $grid-breakpoints { 12 | --breakpoint-#{$bp}: #{$value}; 13 | } 14 | 15 | // Use `inspect` for lists so that quoted items keep the quotes. 16 | // See https://github.com/sass/sass/issues/2383#issuecomment-336349172 17 | --font-family-sans-serif: #{inspect($font-family-sans-serif)}; 18 | --font-family-monospace: #{inspect($font-family-monospace)}; 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/ComplexStateTypes/ComplexType.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models.ComplexStateTypes 2 | { 3 | public abstract class ComplexType 4 | { 5 | public string Description { get; private set; } 6 | public SeverityLevel Severity { get; private set; } 7 | 8 | public ComplexType(string description, SeverityLevel severity) 9 | { 10 | Description = description; 11 | Severity = severity; 12 | } 13 | 14 | public ComplexType(ResponseDescription responseDescription) 15 | { 16 | Description = responseDescription.Description; 17 | Severity = responseDescription.Severity; 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_deprecate.scss: -------------------------------------------------------------------------------- 1 | // Deprecate mixin 2 | // 3 | // This mixin can be used to deprecate mixins or functions. 4 | // `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to 5 | // some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap) 6 | @mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) { 7 | @if ($enable-deprecation-messages != false and $ignore-warning != true) { 8 | @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}."; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400} -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} -------------------------------------------------------------------------------- /src/GPONMonitor/Models/OnuFactory/HLGSFPOnuFactory.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | using GPONMonitor.Models.Onu; 3 | using GPONMonitor.Services; 4 | 5 | namespace GPONMonitor.Models.OnuFactory 6 | { 7 | public class HLGSFPOnuFactory : OnuFactory 8 | { 9 | public HLGSFPOnuFactory(IResponseDescriptionDictionaries responseDescriptionDictionaries, IMapper mapper, IDataService snmpDataService) : base(responseDescriptionDictionaries, mapper, snmpDataService) { } 10 | 11 | public override IOnuFactory BuildOnu(uint oltId, uint oltPortId, uint onuId) 12 | { 13 | HLGSFPOnu onu = _mapper.Map(base.BuildOnu(oltId, oltPortId, onuId)); 14 | 15 | return onu; 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/GPONMonitor/Models/OnuFactory/UnknownOnuFactory.cs: -------------------------------------------------------------------------------- 1 | using AutoMapper; 2 | using GPONMonitor.Models.Onu; 3 | using GPONMonitor.Services; 4 | 5 | namespace GPONMonitor.Models.OnuFactory 6 | { 7 | public class UnknownOnuFactory : OnuFactory 8 | { 9 | public UnknownOnuFactory(IResponseDescriptionDictionaries responseDescriptionDictionaries, IMapper mapper, IDataService snmpDataService) : base(responseDescriptionDictionaries, mapper, snmpDataService) { } 10 | 11 | public override IOnuFactory BuildOnu(uint oltId, uint oltPortId, uint onuId) 12 | { 13 | UnknownOnu onu = _mapper.Map(base.BuildOnu(oltId, oltPortId, onuId)); 14 | return onu; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:53621/", 7 | "sslPort": 0 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "environmentVariables": { 15 | "ASPNETCORE_ENVIRONMENT": "Development" 16 | } 17 | }, 18 | "GPONMonitor": { 19 | "commandName": "Project", 20 | "launchBrowser": true, 21 | "launchUrl": "http://localhost:5000", 22 | "environmentVariables": { 23 | "ASPNETCORE_ENVIRONMENT": "Development" 24 | } 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/GPONMonitor/Services/IResponseDescriptionDictionaries.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | 3 | namespace GPONMonitor.Services 4 | { 5 | public interface IResponseDescriptionDictionaries 6 | { 7 | ResponseDescription OpticalConnectionStateResponse(int? responseCode); 8 | ResponseDescription OpticalConnectionDeactivationReasonResponse(int? responseCode); 9 | ResponseDescription BlockReasonResponse(int? responseCode); 10 | ResponseDescription BlockStatusResponse(int? responseCode); 11 | ResponseDescription EthernetPortStateResponse(int? responseCode); 12 | ResponseDescription EthernetPortSpeedResponse(int? responseCode); 13 | ResponseDescription VoIPLinestatusResponse(int? responseCode); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H640GOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H640GOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/bootstrap-grid.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Grid v4.6.0 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | html { 9 | box-sizing: border-box; 10 | -ms-overflow-style: scrollbar; 11 | } 12 | 13 | *, 14 | *::before, 15 | *::after { 16 | box-sizing: inherit; 17 | } 18 | 19 | @import "functions"; 20 | @import "variables"; 21 | 22 | @import "mixins/deprecate"; 23 | @import "mixins/breakpoints"; 24 | @import "mixins/grid-framework"; 25 | @import "mixins/grid"; 26 | 27 | @import "grid"; 28 | @import "utilities/display"; 29 | @import "utilities/flex"; 30 | @import "utilities/spacing"; 31 | -------------------------------------------------------------------------------- /docker-compose.dcproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2.1 5 | Linux 6 | d4b5caa4-2125-4cad-98d5-f86bc78e97af 7 | LaunchBrowser 8 | {Scheme}://localhost:{ServicePort} 9 | gponmonitor 10 | 11 | 12 | 13 | docker-compose.yml 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/GPONMonitor/libman.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "defaultProvider": "cdnjs", 4 | "libraries": [ 5 | { 6 | "library": "jquery@3.6.0", 7 | "destination": "wwwroot/lib/jquery/" 8 | }, 9 | { 10 | "library": "twitter-bootstrap@4.6.0", 11 | "destination": "wwwroot/lib/twitter-bootstrap/" 12 | }, 13 | { 14 | "library": "bootswatch@4.6.0", 15 | "destination": "wwwroot/lib/bootswatch/", 16 | "files": [ 17 | "yeti/bootstrap.css", 18 | "yeti/bootstrap.min.css" 19 | ] 20 | }, 21 | { 22 | "library": "font-awesome@5.15.3", 23 | "destination": "wwwroot/lib/font-awesome/" 24 | }, 25 | { 26 | "library": "font-awesome-animation@0.3.0", 27 | "destination": "wwwroot/lib/font-awesome-animation/" 28 | } 29 | ] 30 | } -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: block; 10 | src: url("../webfonts/fa-brands-400.eot"); 11 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 12 | 13 | .fab { 14 | font-family: 'Font Awesome 5 Brands'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: block; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 12 | 13 | .fa, 14 | .fas { 15 | font-family: 'Font Awesome 5 Free'; 16 | font-weight: 900; } 17 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/font-awesome/css/regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.15.3 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | font-display: block; 10 | src: url("../webfonts/fa-regular-400.eot"); 11 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 12 | 13 | .far { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 400; } 16 | -------------------------------------------------------------------------------- /src/GPONMonitor/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GXVOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GXVOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4BX3VFOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4BX3VFOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GMV3Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GMV3Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GMV4Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GMV4Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GMVROnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GMVROnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GQVS2.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GQVS2Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GQVSOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GQVSOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GXVFOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GXVFOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_transition.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable property-disallowed-list 2 | @mixin transition($transition...) { 3 | @if length($transition) == 0 { 4 | $transition: $transition-base; 5 | } 6 | 7 | @if length($transition) > 1 { 8 | @each $value in $transition { 9 | @if $value == null or $value == none { 10 | @warn "The keyword 'none' or 'null' must be used as a single argument."; 11 | } 12 | } 13 | } 14 | 15 | @if $enable-transitions { 16 | @if nth($transition, 1) != null { 17 | transition: $transition; 18 | } 19 | 20 | @if $enable-prefers-reduced-motion-media-query and nth($transition, 1) != null and nth($transition, 1) != none { 21 | @media (prefers-reduced-motion: reduce) { 22 | transition: none; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_background-variant.scss: -------------------------------------------------------------------------------- 1 | // stylelint-disable declaration-no-important 2 | 3 | // Contextual backgrounds 4 | 5 | @mixin bg-variant($parent, $color, $ignore-warning: false) { 6 | #{$parent} { 7 | background-color: $color !important; 8 | } 9 | a#{$parent}, 10 | button#{$parent} { 11 | @include hover-focus() { 12 | background-color: darken($color, 10%) !important; 13 | } 14 | } 15 | @include deprecate("The `bg-variant` mixin", "v4.4.0", "v5", $ignore-warning); 16 | } 17 | 18 | @mixin bg-gradient-variant($parent, $color, $ignore-warning: false) { 19 | #{$parent} { 20 | background: $color linear-gradient(180deg, mix($body-bg, $color, 15%), $color) repeat-x !important; 21 | } 22 | @include deprecate("The `bg-gradient-variant` mixin", "v4.5.0", "v5", $ignore-warning); 23 | } 24 | -------------------------------------------------------------------------------- /src/GPONMonitor/Services/IOltFormatChecks.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.Configuration; 2 | using Lextm.SharpSnmpLib; 3 | using System.Net; 4 | 5 | namespace GPONMonitor.Services 6 | { 7 | public interface IOltFormatChecks 8 | { 9 | int CheckOltIdFormat(int id); 10 | string CheckOltNameFormat(string name); 11 | IPAddress CheckOltSnmpIpAddressFormat(string snmpIPAddress); 12 | int CheckOltSnmpPortFormat(string snmpPort); 13 | VersionCode CheckOltSnmpVersionFormat(string snmpVersion); 14 | string CheckOltSnmpCommunityFormat(string snmpCommunity); 15 | int CheckOltSnmpTimeoutFormat(string snmpTimeout); 16 | SnmpV3Credentials CheckSnmpV3Credentials(string snmpVersion, SnmpV3Credentials snmpV3Credentials); 17 | int CheckIpHostWebManagementPortFormat(string ipHostWebManagementPort); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/tests.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net9.0 5 | 6 | false 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | all 16 | runtime; build; native; contentfiles; analyzers 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/GPONMonitor/Properties/PublishProfiles/Linux .NET Core publish-publish.ps1: -------------------------------------------------------------------------------- 1 | [cmdletbinding(SupportsShouldProcess=$true)] 2 | param($publishProperties=@{}, $packOutput, $pubProfilePath) 3 | 4 | # to learn more about this file visit https://go.microsoft.com/fwlink/?LinkId=524327 5 | 6 | try{ 7 | if ($publishProperties['ProjectGuid'] -eq $null){ 8 | $publishProperties['ProjectGuid'] = 'df0c9e45-cf8e-4c9e-b5c7-1df1b62e1ade' 9 | } 10 | 11 | $publishModulePath = Join-Path (Split-Path $MyInvocation.MyCommand.Path) 'publish-module.psm1' 12 | Import-Module $publishModulePath -DisableNameChecking -Force 13 | 14 | # call Publish-AspNet to perform the publish operation 15 | Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput -pubProfilePath $pubProfilePath 16 | } 17 | catch{ 18 | "An error occurred during publish.`n{0}" -f $_.Exception.Message | Write-Error 19 | } -------------------------------------------------------------------------------- /src/GPONMonitor/bundleconfig.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "outputFileName": "wwwroot/css/site.min.css", 4 | "inputFiles": [ 5 | "wwwroot/css/site.css" 6 | ] 7 | }, 8 | { 9 | "outputFileName": "wwwroot/js/site.min.js", 10 | "inputFiles": [ 11 | "wwwroot/js/site.js" 12 | ], 13 | "minify": { 14 | "enabled": true, 15 | "renameLocals": true 16 | } 17 | }, 18 | { 19 | "outputFileName": "wwwroot/js/site.js", 20 | "inputFiles": [ 21 | "wwwroot/js/Services/OnuDescriptionListSearch.js", 22 | "wwwroot/js/Services/TooltipWhenOverflow.js", 23 | "wwwroot/js/Services/NavbarMediaResize.js", 24 | "wwwroot/js/Services/OltDescriptionListService.js", 25 | "wwwroot/js/Services/OnuDetailsService.js", 26 | "wwwroot/js/Controllers/OltDescriptionListController.js", 27 | "wwwroot/js/Controllers/OnuDetailsController.js" 28 | ] 29 | } 30 | ] -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H660GMOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H660GMOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H660GWOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H660GWOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H660RMOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H660RMOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H680GWOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H680GWOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GMVOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GMVOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GQVOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GQVOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H640GW02Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H640GW02Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/H660GMAOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class H660GMAOnu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/HL4GMV2Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class HL4GMV2Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/LXT240GC1Onu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class LXT240GC1Onu : GenericOnu, IOnuFactory 7 | { 8 | public ComplexIntType EthernetPort1State { get; set; } 9 | public ComplexIntType EthernetPort1Speed { get; set; } 10 | public ComplexIntType EthernetPort2State { get; set; } 11 | public ComplexIntType EthernetPort2Speed { get; set; } 12 | public ComplexIntType EthernetPort3State { get; set; } 13 | public ComplexIntType EthernetPort3Speed { get; set; } 14 | public ComplexIntType EthernetPort4State { get; set; } 15 | public ComplexIntType EthernetPort4Speed { get; set; } 16 | 17 | public ComplexIntType VoIPLine1State { get; set; } 18 | public ComplexIntType VoIPLine2State { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_hover.scss: -------------------------------------------------------------------------------- 1 | // Hover mixin and `$enable-hover-media-query` are deprecated. 2 | // 3 | // Originally added during our alphas and maintained during betas, this mixin was 4 | // designed to prevent `:hover` stickiness on iOS-an issue where hover styles 5 | // would persist after initial touch. 6 | // 7 | // For backward compatibility, we've kept these mixins and updated them to 8 | // always return their regular pseudo-classes instead of a shimmed media query. 9 | // 10 | // Issue: https://github.com/twbs/bootstrap/issues/25195 11 | 12 | @mixin hover() { 13 | &:hover { @content; } 14 | } 15 | 16 | @mixin hover-focus() { 17 | &:hover, 18 | &:focus { 19 | @content; 20 | } 21 | } 22 | 23 | @mixin plain-hover-focus() { 24 | &, 25 | &:hover, 26 | &:focus { 27 | @content; 28 | } 29 | } 30 | 31 | @mixin hover-focus-active() { 32 | &:hover, 33 | &:focus, 34 | &:active { 35 | @content; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_table-row.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | @mixin table-row-variant($state, $background, $border: null) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table-#{$state} { 7 | &, 8 | > th, 9 | > td { 10 | background-color: $background; 11 | } 12 | 13 | @if $border != null { 14 | th, 15 | td, 16 | thead th, 17 | tbody + tbody { 18 | border-color: $border; 19 | } 20 | } 21 | } 22 | 23 | // Hover states for `.table-hover` 24 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 25 | .table-hover { 26 | $hover-background: darken($background, 5%); 27 | 28 | .table-#{$state} { 29 | @include hover() { 30 | background-color: $hover-background; 31 | 32 | > td, 33 | > th { 34 | background-color: $hover-background; 35 | } 36 | } 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Only display content to screen readers 2 | // 3 | // See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ 4 | // See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/ 5 | 6 | @mixin sr-only() { 7 | position: absolute; 8 | width: 1px; 9 | height: 1px; 10 | padding: 0; 11 | margin: -1px; // Fix for https://github.com/twbs/bootstrap/issues/25686 12 | overflow: hidden; 13 | clip: rect(0, 0, 0, 0); 14 | white-space: nowrap; 15 | border: 0; 16 | } 17 | 18 | // Use in conjunction with .sr-only to only display content when it's focused. 19 | // 20 | // Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 21 | // 22 | // Credit: HTML5 Boilerplate 23 | 24 | @mixin sr-only-focusable() { 25 | &:active, 26 | &:focus { 27 | position: static; 28 | width: auto; 29 | height: auto; 30 | overflow: visible; 31 | clip: auto; 32 | white-space: normal; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/OnuShortDescription.cs: -------------------------------------------------------------------------------- 1 | namespace GPONMonitor.Models 2 | { 3 | public class OnuShortDescription 4 | { 5 | public uint OltPortId { get; private set; } 6 | public uint OnuId { get; private set; } 7 | public string OnuDescription { get; private set; } 8 | public string OnuGponSerialNumber { get; private set; } 9 | public string OnuOpticalConnectionState { get; private set; } 10 | public string OpticalPowerReceived { get; private set; } 11 | 12 | public OnuShortDescription(uint oltPortId, uint onuId, string onuDescription, string onuGponSerialNumber, string onuOpticalConnectionState, string opticalPowerReceived) 13 | { 14 | OltPortId = oltPortId; 15 | OnuId = onuId; 16 | OnuDescription = onuDescription; 17 | OnuGponSerialNumber = onuGponSerialNumber; 18 | OnuOpticalConnectionState = onuOpticalConnectionState; 19 | OpticalPowerReceived = opticalPowerReceived; 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/utilities/_embed.scss: -------------------------------------------------------------------------------- 1 | // Credit: Nicolas Gallagher and SUIT CSS. 2 | 3 | .embed-responsive { 4 | position: relative; 5 | display: block; 6 | width: 100%; 7 | padding: 0; 8 | overflow: hidden; 9 | 10 | &::before { 11 | display: block; 12 | content: ""; 13 | } 14 | 15 | .embed-responsive-item, 16 | iframe, 17 | embed, 18 | object, 19 | video { 20 | position: absolute; 21 | top: 0; 22 | bottom: 0; 23 | left: 0; 24 | width: 100%; 25 | height: 100%; 26 | border: 0; 27 | } 28 | } 29 | 30 | @each $embed-responsive-aspect-ratio in $embed-responsive-aspect-ratios { 31 | $embed-responsive-aspect-ratio-x: nth($embed-responsive-aspect-ratio, 1); 32 | $embed-responsive-aspect-ratio-y: nth($embed-responsive-aspect-ratio, 2); 33 | 34 | .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} { 35 | &::before { 36 | padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_close.scss: -------------------------------------------------------------------------------- 1 | .close { 2 | float: right; 3 | @include font-size($close-font-size); 4 | font-weight: $close-font-weight; 5 | line-height: 1; 6 | color: $close-color; 7 | text-shadow: $close-text-shadow; 8 | opacity: .5; 9 | 10 | // Override 's hover style 11 | @include hover() { 12 | color: $close-color; 13 | text-decoration: none; 14 | } 15 | 16 | &:not(:disabled):not(.disabled) { 17 | @include hover-focus() { 18 | opacity: .75; 19 | } 20 | } 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 27 | 28 | // stylelint-disable-next-line selector-no-qualifying-type 29 | button.close { 30 | padding: 0; 31 | background-color: transparent; 32 | border: 0; 33 | } 34 | 35 | // Future-proof disabling of clicks on `` elements 36 | 37 | // stylelint-disable-next-line selector-no-qualifying-type 38 | a.close.disabled { 39 | pointer-events: none; 40 | } 41 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/bootstrap.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v4.6.0 (https://getbootstrap.com/) 3 | * Copyright 2011-2021 The Bootstrap Authors 4 | * Copyright 2011-2021 Twitter, Inc. 5 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 6 | */ 7 | 8 | @import "functions"; 9 | @import "variables"; 10 | @import "mixins"; 11 | @import "root"; 12 | @import "reboot"; 13 | @import "type"; 14 | @import "images"; 15 | @import "code"; 16 | @import "grid"; 17 | @import "tables"; 18 | @import "forms"; 19 | @import "buttons"; 20 | @import "transitions"; 21 | @import "dropdown"; 22 | @import "button-group"; 23 | @import "input-group"; 24 | @import "custom-forms"; 25 | @import "nav"; 26 | @import "navbar"; 27 | @import "card"; 28 | @import "breadcrumb"; 29 | @import "pagination"; 30 | @import "badge"; 31 | @import "jumbotron"; 32 | @import "alert"; 33 | @import "progress"; 34 | @import "media"; 35 | @import "list-group"; 36 | @import "close"; 37 | @import "toasts"; 38 | @import "modal"; 39 | @import "tooltip"; 40 | @import "popover"; 41 | @import "carousel"; 42 | @import "spinners"; 43 | @import "utilities"; 44 | @import "print"; 45 | -------------------------------------------------------------------------------- /src/GPONMonitor/Services/IDataService.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models; 2 | using GPONMonitor.Models.OnuFactory; 3 | using GPONMonitor.ViewModels; 4 | using Lextm.SharpSnmpLib; 5 | using System.Collections.Generic; 6 | using System.Threading.Tasks; 7 | 8 | namespace GPONMonitor.Services 9 | { 10 | public interface IDataService 11 | { 12 | IEnumerable GetConfiguredOltListAsync(); 13 | Task GetOltDescriptionAsync(uint oltId); 14 | Task GetOltUptimeAsync(uint oltId); 15 | Task GetOltFirmwareVersionAsync(uint oltId); 16 | int GetOltIpHostWebManagementPort(uint oltId); 17 | Task> GetOnuDescriptionListAsync(uint oltId); 18 | Task GetOnuStateAsync(uint oltId, uint oltPortId, uint onuId); 19 | Task GetStringPropertyAsync(uint oltId, string snmpOid); 20 | Task GetIntPropertyAsync(uint oltId, string snmpOid); 21 | Task> SetStringPropertyAsync(uint oltId, string oid, string data); 22 | Task> SetIntPropertyAsync(uint oltId, string oid, int data); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/GPONMonitor/Properties/PublishProfiles/Linux .NET Core publish.pubxml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | FileSystem 9 | Release 10 | Any CPU 11 | 12 | true 13 | false 14 | netcoreapp1.1 15 | True 16 | .\bin\Release\PublishOutput 17 | false 18 | net9.0 19 | df0c9e45-cf8e-4c9e-b5c7-1df1b62e1ade 20 | false 21 | 22 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/OnuFactory/IOnuFactory.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | 3 | namespace GPONMonitor.Models.OnuFactory 4 | { 5 | public interface IOnuFactory 6 | { 7 | uint OltId { get; set; } 8 | uint OltPortId { get; set; } 9 | uint OltOnuId { get; set; } 10 | 11 | ComplexStringType ModelType { get; set; } 12 | ComplexStringType DescriptionName { get; set; } 13 | ComplexStringType GponSerialNumber { get; set; } 14 | ComplexStringType GponProfile { get; set; } 15 | ComplexStringType FirmwareVersion { get; set; } 16 | 17 | ComplexIntType OpticalConnectionState { get; set; } 18 | ComplexIntType OpticalConnectionDeactivationReason { get; set; } 19 | ComplexStringType OpticalPowerReceived { get; set; } 20 | ComplexIntType OpticalCableDistance { get; set; } 21 | 22 | ComplexIntType OpticalConnectionUptime { get; set; } 23 | ComplexIntType OpticalConnectionInactiveTime { get; set; } 24 | ComplexIntType SystemUptime { get; set; } 25 | 26 | ComplexIntType BlockStatus { get; set; } 27 | ComplexIntType BlockReason { get; set; } 28 | 29 | public ComplexStringType IpHost1 { get; set; } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/css/site.min.css: -------------------------------------------------------------------------------- 1 | body{overflow-y:scroll}.w-10{width:10%}#refresh-onu-list{font-size:1.8em;color:#5bc0de}table.onu-list{width:100%;cursor:pointer}table.onu-list>tbody>tr>td{padding:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}table.onu-list>tbody>tr:hover,table.onu-list>tbody>tr:focus{background-color:#eef8fc}td.onu-list-id{font-size:1.3em;font-weight:normal;text-align:right}td.onu-list-sn{font-size:1.2em;font-weight:normal;text-align:center;color:#5bc0de}td.onu-list-item{font-size:1.3em;font-weight:normal}#refresh-onu-details{font-size:.9em;color:#5bc0de;margin-left:.8em;margin-right:.4em}#reset-onu-icon{color:#f04124}#block-onu-icon{color:#e99002}#unblock-onu-icon{color:#43ac6a}table.onu-details{width:100%}table.onu-details>tbody>tr>td{padding:6px;max-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}td.onu-detail-description{font-size:1.3em;font-weight:normal;text-align:right}td.onu-detail-item{font-size:1.3em;font-weight:bold}td.onu-detail-description-head{font-size:2em;font-weight:normal}td.onu-detail-item-head{font-size:2em;font-weight:normal}.indicator-unknown{color:#808080}.indicator-default{color:#222}.indicator-info{color:#5bc0de}.indicator-success{color:#43ac6a}.indicator-warning{color:#e99002}.indicator-danger{color:#f04124} -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_code.scss: -------------------------------------------------------------------------------- 1 | // Inline code 2 | code { 3 | @include font-size($code-font-size); 4 | color: $code-color; 5 | word-wrap: break-word; 6 | 7 | // Streamline the style when inside anchors to avoid broken underline and more 8 | a > & { 9 | color: inherit; 10 | } 11 | } 12 | 13 | // User input typically entered via keyboard 14 | kbd { 15 | padding: $kbd-padding-y $kbd-padding-x; 16 | @include font-size($kbd-font-size); 17 | color: $kbd-color; 18 | background-color: $kbd-bg; 19 | @include border-radius($border-radius-sm); 20 | @include box-shadow($kbd-box-shadow); 21 | 22 | kbd { 23 | padding: 0; 24 | @include font-size(100%); 25 | font-weight: $nested-kbd-font-weight; 26 | @include box-shadow(none); 27 | } 28 | } 29 | 30 | // Blocks of code 31 | pre { 32 | display: block; 33 | @include font-size($code-font-size); 34 | color: $pre-color; 35 | 36 | // Account for some code outputs that place code tags in pre tags 37 | code { 38 | @include font-size(inherit); 39 | color: inherit; 40 | word-break: normal; 41 | } 42 | } 43 | 44 | // Enable scrollable blocks of code 45 | .pre-scrollable { 46 | max-height: $pre-scrollable-max-height; 47 | overflow-y: scroll; 48 | } 49 | -------------------------------------------------------------------------------- /src/GPONMonitor/Controllers/API/OltApiController.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.Configuration; 2 | using GPONMonitor.Services; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.Extensions.Options; 5 | using System; 6 | using System.Threading.Tasks; 7 | 8 | namespace GPONMonitor.Controllers.API 9 | { 10 | [Route("api")] 11 | public class OltApiController : Controller 12 | { 13 | private readonly DevicesConfiguration _devicesConfiguration; 14 | private IDataService _snmpDataService; 15 | 16 | public OltApiController(IOptions devicesConfiguration, IDataService snmpDataService) 17 | { 18 | _devicesConfiguration = devicesConfiguration.Value; 19 | _snmpDataService = snmpDataService; 20 | } 21 | 22 | // GET: api/OltOnuDescriptionList?oltId=1 23 | [HttpGet("OltOnuDescriptionList")] 24 | public async Task GetOltOnuDescriptionListAsync(uint oltId) 25 | { 26 | try 27 | { 28 | return Json(await _snmpDataService.GetOnuDescriptionListAsync(oltId)); 29 | } 30 | catch (Exception exception) 31 | { 32 | return NotFound(exception.Message); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Toggles 2 | // 3 | // Used in conjunction with global variables to enable certain theme features. 4 | 5 | // Vendor 6 | @import "vendor/rfs"; 7 | 8 | // Deprecate 9 | @import "mixins/deprecate"; 10 | 11 | // Utilities 12 | @import "mixins/breakpoints"; 13 | @import "mixins/hover"; 14 | @import "mixins/image"; 15 | @import "mixins/badge"; 16 | @import "mixins/resize"; 17 | @import "mixins/screen-reader"; 18 | @import "mixins/size"; 19 | @import "mixins/reset-text"; 20 | @import "mixins/text-emphasis"; 21 | @import "mixins/text-hide"; 22 | @import "mixins/text-truncate"; 23 | @import "mixins/visibility"; 24 | 25 | // Components 26 | @import "mixins/alert"; 27 | @import "mixins/buttons"; 28 | @import "mixins/caret"; 29 | @import "mixins/pagination"; 30 | @import "mixins/lists"; 31 | @import "mixins/list-group"; 32 | @import "mixins/nav-divider"; 33 | @import "mixins/forms"; 34 | @import "mixins/table-row"; 35 | 36 | // Skins 37 | @import "mixins/background-variant"; 38 | @import "mixins/border-radius"; 39 | @import "mixins/box-shadow"; 40 | @import "mixins/gradients"; 41 | @import "mixins/transition"; 42 | 43 | // Layout 44 | @import "mixins/clearfix"; 45 | @import "mixins/grid-framework"; 46 | @import "mixins/grid"; 47 | @import "mixins/float"; 48 | -------------------------------------------------------------------------------- /src/GPONMonitor/Controllers/OltController.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.Configuration; 2 | using GPONMonitor.Services; 3 | using Microsoft.AspNetCore.Mvc; 4 | using Microsoft.Extensions.Localization; 5 | using Microsoft.Extensions.Options; 6 | using System.Reflection; 7 | 8 | namespace GPONMonitor.Controllers 9 | { 10 | public class OltController : Controller 11 | { 12 | private readonly DevicesConfiguration _devicesConfiguration; 13 | private IDataService _dataService; 14 | private readonly IStringLocalizer _localizer; 15 | 16 | public OltController(IOptions devicesConfiguration, IDataService dataService, IStringLocalizer localizer) 17 | { 18 | _devicesConfiguration = devicesConfiguration.Value; 19 | _dataService = dataService; 20 | _localizer = localizer; 21 | } 22 | 23 | public IActionResult Index() 24 | { 25 | ViewData["Version"] = Assembly.GetEntryAssembly().GetCustomAttribute().InformationalVersion; 26 | 27 | return View(_dataService.GetConfiguredOltListAsync()); 28 | } 29 | 30 | public IActionResult Error() 31 | { 32 | return View(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/mixins/_image.scss: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | 10 | @mixin img-fluid() { 11 | // Part 1: Set a maximum relative to the parent 12 | max-width: 100%; 13 | // Part 2: Override the height to auto, otherwise images will be stretched 14 | // when setting a width and height attribute on the img element. 15 | height: auto; 16 | } 17 | 18 | 19 | // Retina image 20 | // 21 | // Short retina mixin for setting background-image and -size. 22 | 23 | @mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) { 24 | background-image: url($file-1x); 25 | 26 | // Autoprefixer takes care of adding -webkit-min-device-pixel-ratio and -o-min-device-pixel-ratio, 27 | // but doesn't convert dppx=>dpi. 28 | // There's no such thing as unprefixed min-device-pixel-ratio since it's nonstandard. 29 | // Compatibility info: https://caniuse.com/css-media-resolution 30 | @media only screen and (min-resolution: 192dpi), // IE9-11 don't support dppx 31 | only screen and (min-resolution: 2dppx) { // Standardized 32 | background-image: url($file-2x); 33 | background-size: $width-1x $height-1x; 34 | } 35 | @include deprecate("`img-retina()`", "v4.3.0", "v5"); 36 | } 37 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_toasts.scss: -------------------------------------------------------------------------------- 1 | .toast { 2 | // Prevents from shrinking in IE11, when in a flex container 3 | // See https://github.com/twbs/bootstrap/issues/28341 4 | flex-basis: $toast-max-width; 5 | max-width: $toast-max-width; 6 | @include font-size($toast-font-size); 7 | color: $toast-color; 8 | background-color: $toast-background-color; 9 | background-clip: padding-box; 10 | border: $toast-border-width solid $toast-border-color; 11 | box-shadow: $toast-box-shadow; 12 | opacity: 0; 13 | @include border-radius($toast-border-radius); 14 | 15 | &:not(:last-child) { 16 | margin-bottom: $toast-padding-x; 17 | } 18 | 19 | &.showing { 20 | opacity: 1; 21 | } 22 | 23 | &.show { 24 | display: block; 25 | opacity: 1; 26 | } 27 | 28 | &.hide { 29 | display: none; 30 | } 31 | } 32 | 33 | .toast-header { 34 | display: flex; 35 | align-items: center; 36 | padding: $toast-padding-y $toast-padding-x; 37 | color: $toast-header-color; 38 | background-color: $toast-header-background-color; 39 | background-clip: padding-box; 40 | border-bottom: $toast-border-width solid $toast-header-border-color; 41 | @include border-top-radius(subtract($toast-border-radius, $toast-border-width)); 42 | } 43 | 44 | .toast-body { 45 | padding: $toast-padding-x; // apply to both vertical and horizontal 46 | } 47 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_images.scss: -------------------------------------------------------------------------------- 1 | // Responsive images (ensure images don't scale beyond their parents) 2 | // 3 | // This is purposefully opt-in via an explicit class rather than being the default for all ``s. 4 | // We previously tried the "images are responsive by default" approach in Bootstrap v2, 5 | // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps) 6 | // which weren't expecting the images within themselves to be involuntarily resized. 7 | // See also https://github.com/twbs/bootstrap/issues/18178 8 | .img-fluid { 9 | @include img-fluid(); 10 | } 11 | 12 | 13 | // Image thumbnails 14 | .img-thumbnail { 15 | padding: $thumbnail-padding; 16 | background-color: $thumbnail-bg; 17 | border: $thumbnail-border-width solid $thumbnail-border-color; 18 | @include border-radius($thumbnail-border-radius); 19 | @include box-shadow($thumbnail-box-shadow); 20 | 21 | // Keep them at most 100% wide 22 | @include img-fluid(); 23 | } 24 | 25 | // 26 | // Figures 27 | // 28 | 29 | .figure { 30 | // Ensures the caption's text aligns with the image. 31 | display: inline-block; 32 | } 33 | 34 | .figure-img { 35 | margin-bottom: $spacer / 2; 36 | line-height: 1; 37 | } 38 | 39 | .figure-caption { 40 | @include font-size($figure-caption-font-size); 41 | color: $figure-caption-color; 42 | } 43 | -------------------------------------------------------------------------------- /src/GPONMonitor/Models/Onu/GenericOnu.cs: -------------------------------------------------------------------------------- 1 | using GPONMonitor.Models.ComplexStateTypes; 2 | using GPONMonitor.Models.OnuFactory; 3 | 4 | namespace GPONMonitor.Models.Onu 5 | { 6 | public class GenericOnu : IOnuFactory 7 | { 8 | public uint OltId { get; set; } 9 | public uint OltPortId { get; set; } 10 | public uint OltOnuId { get; set; } 11 | 12 | public ComplexStringType ModelType { get; set; } 13 | public ComplexStringType DescriptionName { get; set; } 14 | public ComplexStringType GponSerialNumber { get; set; } 15 | public ComplexStringType GponProfile { get; set; } 16 | public ComplexStringType FirmwareVersion { get; set; } 17 | 18 | public ComplexIntType OpticalConnectionState { get; set; } 19 | public ComplexIntType OpticalConnectionDeactivationReason { get; set; } 20 | public ComplexStringType OpticalPowerReceived { get; set; } 21 | public ComplexIntType OpticalCableDistance { get; set; } 22 | 23 | public ComplexIntType OpticalConnectionUptime { get; set; } 24 | public ComplexIntType OpticalConnectionInactiveTime { get; set; } 25 | public ComplexIntType SystemUptime { get; set; } 26 | 27 | public ComplexIntType BlockStatus { get; set; } 28 | public ComplexIntType BlockReason { get; set; } 29 | 30 | public ComplexStringType IpHost1 { get; set; } 31 | } 32 | } -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_badge.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Requires one of the contextual, color modifier classes for `color` and 4 | // `background-color`. 5 | 6 | .badge { 7 | display: inline-block; 8 | padding: $badge-padding-y $badge-padding-x; 9 | @include font-size($badge-font-size); 10 | font-weight: $badge-font-weight; 11 | line-height: 1; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | @include border-radius($badge-border-radius); 16 | @include transition($badge-transition); 17 | 18 | @at-root a#{&} { 19 | @include hover-focus() { 20 | text-decoration: none; 21 | } 22 | } 23 | 24 | // Empty badges collapse automatically 25 | &:empty { 26 | display: none; 27 | } 28 | } 29 | 30 | // Quick fix for badges in buttons 31 | .btn .badge { 32 | position: relative; 33 | top: -1px; 34 | } 35 | 36 | // Pill badges 37 | // 38 | // Make them extra rounded with a modifier to replace v3's badges. 39 | 40 | .badge-pill { 41 | padding-right: $badge-pill-padding-x; 42 | padding-left: $badge-pill-padding-x; 43 | @include border-radius($badge-pill-border-radius); 44 | } 45 | 46 | // Colors 47 | // 48 | // Contextual variations (linked badges get darker on :hover). 49 | 50 | @each $color, $value in $theme-colors { 51 | .badge-#{$color} { 52 | @include badge-variant($value); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_progress.scss: -------------------------------------------------------------------------------- 1 | // Disable animation if transitions are disabled 2 | @if $enable-transitions { 3 | @keyframes progress-bar-stripes { 4 | from { background-position: $progress-height 0; } 5 | to { background-position: 0 0; } 6 | } 7 | } 8 | 9 | .progress { 10 | display: flex; 11 | height: $progress-height; 12 | overflow: hidden; // force rounded corners by cropping it 13 | line-height: 0; 14 | @include font-size($progress-font-size); 15 | background-color: $progress-bg; 16 | @include border-radius($progress-border-radius); 17 | @include box-shadow($progress-box-shadow); 18 | } 19 | 20 | .progress-bar { 21 | display: flex; 22 | flex-direction: column; 23 | justify-content: center; 24 | overflow: hidden; 25 | color: $progress-bar-color; 26 | text-align: center; 27 | white-space: nowrap; 28 | background-color: $progress-bar-bg; 29 | @include transition($progress-bar-transition); 30 | } 31 | 32 | .progress-bar-striped { 33 | @include gradient-striped(); 34 | background-size: $progress-height $progress-height; 35 | } 36 | 37 | @if $enable-transitions { 38 | .progress-bar-animated { 39 | animation: $progress-bar-animation-timing progress-bar-stripes; 40 | 41 | @if $enable-prefers-reduced-motion-media-query { 42 | @media (prefers-reduced-motion: reduce) { 43 | animation: none; 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_alert.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .alert { 6 | position: relative; 7 | padding: $alert-padding-y $alert-padding-x; 8 | margin-bottom: $alert-margin-bottom; 9 | border: $alert-border-width solid transparent; 10 | @include border-radius($alert-border-radius); 11 | } 12 | 13 | // Headings for larger alerts 14 | .alert-heading { 15 | // Specified to prevent conflicts of changing $headings-color 16 | color: inherit; 17 | } 18 | 19 | // Provide class for links that match alerts 20 | .alert-link { 21 | font-weight: $alert-link-font-weight; 22 | } 23 | 24 | 25 | // Dismissible alerts 26 | // 27 | // Expand the right padding and account for the close button's positioning. 28 | 29 | .alert-dismissible { 30 | padding-right: $close-font-size + $alert-padding-x * 2; 31 | 32 | // Adjust close link position 33 | .close { 34 | position: absolute; 35 | top: 0; 36 | right: 0; 37 | z-index: 2; 38 | padding: $alert-padding-y $alert-padding-x; 39 | color: inherit; 40 | } 41 | } 42 | 43 | 44 | // Alternate styles 45 | // 46 | // Generate contextual modifier classes for colorizing the alert. 47 | 48 | @each $color, $value in $theme-colors { 49 | .alert-#{$color} { 50 | @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/GPONMonitor/Utils/Utils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Security.Cryptography; 3 | using System.Text; 4 | 5 | namespace GPONMonitor.Utils 6 | { 7 | public static class TimeSpanConverter 8 | { 9 | public static string CalculateTimeSpanAndDateTimeFormSeconds(int? timeSpanInSeconds) 10 | { 11 | var calculatedTimeSpanAndDateTime = TimeSpan.FromSeconds(Convert.ToDouble(timeSpanInSeconds)).ToString(@"d\d\ h\:mm\:ss"); 12 | 13 | if (timeSpanInSeconds != 0) 14 | calculatedTimeSpanAndDateTime = calculatedTimeSpanAndDateTime + " " + (DateTime.Now - TimeSpan.FromSeconds(Convert.ToDouble(timeSpanInSeconds))).ToString("(d.MM H:mm:ss)"); 15 | 16 | return calculatedTimeSpanAndDateTime; 17 | } 18 | } 19 | 20 | public static class HashCalculator 21 | { 22 | public static string CalculateMD5Hash(string input) 23 | { 24 | // Use input string to calculate MD5 hash 25 | using MD5 md5 = MD5.Create(); 26 | byte[] inputBytes = Encoding.ASCII.GetBytes(input); 27 | byte[] hashBytes = md5.ComputeHash(inputBytes); 28 | 29 | // Convert the byte array to hexadecimal string 30 | StringBuilder sb = new(); 31 | for (int i = 0; i < hashBytes.Length; i++) 32 | sb.Append(hashBytes[i].ToString("X2")); 33 | return sb.ToString().ToLower(); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /src/GPONMonitor/wwwroot/lib/twitter-bootstrap/scss/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x; 5 | margin-bottom: $breadcrumb-margin-bottom; 6 | @include font-size($breadcrumb-font-size); 7 | list-style: none; 8 | background-color: $breadcrumb-bg; 9 | @include border-radius($breadcrumb-border-radius); 10 | } 11 | 12 | .breadcrumb-item { 13 | // The separator between breadcrumbs (by default, a forward-slash: "/") 14 | + .breadcrumb-item { 15 | padding-left: $breadcrumb-item-padding; 16 | 17 | &::before { 18 | float: left; // Suppress inline spacings and underlining of the separator 19 | padding-right: $breadcrumb-item-padding; 20 | color: $breadcrumb-divider-color; 21 | content: escape-svg($breadcrumb-divider); 22 | } 23 | } 24 | 25 | // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built 26 | // without `