Initial ref copy commit

This commit is contained in:
Samuele Locatelli
2020-09-12 16:11:43 +02:00
parent 2cb6ec6549
commit d80eeabf66
1886 changed files with 1855438 additions and 0 deletions
+221
View File
@@ -0,0 +1,221 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.props" Condition="Exists('..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.props')" />
<Import Project="..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.props" Condition="Exists('..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{66FA29DB-925A-402B-A4C7-D3D780FB1BC3}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>CMS_Client</RootNamespace>
<AssemblyName>CMS_Client</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>..\Step\bin\Client\x86\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
<UseVSHostingProcess>true</UseVSHostingProcess>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
<OutputPath>bin\x86\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x86</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Resources\CMS_Icon.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>..\Step\bin\Client\x64\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<OutputPath>bin\x64\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<Optimize>true</Optimize>
<DebugType>pdbonly</DebugType>
<PlatformTarget>x64</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
<Prefer32Bit>true</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.WindowsAPICodePack, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.WindowsAPICodePack-Core.1.1.0.2\lib\Microsoft.WindowsAPICodePack.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.Shell, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.WindowsAPICodePack-Shell.1.1.0.0\lib\Microsoft.WindowsAPICodePack.Shell.dll</HintPath>
</Reference>
<Reference Include="Microsoft.WindowsAPICodePack.ShellExtensions, Version=1.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.WindowsAPICodePack-Shell.1.1.0.0\lib\Microsoft.WindowsAPICodePack.ShellExtensions.dll</HintPath>
</Reference>
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Browser_Tools\BrowserJSObject.cs" />
<Compile Include="Browser_Tools\CefBrowserKeyHandler.cs" />
<Compile Include="Config\CMSConfiguration.cs" />
<Compile Include="Browser_Tools\CefBrowserMenuHandler.cs" />
<Compile Include="View\LoadingForm.cs" />
<Compile Include="View\LoadingForm.Designer.cs">
<DependentUpon>LoadingForm.cs</DependentUpon>
</Compile>
<Compile Include="View\MainForm.cs" />
<Compile Include="View\MainForm.Designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="View\NcForm.cs" />
<Compile Include="View\NcForm.Designer.cs">
<DependentUpon>NcForm.cs</DependentUpon>
</Compile>
<Compile Include="View\NcWindow.cs" />
<EmbeddedResource Include="View\LoadingForm.resx">
<DependentUpon>LoadingForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="View\MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
<EmbeddedResource Include="View\NcForm.resx">
<DependentUpon>NcForm.cs</DependentUpon>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config">
<SubType>Designer</SubType>
</None>
</ItemGroup>
<ItemGroup>
<None Include="Resources\CMS_LOGO.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\SIEMENS_ICON.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\SinumerikHmi.ico" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\CMS_Icon.ico" />
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.6.2">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.6.2 %28x86 e x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="..\packages\cef.redist.x64.3.2987.1601\build\cef.redist.x64.targets" Condition="Exists('..\packages\cef.redist.x64.3.2987.1601\build\cef.redist.x64.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>Questo progetto fa riferimento a uno o più pacchetti NuGet che non sono presenti in questo computer. Usare lo strumento di ripristino dei pacchetti NuGet per scaricarli. Per altre informazioni, vedere http://go.microsoft.com/fwlink/?LinkID=322105. Il file mancante è {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\cef.redist.x64.3.2987.1601\build\cef.redist.x64.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x64.3.2987.1601\build\cef.redist.x64.targets'))" />
<Error Condition="!Exists('..\packages\cef.redist.x86.3.2987.1601\build\cef.redist.x86.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\cef.redist.x86.3.2987.1601\build\cef.redist.x86.targets'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.targets'))" />
<Error Condition="!Exists('..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.props'))" />
<Error Condition="!Exists('..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.targets'))" />
</Target>
<Import Project="..\packages\cef.redist.x86.3.2987.1601\build\cef.redist.x86.targets" Condition="Exists('..\packages\cef.redist.x86.3.2987.1601\build\cef.redist.x86.targets')" />
<Import Project="..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.targets" Condition="Exists('..\packages\CefSharp.Common.57.0.0\build\CefSharp.Common.targets')" />
<Import Project="..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.targets" Condition="Exists('..\packages\CefSharp.WinForms.57.0.0\build\CefSharp.WinForms.targets')" />
</Project>
@@ -0,0 +1,99 @@
using Step.CmsConnectGateway.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway
{
public class GatewayNetworkConfigurationBuilder : iBuilder
{
private GatewayNetworkConfiguration config;
public GatewayNetworkConfigurationBuilder()
{
config = new GatewayNetworkConfiguration();
}
public GatewayNetworkConfigurationBuilder HasDhcp(Boolean useDhcp)
{
config.hasDhcp = useDhcp;
return this;
}
public GatewayNetworkConfigurationBuilder IpAddress(IPAddress ipAddress)
{
config.ipAddress = ipAddress;
return this;
}
public GatewayNetworkConfigurationBuilder NetMaskAddress(IPAddress netMask)
{
config.netMaskAddress = netMask;
return this;
}
public GatewayNetworkConfigurationBuilder DefaultGatewayAddress(IPAddress gateway)
{
config.defaultGatewayAddress = gateway;
return this;
}
public GatewayNetworkConfigurationBuilder DnsAddresses(IEnumerable<IPAddress> dns)
{
config.dnsAddresses = dns;
return this;
}
public GatewayNetworkConfigurationBuilder DnsPrefixes(IEnumerable<string> dnsPrefixes)
{
config.dnsPrefixes = dnsPrefixes;
return this;
}
public GatewayNetworkConfiguration GenerateConfiguration()
{
//If DHCP enabled go out
if (config.hasDhcp)
{
config.ipAddress = null;
config.netMaskAddress = null;
config.defaultGatewayAddress = null;
}
else
{
//Controls not NULL
CheckNotNull(config.ipAddress, "IpAddress");
CheckNotNull(config.netMaskAddress, "NetMaskAddress");
CheckNotNull(config.defaultGatewayAddress, "DefaultGatewayAddress");
//Controls address
CheckIpAddress(config.ipAddress);
CheckNetmaskAddress(config.netMaskAddress);
CheckIpAddress(config.defaultGatewayAddress);
}
//Controls DNS Address
if (config.dnsAddresses != null)
{
foreach (IPAddress addr in config.dnsAddresses)
CheckIpAddress(addr);
}
//Controls empty spaces
if (config.dnsPrefixes != null)
{
foreach (string str in config.dnsPrefixes)
CheckNoEmptySpaces(str, "DnsPrefixes");
}
return config;
}
}
}
@@ -0,0 +1,93 @@
using Step.CmsConnectGateway.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway
{
public class GatewayProxyConfigurationBuilder : iBuilder
{
private GatewayProxyConfiguration config;
public GatewayProxyConfigurationBuilder()
{
config = new GatewayProxyConfiguration();
}
public GatewayProxyConfigurationBuilder HasProxy(Boolean useProxy)
{
config.hasProxy = useProxy;
return this;
}
public GatewayProxyConfigurationBuilder Address(string address)
{
config.address = address;
return this;
}
public GatewayProxyConfigurationBuilder Address(IPAddress address)
{
CheckIpAddress(address);
config.address = address.ToString();
return this;
}
public GatewayProxyConfigurationBuilder Port(uint port)
{
config.port = port;
return this;
}
public GatewayProxyConfigurationBuilder Username(string username)
{
config.username = username;
return this;
}
public GatewayProxyConfigurationBuilder Password(string password)
{
config.password = password;
return this;
}
public GatewayProxyConfigurationBuilder NoproxyAddresses(IEnumerable<string> addresses)
{
config.noproxyAddresses = addresses;
return this;
}
public GatewayProxyConfiguration GenerateConfiguration()
{
//If DHCP enabled go out
if (!config.hasProxy)
{
config.address = null;
config.port = 0;
config.username = null;
config.password = null;
config.noproxyAddresses = null;
return config;
}
//Controls not NULL
CheckNotNull(config.address, "Address");
//Controls empty spaces
CheckNoEmptySpaces(config.address, "Address");
if(config.username != null)
CheckNoEmptySpaces(config.username, "Username");
if (config.password != null)
CheckNoEmptySpaces(config.password, "Password");
foreach (string str in config.noproxyAddresses)
CheckNoEmptySpaces(str, "NoproxyAddresses");
return config;
}
}
}
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway.Builders
{
public abstract class iBuilder
{
//------------------------------------ To Implement ------------------------------------
#region ToImplement_Functions
#endregion
//------------------------------------ Controls ------------------------------------
#region Control_Functions
internal void CheckIpAddress(IPAddress ipAddress)
{
byte[] byteIP = ipAddress.GetAddressBytes();
//IP must be NE 0.0.0.0
if (byteIP[0] == 0 && byteIP[1] == 0 && byteIP[2] == 0 && byteIP[3] == 0)
throw new ArgumentException("IP must be different from 0.0.0.0");
}
internal void CheckNetmaskAddress(IPAddress netmaskAddress)
{
byte[] byteIP = netmaskAddress.GetAddressBytes();
//NETMASK must be NE 0.0.0.0
if (byteIP[0] == 0 && byteIP[1] == 0 && byteIP[2] == 0 && byteIP[3] == 0)
throw new ArgumentException("NETMASK must be different from 0.0.0.0");
//NETMASK first number must be NE 0
if (byteIP[0] == 0)
throw new ArgumentException("NETMASK starting address must be different from 0. Eg: xx.0.0.0 ");
}
internal void CheckNotNull(object objToCheck, string paramName)
{
if (objToCheck == null)
throw new FormatException("BAD FORMAT - param \"" + paramName + "\" is mandatory");
}
internal void CheckNoEmptySpaces(string strToCheck,string paramName)
{
if (strToCheck.Contains(" "))
throw new FormatException("BAD FORMAT - param \"" + paramName + "\" must be without empty spaces");
}
private bool EvaluateIPV4(string stringValue, out IPAddress address)
{
Regex rgx = new Regex(@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
if (rgx.IsMatch(stringValue))
{
IPAddress.TryParse(stringValue, out address);
return true;
}
address = new IPAddress(0);
return false;
}
#endregion
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway.Events
{
public class GatewayRebootEventHandlerArgs : EventArgs
{
public Boolean errorStatus { get; internal set; }
public String errorMessage { get; internal set; }
public GatewayRebootEventHandlerArgs()
{
errorStatus = false;
errorMessage = "";
}
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway.Exceptions
{
public class GatewayException: Exception
{
public GatewayException(string message): base(message)
{
}
}
}
+759
View File
@@ -0,0 +1,759 @@
using Renci.SshNet;
using Renci.SshNet.Common;
using Step.CmsConnectGateway.Events;
using Step.CmsConnectGateway.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace Step.CmsConnectGateway
{
public class GatewayAdapter : IDisposable
{
//Internal Constant
private const string SSH_SET_PROXY_COMMAND = "sudo ./setProxy.sh ";
private const string SSH_SET_DNSIP_COMMAND = "sudo ./setDnsIp.sh ";
private const string SSH_SET_DNSSUFFIX_COMMAND = "sudo ./setDnsSuffix.sh ";
private const string SSH_SET_NETWORK_COMMAND = "sudo ./setNetwork.sh ";
private const string SSH_GET_NETWORK_COMMAND = "sudo ./getNetworkConfiguration.sh ";
private const string SSH_GET_PROXY_COMMAND = "sudo ./getProxyConfiguration.sh ";
private const string SSH_TEST_CONNECTION_COMMAND = "sudo ./testConnection.sh ";
private const string SSH_GW_REBOOT_COMMAND = "sudo ./gatewayReboot.sh ";
const string IP_ADDR_LABEL = "IP_ADDRESS=";
const string GATEWAY_LABEL = "DEFAULT_GATEWAY=";
const string DNSIP_LABEL = "DNS_IP=";
const string DNSPREFIX_LABEL = "DNS_SUFFIX=";
const string PROXY_ADDR_LABEL = "PROXY=";
const string NO_PROXY_LABEL = "NO_PROXY=";
const string UNDEF_VALUE = "none";
const string CONNECTION_OK_VALUE = "OK";
const string CONNECTION_NOWEB_VALUE = "NO_WEB";
const string CONNECTION_NOPORT_VALUE = "NO_PORTS";
const int REBOOT_MINUTES_MAX = 2;
const int REBOOT_MSWAIT_BETWEEN_OP = 500;
//Internal Private Variable
private string host;
private string username;
private string password;
//---------------------------------------------------------------------------------------------------
#region Public_methods
/// <summary>
/// Simple constructor.
/// Create an instance with this configuration: hostname: localhost, username: root, password: root.
/// </summary>
public GatewayAdapter()
{
this.host = "localhost";
this.username = "root";
this.password = "root";
}
/// <summary>
/// Advanced constructor.
/// Create an instance with the configuration passed by arguments
/// </summary>
/// <param name="hostname">Name (or IP-Address) of the gateway</param>
/// <param name="username">Username for Gateway Login</param>
/// <param name="password">Password for Gateway Login</param>
/// <exception cref="System.NullReferenceException">Thrown when one parameter is null</exception>
public GatewayAdapter(string hostname, string username, string password)
{
Setup(hostname, username, password);
}
/// <summary>
/// Setup parameters Method.
/// </summary>
/// <param name="hostname">Name (or IP-Address) of the gateway</param>
/// <param name="username">Username for Gateway Login</param>
/// <param name="password">Password for Gateway Login</param>
/// <exception cref="System.NullReferenceException">Thrown when one parameter is null</exception>
public void Setup(string hostname, string username, string password)
{
this.host = hostname ?? throw new NullReferenceException("hostname is mandatory");
this.username = username ?? throw new NullReferenceException("username is mandatory");
this.password = password ?? throw new NullReferenceException("password is mandatory");
}
/// <summary>
/// Write Proxy-Configuration on Gateway.
/// <para />See <see cref="GatewayProxyConfigurationBuilder"/> for generate the configuration.
/// </summary>
/// <param name="proxyConfiguration">Configuration of the proxy.</param>
/// <exception cref="GatewayException"></exception>
public void WriteGatewayProxyConfiguration(GatewayProxyConfiguration proxyConfiguration)
{
String Command = GenerateSshProxyCommand(proxyConfiguration);
SendSSHCommand(Command);
}
/// <summary>
/// Write Newtork-Configuration on Gateway.
/// <para />See <see cref="GatewayNetworkConfigurationBuilder"/> for generate the configuration.
/// </summary>
/// <param name="networkConfiguration">Configuration of the network.</param>
/// <exception cref="GatewayException"></exception>
public void WriteGatewayNetworkConfiguration(GatewayNetworkConfiguration networkConfiguration)
{
String NetworkCommand = GenerateSshNetworkCommand(networkConfiguration);
String DnsIpCommand = GenerateSshDnsCommand(networkConfiguration);
String DnsSuffixCommand = GenerateSshDnsSuffxCommand(networkConfiguration);
SendSSHCommand(new List<string>() { NetworkCommand, DnsIpCommand, DnsSuffixCommand });
}
/// <summary>
/// Read Newtork-Configuration saved on Gateway.
/// </summary>
/// <returns>See <see cref="GatewayNetworkConfiguration"/>
/// </returns>
/// <exception cref="GatewayException"></exception>
public GatewayNetworkConfiguration ReadGatewayNetworkConfiguration()
{
return ElaborateConfigFromSshNetworkCommand( SendSSHCommand(SSH_GET_NETWORK_COMMAND) );
}
/// <summary>
/// Read Proxy-Configuration saved on Gateway.
/// </summary>
/// <returns>See <see cref="GatewayProxyConfiguration"/>
/// </returns>
/// <exception cref="GatewayException"></exception>
public GatewayProxyConfiguration ReadGatewayProxyConfiguration()
{
return ElaborateConfigFromSshProxyCommand(SendSSHCommand(SSH_GET_PROXY_COMMAND));
}
/// <summary>
/// Test connection to SCM/CMS Server, on Gateway.
/// </summary>
/// <param name="timeout">Seconds timeout for the request</param>
/// <exception cref="GatewayException"></exception>
public GatewayConnectionStatus TestGatewayConnection(int timeout)
{
if (timeout < 0)
throw new ArgumentOutOfRangeException("Timeout must be > 0");
return ElaborateTestConnectionCommand(SendSSHCommand(SSH_TEST_CONNECTION_COMMAND + timeout));
}
/// <summary>
/// Reboot asynchronously the Gateway.
/// </summary>
/// <param name="delay">Serconds to delay before reboot</param>
/// <param name="handler">Handler Callback when the operation is finished or an error occours.
/// See <see cref="GatewayRebootEventHandlerArgs"/>
/// </param>
public void RebootGatewayAsync(int delay, EventHandler<GatewayRebootEventHandlerArgs> handler)
{
if (delay < 0)
throw new ArgumentOutOfRangeException("Delay must be > 0");
//Create the Action
Action<int, EventHandler<GatewayRebootEventHandlerArgs>> action = (int del, EventHandler<GatewayRebootEventHandlerArgs> hand) =>
{
GatewayRebootEventHandlerArgs ev = new GatewayRebootEventHandlerArgs();
try
{
this.SendSSHReboot(del);
}
catch (Exception e)
{
ev.errorStatus = true;
ev.errorMessage = e.Message;
}
hand(this, ev);
};
// Create a task and not start it.
Task t = new Task (() => action(delay, handler));
t.Start();
}
/// <summary>
/// Reboot and wait a new session of the Gateway.
/// </summary>
/// <param name="delay">Seconds to delay before reboot</param>
/// <exception cref="GatewayException"></exception>
public void RebootGateway(int delay)
{
if (delay < 0)
throw new ArgumentOutOfRangeException("Delay must be > 0");
//Send Command
this.SendSSHReboot(delay);
}
public void Dispose()
{
}
public override string ToString()
{
return "CmsConnectAdapter - Host:" + this.host;
}
#endregion
//---------------------------------------------------------------------------------------------------
#region SSH_commands_preparations_sub_methods
//SSH command generator for Proxy setting
private string GenerateSshProxyCommand(GatewayProxyConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_PROXY_COMMAND);
//Call the script without an argument will disable the Proxy
if (configuration.hasProxy)
{
/* 1St parameter. Must be one of these:
* - Address:Port
* - User:Password@Address:Port
*/
//Setup Username & password if needed
if (!String.IsNullOrWhiteSpace(configuration.username) && !String.IsNullOrWhiteSpace(configuration.password))
command.Append(configuration.username).Append(":").Append(configuration.password).Append("@");
//Setup Address & Port
command.Append(configuration.address).Append(":").Append(configuration.port).Append(" ");
/* 2nd parameter. Must be:
* "no_proxy1,no_proxy2,…,no_proxyN"
*/
if (configuration.noproxyAddresses != null)
{
command.Append("\"");
command.Append(string.Join(",", configuration.noproxyAddresses));
command.Append("\"");
}
}
return command.ToString();
}
//SSH command generator for Network setting
private string GenerateSshNetworkCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_NETWORK_COMMAND);
if (configuration.hasDhcp)
{
command.Append("DHCP");
}
else
{
//Set IP address / Netmask
IPNetwork tempIpNetw = IPNetwork.Parse(configuration.ipAddress, configuration.netMaskAddress);
command.Append(configuration.ipAddress).Append("/").Append(tempIpNetw.Cidr).Append(" ");
if(configuration.defaultGatewayAddress != null)
command.Append(configuration.defaultGatewayAddress);
}
return command.ToString();
}
//SSH command generator for Dns setting
private string GenerateSshDnsCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_DNSIP_COMMAND);
if (configuration.dnsAddresses != null)
command.Append(string.Join(",", configuration.dnsAddresses));
return command.ToString();
}
//SSH command generator for Dns-Suffix setting
private string GenerateSshDnsSuffxCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_DNSSUFFIX_COMMAND);
if(configuration.dnsPrefixes != null)
command.Append(string.Join(",", configuration.dnsPrefixes));
return command.ToString();
}
#endregion
//---------------------------------------------------------------------------------------------------
#region elaborate_SSH_values_sub_methods
private GatewayNetworkConfiguration ElaborateConfigFromSshNetworkCommand(List<string> lines)
{
GatewayNetworkConfiguration configuration = new GatewayNetworkConfiguration();
foreach (string line in lines)
{
if (line.StartsWith(IP_ADDR_LABEL))
DecodeNetworkIPAddress(line.Remove(0, IP_ADDR_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(GATEWAY_LABEL))
DecodeNetworkDefGateway(line.Remove(0, GATEWAY_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(DNSIP_LABEL))
DecodeNetworkDnsIp(line.Remove(0, DNSIP_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(DNSPREFIX_LABEL))
DecodeNetworkDnsPrefix(line.Remove(0, DNSPREFIX_LABEL.Length).Trim(), ref configuration);
}
return configuration;
}
private GatewayProxyConfiguration ElaborateConfigFromSshProxyCommand(List<string> lines)
{
GatewayProxyConfiguration configuration = new GatewayProxyConfiguration();
foreach (string line in lines)
{
if (line.StartsWith(PROXY_ADDR_LABEL))
DecodeProxyAddress(line.Remove(0, PROXY_ADDR_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(NO_PROXY_LABEL))
DecodeNoProxyUrls(line.Remove(0, NO_PROXY_LABEL.Length).Trim(), ref configuration);
}
return configuration;
}
private GatewayConnectionStatus ElaborateTestConnectionCommand(List<string> lines)
{
GatewayConnectionStatus status = new GatewayConnectionStatus();
foreach (string line in lines)
{
if (!String.IsNullOrWhiteSpace(line))
DecodeConnectionStatus(line.Trim(), ref status);
}
return status;
}
#endregion
//---------------------------------------------------------------------------------------------------
#region decode_SSH_values_sub_methods
private void DecodeNetworkIPAddress(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//Check if has DHCP
if (stringValue == "DHCP")
configuration.hasDhcp = true;
else
{
configuration.hasDhcp = false;
//Check if has / for netmask
if (!stringValue.Contains('/'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
string [] tempAddr = stringValue.Split('/');
//Check if has lenght == 2
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
//Set the IPAddress / Netmask
IPAddress tempIp;
if (!EvaluateIPV4(tempAddr[0], out tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
IPNetwork tempIpNetw;
if (!IPNetwork.TryParse(stringValue, out tempIpNetw))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
configuration.ipAddress = tempIp;
configuration.netMaskAddress = tempIpNetw.Netmask;
}
}
private void DecodeNetworkDefGateway(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.defaultGatewayAddress = null;
else
{
IPAddress tempIp;
if (!EvaluateIPV4(stringValue, out tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + GATEWAY_LABEL + stringValue);
configuration.defaultGatewayAddress = tempIp;
}
}
private void DecodeNetworkDnsIp(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.dnsAddresses = null;
else
{
string[] tempStr = stringValue.Split(' ');
if (tempStr.Length == 0)
configuration.dnsAddresses = null;
else
{
IPAddress tempIp;
List<IPAddress> tempDns = new List<IPAddress>();
foreach (string str in tempStr)
{
if (string.IsNullOrEmpty(str))
continue;
if (!EvaluateIPV4(str, out tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + DNSIP_LABEL + stringValue);
tempDns.Add(tempIp);
}
configuration.dnsAddresses = tempDns;
}
}
}
private void DecodeNetworkDnsPrefix(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.dnsPrefixes = null;
else
{
string[] tempStr = stringValue.Split(' ');
if (tempStr.Length == 0)
configuration.dnsPrefixes = null;
else
configuration.dnsPrefixes = tempStr.Where(X=> !String.IsNullOrEmpty(X)).ToList();
}
}
private void DecodeProxyAddress(string stringValue, ref GatewayProxyConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.hasProxy = false;
else
{
configuration.hasProxy = true;
/* Must be one of these:
* - Address:Port
* - User:Password@Address:Port
*/
if (!stringValue.Contains("@"))
{
//Set username & password
configuration.username = null;
configuration.password = null;
//Check if has :
if (!stringValue.Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
string[] tempAddr = stringValue.Split(':');
//Check if has lenght == 2
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
//Set the address
configuration.address = tempAddr[0];
//Set the port
UInt32 tempPort;
if (!UInt32.TryParse(tempAddr[1], out tempPort))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
configuration.port = tempPort;
}
else
{
string[] splitted = stringValue.Split('@');
//Check if has lenght == 2
if (splitted.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
//Check if has :
if (!splitted[0].Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
if (!splitted[1].Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
string[] tempLogin = splitted[0].Split(':');
string[] tempAddr = splitted[1].Split(':');
//Check if has lenght == 2
if (tempLogin.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
//Set the username
configuration.username = tempLogin[0];
//Set the password
configuration.password = tempLogin[1];
//Set the address
configuration.address = tempAddr[0];
//Set the port
UInt32 tempPort;
if (!UInt32.TryParse(tempAddr[1], out tempPort))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
configuration.port = tempPort;
}
}
}
private void DecodeNoProxyUrls(string stringValue, ref GatewayProxyConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.noproxyAddresses = null;
else
{
string[] tempStr = stringValue.Trim('"').Split(',');
for (int i=0;i<tempStr.Length;i++)
tempStr[i] = tempStr[i].Trim();
if (tempStr.Length == 0)
configuration.noproxyAddresses = null;
else
configuration.noproxyAddresses = tempStr.ToList();
}
}
private void DecodeConnectionStatus(string stringValue, ref GatewayConnectionStatus status)
{
if (stringValue == CONNECTION_OK_VALUE)
status = GatewayConnectionStatus.OK;
else if (stringValue == CONNECTION_NOWEB_VALUE)
status = GatewayConnectionStatus.WEB_ERROR;
else if (stringValue == CONNECTION_NOPORT_VALUE)
status = GatewayConnectionStatus.PORT_ERROR;
else
throw new GatewayException("Internal Gateway Error during Connection-Test (bad format): " + stringValue);
}
private bool EvaluateIPV4(string stringValue,out IPAddress address)
{
Regex rgx = new Regex(@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
if (rgx.IsMatch(stringValue))
{
IPAddress.TryParse(stringValue, out address);
return true;
}
address = new IPAddress(0);
return false;
}
#endregion
//---------------------------------------------------------------------------------------------------
#region ssh_sub_methods
//Override sendCommand for single command
private List<string> SendSSHCommand(string command)
{
return SendSSHCommand(new List<string> {command});
}
//Send multiple SSH Command
private List<string> SendSSHCommand(IEnumerable<string> command)
{
SshCommand sshCmd;
List<string> returnedValues = new List<string>();
//Create the SSH Gateway
SshClient _sshGateway = new SshClient(this.host, this.username, this.password);
try
{
//Connect
_sshGateway.Connect();
foreach(string cmd in command)
{
//Run command
sshCmd = _sshGateway.RunCommand(cmd);
//Add return values if esists
returnedValues.AddRange(sshCmd.Result.Split(new[] { "\n" }, StringSplitOptions.None));
//Check for errors
if (sshCmd.ExitStatus != 0)
{
_sshGateway.Disconnect();
throw new GatewayException("Internal Gateway Error: " + sshCmd.Error);
}
}
//Disconnect
_sshGateway.Disconnect();
}
catch (SocketException e)
{
throw new GatewayException("Connection Error: - Host:" + this.host);
}
catch (SshConnectionException e)
{
throw new GatewayException("Connection Error: - Host:" + this.host);
}
catch (ProxyException e)
{
throw new GatewayException("Proxy Error: - Host:" + this.host);
}
catch (SshAuthenticationException e)
{
throw new GatewayException("Authentication Error: - Host:" + this.host);
}
catch (SshException e)
{
throw new GatewayException("Internal command Error: - Host:" + this.host);
}
catch (GatewayException e)
{
throw new GatewayException(e.Message);
}
catch (Exception e)
{
throw new GatewayException("Unknown Error: " + e);
}
return returnedValues;
}
//Send REBOOT Command
private void SendSSHReboot(int seconds)
{
//Send SSH Command
SendSSHCommand(SSH_GW_REBOOT_COMMAND + seconds);
//Wait the time for reboot
Thread.Sleep((seconds + 5) * 1000);
//Save actual timestamp
DateTime nowAfterReboot = DateTime.Now;
//Create the Instance
SshClient _sshGateway = new SshClient(this.host, this.username, this.password);
//Phase 1 Wait Disconnection Cycle
bool disconnected = false;
do
{
try
{
//If TimeSpan > TOT MIN -> Exception
if ((DateTime.Now - nowAfterReboot) > TimeSpan.FromMinutes(REBOOT_MINUTES_MAX))
throw new GatewayException("Timeout Error during reboot - Gateway has never been rebooted");
//Try Connection
_sshGateway.Connect();
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
_sshGateway.Disconnect();
}
catch (SocketException e)
{
//Not Connected
disconnected = true;
}
catch (SshConnectionException e)
{
//Not Connected
disconnected = true;
}
catch (SshException e)
{
//Not Connected
disconnected = true;
}
catch (GatewayException e)
{
//Error
throw new GatewayException(e.Message);
}
catch (Exception e)
{
//Error
throw new GatewayException("Unknown Error during reboot: " + e);
}
} while (!disconnected);
//Phase 2 Wait Re-connection Cycle
bool connected = false;
do
{
try
{
//If TimeSpan > TOT MIN -> Exception
if((DateTime.Now - nowAfterReboot) > TimeSpan.FromMinutes(REBOOT_MINUTES_MAX))
throw new GatewayException("Timeout Error during reboot - Gateway not found during reboot");
//Try Connection
_sshGateway.Connect();
connected = true;
}
catch (SocketException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (SshConnectionException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (SshException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (GatewayException e)
{
//Error
throw new GatewayException(e.Message);
}
catch (Exception e)
{
//Error
throw new GatewayException("Unknown Error during reboot: " + e);
}
} while (!connected);
_sshGateway.Disconnect();
}
#endregion
}
}
@@ -0,0 +1,56 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
namespace Step.CmsConnectGateway
{
public enum GatewayConnectionStatus { OK = 0, WEB_ERROR = 1, PORT_ERROR = 2 };
public class GatewayNetworkConfiguration
{
internal GatewayNetworkConfiguration() {}
public Boolean hasDhcp { get; internal set;}
public IPAddress ipAddress { get; internal set; }
public IPAddress netMaskAddress { get; internal set; }
public IPAddress defaultGatewayAddress { get; internal set; }
public IEnumerable<IPAddress> dnsAddresses { get; internal set; }
public IEnumerable<string> dnsPrefixes { get; internal set; }
public override string ToString()
{
return "hasDhcp: " + hasDhcp + Environment.NewLine +
"ipAddress: " + (ipAddress != null ? ipAddress.ToString() : "null") + Environment.NewLine +
"netMaskAddress: " + (netMaskAddress != null ? netMaskAddress.ToString() : "null") + Environment.NewLine +
"defaultGatewayAddress: " + (defaultGatewayAddress != null ? defaultGatewayAddress.ToString() : "null") + Environment.NewLine +
"dnsAddresses: " + (dnsAddresses != null ? string.Join(",", dnsAddresses) : "null") + Environment.NewLine +
"dnsPrefixes: " + (dnsPrefixes != null ? string.Join(",", dnsPrefixes) : "null");
}
}
public class GatewayProxyConfiguration
{
internal GatewayProxyConfiguration(){}
public Boolean hasProxy { get; internal set; }
public string address { get; internal set; }
public uint port { get; internal set; }
public string username { get; internal set; }
public string password { get; internal set; }
public IEnumerable<string> noproxyAddresses { get; internal set; }
public override string ToString()
{
return "hasProxy: " + hasProxy + Environment.NewLine +
"address: " + (address != null ? address.ToString() : "null") + Environment.NewLine +
"port: " + (port != 0 ? port.ToString() : "null") + Environment.NewLine +
"username: " + (username != null ? username : "null") + Environment.NewLine +
"password: " + (password != null ? password : "null") + Environment.NewLine +
"noproxyAddresses: " + (noproxyAddresses != null ? string.Join(",", noproxyAddresses) : "null");
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Le informazioni generali relative a un assembly sono controllate dal seguente
// set di attributi. Modificare i valori di questi attributi per modificare le informazioni
// associate a un assembly.
[assembly: AssemblyTitle("Step.CmsConnect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Step.CmsConnect")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Se si imposta ComVisible su false, i tipi in questo assembly non saranno visibili
// ai componenti COM. Se è necessario accedere a un tipo in questo assembly da
// COM, impostare su true l'attributo ComVisible per tale tipo.
[assembly: ComVisible(false)]
// Se il progetto viene esposto a COM, il GUID seguente verrà utilizzato come ID della libreria dei tipi
[assembly: Guid("49b04d99-0ecd-4900-86d3-7098d61314d7")]
// Le informazioni sulla versione di un assembly sono costituite dai seguenti quattro valori:
//
// Versione principale
// Versione secondaria
// Numero di build
// Revisione
//
// È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build
// usando l'asterisco '*' come illustrato di seguito:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{49B04D99-0ECD-4900-86D3-7098D61314D7}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Step.CmsConnectGateway</RootNamespace>
<AssemblyName>Step.CmsConnectGateway</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Net.IPNetwork, Version=2.4.0.126, Culture=neutral, PublicKeyToken=717343cc2c25edcf, processorArchitecture=MSIL">
<HintPath>..\packages\IPNetwork2.2.4.0.126\lib\net46\System.Net.IPNetwork.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Builders\iBuilder.cs" />
<Compile Include="GatewayAdapter.cs" />
<Compile Include="Events\GatewayRebootEventHandlerArgs.cs" />
<Compile Include="Exceptions\GatewayException.cs" />
<Compile Include="Models\GatewayConfiguration.cs" />
<Compile Include="Builders\GatewayProxyConfigurationBuilder.cs" />
<Compile Include="Builders\GatewayNewtorkConfigurationBuilder.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")]
@@ -0,0 +1 @@
e7ad1f39338cdb47ba0dd5517909a38e0e2688b2
@@ -0,0 +1,10 @@
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Step.CmsConnect.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Step.CmsConnect.pdb
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Renci.SshNet.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Renci.SshNet.xml
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnect.csprojResolveAssemblyReference.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnect.csproj.CoreCompileInputs.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnect.csproj.CopyComplete
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnect.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnect.pdb
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\System.Net.IPNetwork.dll
@@ -0,0 +1,10 @@
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Renci.SshNet.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\System.Net.IPNetwork.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Renci.SshNet.xml
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnectGateway.csprojResolveAssemblyReference.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnectGateway.csproj.CoreCompileInputs.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnectGateway.csproj.CopyComplete
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Step.CmsConnectGateway.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\bin\Debug\Step.CmsConnectGateway.pdb
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnectGateway.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnect\obj\Debug\Step.CmsConnectGateway.pdb
@@ -0,0 +1 @@
97d00f442ca134113e8458a6dbfc4c06fe044fb9
@@ -0,0 +1 @@
f1dc8bb19a1d95a3f0d4bf66c6bb1c0e828a3b63
@@ -0,0 +1,10 @@
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\bin\Release\Step.CmsConnectGateway.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\bin\Release\Step.CmsConnectGateway.pdb
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\bin\Release\Renci.SshNet.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\bin\Release\System.Net.IPNetwork.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\bin\Release\Renci.SshNet.xml
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\obj\Release\Step.CmsConnectGateway.csprojResolveAssemblyReference.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\obj\Release\Step.CmsConnectGateway.csproj.CoreCompileInputs.cache
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\obj\Release\Step.CmsConnectGateway.csproj.CopyComplete
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\obj\Release\Step.CmsConnectGateway.dll
C:\VisualStudio Projects\Git_Repo\CMS-Step\Step.CmsConnectGateway\obj\Release\Step.CmsConnectGateway.pdb
+5
View File
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="IPNetwork2" version="2.4.0.126" targetFramework="net461" />
<package id="SSH.NET" version="2016.1.0" targetFramework="net461" />
</packages>
@@ -0,0 +1,99 @@
using Step.CmsConnectManager.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectManager
{
public class GatewayNetworkConfigurationBuilder : IBuilder
{
private GatewayNetworkConfiguration _Config;
public GatewayNetworkConfigurationBuilder()
{
_Config = new GatewayNetworkConfiguration();
}
public GatewayNetworkConfigurationBuilder HasDhcp(bool useDhcp)
{
_Config.hasDhcp = useDhcp;
return this;
}
public GatewayNetworkConfigurationBuilder IpAddress(IPAddress ipAddress)
{
_Config.ipAddress = ipAddress;
return this;
}
public GatewayNetworkConfigurationBuilder NetMaskAddress(IPAddress netMask)
{
_Config.netMaskAddress = netMask;
return this;
}
public GatewayNetworkConfigurationBuilder DefaultGatewayAddress(IPAddress gateway)
{
_Config.defaultGatewayAddress = gateway;
return this;
}
public GatewayNetworkConfigurationBuilder DnsAddresses(IEnumerable<IPAddress> dns)
{
_Config.dnsAddresses = dns;
return this;
}
public GatewayNetworkConfigurationBuilder DnsPrefixes(IEnumerable<string> dnsPrefixes)
{
_Config.dnsPrefixes = dnsPrefixes;
return this;
}
public GatewayNetworkConfiguration GenerateConfiguration()
{
//If DHCP enabled go out
if (_Config.hasDhcp)
{
_Config.ipAddress = null;
_Config.netMaskAddress = null;
_Config.defaultGatewayAddress = null;
}
else
{
//Controls not NULL
CheckNotNull(_Config.ipAddress, "IpAddress");
CheckNotNull(_Config.netMaskAddress, "NetMaskAddress");
CheckNotNull(_Config.defaultGatewayAddress, "DefaultGatewayAddress");
//Controls address
CheckIpAddress(_Config.ipAddress);
CheckNetmaskAddress(_Config.netMaskAddress);
CheckIpAddress(_Config.defaultGatewayAddress);
}
//Controls DNS Address
if (_Config.dnsAddresses != null)
{
foreach (IPAddress addr in _Config.dnsAddresses)
CheckIpAddress(addr);
}
//Controls empty spaces
if (_Config.dnsPrefixes != null)
{
foreach (string str in _Config.dnsPrefixes)
CheckNoEmptySpaces(str, "DnsPrefixes");
}
return _Config;
}
}
}
@@ -0,0 +1,93 @@
using Step.CmsConnectManager.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectManager
{
public class GatewayProxyConfigurationBuilder : IBuilder
{
private GatewayProxyConfiguration config;
public GatewayProxyConfigurationBuilder()
{
config = new GatewayProxyConfiguration();
}
public GatewayProxyConfigurationBuilder HasProxy(bool useProxy)
{
config.hasProxy = useProxy;
return this;
}
public GatewayProxyConfigurationBuilder Address(string address)
{
config.address = address;
return this;
}
public GatewayProxyConfigurationBuilder Address(IPAddress address)
{
CheckIpAddress(address);
config.address = address.ToString();
return this;
}
public GatewayProxyConfigurationBuilder Port(uint port)
{
config.port = port;
return this;
}
public GatewayProxyConfigurationBuilder Username(string username)
{
config.username = username;
return this;
}
public GatewayProxyConfigurationBuilder Password(string password)
{
config.password = password;
return this;
}
public GatewayProxyConfigurationBuilder NoproxyAddresses(IEnumerable<string> addresses)
{
config.noproxyAddresses = addresses;
return this;
}
public GatewayProxyConfiguration GenerateConfiguration()
{
//If DHCP enabled go out
if (!config.hasProxy)
{
config.address = null;
config.port = 0;
config.username = null;
config.password = null;
config.noproxyAddresses = null;
return config;
}
//Controls not NULL
CheckNotNull(config.address, "Address");
//Controls empty spaces
CheckNoEmptySpaces(config.address, "Address");
if(config.username != null)
CheckNoEmptySpaces(config.username, "Username");
if (config.password != null)
CheckNoEmptySpaces(config.password, "Password");
foreach (string str in config.noproxyAddresses)
CheckNoEmptySpaces(str, "NoproxyAddresses");
return config;
}
}
}
@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Step.CmsConnectManager.Builders
{
public abstract class IBuilder
{
//------------------------------------ To Implement ------------------------------------
#region ToImplement_Functions
#endregion
//------------------------------------ Controls ------------------------------------
#region Control_Functions
internal void CheckIpAddress(IPAddress ipAddress)
{
byte[] byteIP = ipAddress.GetAddressBytes();
//IP must be NE 0.0.0.0
if (byteIP[0] == 0 && byteIP[1] == 0 && byteIP[2] == 0 && byteIP[3] == 0)
throw new ArgumentException("IP must be different from 0.0.0.0");
}
internal void CheckNetmaskAddress(IPAddress netmaskAddress)
{
byte[] byteIP = netmaskAddress.GetAddressBytes();
//NETMASK must be NE 0.0.0.0
if (byteIP[0] == 0 && byteIP[1] == 0 && byteIP[2] == 0 && byteIP[3] == 0)
throw new ArgumentException("NETMASK must be different from 0.0.0.0");
//NETMASK first number must be NE 0
if (byteIP[0] == 0)
throw new ArgumentException("NETMASK starting address must be different from 0. Eg: xx.0.0.0 ");
}
internal void CheckNotNull(object objToCheck, string paramName)
{
if (objToCheck == null)
throw new FormatException("BAD FORMAT - param \"" + paramName + "\" is mandatory");
}
internal void CheckNoEmptySpaces(string strToCheck,string paramName)
{
if (strToCheck.Contains(" "))
throw new FormatException("BAD FORMAT - param \"" + paramName + "\" must be without empty spaces");
}
private bool EvaluateIPV4(string stringValue, out IPAddress address)
{
Regex rgx = new Regex(@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
if (rgx.IsMatch(stringValue))
{
IPAddress.TryParse(stringValue, out address);
return true;
}
address = new IPAddress(0);
return false;
}
#endregion
}
}
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectManager
{
public static class CMSConnectConstants
{
public const string IP_ADDR_LABEL = "IP_ADDRESS=";
public const string GATEWAY_LABEL = "DEFAULT_GATEWAY=";
public const string DNSIP_LABEL = "DNS_IP=";
public const string DNSPREFIX_LABEL = "DNS_SUFFIX=";
public const string PROXY_ADDR_LABEL = "PROXY=";
public const string NO_PROXY_LABEL = "NO_PROXY=";
public const string UNDEF_VALUE = "none";
public const string CONNECTION_OK_VALUE = "OK";
public const string CONNECTION_NOWEB_VALUE = "NO_WEB";
public const string CONNECTION_NOPORT_VALUE = "NO_PORTS";
public const int REBOOT_MINUTES_MAX = 2;
public const int REBOOT_MSWAIT_BETWEEN_OP = 500;
public const string ADMIN_COMMAND = "sudo ";
public const string SSH_SET_PROXY_COMMAND = ADMIN_COMMAND + "./setProxy.sh ";
public const string SSH_SET_DNSIP_COMMAND = ADMIN_COMMAND + "./setDnsIp.sh ";
public const string SSH_SET_DNSSUFFIX_COMMAND = ADMIN_COMMAND + "./setDnsSuffix.sh ";
public const string SSH_SET_NETWORK_COMMAND = ADMIN_COMMAND + "./setNetwork.sh ";
public const string SSH_GET_NETWORK_COMMAND = ADMIN_COMMAND + "./getNetworkConfiguration.sh ";
public const string SSH_GET_PROXY_COMMAND = ADMIN_COMMAND + "./getProxyConfiguration.sh ";
public const string SSH_TEST_CONNECTION_COMMAND = ADMIN_COMMAND + "./testConnection.sh ";
public const string SSH_GW_REBOOT_COMMAND = ADMIN_COMMAND + "./gatewayReboot.sh ";
public const string YAML_CONFIG_FILE = "./example-mconnect.conf.yaml";
}
}
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectManager.Events
{
public class GatewayRebootEventHandlerArgs : EventArgs
{
public bool ErrorStatus { get; internal set; }
public string ErrorMessage { get; internal set; }
public GatewayRebootEventHandlerArgs()
{
ErrorStatus = false;
ErrorMessage = "";
}
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step.CmsConnectManager.Exceptions
{
public class GatewayException: Exception
{
public GatewayException(string message) : base(message)
{
}
}
}
+440
View File
@@ -0,0 +1,440 @@
using Step.CmsConnectManager.Events;
using Step.CmsConnectManager.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using static Step.CmsConnectManager.CMSConnectConstants;
namespace Step.CmsConnectManager
{
public class GatewayController
{
private SSHAdapter SSHAdapter;
//---------------------------------------------------------------------------------------------------
#region Public_methods
/// <summary>
/// Simple constructor.
/// Create an instance with this configuration: hostname: localhost, username: root, password: root.
/// </summary>
public GatewayController()
{
SSHAdapter = new SSHAdapter("localhost", "root", "root");
}
/// <summary>
/// Advanced constructor.
/// Create an instance with the configuration passed by arguments
/// </summary>
/// <param name="hostname">Name (or IP-Address) of the gateway</param>
/// <param name="username">Username for Gateway Login</param>
/// <param name="password">Password for Gateway Login</param>
/// <exception cref="System.NullReferenceException">Thrown when one parameter is null</exception>
public GatewayController(string hostname, string username, string password)
{
SSHAdapter = new SSHAdapter(hostname, username, password);
}
/// <summary>
/// Write Proxy-Configuration on Gateway.
/// <para />See <see cref="GatewayProxyConfigurationBuilder"/> for generate the configuration.
/// </summary>
/// <param name="proxyConfiguration">Configuration of the proxy.</param>
/// <exception cref="GatewayException"></exception>
public void WriteGatewayProxyConfiguration(GatewayProxyConfiguration proxyConfiguration)
{
string Command = SSHAdapter.GenerateSshProxyCommand(proxyConfiguration);
SSHAdapter.SendSSHCommand(Command);
}
/// <summary>
/// Write Newtork-Configuration on Gateway.
/// <para />See <see cref="GatewayNetworkConfigurationBuilder"/> for generate the configuration.
/// </summary>
/// <param name="networkConfiguration">Configuration of the network.</param>
/// <exception cref="GatewayException"></exception>
public void WriteGatewayNetworkConfiguration(GatewayNetworkConfiguration networkConfiguration)
{
string NetworkCommand = SSHAdapter.GenerateSshNetworkCommand(networkConfiguration);
string DnsIpCommand = SSHAdapter.GenerateSshDnsCommand(networkConfiguration);
string DnsSuffixCommand = SSHAdapter.GenerateSshDnsSuffxCommand(networkConfiguration);
SSHAdapter.SendSSHCommand(new List<string>() { NetworkCommand, DnsIpCommand, DnsSuffixCommand });
}
/// <summary>
/// Read Newtork-Configuration saved on Gateway.
/// </summary>
/// <returns>See <see cref="GatewayNetworkConfiguration"/>
/// </returns>
/// <exception cref="GatewayException"></exception>
public GatewayNetworkConfiguration ReadGatewayNetworkConfiguration()
{
return ElaborateConfigFromSshNetworkCommand( SSHAdapter.SendSSHCommand(SSH_GET_NETWORK_COMMAND) );
}
/// <summary>
/// Read Proxy-Configuration saved on Gateway.
/// </summary>
/// <returns>See <see cref="GatewayProxyConfiguration"/>
/// </returns>
/// <exception cref="GatewayException"></exception>
public GatewayProxyConfiguration ReadGatewayProxyConfiguration()
{
return ElaborateConfigFromSshProxyCommand( SSHAdapter.SendSSHCommand(SSH_GET_PROXY_COMMAND));
}
/// <summary>
/// Test connection to SCM/CMS Server, on Gateway.
/// </summary>
/// <param name="timeout">Seconds timeout for the request</param>
/// <exception cref="GatewayException"></exception>
public GatewayConnectionStatus TestGatewayConnection(int timeout)
{
if (timeout < 0)
throw new ArgumentOutOfRangeException("Timeout must be > 0");
return ElaborateTestConnectionCommand(SSHAdapter.SendSSHCommand(SSH_TEST_CONNECTION_COMMAND + timeout));
}
/// <summary>
/// Reboot asynchronously the Gateway.
/// </summary>
/// <param name="delay">Serconds to delay before reboot</param>
/// <param name="handler">Handler Callback when the operation is finished or an error occours.
/// See <see cref="GatewayRebootEventHandlerArgs"/>
/// </param>
public void RebootGatewayAsync(int delay, EventHandler<GatewayRebootEventHandlerArgs> handler)
{
if (delay < 0)
throw new ArgumentOutOfRangeException("Delay must be > 0");
//Create the Action
Action<int, EventHandler<GatewayRebootEventHandlerArgs>> action = (int del, EventHandler<GatewayRebootEventHandlerArgs> hand) =>
{
GatewayRebootEventHandlerArgs ev = new GatewayRebootEventHandlerArgs();
try
{
SSHAdapter.SendSSHReboot(del);
}
catch (Exception e)
{
ev.ErrorStatus = true;
ev.ErrorMessage = e.Message;
}
hand(this, ev);
};
// Create a task and not start it.
Task t = new Task (() => action(delay, handler));
t.Start();
}
/// <summary>
/// Reboot and wait a new session of the Gateway.
/// </summary>
/// <param name="delay">Seconds to delay before reboot</param>
/// <exception cref="GatewayException"></exception>
public void RebootGateway(int delay)
{
if (delay < 0)
throw new ArgumentOutOfRangeException("Delay must be > 0");
// Send Command
SSHAdapter.SendSSHReboot(delay);
}
#endregion
//---------------------------------------------------------------------------------------------------
#region SSH_commands_preparations_sub_methods
#endregion
//---------------------------------------------------------------------------------------------------
#region elaborate_SSH_values_sub_methods
private GatewayNetworkConfiguration ElaborateConfigFromSshNetworkCommand(List<string> lines)
{
GatewayNetworkConfiguration configuration = new GatewayNetworkConfiguration();
foreach (string line in lines)
{
if (line.StartsWith(IP_ADDR_LABEL))
DecodeNetworkIPAddress(line.Remove(0, IP_ADDR_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(GATEWAY_LABEL))
DecodeNetworkDefGateway(line.Remove(0, GATEWAY_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(DNSIP_LABEL))
DecodeNetworkDnsIp(line.Remove(0, DNSIP_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(DNSPREFIX_LABEL))
DecodeNetworkDnsPrefix(line.Remove(0, DNSPREFIX_LABEL.Length).Trim(), ref configuration);
}
return configuration;
}
private GatewayProxyConfiguration ElaborateConfigFromSshProxyCommand(List<string> lines)
{
GatewayProxyConfiguration configuration = new GatewayProxyConfiguration();
foreach (string line in lines)
{
if (line.StartsWith(PROXY_ADDR_LABEL))
DecodeProxyAddress(line.Remove(0, PROXY_ADDR_LABEL.Length).Trim(), ref configuration);
else if (line.StartsWith(NO_PROXY_LABEL))
DecodeNoProxyUrls(line.Remove(0, NO_PROXY_LABEL.Length).Trim(), ref configuration);
}
return configuration;
}
private GatewayConnectionStatus ElaborateTestConnectionCommand(List<string> lines)
{
GatewayConnectionStatus status = new GatewayConnectionStatus();
foreach (string line in lines)
{
if (!string.IsNullOrWhiteSpace(line))
DecodeConnectionStatus(line.Trim(), ref status);
}
return status;
}
#endregion
//---------------------------------------------------------------------------------------------------
#region decode_SSH_values_sub_methods
private void DecodeNetworkIPAddress(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//Check if has DHCP
if (stringValue == "DHCP")
configuration.hasDhcp = true;
else
{
configuration.hasDhcp = false;
//Check if has / for netmask
if (!stringValue.Contains('/'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
string [] tempAddr = stringValue.Split('/');
//Check if has lenght == 2
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
//Set the IPAddress / Netmask
IPAddress tempIp;
if (!EvaluateIPV4(tempAddr[0], out tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
IPNetwork tempIpNetw;
if (!IPNetwork.TryParse(stringValue, out tempIpNetw))
throw new GatewayException("Internal Gateway Error during read (bad format): " + IP_ADDR_LABEL + stringValue);
configuration.ipAddress = tempIp;
configuration.netMaskAddress = tempIpNetw.Netmask;
}
}
private void DecodeNetworkDefGateway(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.defaultGatewayAddress = null;
else
{
if (!EvaluateIPV4(stringValue, out IPAddress tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + GATEWAY_LABEL + stringValue);
configuration.defaultGatewayAddress = tempIp;
}
}
private void DecodeNetworkDnsIp(string stringValue, ref GatewayNetworkConfiguration configuration)
{
//check if is defined
if (stringValue == UNDEF_VALUE)
configuration.dnsAddresses = null;
else
{
string[] tempStr = stringValue.Split(' ');
if (tempStr.Length == 0)
configuration.dnsAddresses = null;
else
{
IPAddress tempIp;
List<IPAddress> tempDns = new List<IPAddress>();
foreach (string str in tempStr)
{
if (string.IsNullOrEmpty(str))
continue;
if (!EvaluateIPV4(str, out tempIp))
throw new GatewayException("Internal Gateway Error during read (bad format): " + DNSIP_LABEL + stringValue);
tempDns.Add(tempIp);
}
configuration.dnsAddresses = tempDns;
}
}
}
private void DecodeNetworkDnsPrefix(string stringValue, ref GatewayNetworkConfiguration configuration)
{
// Check if is defined
if (stringValue == UNDEF_VALUE)
configuration.dnsPrefixes = null;
else
{
string[] tempStr = stringValue.Split(' ');
if (tempStr.Length == 0)
configuration.dnsPrefixes = null;
else
configuration.dnsPrefixes = tempStr.Where(X=> !string.IsNullOrEmpty(X)).ToList();
}
}
private void DecodeProxyAddress(string stringValue, ref GatewayProxyConfiguration configuration)
{
// Check if is defined
if (stringValue == UNDEF_VALUE)
configuration.hasProxy = false;
else
{
configuration.hasProxy = true;
/* Must be one of these:
* - Address:Port
* - User:Password@Address:Port
*/
if (!stringValue.Contains("@"))
{
// Set username & password
configuration.username = null;
configuration.password = null;
// Check if has :
if (!stringValue.Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
string[] tempAddr = stringValue.Split(':');
// Check if has lenght == 2
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
// Set the address
configuration.address = tempAddr[0];
// Set the port
if (!uint.TryParse(tempAddr[1], out uint tempPort))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
configuration.port = tempPort;
}
else
{
string[] splitted = stringValue.Split('@');
//Check if has lenght == 2
if (splitted.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
//Check if has :
if (!splitted[0].Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
if (!splitted[1].Contains(':'))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
string[] tempLogin = splitted[0].Split(':');
string[] tempAddr = splitted[1].Split(':');
//Check if has lenght == 2
if (tempLogin.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
if (tempAddr.Length != 2)
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
// Set the username
configuration.username = tempLogin[0];
// Set the password
configuration.password = tempLogin[1];
// Set the address
configuration.address = tempAddr[0];
// Set the port
if (!uint.TryParse(tempAddr[1], out uint tempPort))
throw new GatewayException("Internal Gateway Error during read (bad format): " + PROXY_ADDR_LABEL + stringValue);
configuration.port = tempPort;
}
}
}
private void DecodeNoProxyUrls(string stringValue, ref GatewayProxyConfiguration configuration)
{
// Check if is defined
if (stringValue == UNDEF_VALUE)
configuration.noproxyAddresses = null;
else
{
string[] tempStr = stringValue.Trim('"').Split(',');
for (int i=0;i<tempStr.Length;i++)
tempStr[i] = tempStr[i].Trim();
if (tempStr.Length == 0)
configuration.noproxyAddresses = null;
else
configuration.noproxyAddresses = tempStr.ToList();
}
}
private void DecodeConnectionStatus(string stringValue, ref GatewayConnectionStatus status)
{
if (stringValue == CONNECTION_OK_VALUE)
status = GatewayConnectionStatus.OK;
else if (stringValue == CONNECTION_NOWEB_VALUE)
status = GatewayConnectionStatus.WEB_ERROR;
else if (stringValue == CONNECTION_NOPORT_VALUE)
status = GatewayConnectionStatus.PORT_ERROR;
else
throw new GatewayException("Internal Gateway Error during Connection-Test (bad format): " + stringValue);
}
private bool EvaluateIPV4(string stringValue,out IPAddress address)
{
Regex rgx = new Regex(@"^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
if (rgx.IsMatch(stringValue))
{
IPAddress.TryParse(stringValue, out address);
return true;
}
address = new IPAddress(0);
return false;
}
#endregion
}
}
@@ -0,0 +1,241 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MConnectSDK;
using Step.Database.Controllers;
using TeamDev.SDK.MVVM;
using static Step.CmsConnectManager.CMSConnectConstants;
using static Step.Model.Constants;
using static Step.Config.ServerConfig;
using Step.Model.DTOModels;
namespace Step.CmsConnectManager
{
public class MConnectSDKWrapper : IDisposable
{
private static MConnectClient _client { get; set; }
private static CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
private static LicenseData License = new LicenseData();
private CancellationToken _cancellationToken = _cancellationTokenSource.Token;
public MConnectSDKWrapper()
{
if(_client == null)
_client = new MConnectClient();
}
public async Task<bool> InitSDK()
{
// Call SDK Function
var res = await _client.InitSDKAsync(YAML_CONFIG_FILE, _cancellationToken);
return ConnectionIsOk(res);
}
public async Task<bool> CheckActivationData()
{
// Call SDK Function
var res = await _client.GetClientStatusAsync();
if (!ConnectionIsOk(res))
return false;
if (!res.IsHmiEnrolled)
return false;
// Check if connection is ok and if token is needed
return await GetLicence();
}
public async Task<bool> TryActivation()
{
// Setup callback
Progress<Result> progress = new Progress<Result>();
progress.ProgressChanged += TryActivation_ProgressChanged;
// Start SDK progress
var res = await _client.TryActivationAsync(_cancellationToken, progress);
if (!ConnectionIsOk(res))
return false;
// If machine is already authenticated & enrolled return ok
if (res.IsAuth && res.IsHmiEnrolled)
{
UpdateClients(res);
return true;
}
// If not enrolled
if (res.IsAuth && !res.IsHmiEnrolled)
{
res = await Enroll();
UpdateClients(res);
return ConnectionIsOk(res) && res.IsHmiEnrolled;
}
if (res.IsHmiEnrolled && !res.IsAuth)
return await GetLicence();
return true;
}
public async Task<Result> Enroll()
{
// Useless progress parameter
Progress<Result> progress = new Progress<Result>();
var res = await _client.EnrollMachineAsync(_cancellationToken, progress);
return res;
}
public async Task<bool> GetLicence()
{
// Call SDK Function
var res = await _client.GetLicenseAsync();
// If the API is successful set license data
if(res.CallResultOk && res.Payload is LicensePayload)
{
var lic = await _client.GetLicenseAsync();
License = (lic.Payload as LicensePayload).Data;
}
return ConnectionIsOk(res);
}
public async Task<List<UserData>> GetUserOrganizzationList(bool getImage = false)
{
// TODO: REMOVE
var connectionStatus = await CheckActivationData();
if (!connectionStatus)
return null;
// Call SDK function
var res = await _client.getUserListAsync(getImage);
if (!ConnectionIsOk(res))
return null;
if(res.Payload is UserPayload payload)
return payload.UserList;
return null;
}
public async Task<List<UserData>> GetUserNotImported()
{
var res = await GetUserOrganizzationList(true);
if (res == null)
return null;
return res
.Where(x => x.LoginStatus != UserStatus.IMPORTED)
.ToList();
}
public async Task<UserData> TryUserLogin(string username, string password)
{
// Call SDK function
var res = await _client.TryUserLogin(username, password);
if (!ConnectionIsOk(res))
return null;
// Check if SDK return user data
if (res.Payload is UserPayload payload && payload.UserList.Count() > 0)
return payload.UserList.First();
return null;
}
// Callback
private void TryActivation_ProgressChanged(object sender, Result res)
{
// Check if data are ok
if (ConnectionIsOk(res) && res.Payload is ActivationPayload activation)
{
// Send data to connected client
MessageServices.Current.Publish(CONNECT_ACTIVATION_NOTIFICATIONS, null, activation);
}
}
private void UpdateClients(object res)
{
MessageServices.Current.Publish(CONNECT_GENERAL_DATA, null, res);
}
public void Dispose()
{
_cancellationTokenSource.Cancel();
}
private bool ConnectionIsOk(Result res)
{
return res.CallResultOk && res.CloudStatusOk;
}
public async Task<bool> ImportConnectUsers(List<UserData> connectUserList)
{
UsersController userController = new UsersController();
//var userList = userController.GetCMSConnectUserList();
//var deletedUsers = userList.Where(x => !connectUserList.Any(y => x.CmsConnectUserId == y.UserId)).ToList();
//var newUser = connectUserList.Where(x => !userList.Any(y => x.UserId == y.CmsConnectUserId)).ToList();
foreach (var user in connectUserList)
{
userController.CreateCMSConnectUser(user.Username, "", user.Nome, user.Cognome, Config.ServerConfig.ServerStartupConfig.Language, user.Email, user.UserId, user.IsAdmin);
var res = await _client.setUserImported(SourceType.LOCAL, user.Username, true);
if (!ConnectionIsOk(res))
return false;
}
return true;
}
public async Task<bool> RemoveUserFromImported(string username)
{
var res = await _client.setUserImported(SourceType.LOCAL, username, false);
return ConnectionIsOk(res);
}
public bool SendMessage(DTOMessageModel message)
{
RedisController.SendMessage(message);
return true;
}
//private async void UpdateCmsConnectUsers()
//{
// MConnectSDKWrapper _sdk = new MConnectSDKWrapper();
// var connectUserList = await _sdk.GetUserList();
// UsersController userController = new UsersController();
// var userList = userController.GetCMSConnectUserList();
// var deletedUsers = userList.Where(x => !connectUserList.Any(y => x.CmsConnectUserId == y.UserId)).ToList();
// var newUser = connectUserList.Where(x => !userList.Any(y => x.UserId == y.CmsConnectUserId)).ToList();
// foreach (var user in newUser)
// {
// userController.CreateCMSConnectUser(user.Username, "", user.Nome, user.Cognome, Config.ServerConfig.ServerStartupConfig.Language, user.Email, user.UserId, user.IsAdmin);
// }
// foreach (var deletetUser in deletedUsers)
// {
// userController.DeleteUser(deletetUser);
// }
//}
}
}
@@ -0,0 +1,54 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
namespace Step.CmsConnectManager
{
public enum GatewayConnectionStatus { OK = 0, WEB_ERROR = 1, PORT_ERROR = 2 };
public class GatewayNetworkConfiguration
{
internal GatewayNetworkConfiguration() {}
public bool hasDhcp { get; internal set;}
public IPAddress ipAddress { get; internal set; }
public IPAddress netMaskAddress { get; internal set; }
public IPAddress defaultGatewayAddress { get; internal set; }
public IEnumerable<IPAddress> dnsAddresses { get; internal set; }
public IEnumerable<string> dnsPrefixes { get; internal set; }
public override string ToString()
{
return "hasDhcp: " + hasDhcp + Environment.NewLine +
"ipAddress: " + (ipAddress != null ? ipAddress.ToString() : "null") + Environment.NewLine +
"netMaskAddress: " + (netMaskAddress != null ? netMaskAddress.ToString() : "null") + Environment.NewLine +
"defaultGatewayAddress: " + (defaultGatewayAddress != null ? defaultGatewayAddress.ToString() : "null") + Environment.NewLine +
"dnsAddresses: " + (dnsAddresses != null ? string.Join(",", dnsAddresses) : "null") + Environment.NewLine +
"dnsPrefixes: " + (dnsPrefixes != null ? string.Join(",", dnsPrefixes) : "null");
}
}
public class GatewayProxyConfiguration
{
internal GatewayProxyConfiguration(){}
public bool hasProxy { get; internal set; }
public string address { get; internal set; }
public uint port { get; internal set; }
public string username { get; internal set; }
public string password { get; internal set; }
public IEnumerable<string> noproxyAddresses { get; internal set; }
public override string ToString()
{
return "hasProxy: " + hasProxy + Environment.NewLine +
"address: " + (address != null ? address.ToString() : "null") + Environment.NewLine +
"port: " + (port != 0 ? port.ToString() : "null") + Environment.NewLine +
"username: " + (username != null ? username : "null") + Environment.NewLine +
"password: " + (password != null ? password : "null") + Environment.NewLine +
"noproxyAddresses: " + (noproxyAddresses != null ? string.Join(",", noproxyAddresses) : "null");
}
}
}
@@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Le informazioni generali relative a un assembly sono controllate dal seguente
// set di attributi. Modificare i valori di questi attributi per modificare le informazioni
// associate a un assembly.
[assembly: AssemblyTitle("Step.CmsConnect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Step.CmsConnect")]
[assembly: AssemblyCopyright("Copyright © 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Se si imposta ComVisible su false, i tipi in questo assembly non saranno visibili
// ai componenti COM. Se è necessario accedere a un tipo in questo assembly da
// COM, impostare su true l'attributo ComVisible per tale tipo.
[assembly: ComVisible(false)]
// Se il progetto viene esposto a COM, il GUID seguente verrà utilizzato come ID della libreria dei tipi
[assembly: Guid("49b04d99-0ecd-4900-86d3-7098d61314d7")]
// Le informazioni sulla versione di un assembly sono costituite dai seguenti quattro valori:
//
// Versione principale
// Versione secondaria
// Numero di build
// Revisione
//
// È possibile specificare tutti i valori oppure impostare valori predefiniti per i numeri relativi alla revisione e alla build
// usando l'asterisco '*' come illustrato di seguito:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
+13
View File
@@ -0,0 +1,13 @@
---------------------------------------------------------------
------- MConnect Client SDK -------
---------------------------------------------------------------
Libreria di utility per connessione con il cloud di Maestro Connect.
Le dipendenze inserite sono necessarie al funzionamento dell'SDK.
Sono inclusi a titolo di esempio due files:
* example-mconnect.conf.yaml
* example-NLog.config
Attenzione a configurare correttamente il file NLog.xml includendo il rule per la classe, vedere ad esempio il file example-NLog.config allegato.
+287
View File
@@ -0,0 +1,287 @@
using Renci.SshNet;
using Renci.SshNet.Common;
using Step.CmsConnectManager.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using static Step.CmsConnectManager.CMSConnectConstants;
namespace Step.CmsConnectManager
{
public class SSHAdapter
{
// Internal Private Variable
private string Host;
private string Username;
private string Password;
public SSHAdapter(string host, string username, string password)
{
this.Host = host;
this.Username = username;
this.Password = password;
}
// Override sendCommand for single command
public List<string> SendSSHCommand(string command)
{
return SendSSHCommand(new List<string> { command });
}
// Send multiple SSH Command
public List<string> SendSSHCommand(IEnumerable<string> command)
{
SshCommand sshCmd;
List<string> returnedValues = new List<string>();
// Create the SSH Gateway
SshClient _sshGateway = new SshClient(this.Host, this.Username, this.Password);
try
{
// Connect
_sshGateway.Connect();
foreach (string cmd in command)
{
// Run command
sshCmd = _sshGateway.RunCommand(cmd);
// Add return values if esists
returnedValues.AddRange(sshCmd.Result.Split(new[] { "\n" }, StringSplitOptions.None));
// Check for errors
if (sshCmd.ExitStatus != 0)
{
_sshGateway.Disconnect();
throw new GatewayException("Internal Gateway Error: " + sshCmd.Error);
}
}
// Disconnect
_sshGateway.Disconnect();
}
catch (SocketException e)
{
throw new GatewayException("Connection Error: - Host:" + this.Host);
}
catch (SshConnectionException e)
{
throw new GatewayException("Connection Error: - Host:" + this.Host);
}
catch (ProxyException e)
{
throw new GatewayException("Proxy Error: - Host:" + this.Host);
}
catch (SshAuthenticationException e)
{
throw new GatewayException("Authentication Error: - Host:" + this.Host);
}
catch (SshException e)
{
throw new GatewayException("Internal command Error: - Host:" + this.Host);
}
catch (GatewayException e)
{
throw new GatewayException(e.Message);
}
catch (Exception e)
{
throw new GatewayException("Unknown Error: " + e);
}
return returnedValues;
}
// Send REBOOT Command
public void SendSSHReboot(int seconds)
{
// Send SSH Command
SendSSHCommand(SSH_GW_REBOOT_COMMAND + seconds);
// Wait the time for reboot
Thread.Sleep((seconds + 5) * 1000);
// Save actual timestamp
DateTime nowAfterReboot = DateTime.Now;
//Create the Instance
SshClient _sshGateway = new SshClient(this.Host, this.Username, this.Password);
// Phase 1 Wait Disconnection Cycle
bool disconnected = false;
do
{
try
{
// If TimeSpan > TOT MIN -> Exception
if ((DateTime.Now - nowAfterReboot) > TimeSpan.FromMinutes(REBOOT_MINUTES_MAX))
throw new GatewayException("Timeout Error during reboot - Gateway has never been rebooted");
// Try Connection
_sshGateway.Connect();
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
_sshGateway.Disconnect();
}
catch (SocketException e)
{
// Not Connected
disconnected = true;
}
catch (SshConnectionException e)
{
// Not Connected
disconnected = true;
}
catch (SshException e)
{
// Not Connected
disconnected = true;
}
catch (GatewayException e)
{
// Error
throw new GatewayException(e.Message);
}
catch (Exception e)
{
// Error
throw new GatewayException("Unknown Error during reboot: " + e);
}
} while (!disconnected);
// Phase 2 Wait Re-connection Cycle
bool connected = false;
do
{
try
{
// If TimeSpan > TOT MIN -> Exception
if ((DateTime.Now - nowAfterReboot) > TimeSpan.FromMinutes(REBOOT_MINUTES_MAX))
throw new GatewayException("Timeout Error during reboot - Gateway not found during reboot");
// Try Connection
_sshGateway.Connect();
connected = true;
}
catch (SocketException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (SshConnectionException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (SshException e)
{
//Not Connected
Thread.Sleep(REBOOT_MSWAIT_BETWEEN_OP);
}
catch (GatewayException e)
{
//Error
throw new GatewayException(e.Message);
}
catch (Exception e)
{
//Error
throw new GatewayException("Unknown Error during reboot: " + e);
}
} while (!connected);
_sshGateway.Disconnect();
}
// SSH command generator for Proxy setting
public string GenerateSshProxyCommand(GatewayProxyConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_PROXY_COMMAND);
// Call the script without an argument will disable the Proxy
if (configuration.hasProxy)
{
/* 1St parameter. Must be one of these:
* - Address:Port
* - User:Password@Address:Port
*/
// Setup Username & password if needed
if (!string.IsNullOrWhiteSpace(configuration.username) && !string.IsNullOrWhiteSpace(configuration.password))
command.Append(configuration.username).Append(":").Append(configuration.password).Append("@");
// Setup Address & Port
command.Append(configuration.address).Append(":").Append(configuration.port).Append(" ");
/* 2nd parameter. Must be:
* "no_proxy1,no_proxy2,…,no_proxyN"
*/
if (configuration.noproxyAddresses != null)
{
command.Append("\"");
command.Append(string.Join(",", configuration.noproxyAddresses));
command.Append("\"");
}
}
return command.ToString();
}
// SSH command generator for Network setting
public string GenerateSshNetworkCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_NETWORK_COMMAND);
if (configuration.hasDhcp)
{
command.Append("DHCP");
}
else
{
// Set IP address / Netmask
IPNetwork tempIpNetw = IPNetwork.Parse(configuration.ipAddress, configuration.netMaskAddress);
command.Append(configuration.ipAddress).Append("/").Append(tempIpNetw.Cidr).Append(" ");
if (configuration.defaultGatewayAddress != null)
command.Append(configuration.defaultGatewayAddress);
}
return command.ToString();
}
// SSH command generator for Dns setting
public string GenerateSshDnsCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_DNSIP_COMMAND);
if (configuration.dnsAddresses != null)
command.Append(string.Join(",", configuration.dnsAddresses));
return command.ToString();
}
// SSH command generator for Dns-Suffix setting
public string GenerateSshDnsSuffxCommand(GatewayNetworkConfiguration configuration)
{
StringBuilder command = new StringBuilder(SSH_SET_DNSSUFFIX_COMMAND);
if (configuration.dnsPrefixes != null)
command.Append(string.Join(",", configuration.dnsPrefixes));
return command.ToString();
}
}
}
@@ -0,0 +1,142 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{49B04D99-0ECD-4900-86D3-7098D61314D7}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Step.CmsConnectManager</RootNamespace>
<AssemblyName>Step.CmsConnectManager</AssemblyName>
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="MConnectSDK, Version=1.2.1912.216, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MConnectSDK.1.2.1912.216\lib\net462\MConnectSDK.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.6.7\lib\net45\NLog.dll</HintPath>
</Reference>
<Reference Include="Pipelines.Sockets.Unofficial, Version=1.0.0.0, Culture=neutral, PublicKeyToken=42ea0a778e13fbe2, processorArchitecture=MSIL">
<HintPath>..\packages\Pipelines.Sockets.Unofficial.2.0.25\lib\net461\Pipelines.Sockets.Unofficial.dll</HintPath>
</Reference>
<Reference Include="Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=1cee9f8bde3db106, processorArchitecture=MSIL">
<HintPath>..\packages\SSH.NET.2016.1.0\lib\net40\Renci.SshNet.dll</HintPath>
</Reference>
<Reference Include="StackExchange.Redis, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c219ff1ca8c2ce46, processorArchitecture=MSIL">
<HintPath>..\packages\StackExchange.Redis.2.0.601\lib\net461\StackExchange.Redis.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Diagnostics.PerformanceCounter, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Diagnostics.PerformanceCounter.4.7.0\lib\net461\System.Diagnostics.PerformanceCounter.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Pipelines, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.4.6.0\lib\netstandard2.0\System.IO.Pipelines.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.IPNetwork, Version=2.4.0.126, Culture=neutral, PublicKeyToken=717343cc2c25edcf, processorArchitecture=MSIL">
<HintPath>..\packages\IPNetwork2.2.4.0.126\lib\net46\System.Net.IPNetwork.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.5.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.Threading.Channels, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Channels.4.6.0\lib\netstandard2.0\System.Threading.Channels.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.3\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Transactions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="TeamDev.SDK.WPF">
<HintPath>..\Libs\TeamDev.SDK.WPF.dll</HintPath>
</Reference>
<Reference Include="YamlDotNet, Version=8.0.0.0, Culture=neutral, PublicKeyToken=ec19458f3c15af5e, processorArchitecture=MSIL">
<HintPath>..\packages\YamlDotNet.8.1.2\lib\net45\YamlDotNet.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Builders\iBuilder.cs" />
<Compile Include="CMSConnectConstants.cs" />
<Compile Include="GatewayController.cs" />
<Compile Include="Events\GatewayRebootEventHandlerArgs.cs" />
<Compile Include="Exceptions\GatewayException.cs" />
<Compile Include="MConnectSDKWrapper.cs" />
<Compile Include="Models\GatewayConfiguration.cs" />
<Compile Include="Builders\GatewayProxyConfigurationBuilder.cs" />
<Compile Include="Builders\GatewayNewtorkConfigurationBuilder.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="SSHAdapter.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<Content Include="example-mconnect.conf.yaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="example-NLog.config" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<Folder Include="MConnectSDKWrappers\" />
</ItemGroup>
<ItemGroup>
<Content Include="README.txt" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Step.Config\Step.Config.csproj">
<Project>{3f5c2483-fc87-43ef-92a8-66ff7d0e440f}</Project>
<Name>Step.Config</Name>
</ProjectReference>
<ProjectReference Include="..\Step.Database\Step.Database.csproj">
<Project>{357D5EE1-FFC8-489B-9232-22CF474D9A6F}</Project>
<Name>Step.Database</Name>
</ProjectReference>
<ProjectReference Include="..\Step.Model\Step.Model.csproj">
<Project>{631375dd-06d3-49bb-8130-d9ddb34c429d}</Project>
<Name>Step.Model</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
+43
View File
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="YamlDotNet" publicKeyToken="ec19458f3c15af5e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.10.4.0" newVersion="6.10.4.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<areasConfig>
<production>
<enabled>true</enabled>
<allowExternalBrowser>false</allowExternalBrowser>
<ncNeeded>true</ncNeeded>
</production>
<tooling>
<enabled>true</enabled>
<allowExternalBrowser>false</allowExternalBrowser>
<ncNeeded>true</ncNeeded>
</tooling>
<report>
<enabled>false</enabled>
<allowExternalBrowser>true</allowExternalBrowser>
<ncNeeded>true</ncNeeded>
</report>
<alarms>
<enabled>true</enabled>
<allowExternalBrowser>true</allowExternalBrowser>
<ncNeeded>false</ncNeeded>
</alarms>
<maintenance>
<enabled>true</enabled>
<allowExternalBrowser>false</allowExternalBrowser>
<ncNeeded>true</ncNeeded>
</maintenance>
<utilities>
<enabled>true</enabled>
<allowExternalBrowser>false</allowExternalBrowser>
<ncNeeded>false</ncNeeded>
</utilities>
<scada>
<enabled>true</enabled>
<allowExternalBrowser>true</allowExternalBrowser>
<ncNeeded>true</ncNeeded>
</scada>
<jobeditor>
<enabled>false</enabled>
<allowExternalBrowser>true</allowExternalBrowser>
<ncNeeded>false</ncNeeded>
</jobeditor>
<users>
<enabled>true</enabled>
<allowExternalBrowser>true</allowExternalBrowser>
<ncNeeded>false</ncNeeded>
</users>
</areasConfig>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<axes>
<axis id="1" >X</axis>
<axis id="2" >Y</axis>
<axis id="3" >Z</axis>
<axis id="4" >B</axis>
<axis id="5" >C</axis>
<axis id="6" >V</axis>
<axis id="7" ></axis>
<axis id="8" ></axis>
<axis id="9" ></axis>
<axis id="10" ></axis>
<axis id="11" ></axis>
<axis id="12" ></axis>
<axis id="13" ></axis>
<axis id="14" ></axis>
<axis id="15" ></axis>
<axis id="16" ></axis>
<axis id="17" >SP</axis>
<axis id="18" ></axis>
<axis id="19" ></axis>
<axis id="20" ></axis>
<axis id="21" ></axis>
<axis id="22" ></axis>
<axis id="23" ></axis>
<axis id="24" ></axis>
</axes>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<cmsConnectConfig>
<enabled>false</enabled>
<gateway>
<address>192.168.214.200</address>
<token>gsHOP9H9aJHqgVzxruZg/T3XiZ9AfS1NdS/y/JFl05y8nCY9rmrCssxSONSyN/xkkLRvEcEYd/kf0HrluGX6MGrv8qLlCIIZXS6uKQNz7mtG4HokLFqIrHKdu3u3P6jI</token>
</gateway>
</cmsConnectConfig>
</root>
@@ -0,0 +1,4 @@
%
<ACTIVE_LOADER_{0}>
M30;
%
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8" ?>
<heads>
<head>
<localizedNames>
<lang langKey="it">Testa Spindle A</lang>
<lang langKey="en">Head Spindle A</lang>
</localizedNames>
<type>SPINDLE</type>
<fixedHead>false</fixedHead>
<warningLimit>55</warningLimit>
<alarmLimit>80</alarmLimit>
</head>
<head>
<localizedNames>
<lang langKey="it">Testa AWJ B</lang>
<lang langKey="en">Head AWJ B</lang>
</localizedNames>
<type>AWJ</type>
<fixedHead>false</fixedHead>
<warningLimit>55</warningLimit>
<alarmLimit>80</alarmLimit>
</head>
<head>
<localizedNames>
<lang langKey="it">Testa Additive C</lang>
<lang langKey="en">Head Additive C</lang>
</localizedNames>
<type>ADDITIVE</type>
<fixedHead>false</fixedHead>
<warningLimit>55</warningLimit>
<alarmLimit>80</alarmLimit>
</head>
<head>
<localizedNames>
<lang langKey="it">Testa CuttingGlass D</lang>
<lang langKey="en">Head CuttingGlass D</lang>
</localizedNames>
<type>CUTTING_GLASS</type>
<fixedHead>false</fixedHead>
<warningLimit>55</warningLimit>
<alarmLimit>80</alarmLimit>
</head>
</heads>
@@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<inputsOperator>
<buttonsListModal>
<id>1</id>
<title>
<lang langKey="it">Hai rimosso manualmente anche il pezzo lavorato ?</lang>
<lang langKey="en">Have you also manually removed the workpiece ?</lang>
</title>
<buttons>
<button>
<value>0</value>
<title>
<lang langKey="it">No</lang>
<lang langKey="en">No</lang>
</title>
</button>
<button>
<value>1</value>
<title>
<lang langKey="it">Si</lang>
<lang langKey="en">Yes</lang>
</title>
</button>
</buttons>
</buttonsListModal>
<realValueModal>
<id>10</id>
<title>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</title>
</realValueModal>
<realValueModal>
<id>11</id>
<title>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</title>
</realValueModal>
<buttonsListModal>
<id>6</id>
<title>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</title>
<buttons>
<button>
<value>3</value>
<title>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</title>
</button>
<button>
<value>4</value>
<title>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</title>
</button>
</buttons>
</buttonsListModal>
</inputsOperator>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<macros>
<macro>Macro 1</macro>
<macro>Macro 2</macro>
<macro>Macro 3</macro>
</macros>
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<maintenancesConfig>
<cmsContacts>
<MainOffice>
<company>CMS spa</company>
<email>cms.assistance@cms.it</email>
<phoneNumber>+39 0345 64 350</phoneNumber>
<moreInfoUrl>https://www.scmgroup.com/en/cms/customer-care</moreInfoUrl>
</MainOffice>
<AuxOffice1>
<visible>true</visible>
<name>SPARE PARTS</name>
<email>cms.spares@cms.it</email>
<phoneNumber>+39 0345 64 832</phoneNumber>
</AuxOffice1>
<AuxOffice2>
<visible>true</visible>
<name>Retrofit</name>
<email>cms.retrofit@cms.it</email>
<phoneNumber>+39 0345 64 350</phoneNumber>
</AuxOffice2>
</cmsContacts>
<scmContacts>
<MainOffice>
<company>CMS spa</company>
<email>cms.assistance@cms.it</email>
<phoneNumber>+39 0345 64 350</phoneNumber>
<moreInfoUrl>https://www.scmgroup.com/en/cms/customer-care</moreInfoUrl>
</MainOffice>
<AuxOffice1>
<visible>true</visible>
<name>SPARE PARTS</name>
<email>cms.spares@cms.it</email>
<phoneNumber>+39 0345 64 832</phoneNumber>
</AuxOffice1>
<AuxOffice2>
<visible>true</visible>
<name>Retrofit</name>
<email>cms.retrofit@cms.it</email>
<phoneNumber>+39 0345 64 350</phoneNumber>
</AuxOffice2>
</scmContacts>
<maintenances>
<maintenance>
<id>1</id>
<localizedName>
<lang langKey="en">5-Axis operating-unit management</lang>
<lang langKey="it">Gestione gruppo operatore 5 assi</lang>
</localizedName>
<interval>2000</interval>
<deadline>15/07/2018 13:00</deadline>
<type>MACHINE_INTERVAL</type>
<localizedDescription>
<lang langKey="en">Replace air/liquid seals of rotary axis joint</lang>
<lang langKey="it">Sostituire tenute aria/liquido giunto assi rotanti</lang>
</localizedDescription>
<unitOfMeasure>mm</unitOfMeasure>
<counterId>0</counterId>
</maintenance>
</maintenances>
</maintenancesConfig>
@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8" ?>
<ncSoftKeys>
<auto>
<enabled>true</enabled>
<visualizedName>Auto</visualizedName>
<readOnly>false</readOnly>
</auto>
<edit>
<enabled>true</enabled>
<visualizedName>Edit</visualizedName>
<readOnly>false</readOnly>
</edit>
<mdi>
<enabled>true</enabled>
<visualizedName>Mdi</visualizedName>
<readOnly>false</readOnly>
</mdi>
<dnc>
<enabled>true</enabled>
<visualizedName>Dnc</visualizedName>
<readOnly>false</readOnly>
</dnc>
<ref>
<enabled>true</enabled>
<visualizedName>Ref</visualizedName>
<readOnly>false</readOnly>
</ref>
<jog>
<enabled>true</enabled>
<visualizedName>Jog</visualizedName>
<readOnly>false</readOnly>
</jog>
<jogInc>
<enabled>true</enabled>
<visualizedName>Jog Inc</visualizedName>
<readOnly>false</readOnly>
</jogInc>
<restart>
<enabled>true</enabled>
<visualizedName>Restart</visualizedName>
<readOnly>false</readOnly>
</restart>
<teach>
<enabled>true</enabled>
<visualizedName>Teach</visualizedName>
<readOnly>false</readOnly>
</teach>
<retract>
<enabled>true</enabled>
<visualizedName>Restract</visualizedName>
<readOnly>false</readOnly>
</retract>
<wcsMcs>
<enabled>true</enabled>
<visualizedName>Wcs Mcs</visualizedName>
<readOnly>false</readOnly>
</wcsMcs>
<handle>
<enabled>true</enabled>
<visualizedName>Handle</visualizedName>
<readOnly>true</readOnly>
</handle>
<reset>
<enabled>true</enabled>
<visualizedName>Reset</visualizedName>
<readOnly>false</readOnly>
</reset>
<!-- Sub Menu -->
<blk>
<enabled>true</enabled>
<visualizedName>Blk/Blk</visualizedName>
<readOnly>false</readOnly>
</blk>
<blkDel>
<enabled>true</enabled>
<visualizedName>Blk Del</visualizedName>
<readOnly>false</readOnly>
</blkDel>
<opStop>
<enabled>true</enabled>
<visualizedName>OpStop</visualizedName>
<readOnly>false</readOnly>
</opStop>
<dryRun>
<enabled>true</enabled>
<visualizedName>DryRun</visualizedName>
<readOnly>false</readOnly>
</dryRun>
<prgTest>
<enabled>true</enabled>
<visualizedName>PrgTest</visualizedName>
<readOnly>false</readOnly>
</prgTest>
<manualHandleInterrupt>
<enabled>true</enabled>
<visualizedName>Manual Handle Interrupt</visualizedName>
<readOnly>true</readOnly>
</manualHandleInterrupt>
<teachIn>
<enabled>true</enabled>
<visualizedName>Teach In</visualizedName>
<readOnly>false</readOnly>
</teachIn>
<incPlane>
<enabled>true</enabled>
<visualizedName>Inc Plane</visualizedName><readOnly>false</readOnly>
</incPlane>
<plus>
<enabled>true</enabled>
<visualizedName>+</visualizedName>
<readOnly>false</readOnly>
</plus>
<minus>
<enabled>true</enabled>
<visualizedName>-</visualizedName>
<readOnly>false</readOnly>
</minus>
<rapid>
<enabled>true</enabled>
<visualizedName>Rapid</visualizedName>
<readOnly>false</readOnly>
</rapid>
<xOne>
<enabled>true</enabled>
<visualizedName>x1</visualizedName>
<readOnly>false</readOnly>
</xOne>
<xTen>
<enabled>true</enabled>
<visualizedName>x10</visualizedName>
<readOnly>false</readOnly>
</xTen>
<xHundred>
<enabled>true</enabled>
<visualizedName>x100</visualizedName>
<readOnly>false</readOnly>
</xHundred>
<xThousand>
<enabled>true</enabled>
<visualizedName>x1000</visualizedName>
<readOnly>false</readOnly>
</xThousand>
<overstroke>
<enabled>true</enabled>
<visualizedName>Over Stroke</visualizedName>
<readOnly>false</readOnly>
</overstroke>
<feedByPass>
<enabled>true</enabled>
<visualizedName>Feed By Pass</visualizedName>
<readOnly>false</readOnly>
</feedByPass>
</ncSoftKeys>
@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<serverConfig>
<ncConfig>
<ncVendor>OSAI</ncVendor> <!-- NO_NC/DEMO/FANUC/SIEMENS/OSAI -->
<showNcHMI>false</showNcHMI>
<ncIpAddress>192.168.157.2</ncIpAddress>
<ncPort>8080</ncPort>
<machineModel>Ares 37 OF</machineModel>
<sharedPath>C:\PartPrg\</sharedPath>
<sharedName>//PARTPRG:/</sharedName>
<installationDate>01/01/2019</installationDate>
<mgiOption>false</mgiOption>
<siemensKeyboardOption>false</siemensKeyboardOption>
<machineNumberHasLetters>true</machineNumberHasLetters>
</ncConfig>
<softwareProdConfig>
<enabled>false</enabled>
<path>C:\Program Files\Notepad++\notepad++.exe</path>
</softwareProdConfig>
<serverConfig>
<serverPort>9000</serverPort>
<serverAddress>*</serverAddress>
<language>en</language>
<enableDirectoryBrowsing>true</enableDirectoryBrowsing>
<databaseAddress>localhost</databaseAddress>
<autoOpenCmsClient>false</autoOpenCmsClient>
<textEditorPath>C:\Windows\System32\notepad.exe</textEditorPath>
<MTCFolderPath>C:\CMS\MTC\ADAPTER\</MTCFolderPath>
<MTCApplicationName>SCMA</MTCApplicationName>
<CMSConnectReady>false</CMSConnectReady>
<maxAlarmsRows>50000</maxAlarmsRows>
<alarmToDelete>5000</alarmToDelete>
</serverConfig>
<extSoftwares>
<software>
<longName>Calculator</longName>
<shortName>CAL</shortName>
<path>C:\Windows\System32\calc.exe</path>
<arguments></arguments>
<inMainMenuBar>true</inMainMenuBar>
</software>
<software>
<longName>Windows</longName>
<shortName>NP</shortName>
<path>C:\Windows</path>
<arguments></arguments>
<inMainMenuBar>true</inMainMenuBar>
</software>
<software>
<longName>MsPaint</longName>
<shortName>PA</shortName>
<path>C:\Windows\System32\mspaint.exe</path>
<arguments></arguments>
<inMainMenuBar>false</inMainMenuBar>
</software>
<software>
<longName>NotePad2</longName>
<shortName>NP2</shortName>
<path>C:\Windows\System32\notepad.exe</path>
<arguments></arguments>
<inMainMenuBar>false</inMainMenuBar>
</software>
</extSoftwares>
</serverConfig>
@@ -0,0 +1,966 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<toolManagerConfig>
<toolMetricType>DIAMETER</toolMetricType> <!-- RADIUS/DIAMETER -->
<familyOpt>true</familyOpt>
<shankOpt>false</shankOpt>
<magPositionOpt>true</magPositionOpt>
<offsetOpt>false</offsetOpt>
<reviveOpt>true</reviveOpt>
<gammaOpt>true</gammaOpt>
<lifeOpt>true</lifeOpt>
<tcpOpt>true</tcpOpt>
<coolingOpt>true</coolingOpt>
<multidimensionalShankOpt>true</multidimensionalShankOpt>
<selfAdaptivePathOpt>true</selfAdaptivePathOpt>
<dynamicCompensationOpt>true</dynamicCompensationOpt>
<ballufOpt>true</ballufOpt>
<integrityCheckOpt>true</integrityCheckOpt>
</toolManagerConfig>
<coolingLocalizedNames>
<cooling>
<lang langKey="en">Cooling</lang>
<lang langKey="it">Raffreddamento</lang>
</cooling>
<cooling1>
<lang langKey="en">Cooling 1</lang>
<lang langKey="it">Raffreddamento 1</lang>
</cooling1>
<cooling2>
<lang langKey="en">Cooling 2</lang>
<lang langKey="it">Raffreddamento 2</lang>
</cooling2>
<cooling3>
<lang langKey="en">Cooling 3</lang>
<lang langKey="it">Raffreddamento 3</lang>
</cooling3>
<cooling4>
<lang langKey="en">Cooling 4</lang>
<lang langKey="it">Raffreddamento 4</lang>
</cooling4>
<cooling5>
<lang langKey="en">Cooling 5</lang>
<lang langKey="it">Raffreddamento 5</lang>
</cooling5>
<cooling6>
<lang langKey="en">Cooling 6</lang>
<lang langKey="it">Raffreddamento 6</lang>
</cooling6>
<cooling7>
<lang langKey="en">Cooling 7</lang>
<lang langKey="it">Raffreddamento 7</lang>
</cooling7>
</coolingLocalizedNames>
<magazineNames>
<magazine>
<id>1</id>
<assistedTooling>true</assistedTooling>
<localizedNames>
<lang langKey="en">Magazine 1</lang>
<lang langKey="it">Magazzino 1</lang>
</localizedNames>
</magazine>
<magazine>
<id>2</id>
<assistedTooling>false</assistedTooling>
<localizedNames>
<lang langKey="en">Magazine 2</lang>
<lang langKey="it">Magazzino 2</lang>
</localizedNames>
</magazine>
<magazine>
<id>3</id>
<assistedTooling>false</assistedTooling>
<localizedNames>
<lang langKey="en">Magazine 3</lang>
<lang langKey="it">Magazzino 3</lang>
</localizedNames>
</magazine>
</magazineNames>
<offsetCustomFields>
<offsetCustomField>
<order>1</order>
<plcId>0</plcId>
<type>REAL</type>
<localizedNames>
<lang langKey="en">Campo1_double</lang>
<lang langKey="it">campo1_double</lang>
</localizedNames>
</offsetCustomField>
<offsetCustomField>
<order>2</order> <!-- Mi aspetto: 124 -->
<plcId>1</plcId>
<type>INT</type>
<localizedNames>
<lang langKey="en">Campo2_int</lang>
<lang langKey="it">Campo2_int</lang>
</localizedNames>
</offsetCustomField>
</offsetCustomFields>
<toolTypes>
<toolType>
<id>0</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Generic</lang>
<lang langKey="it">Generico</lang>
<lang langKey="fr">Générique</lang>
<lang langKey="de">Allgemein</lang>
<lang langKey="hr">Opće</lang>
<lang langKey="ro">Generic</lang>
<lang langKey="nl">Algemeen</lang>
<lang langKey="el">Γενικό</lang>
<lang langKey="ru">Общий</lang>
<lang langKey="pl">Ogólny</lang>
<lang langKey="sv">Generisk</lang>
<lang langKey="da">Generel</lang>
<lang langKey="pt">Genérico</lang>
<lang langKey="es">Genérico</lang>
</localizedNames>
</toolType>
<toolType>
<id>10</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Angular Transmission</lang>
<lang langKey="it">Rinvio Angolare</lang>
<lang langKey="fr">Transmission Angulaire</lang>
<lang langKey="de">Scheibe</lang>
<lang langKey="hr">Disk</lang>
<lang langKey="ro">Transmisie unghiulară</lang>
<lang langKey="nl">Hoekige transmissie</lang>
<lang langKey="el">Γωνιακή μετάδοση</lang>
<lang langKey="ru">Угловой контрпривод</lang>
<lang langKey="pl">Przekładnia kątowa</lang>
<lang langKey="sv">Vinkelöverföring</lang>
<lang langKey="da">Vinkel mellemarm</lang>
<lang langKey="pt">Transmissão Angular</lang>
<lang langKey="es">Reenvío Angular</lang>
</localizedNames>
</toolType>
<toolType>
<id>70</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 15%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 15%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 15%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 15%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 15%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 15%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 15%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 15%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 15%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 15%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 15%%</lang>
<lang langKey="da">Ultralydsskive amplitude 15%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 15%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 15%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>71</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 20%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 20%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 20%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 20%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 20%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 20%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 20%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 20%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 20%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 20%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 20%%</lang>
<lang langKey="da">Ultralydsskive amplitude 20%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 20%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 20%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>72</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 30%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 30%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 30%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 30%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 30%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 30%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 30%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 30%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 30%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 30%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 30%%</lang>
<lang langKey="da">Ultralydsskive amplitude 30%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 30%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 30%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>73</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 40%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 40%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 40%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 40%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 40%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 40%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 40%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 40%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 40%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 40%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 40%%</lang>
<lang langKey="da">Ultralydsskive amplitude 40%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 40%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 40%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>74</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 50%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 50%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 50%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 50%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 50%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 50%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 50%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 50%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 50%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 50%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 50%%</lang>
<lang langKey="da">Ultralydsskive amplitude 50%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 50%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 50%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>75</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 60%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 60%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 60%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 60%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 60%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 60%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 60%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 60%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 60%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 60%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 60%%</lang>
<lang langKey="da">Ultralydsskive amplitude 60%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 60%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 60%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>76</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 70%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 70%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 70%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 70%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 70%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 70%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 70%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 70%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 70%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 70%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 70%%</lang>
<lang langKey="da">Ultralydsskive amplitude 70%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 70%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 70%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>77</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 80%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 80%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 80%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 80%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 80%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 80%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 80%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 80%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 80%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 80%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 80%%</lang>
<lang langKey="da">Ultralydsskive amplitude 80%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 80%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 80%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>78</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 90%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 90%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 90%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 90%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 90%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 90%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 90%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 90%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 90%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 90%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 90%%</lang>
<lang langKey="da">Ultralydsskive amplitude 90%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 90%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 90%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>79</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound disk amplitude 100%%</lang>
<lang langKey="it">Disco ultrasuoni amplitude 100%%</lang>
<lang langKey="fr">Disque à ultrasons, amplitude 100%%</lang>
<lang langKey="de">Ultraschallscheibenamplitude 100%%</lang>
<lang langKey="hr">Amplituda ultrazvučnog diska 100%%</lang>
<lang langKey="ro">Disc de ultrasunete, amplitudine 100%%</lang>
<lang langKey="nl">Ultrasoon schijf amplitude 100%%</lang>
<lang langKey="el">Δίσκος υπερήχων πλάτους 100%%</lang>
<lang langKey="ru">Ультразвуковой диск амплитуда 100%%</lang>
<lang langKey="pl">Tarcza ultradźwiękowa amplituda 100%%</lang>
<lang langKey="sv">Amplitud ultraljudsskiva 100%%</lang>
<lang langKey="da">Ultralydsskive amplitude 100%%</lang>
<lang langKey="pt">Disco ultrassom amplitude 100%%</lang>
<lang langKey="es">Disco ultrasonidos amplitud 100%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>80</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 10%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 10%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 10%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 10%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 10%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 10%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 10%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 10%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 10%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 10%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 10%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 10%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 10%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 10%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>81</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 20%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 20%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 20%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 20%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 20%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 20%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 20%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 20%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 20%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 20%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 20%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 20%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 20%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 20%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>82</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 30%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 30%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 30%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 30%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 30%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 30%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 30%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 30%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 30%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 30%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 30%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 30%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 30%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 30%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>83</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 40%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 40%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 40%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 40%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 40%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 40%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 40%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 40%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 40%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 40%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 40%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 40%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 40%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 40%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>84</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 50%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 50%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 50%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 50%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 50%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 50%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 50%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 50%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 50%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 50%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 50%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 50%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 50%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 50%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>85</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 60%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 60%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 60%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 60%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 60%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 60%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 60%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 60%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 60%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 60%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 60%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 60%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 60%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 60%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>86</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 70%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 70%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 70%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 70%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 70%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 70%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 70%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 70%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 70%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 70%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 70%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 70%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 70%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 70%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>87</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 80%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 80%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 80%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 80%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 80%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 80%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 80%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 80%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 80%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 80%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 80%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 80%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 80%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 80%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>88</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 90%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 90%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 90%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 90%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 90%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 90%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 90%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 90%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 90%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 90%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 90%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 90%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 90%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 90%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>89</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Ultrasound blade amplitude 100%%</lang>
<lang langKey="it">Lama ultrasuoni amplitude 100%%</lang>
<lang langKey="fr">Lame à ultrasons, amplitude 100%%</lang>
<lang langKey="de">Ultraschallklingenamplitude 100%%</lang>
<lang langKey="hr">Amplituda ultrazvučne oštrice 100%%</lang>
<lang langKey="ro">Lama cu ultrasunete, amplitudine 100%%</lang>
<lang langKey="nl">Ultrasoon mes amplitude 100%%</lang>
<lang langKey="el">Λεπίδα υπερήχων πλάτους 100%%</lang>
<lang langKey="ru">Ультразвуковой резец амплитуда 100%%</lang>
<lang langKey="pl">Ostrze ultradźwiękowe amplituda 100%%</lang>
<lang langKey="sv">Amplitud ultraljudsblad 100%%</lang>
<lang langKey="da">Ultralydsklinge amplitude 100%%</lang>
<lang langKey="pt">Lâmina ultrassom amplitude 100%%</lang>
<lang langKey="es">Cuchilla ultrasonidos amplitud 100%%</lang>
</localizedNames>
</toolType>
<toolType>
<id>90</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 1</lang>
<lang langKey="it">Lama 1</lang>
<lang langKey="fr">Lame 1</lang>
<lang langKey="de">Klinge 1</lang>
<lang langKey="hr">List pile 1</lang>
<lang langKey="ro">Lama 1</lang>
<lang langKey="nl">Mes 1</lang>
<lang langKey="el">Λάμα 1</lang>
<lang langKey="ru">Резец 1</lang>
<lang langKey="pl">Ostrze 1</lang>
<lang langKey="sv">Blad 1</lang>
<lang langKey="da">Klinge 1</lang>
<lang langKey="pt">Lâmina 1</lang>
<lang langKey="es">Cuchilla 1</lang>
</localizedNames>
</toolType>
<toolType>
<id>91</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 2</lang>
<lang langKey="it">Lama 2</lang>
<lang langKey="fr">Lame 2</lang>
<lang langKey="de">Klinge 2</lang>
<lang langKey="hr">List pile 2</lang>
<lang langKey="ro">Lama 2</lang>
<lang langKey="nl">Mes 2</lang>
<lang langKey="el">Λάμα 2</lang>
<lang langKey="ru">Резец 2</lang>
<lang langKey="pl">Ostrze 2</lang>
<lang langKey="sv">Blad 2</lang>
<lang langKey="da">Klinge 2</lang>
<lang langKey="pt">Lâmina 2</lang>
<lang langKey="es">Cuchilla 2</lang>
</localizedNames>
</toolType>
<toolType>
<id>92</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 3</lang>
<lang langKey="it">Lama 3</lang>
<lang langKey="fr">Lame 3</lang>
<lang langKey="de">Klinge 3</lang>
<lang langKey="hr">List pile 3</lang>
<lang langKey="ro">Lama 3</lang>
<lang langKey="nl">Mes 3</lang>
<lang langKey="el">Λάμα 3</lang>
<lang langKey="ru">Резец 3</lang>
<lang langKey="pl">Ostrze 3</lang>
<lang langKey="sv">Blad 3</lang>
<lang langKey="da">Klinge 3</lang>
<lang langKey="pt">Lâmina 3</lang>
<lang langKey="es">Cuchilla 3</lang>
</localizedNames>
</toolType>
<toolType>
<id>93</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 4</lang>
<lang langKey="it">Lama 4</lang>
<lang langKey="fr">Lame 4</lang>
<lang langKey="de">Klinge 4</lang>
<lang langKey="hr">List pile 4</lang>
<lang langKey="ro">Lama 4</lang>
<lang langKey="nl">Mes 4</lang>
<lang langKey="el">Λάμα 4</lang>
<lang langKey="ru">Резец 4</lang>
<lang langKey="pl">Ostrze 4</lang>
<lang langKey="sv">Blad 4</lang>
<lang langKey="da">Klinge 4</lang>
<lang langKey="pt">Lâmina 4</lang>
<lang langKey="es">Cuchilla 4</lang>
</localizedNames>
</toolType>
<toolType>
<id>94</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 5</lang>
<lang langKey="it">Lama 5</lang>
<lang langKey="fr">Lame 5</lang>
<lang langKey="de">Klinge 5</lang>
<lang langKey="hr">List pile 5</lang>
<lang langKey="ro">Lama 5</lang>
<lang langKey="nl">Mes 5</lang>
<lang langKey="el">Λάμα 5</lang>
<lang langKey="ru">Резец 5</lang>
<lang langKey="pl">Ostrze 5</lang>
<lang langKey="sv">Blad 5</lang>
<lang langKey="da">Klinge 5</lang>
<lang langKey="pt">Lâmina 5</lang>
<lang langKey="es">Cuchilla 5</lang>
</localizedNames>
</toolType>
<toolType>
<id>95</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 6</lang>
<lang langKey="it">Lama 6</lang>
<lang langKey="fr">Lame 6</lang>
<lang langKey="de">Klinge 6</lang>
<lang langKey="hr">List pile 6</lang>
<lang langKey="ro">Lama 6</lang>
<lang langKey="nl">Mes 6</lang>
<lang langKey="el">Λάμα 6</lang>
<lang langKey="ru">Резец 6</lang>
<lang langKey="pl">Ostrze 6</lang>
<lang langKey="sv">Blad 6</lang>
<lang langKey="da">Klinge 6</lang>
<lang langKey="pt">Lâmina 6</lang>
<lang langKey="es">Cuchilla 6</lang>
</localizedNames>
</toolType>
<toolType>
<id>96</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade 7</lang>
<lang langKey="it">Lama 7</lang>
<lang langKey="fr">Lame 7</lang>
<lang langKey="de">Klinge 7</lang>
<lang langKey="hr">List pile 7</lang>
<lang langKey="ro">Lama 7</lang>
<lang langKey="nl">Mes 7</lang>
<lang langKey="el">Λάμα 7</lang>
<lang langKey="ru">Резец 7</lang>
<lang langKey="pl">Ostrze 7</lang>
<lang langKey="sv">Blad 7</lang>
<lang langKey="da">Klinge 7</lang>
<lang langKey="pt">Lâmina 7</lang>
<lang langKey="es">Cuchilla 7</lang>
</localizedNames>
</toolType>
<toolType>
<id>97</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade ⌀300</lang>
<lang langKey="it">Lama ⌀300</lang>
<lang langKey="fr">Lame ⌀300</lang>
<lang langKey="de">Klinge ⌀300</lang>
<lang langKey="hr">List pile ⌀300</lang>
<lang langKey="ro">Lama ⌀300</lang>
<lang langKey="nl">Mes ⌀300</lang>
<lang langKey="el">Λάμα ⌀300</lang>
<lang langKey="ru">Резец ⌀300</lang>
<lang langKey="pl">Ostrze ⌀300</lang>
<lang langKey="sv">Blad ⌀300</lang>
<lang langKey="da">Klinge ⌀300</lang>
<lang langKey="pt">Lâmina ⌀300</lang>
<lang langKey="es">Cuchilla ⌀300</lang>
</localizedNames>
</toolType>
<toolType>
<id>98</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade ⌀400</lang>
<lang langKey="it">Lama ⌀400</lang>
<lang langKey="fr">Lame ⌀400</lang>
<lang langKey="de">Klinge ⌀400</lang>
<lang langKey="hr">List pile ⌀400</lang>
<lang langKey="ro">Lama ⌀400</lang>
<lang langKey="nl">Mes ⌀400</lang>
<lang langKey="el">Λάμα ⌀400</lang>
<lang langKey="ru">Резец ⌀400</lang>
<lang langKey="pl">Ostrze ⌀400</lang>
<lang langKey="sv">Blad ⌀400</lang>
<lang langKey="da">Klinge ⌀400</lang>
<lang langKey="pt">Lâmina ⌀400</lang>
<lang langKey="es">Cuchilla ⌀400</lang>
</localizedNames>
</toolType>
<toolType>
<id>99</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Blade ⌀500</lang>
<lang langKey="it">Lama ⌀500</lang>
<lang langKey="fr">Lame ⌀500</lang>
<lang langKey="de">Klinge ⌀500</lang>
<lang langKey="hr">List pile ⌀500</lang>
<lang langKey="ro">Lama ⌀500</lang>
<lang langKey="nl">Mes ⌀500</lang>
<lang langKey="el">Λάμα ⌀500</lang>
<lang langKey="ru">Резец ⌀500</lang>
<lang langKey="pl">Ostrze ⌀500</lang>
<lang langKey="sv">Blad ⌀500</lang>
<lang langKey="da">Klinge ⌀500</lang>
<lang langKey="pt">Lâmina ⌀500</lang>
<lang langKey="es">Cuchilla ⌀500</lang>
</localizedNames>
</toolType>
<toolType>
<id>101</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 1 - Reciever 1</lang>
<lang langKey="it">Radio Probe 1 - Ricevitore 1</lang>
<lang langKey="fr">Radio Probe 1 - Récepteur 1</lang>
<lang langKey="de">Radio Probe 1 - Empfänger 1</lang>
<lang langKey="hr">Radio Probe 1 - Prijemnik 1</lang>
<lang langKey="ro">Probe Radio 1 - Receptor 1</lang>
<lang langKey="nl">Radio Probe 1 - Ontvanger 1</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 1 - Δέκτης 1</lang>
<lang langKey="ru">Радиодатчик 1 - Приемник 1</lang>
<lang langKey="pl">Sonda radiowa 1 - Odbiornik 1</lang>
<lang langKey="sv">Radiosond 1 - Mottagare 1</lang>
<lang langKey="da">Radio Sonde 1 - Modtager 1</lang>
<lang langKey="pt">Sonda Probe 1 - Receptor 1</lang>
<lang langKey="es">Radio Probe 1 - Receptor 1</lang>
</localizedNames>
</toolType>
<toolType>
<id>102</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 2 - Reciever 1</lang>
<lang langKey="it">Radio Probe 2 - Ricevitore 1</lang>
<lang langKey="fr">Radio Probe 2 - Récepteur 1</lang>
<lang langKey="de">Radio Probe 2 - Empfänger 1</lang>
<lang langKey="hr">Radio Probe 2 - Prijemnik 1</lang>
<lang langKey="ro">Probe Radio 2 - Receptor 1</lang>
<lang langKey="nl">Radio Probe 2 - Ontvanger 1</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 2 - Δέκτης 1</lang>
<lang langKey="ru">Радиодатчик 2 - Приемник 1</lang>
<lang langKey="pl">Sonda radiowa 2 - Odbiornik 1</lang>
<lang langKey="sv">Radiosond 2 - Mottagare 1</lang>
<lang langKey="da">Radio Sonde 2 - Modtager 1</lang>
<lang langKey="pt">Sonda Probe 2 - Receptor 1</lang>
<lang langKey="es">Radio Probe 2 - Receptor 1</lang>
</localizedNames>
</toolType>
<toolType>
<id>103</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 3 - Reciever 1</lang>
<lang langKey="it">Radio Probe 3 - Ricevitore 1</lang>
<lang langKey="fr">Radio Probe 3 - Récepteur 1</lang>
<lang langKey="de">Radio Probe 3 - Empfänger 1</lang>
<lang langKey="hr">Radio Probe 3 - Prijemnik 1</lang>
<lang langKey="ro">Probe Radio 3 - Receptor 1</lang>
<lang langKey="nl">Radio Probe 3 - Ontvanger 1</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 3 - Δέκτης 1</lang>
<lang langKey="ru">Радиодатчик 3 - Приемник 1</lang>
<lang langKey="pl">Sonda radiowa 3 - Odbiornik 1</lang>
<lang langKey="sv">Radiosond 3 - Mottagare 1</lang>
<lang langKey="da">Radio Sonde 3 - Modtager 1</lang>
<lang langKey="pt">Sonda Probe 3 - Receptor 1</lang>
<lang langKey="es">Radio Probe 3 - Receptor 1</lang>
</localizedNames>
</toolType>
<toolType>
<id>104</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 4 - Reciever 1</lang>
<lang langKey="it">Radio Probe 4 - Ricevitore 1</lang>
<lang langKey="fr">Radio Probe 4 - Récepteur 1</lang>
<lang langKey="de">Radio Probe 4 - Empfänger 1</lang>
<lang langKey="hr">Radio Probe 4 - Prijemnik 1</lang>
<lang langKey="ro">Probe Radio 4 - Receptor 1</lang>
<lang langKey="nl">Radio Probe 4 - Ontvanger 1</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 4 - Δέκτης 1</lang>
<lang langKey="ru">Радиодатчик 4 - Приемник 1</lang>
<lang langKey="pl">Sonda radiowa 4 - Odbiornik 1</lang>
<lang langKey="sv">Radiosond 4 - Mottagare 1</lang>
<lang langKey="da">Radio Sonde 4 - Modtager 1</lang>
<lang langKey="pt">Sonda Probe 4 - Receptor 1</lang>
<lang langKey="es">Radio Probe 4 - Receptor 1</lang>
</localizedNames>
</toolType>
<toolType>
<id>105</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 1 - Reciever 2</lang>
<lang langKey="it">Radio Probe 1 - Ricevitore 2</lang>
<lang langKey="fr">Radio Probe 1 - Récepteur 2</lang>
<lang langKey="de">Radio Probe 1 - Empfänger 2</lang>
<lang langKey="hr">Radio Probe 1 - Prijemnik 2</lang>
<lang langKey="ro">Probe Radio 1 - Receptor 2</lang>
<lang langKey="nl">Radio Probe 1 - Ontvanger 2</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 1 - Δέκτης 2</lang>
<lang langKey="ru">Радиодатчик 1 - Приемник 2</lang>
<lang langKey="pl">Sonda radiowa 1 - Odbiornik 2</lang>
<lang langKey="sv">Radiosond 1 - Mottagare 2</lang>
<lang langKey="da">Radio Sonde 1 - Modtager 2</lang>
<lang langKey="pt">Sonda Probe 1 - Receptor 2</lang>
<lang langKey="es">Radio Probe 1 - Receptor 2</lang>
</localizedNames>
</toolType>
<toolType>
<id>106</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 2 - Reciever 2</lang>
<lang langKey="it">Radio Probe 2 - Ricevitore 2</lang>
<lang langKey="fr">Radio Probe 2 - Récepteur 2</lang>
<lang langKey="de">Radio Probe 2 - Empfänger 2</lang>
<lang langKey="hr">Radio Probe 2 - Prijemnik 2</lang>
<lang langKey="ro">Probe Radio 2 - Receptor 2</lang>
<lang langKey="nl">Radio Probe 2 - Ontvanger 2</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 2 - Δέκτης 2</lang>
<lang langKey="ru">Радиодатчик 2 - Приемник 2</lang>
<lang langKey="pl">Sonda radiowa 2 - Odbiornik 2</lang>
<lang langKey="sv">Radiosond 2 - Mottagare 2</lang>
<lang langKey="da">Radio Sonde 2 - Modtager 2</lang>
<lang langKey="pt">Sonda Probe 2 - Receptor 2</lang>
<lang langKey="es">Radio Probe 2 - Receptor 2</lang>
</localizedNames>
</toolType>
<toolType>
<id>107</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 3 - Reciever 2</lang>
<lang langKey="it">Radio Probe 3 - Ricevitore 2</lang>
<lang langKey="fr">Radio Probe 3 - Récepteur 2</lang>
<lang langKey="de">Radio Probe 3 - Empfänger 2</lang>
<lang langKey="hr">Radio Probe 3 - Prijemnik 2</lang>
<lang langKey="ro">Probe Radio 3 - Receptor 2</lang>
<lang langKey="nl">Radio Probe 3 - Ontvanger 2</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 3 - Δέκτης 2</lang>
<lang langKey="ru">Радиодатчик 3 - Приемник 2</lang>
<lang langKey="pl">Sonda radiowa 3 - Odbiornik 2</lang>
<lang langKey="sv">Radiosond 3 - Mottagare 2</lang>
<lang langKey="da">Radio Sonde 3 - Modtager 2</lang>
<lang langKey="pt">Sonda Probe 3 - Receptor 2</lang>
<lang langKey="es">Radio Probe 3 - Receptor 2</lang>
</localizedNames>
</toolType>
<toolType>
<id>108</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 4 - Reciever 2</lang>
<lang langKey="it">Radio Probe 4 - Ricevitore 2</lang>
<lang langKey="fr">Radio Probe 4 - Récepteur 2</lang>
<lang langKey="de">Radio Probe 4 - Empfänger 2</lang>
<lang langKey="hr">Radio Probe 4 - Prijemnik 2</lang>
<lang langKey="ro">Probe Radio 4 - Receptor 2</lang>
<lang langKey="nl">Radio Probe 4 - Ontvanger 2</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 4 - Δέκτης 2</lang>
<lang langKey="ru">Радиодатчик 4 - Приемник 2</lang>
<lang langKey="pl">Sonda radiowa 4 - Odbiornik 2</lang>
<lang langKey="sv">Radiosond 4 - Mottagare 2</lang>
<lang langKey="da">Radio Sonde 4 - Modtager 2</lang>
<lang langKey="pt">Sonda Probe 4 - Receptor 2</lang>
<lang langKey="es">Radio Probe 4 - Receptor 2</lang>
</localizedNames>
</toolType>
<toolType>
<id>112</id>
<disabled>false</disabled>
<localizedNames>
<lang langKey="en">Radio Probe 4 - Reciever 2</lang>
<lang langKey="it">Radio Probe 4 - Ricevitore 2</lang>
<lang langKey="fr">Radio Probe 4 - Récepteur 2</lang>
<lang langKey="de">Radio Probe 4 - Empfänger 2</lang>
<lang langKey="hr">Radio Probe 4 - Prijemnik 2</lang>
<lang langKey="ro">Probe Radio 4 - Receptor 2</lang>
<lang langKey="nl">Radio Probe 4 - Ontvanger 2</lang>
<lang langKey="el">Ραδιο-ανιχνευτής 4 - Δέκτης 2</lang>
<lang langKey="ru">Радиодатчик 4 - Приемник 2</lang>
<lang langKey="pl">Sonda radiowa 4 - Odbiornik 2</lang>
<lang langKey="sv">Radiosond 4 - Mottagare 2</lang>
<lang langKey="da">Radio Sonde 4 - Modtager 2</lang>
<lang langKey="pt">Sonda Probe 4 - Receptor 2</lang>
<lang langKey="es">Radio Probe 4 - Receptor 2</lang>
</localizedNames>
</toolType>
</toolTypes>
</root>
@@ -0,0 +1,501 @@
<?xml version="1.0" encoding="utf-8" ?>
<userSoftKeys>
<softKey_procedure>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>1</plcId>
<localizedNames>
<lang langKey="en">Yes</lang>
<lang langKey="it">Si</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>2</plcId>
<localizedNames>
<lang langKey="en">Limitswitch bypass</lang>
<lang langKey="it">Bypass extracorsa</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>3</plcId>
<localizedNames>
<lang langKey="en">Automatic zeroing</lang>
<lang langKey="it">Azzeramento automatico degli assi con 2 sec di ritardo</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>4</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>5</plcId>
<localizedNames>
<lang langKey="en">Set limits</lang>
<lang langKey="it">Set limiti</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_toggle>
<active>false</active>
<category>5</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>6</plcId>
<localizedNames>
<lang langKey="en">Light</lang>
<lang langKey="it">Illuminazione</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>true</active>
<category>6</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>7</plcId>
<localizedNames>
<lang langKey="en">POWER ON</lang>
<lang langKey="it">POWER ON</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_procedure>
<active>true</active>
<category>7</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>8</plcId>
<localizedNames>
<lang langKey="en">Tutti mag. ind.+prot. chius.</lang>
<lang langKey="it">Tutti mag. ind.+prot. chius.</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_toggle>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>9</plcId>
<localizedNames>
<lang langKey="en">POWER OFF</lang>
<lang langKey="it">POWER OFF</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_procedure>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>109</plcId>
<localizedNames>
<lang langKey="en">START SIEMENS</lang>
<lang langKey="it">START SIEMENS</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>10</plcId>
<localizedNames>
<lang langKey="en">START FANUC</lang>
<lang langKey="it">START FANUC</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_toggle>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>11</plcId>
<localizedNames>
<lang langKey="en">Selettore port. disco mob.</lang>
<lang langKey="it">Selettore port. disco mob.</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>12</plcId>
<localizedNames>
<lang langKey="en">Sbloccaggio UT</lang>
<lang langKey="it">Sbloccaggio UT</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>13</plcId>
<localizedNames>
<lang langKey="en">Ut. Bloccato in mandr.</lang>
<lang langKey="it">Ut. Bloccato in mandr.</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_procedure>
<active>false</active>
<category>4</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>14</plcId>
<localizedNames>
<lang langKey="en">Coupled tables</lang>
<lang langKey="it">Tavole accoppiate</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>false</active>
<category>4</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>15</plcId>
<localizedNames>
<lang langKey="en">Pendular tables</lang>
<lang langKey="it">Tavole pendolare</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>false</active>
<category>7</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>16</plcId>
<localizedNames>
<lang langKey="en">Table 1</lang>
<lang langKey="it">Tavola 1</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>false</active>
<category>7</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>17</plcId>
<localizedNames>
<lang langKey="en">Table 2</lang>
<lang langKey="it">Tavola 2</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_toggle>
<active>false</active>
<category>6</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>18</plcId>
<localizedNames>
<lang langKey="en">Tool magazine protection 1</lang>
<lang langKey="it">Protezione magazzino 1</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>6</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>19</plcId>
<localizedNames>
<lang langKey="en">Tool magazine protection 2</lang>
<lang langKey="it">Protezione magazzino 2</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_group>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">Vacuum pumps:</lang>
<lang langKey="it">Pompe vuoto:</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="21"> 2 </subKey>
<subKey active="true" plcId="20"> 1 </subKey>
<!-- <subKey plcId="23"> 4 </subKey> -->
<!-- <subKey plcId="22"> 3 </subKey> -->
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_group>
<active>false</active>
<category>2</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">Auxiliary vacuum clamps:</lang>
<lang langKey="it">Bloccaggi ausiliari vuoto:</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="27"> 2 </subKey>
<subKey active="true" plcId="26"> 1 </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_group>
<active>true</active>
<category>2</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">RAPID OVERRIDE:</lang>
<lang langKey="it">RAPID OVERRIDE:</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="28"> R 0% </subKey>
<subKey active="true" plcId="29"> R 50% </subKey>
<subKey active="true" plcId="30"> R 100% </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_group>
<active>true</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">JOG OVERRIDE:</lang>
<lang langKey="it">JOG OVERRIDE:</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="36"> J 0% </subKey>
<subKey active="true" plcId="37"> J 50% </subKey>
<subKey active="true" plcId="38"> J 100% </subKey>
<subKey active="true" plcId="39"> K4 </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_group>
<active>true</active>
<category>5</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">Set origin G:</lang>
<lang langKey="it">Set origini G: </lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="40"> 55 </subKey>
<subKey active="true" plcId="41"> 56 </subKey>
<subKey active="true" plcId="42"> 57 </subKey>
<subKey active="true" plcId="43"> 58 </subKey>
<subKey active="true" plcId="35"> 59 </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_procedure>
<active>true</active>
<category>5</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>44</plcId>
<localizedNames>
<lang langKey="en">Customer 1</lang>
<lang langKey="it">Customer 1</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>5</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>45</plcId>
<localizedNames>
<lang langKey="en">Customer 2</lang>
<lang langKey="it">Customer 2</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>5</category>
<operatorConfirmationNeeded>true</operatorConfirmationNeeded>
<plcId>46</plcId>
<localizedNames>
<lang langKey="en">Machine parking</lang>
<lang langKey="it">Parcheggio macchina</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>false</active>
<category>6</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>47</plcId>
<localizedNames>
<lang langKey="en">Tooling stock</lang>
<lang langKey="it">Attrezzaggio macchina</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_procedure>
<active>true</active>
<category>5</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>48</plcId>
<localizedNames>
<lang langKey="en">Restore tool change</lang>
<lang langKey="it">Ripristino cambio utensile</lang>
</localizedNames>
<visible>true</visible>
</softKey_procedure>
<softKey_toggle>
<active>false</active>
<category>6</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>49</plcId>
<localizedNames>
<lang langKey="en">Suction</lang>
<lang langKey="it">Aspirazione</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_group>
<active>true</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">Brakes ON/FF:</lang>
<lang langKey="it">Freni ON/OFF</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="50"> B </subKey>
<subKey active="true" plcId="51"> C </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
<softKey_toggle>
<active>true</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>52</plcId>
<localizedNames>
<lang langKey="en">Tool blower</lang>
<lang langKey="it">Soffiatore esterno utensile</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>53</plcId>
<localizedNames>
<lang langKey="en">Internal tool blower</lang>
<lang langKey="it">Soffiatore interno utensile</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>54</plcId>
<localizedNames>
<lang langKey="en">Cold air blower</lang>
<lang langKey="it">Soffiatore aria fredda</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>55</plcId>
<localizedNames>
<lang langKey="en">External tool coolant</lang>
<lang langKey="it">Nebulizzatore esterno utensile</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>56</plcId>
<localizedNames>
<lang langKey="en">Internal tool coolant</lang>
<lang langKey="it">Nebulizzatore interno utensile</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>57</plcId>
<localizedNames>
<lang langKey="en">Internal water</lang>
<lang langKey="it">Acqua interna</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_toggle>
<active>false</active>
<category>3</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<plcId>58</plcId>
<localizedNames>
<lang langKey="en">External water</lang>
<lang langKey="it">Acqua esterna</lang>
</localizedNames>
<visible>true</visible>
</softKey_toggle>
<softKey_group>
<active>false</active>
<category>1</category>
<operatorConfirmationNeeded>false</operatorConfirmationNeeded>
<localizedNames>
<lang langKey="en">PCP</lang>
<lang langKey="it">PCP</lang>
</localizedNames>
<subKeys>
<subKey active="true" plcId="67"> 2 </subKey>
<subKey active="true" plcId="66"> 1 </subKey>
</subKeys>
<visible>true</visible>
</softKey_group>
</userSoftKeys>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<!-- optional, add some variables
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="logDirectory" value="${basedir}/logs" />
<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<!--
add your targets here
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
-->
<target name="logfile" xsi:type="File" fileName="${logDirectory}/${shortdate}.txt" layout="${longdate} | ${level:uppercase=true} | ${message}"/>
<target name="console" xsi:type="Console" />
<!--
Write events to a file with the date in the filename.
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets>
<rules>
<!-- add your logging rules here -->
<logger name="*" minlevel="Debug" writeTo="logfile"/>
<logger name="*" minlevel="Debug" writeTo="console"/>
<!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" />
-->
</rules>
</nlog>
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<pieAndData>
<absoluteValue>90</absoluteValue>
<productedPieces>10000</productedPieces>
<discardedPieces>6</discardedPieces>
<stop>20</stop>
<run>60</run>
<idle>20</idle>
</pieAndData>
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8" ?>
<root>
<programs>
<program>
<name>Nuovo Prg</name>
<quantity>17</quantity>
<startDate>10/02/2019 12:00</startDate>
<endDate>10/02/2019 19:00</endDate>
<actualT>03:00:00</actualT>
<averageT>02:00:00</averageT>
<theoricT>04:00:00</theoricT>
<deviation>+01:00:00</deviation>
<frequency>10</frequency>
</program>
<program>
<name>Finestra</name>
<quantity>3</quantity>
<startDate>22/02/2019 12:00</startDate>
<endDate>22/02/2019 11:00</endDate>
<actualT>01:00:00</actualT>
<averageT>01:00:00</averageT>
<theoricT>02:00:00</theoricT>
<deviation>00:00:00</deviation>
<frequency>5</frequency>
</program>
<program>
<name>Telaio</name>
<quantity>22</quantity>
<startDate>15/02/2019 12:00</startDate>
<endDate>17/02/2019 19:00</endDate>
<actualT>01:00:00</actualT>
<averageT>00:50:45</averageT>
<theoricT>01:00:00</theoricT>
<deviation>-01:00:00</deviation>
<frequency>30</frequency>
</program>
<program>
<name>Fresatura</name>
<quantity>50</quantity>
<startDate>01/02/2019 10:00</startDate>
<endDate>04/02/2019 16:00</endDate>
<actualT>15:00:00</actualT>
<averageT>13:00:00</averageT>
<theoricT>14:00:00</theoricT>
<deviation>-01:00:00</deviation>
<frequency>40</frequency>
</program>
<program>
<name>Vasca</name>
<quantity>7</quantity>
<startDate>01/02/2019 10:00</startDate>
<endDate>04/02/2019 16:00</endDate>
<actualT>03:00:00</actualT>
<averageT>03:00:00</averageT>
<theoricT>03:00:00</theoricT>
<deviation>+00:00:00</deviation>
<frequency>20</frequency>
</program>
<program>
<name>Portiera</name>
<quantity>45</quantity>
<startDate>01/02/2019 10:00</startDate>
<endDate>04/02/2019 16:00</endDate>
<actualT>15:00:00</actualT>
<averageT>13:00:00</averageT>
<theoricT>14:00:00</theoricT>
<deviation>-01:00:00</deviation>
<frequency>30</frequency>
</program>
<program>
<name>Buchi</name>
<quantity>38</quantity>
<startDate>01/01/2019 10:00</startDate>
<endDate>02/01/2019 11:00</endDate>
<actualT>01:00:00</actualT>
<averageT>00:55:00</averageT>
<theoricT>01:20:00</theoricT>
<deviation>+00:25:00</deviation>
<frequency>55</frequency>
</program>
<program>
<name>Finestra</name>
<quantity>1</quantity>
<startDate>22/02/2019 20:00</startDate>
<endDate>22/02/2019 22:00</endDate>
<actualT>02:00:00</actualT>
<averageT>02:00:45</averageT>
<theoricT>02:30:00</theoricT>
<deviation>+00:30:45</deviation>
<frequency>2</frequency>
</program>
<program>
<name>Occhiali</name>
<quantity>38</quantity>
<startDate>16/01/2019 08:00</startDate>
<endDate>16/01/2019 19:00</endDate>
<actualT>00:50:11</actualT>
<averageT>00:45:20</averageT>
<theoricT>00:50:00</theoricT>
<deviation>+00:04:40</deviation>
<frequency>80</frequency>
</program>
<program>
<name>Misurazione</name>
<quantity>60</quantity>
<startDate>11/02/2019 08:00</startDate>
<endDate>17/02/2019 19:00</endDate>
<actualT>00:02:11</actualT>
<averageT>00:01:50</averageT>
<theoricT>00:01:30</theoricT>
<deviation>-00:00:20</deviation>
<frequency>60</frequency>
</program>
</programs>
</root>
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8" ?>
<timeline>
<statusData>
<runs>
<run>
<from>2019-02-01</from>
<to>2019-02-03</to>
</run>
<run>
<from>2019-02-22</from>
<to>2019-02-28</to>
</run>
<run>
<from>2019-03-05</from>
<to>2019-03-10</to>
</run>
</runs>
<stops>
<stop>
<from>2019-02-15</from>
<to>2019-02-17</to>
</stop>
<stop>
<from>2019-03-01</from>
<to>2019-03-05</to>
</stop>
</stops>
<idles>
<idle>
<from>2019-02-11</from>
<to>2019-02-13</to>
</idle>
<idle>
<from>2019-03-04</from>
<to>2019-03-05</to>
</idle>
</idles>
</statusData>
<partPrgs>
<partPrg>
<name>PartPrg1</name>
<executed>150</executed>
<frequency>44</frequency>
<dates>
<date>
<from>2019-02-01</from>
<to>2019-02-05</to>
</date>
<date>
<from>2019-02-10</from>
<to>2019-02-15</to>
</date>
</dates>
</partPrg>
<partPrg>
<name>Programma pezzo</name>
<executed>18</executed>
<frequency>33</frequency>
<dates>
<date>
<from>2019-02-20</from>
<to>2019-02-23</to>
</date>
<date>
<from>2019-02-25</from>
<to>2019-02-25</to>
</date>
</dates>
</partPrg>
</partPrgs>
</timeline>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="YamlDotNet" publicKeyToken="ec19458f3c15af5e" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.10.4.0" newVersion="6.10.4.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup></configuration>
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
<providers>
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.10.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.10.4.0" newVersion="6.10.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Channels" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="v13.0" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More