SideCarCLI–create releases
Summary links SideCarCLI
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )Because all code is in Github, the easy way is GitHub Actions , https://github.com/features/actions . Some modifications are required on CSPROJ file to build for Linux or Windows :
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
</PropertyGroup>
And after 6 commits, this is the ( almost) final version:
name: .NET Core
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.301
– name: Build
run: |
cd src
cd SideCarCLI
dotnet restore
dotnet build –configuration Release –no-restore -r linux-x64 -o linuxx64
dotnet build –configuration Release –no-restore -r win-x64 -o winx64
– uses: actions/upload-artifact@v2
with:
name: winx64
path: src/SideCarCLI/winx64/
– uses: actions/upload-artifact@v2
with:
name: linuxx64
path: src/SideCarCLI/linuxx64/
#- name: Test
# run: dotnet test –no-restore –verbosity normal
Your job , if you accept, is to modify to use
dotnet publish
with trimmed and self contained and publish single file. ( you can see latest version at https://github.com/ignatandrei/SideCarCLI/blob/main/.github/workflows/dotnet-core.yml )
SideCarCLI–refactor command line
Summary links SideCarCLI
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )When starting to implement the project, suddenly realize that list interceptors command does not belong to start app command . So the application should be refactored to new specifications
– StartApp command – contains the whole list of commands for starting the app , including timer, adding interceptor
– Interceptors command – should list the interceptors (timer, line, finish)
The interceptors should be defined in a separate file , like this
{
“TimerInterceptors”: [],
“LineInterceptors”: [
{
“Name”: “echo”,
“FolderToExecute”: null
}
],
“FinishInterceptors”: []
}
So this will be how it looks the command line
————–
command path:
————–
SideCar for any other applicationUsage: [command] [options]
Options:
-h|–help Show help information
-max|–maxSeconds max seconds for the StartApp to runCommands:
about
interceptors
listAllCommands
StartAPPRun ‘ [command] -h|–help’ for more information about a command.
The most simplest form it is:
SideCarCLI startApp –name YourApp————–
command path:–>about
————–
Usage: about [options]Options:
-h|–help Show help information————–
command path:–>StartAPP
————–
start the CLI application that you need to interceptUsage: StartAPP [options]
Options:
-n|–name <fullPathToApplication> Path to the StartApp
-a|–arguments <arguments_to_the_app> StartApp arguments
-f|–folder[:<folder_where_execute_the_app>] folder where to execute the StartApp – default folder of the StartApp
-aLi|–addLineInterceptor Add Line Interceptor to execute
-aTi|–addTimerInterceptor Add Timer Interceptor to execute
-aFi|–addFinishInterceptor Add Finish Interceptor to execute
-h|–help Show help information————–
command path:–>interceptors
————–
Usage: interceptors [options]Options:
-lLi|–ListLineInterceptor List line interceptor
-lLi|–ListTimerInterceptor List timer interceptor
-lFi|–ListFinishInterceptor List timer interceptor
-h|–help Show help information————–
command path:–>listAllCommands
————–
List all commands for the appUsage: listAllCommands [options]
Options:
-h|–help Show help information
SideCarCLI–Architecture and specs–part 2
Summary links SideCarCLI
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )The SideCarCLI application should start another application and intercept in various ways . What will execute when intercept is not known in advance – so should be read at runtime . So the SideCarCLI will load the interceptors and make then available to the application. Let’s say that , for the moment, the SideCarCLI will take all the configuration from the command line.
So let’s analyze the command line . The most simplest form it is:
SideCarCLI startApp –name YourCLIApplication
For intercepting the output or the error of the console we do not know in advance what we will use. So we will make start dynamically what applications will intercept the output lines provided by StartApp.
Also this is available for intercepting the result of the application and for the thing that is running periodically.
Also I want to provide a way for the users to make on-the-fly code to intercept – so I will make also a plugin architecture to provide interceptors on the fly.
Let’s see how the application command line will look –
————–
command path:
————–
SideCar for any other application
Usage: [command] [options]
Options:
-h|–help Show help information
-max|–maxSeconds max seconds for the StartApp to run
Commands:
_about
_listAllCommands
startApp
Run ‘ [command] -h|–help’ for more information about a command.
The most simplest form it is:
SideCarCLI startApp –name YourApp
————–
command path:–>_about
————–
Usage: _about [options]
Options:
-h|–help Show help information
————–
command path:–>startApp
————–
start the CLI application that you need to intercept
Usage: startApp [command] [options]
Options:
-n|–name <fullPathToApplication> Path to the StartApp
-a|–arguments <arguments_to_the_app> StartApp arguments
-f|–folder[:<folder_where_execute_the_app>] folder where to execute the StartApp – default folder of the StartApp
-h|–help Show help information
Commands:
finishInterceptors
lineInterceptors
plugins
timer
Run ‘startApp [command] -h|–help’ for more information about a command.
————–
command path:–>startApp–>lineInterceptors
————–
Specify application for start when StartApp has a new line output
Usage: startApp lineInterceptors [options]
Options:
-l|–list List interceptors for lines
-a|–add Add interceptor to execute
-f|–folder folder where to start the interceptor
-h|–help Show help information
————–
command path:–>startApp–>timer
————–
Specify timer to start an application at repeating interval
Usage: startApp timer [options]
Options:
-i|–intervalRepeatSeconds Repeat interval in seconds
-l|–list List interceptors to execute periodically
-a|–add Add interceptor to execute
-f|–folder folder where to start the interceptor
-h|–help Show help information
————–
command path:–>startApp–>finishInterceptors
————–
Specify interceptors for start when finish the app
Usage: startApp finishInterceptors [options]
Options:
-l|–list List interceptors for finish application
-a|–add Add interceptor to execute
-f|–folder folder where to start the interceptor
-h|–help Show help information
————–
command path:–>startApp–>plugins
————–
Load dynamically plugins
Usage: startApp plugins [options]
Options:
-f|–folder folder with plugins
-l|–list List plugins
-a|–add Add interceptor to execute
-h|–help Show help information
————–
command path:–>_listAllCommands
————–
List all commands for the app
Usage: _listAllCommands [options]
Options:
-h|–help Show help information
SideCarCLI | Command Line – description –part 1
Summary links SideCarCLI
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )There are those days a great deal of command line applications that performs a variety of things. The problem is that you cannot control them . The command line performs their duty well – but , from time to time, you need something else integrated with this.
The pattern for this is https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar – it is applied to microservices , but why not applied to command lines ?
So – let’s start this project with specifications.
Let’s suppose that I want to run an command line application – let name it StartApp. But I want also:
- Intercept every line of the StartApp that is outputting to the console and run something with that with the line ( send to HTTP endpoint, log somewhere, and so on).
- Intercept the finish of the StartApp and run something with the output ( either all lines, either with the result of the application)
- Timers:
- Do not let the StartApp to run more than an maximum amount of time
- Run something periodically with arguments from the StartApp arguments
The solution is to make another application ( let’s name SideCarCLI ) that runs the StartApplication.
What it is complicated her is how we pass the arguments of the SideCarCLI versus the arguments of the StartApp .
Friday Links 393
[ADCES]SqlInjection si Migrare BD in Azure
1. Teorie si Demo practic de Sql Injection si spargerea parolelor prin hashing
Prezentator: Andrei Rinea, https://www.linkedin.com/in/andreirinea/
Descriere: Abordare teoretică și practică asupra SQL Injection și Hashing. Include live hacking!
2. Migrarea bazelor de date SQL Server in cloud
Prezentator: Dragos Barbu, https://www.linkedin.com/in/drbarbu/
Descriere:
Incheiem seria in care am prezentat cum mutam o solutie veche in cloud cu etapa de migrare a bazei de date. Voi prezenta de ce sa alegem varianta migrarii in cloud si cum sa facem acest lucru. Variante de gazduire a bazei de date in cloud-ul Microsoft Azure si pentru ce este potrivita fiecare. Discutam si de trend-ul denumit Database Modernization.
Va astept la https://www.meetup.com/Bucharest-A-D-C-E-S-Meetup/events/273499121/ ( online la https://meet.google.com/gpj-jedu-mzj )
Deploy .NET Core +SqlServer application to Ubuntu
Tools used:
SSH – Windows Native
DOS – Windows Native
SSMS – download https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15
FileZilla – download https://filezilla-project.org/download.php?platform=win64
How I did :
SSH : Install SqlServer: https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-ubuntu?view=sql-server-ver15
SSMS: Copy database with SSMS export data
DOS : Windows Compile application for Linux: dotnet publish -r linux-x64
Filezilla: Transfer with FileZilla all files: manual
SSH -Change permission chmod +777 <application name> – to can execute
SSH –execute: sudo ./<application name>–urls http://<ip>:8090
Note: Pay attention to Environment Variables on Linux – it did not work . See https://docs.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariables?view=netcore-2.0 . It did not work for me with Export.
Maybe it is better to configure as Linux Service, as in
https://irina.codes/net-api-as-a-linux-service/
https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-apache?view=aspnetcore-5.0
Add
Environment=ASPNETCORE_URLS=http://asdasd:port/
Also, for editing in ssh , sudo nano name.of.the.service
Also, to start , sudo systemctl start name.of.the.service
Also, to start at startup, sudo systemctl enable name.of.the.service
Friday Links 392
ASP.NET Core WebAPI should/ (must?) have
I am trying to have an extensive list about what an ASP.NET Core WebAPI project should / must have . After al, can be easy integrated into a VS project – or a wizard. I have put into 3 categories:
- Development – you need at development time.
- Testing – needed at testing time
- Production – needed in production
Note: All three are needed to be developed !
- Development – Visibility – see definition of the API
- Open API / Swagger – read https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-swashbuckle or https://docs.microsoft.com/en-us/aspnet/core/tutorials/getting-started-with-nswag
- For graphQL you can use https://github.com/graphql-dotnet/server
- You can also see https://github.com/ignatandrei/netcoreblockly ( my pet project for integrating GraphQL + Swagger with Blockly
- Development – Authorization + Authentication
- Windows Identity : https://docs.microsoft.com/en-us/aspnet/core/security/authentication
- ASP.NET Identity – https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identit
- Identity Server ( soon to be retired , paid version available ) – https://identityserver.io/
- OpenIddict – https://github.com/openiddict/openiddict-core
- OAuth, JWT, Cookie, 2FA s: https://docs.microsoft.com/en-us/dotnet/architecture/microservices/secure-net-microservices-web-applications/
- Development-Problem Details – flow the
errors as JSON text , keep status code - https://github.com/khellang/Middleware
and see https://codeopinion.com/http-api-problem-details-in-asp-net-core/ - Testing – test your application in CI mode
- Powershell https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7
- HttpRepl https://docs.microsoft.com/en-us/aspnet/core/web-api/http-repl
- Executing from file: https://github.com/ignatandrei/WebAPI2CLI
- Production – Versioning API endpoints
- See https://github.com/microsoft/aspnet-api-versioning . I do like
- Production – CORS
- Production – WhiteBox Monitoring
- Serilog https://serilog.net/
- NLog https://nlog-project.org/
- Ecosystem for logs – ELK – https://www.elastic.co/what-is/elk-stack ?
- Production –BlackBox Monitoring and Observability – read about RED and USE
- AppMetrics – https://www.app-metrics.io/web-monitoring/aspnet-core/tracking-middleware/
- Ecosystem: Prometheus
- Production –Rate limit – do not allow insane usage
- https://github.com/stefanprodan/AspNetCoreRateLimit
- Started my own project – do not have time to finish : https://github.com/ignatandrei/NetCoreRetarder
- Production –Caching data – to return latest values
- static variable caching
- IMemoryCache – https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory
- Production – Status of the system
https://github.com/microsoft/aspnet-api-versioning/wiki/Versioning-via-the-URL-Path
Nice to have:
- Graph with endpoints: https://andrewlock.net/adding-an-endpoint-graph-to-your-aspnetcore-application/ – read about https://en.wikipedia.org/wiki/DOT_(graph_description_language)
- Versioning end points- see what version is your program: http://msprogrammer.serviciipeweb.ro/2019/02/18/identify-version-for-application-and-components-for-backend-net-core-and-frontendangularpart-2-backend/
- Not yet discovered, but should have endpoints for environment, settings json and others.
- Formatters: BSON, CSV, YAML: https://github.com/WebApiContrib/WebAPIContrib.Core