Category: .NET Core

Console2SAAS – what I learned from second chapter

The second chapter of Console2SAAS is very short. I realized that , as soon that you have the software , you want to have an ecosystem around it – version control, automatic CI . Also, if the software is released even to beta testers, you should have some refactoring done in order to have the solution structured properly for modifications.

You can find the second chapter at https://github.com/ignatandrei/console_to_saas/tree/master/Chapter02

Blog posts about this topic

Console2SAAS

A mini-e-book about how to transform a Console to a SAAS application
Download the book for free from https://ignatandrei.github.io/console_to_saas/consoleToSaas.pdf.html
Buy the book from Amazon , if you want to support me : https://www.amazon.com/dp/B08N56SD4D
NoBlog 
1Introduction
2Technical Details
3Console2SAAS-Chapter1
4Console2SAAS-Chapter2
5Console2SAAS-Chapter3
6Console2SAAS-Chapter4
7Console2SAAS-Chapter5
8Console2SAAS-Chapter6
9Console2SAAS-Chapter7
10Console2SAAS-PM

Book – Console 2 SAAS

I have a passion to read – also a passion to teach . And to reach others, what is best than a book ?

The idea of the book is how to pass from a Console application to a SAAS application –  with clear examples in .NET .

I have written the book with the help of Daniel Tila.

I will quote from the introduction of the book , because it is comprehensive:

<<

This book will guide you step-by-step to build a scalable product from a proof of concept to production-ready SAAS. Any development done will start from a business need: this will make things clear for the team what is the impact of the delivery.

You will see different architecture patterns for separation of concerns and why some of them fit well and some of them not. Everything will happen incrementally and the product development history will be easy to be seen by analyzing commits.

Every chapter is a progressive journey with some specific challenges that will be overcome by specific programming best practices.

This can be considered as a .NET tutorial, that demonstrates the versatility of the platform to create different types of applications (CLI, Desktop & Website).

>>

All examples in the book are in .NET Core

The book is free to download and read . What you can do:

  1. Download the book from https://ignatandrei.github.io/console_to_saas/consoleToSaas.pdf.html 
  2. Contribute to the book by modifying and submit a PR ( see https://github.com/ignatandrei/console_to_saas). We have already a contributor, Daniel Costea, http://apexcode.ro/about/
  3. Buy the book from Amazon , if you want to support me : https://www.amazon.com/dp/B08N56SD4D 

Blog posts about this topic

Console2SAAS

A mini-e-book about how to transform a Console to a SAAS application
Download the book for free from https://ignatandrei.github.io/console_to_saas/consoleToSaas.pdf.html
Buy the book from Amazon , if you want to support me : https://www.amazon.com/dp/B08N56SD4D
NoBlog 
1Introduction
2Technical Details
3Console2SAAS-Chapter1
4Console2SAAS-Chapter2
5Console2SAAS-Chapter3
6Console2SAAS-Chapter4
7Console2SAAS-Chapter5
8Console2SAAS-Chapter6
9Console2SAAS-Chapter7
10Console2SAAS-PM

SideCarCLI- console to dot net tool

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )

To create a .NET Tool, please read first https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools-how-to-create 

Of course , all the  nuget additional formats for csproj apply: read https://docs.microsoft.com/en-us/dotnet/core/tools/csproj . Of course, the easy way to in Visual Studio to right click the project, properties, Package.

This is the final xml from .csproj:

<PropertyGroup>
     <OutputType>Exe</OutputType>
     <TargetFramework>netcoreapp3.1</TargetFramework>
     <RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
     <PackAsTool>true</PackAsTool>
     <ToolCommandName>sidecarcli</ToolCommandName>
     <Title>SideCarCLI</Title>
    
     <PackageOutputPath>./nupkg</PackageOutputPath>
     <PackageId>sidecarcli</PackageId>
     <Version>2020.111.104</Version>
     <Authors>Andrei Ignat</Authors>
     <Company>AOM</Company>
     <Product>sidecarcli</Product>
     <Description>A SideCar for Command Line Applications. Read http://msprogrammer.serviciipeweb.ro/category/sidecar/ . Code source at https://github.com/ignatandrei/sidecarcli</Description>
     <PackageLicenseExpression>MIT</PackageLicenseExpression>
     <PackageProjectUrl>http://msprogrammer.serviciipeweb.ro/category/sidecar/</PackageProjectUrl>
     <RepositoryUrl>https://github.com/ignatandrei/SideCarCLI/</RepositoryUrl>
     <RepositoryType>GIT</RepositoryType>
     <PackageTags>SideCarCLI;Side Car; Command Line</PackageTags>
     <PackageReleaseNotes>First version. Read http://msprogrammer.serviciipeweb.ro/category/sidecar/</PackageReleaseNotes>
   </PropertyGroup>

 

You can create the project with

dotnet pack

command

Now go to https://www.nuget.org/packages/manage/upload and upload the project.

You can find the final result at https://www.nuget.org/packages/sidecarcli/  and you can install it

And this concludes the work for https://github.com/ignatandrei/SideCarCLI/issues/10 .

SideCARCLI–Finish process after some time

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )

One of the feature is to let the original process execute just a limited amount of time. For this, I have defined an option

var maxSeconds = app.Option(“-mS|–maxSeconds”, “max seconds for the StartApp to run”, CommandOptionType.SingleOrNoValue);

and the code for waiting is

Process p = new Process()
{
StartInfo = pi
};

//code

var res=p.WaitForExit(this.MaxSeconds);

//code

if (res)
{
exitCode = p.ExitCode;
RunFinishInterceptors(exitCode);
}
else
{
Console.WriteLine($”timeout {MaxSeconds} elapsed”);
exitCode = int.MinValue;
}

 

where the default value for this.MaxSeconds is –1 – wait undefinetely

SideCarCLI – Line interceptors

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )

For the SideCarCLI I have the concept of Line Interceptors. That means for each line from the original program another program will be start .

The json looks like this

“LineInterceptors”: [
{
“Name”: “WindowsStandardWindowsOutputInterceptor”,
“Arguments”: “/c echo \”{site} {line}\””,
“FullPath”: “cmd.exe”,
“FolderToExecute”: null,
“InterceptOutput”: true
},
{
“Name”: “NextInterceptor”,
“Arguments”: “/c echo {line}”,
“FullPath”: “cmd.exe”,
“FolderToExecute”: null,
“InterceptOutput”: true
}
]

and you can activate by command line

-aLi WindowsStandardWindowsOutputInterceptor

Pretty simple , right ? For the code , means intercepting each line

p.OutputDataReceived += P_OutputDataReceived;
p.ErrorDataReceived += P_ErrorDataReceived;

and then run the process

foreach(var item in runningInterceptors.LineInterceptors)
{
try
{

var local = item;
var dataToBeParsed=new Dictionary<string, string>();

if(this.argsRegex.Count>0)
{
foreach (var reg in argsRegex)
{
dataToBeParsed.Add(“{“+reg.Key+”}”, reg.Value);
}
}
dataToBeParsed[“{line}”]= e.Data;
allProcesses.TryAdd(local.Name, local.RunLineInterceptor(local.Name,dataToBeParsed));

}
catch (Exception ex)
{
Console.WriteLine($”LineInterceptor:{item?.Name} error:!!!” + ex.Message);
}
}

Every time it is interesting how a simple specification means multiple lines of code….

SideCarCLI- finish interceptors

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( Description : SideCar for CLI applications. Interceptors for Line, Finish, Timer . See Code )

The idea for FinishInterceptors is very simple – when the initial  process, StartApp , is finished –then run some other programs . And here comes some decisions:

  1. Pass the ExitCode of the StartApp ? ( YES)
  2. Pass the output lines of text of the StartApp ? ( NO  – could be enormous )
  3. What to do if the StartApp has not finished in time ? ( Do nothing – we need the exit code)
  4. Wait for FinishInterceptors to finish ? If yes, how much time ? ( yes )

 

Same problems for TimerInterceptors and for LineInterceptors.

But, I think, the best way is to draw a diagram for that.

In the meantime, the project is already WIP

SideCarCLI–refactor command line

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( 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 application

Usage:  [command] [options]

Options:
-h|–help          Show help information
-max|–maxSeconds  max seconds for the StartApp to run

Commands:
about
interceptors
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 [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 app

Usage:  listAllCommands [options]

Options:
-h|–help  Show help information

SideCarCLI–Architecture and specs–part 2

Summary links SideCarCLI

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( 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

NoName + Link 
1Description
2Specifications
3Refactor specifications and code
4Create Release
5Finish interceptors
6Send part of command to interceptors
7Line Interceptors
8Finish process after some time
9Documetation Diagram
10Technical Summary
11Create dotnet tool
( 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:

  1. 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).
  2. Intercept the finish of the StartApp and run something with the output ( either all lines, either with the result of the application)
  3. 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 .

Andrei Ignat weekly software news(mostly .NET)

* indicates required

Please select all the ways you would like to hear from me:

You can unsubscribe at any time by clicking the link in the footer of our emails. For information about our privacy practices, please visit our website.

We use Mailchimp as our marketing platform. By clicking below to subscribe, you acknowledge that your information will be transferred to Mailchimp for processing. Learn more about Mailchimp's privacy practices here.