mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-03-03 15:30:27 +00:00
FTP+Ping
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
<PackageReference Include="Cosmos.Plugs" Version="0.1.0-localbuild20260201071815" />
|
<PackageReference Include="Cosmos.Plugs" Version="0.1.0-localbuild20260201071815" />
|
||||||
<PackageReference Include="Cosmos.System2" Version="0.1.0-localbuild20260201071815" />
|
<PackageReference Include="Cosmos.System2" Version="0.1.0-localbuild20260201071815" />
|
||||||
<PackageReference Include="Cosmos.System2_Plugs" Version="0.1.0-localbuild20260201071815" />
|
<PackageReference Include="Cosmos.System2_Plugs" Version="0.1.0-localbuild20260201071815" />
|
||||||
|
<PackageReference Include="CosmosFtpServer" Version="1.0.9" />
|
||||||
<PackageReference Include="IL2CPU.API" Version="0.1.0-localbuild20260202032053" />
|
<PackageReference Include="IL2CPU.API" Version="0.1.0-localbuild20260202032053" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using CosmosFtpServer;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
|||||||
16
Kernel.cs
16
Kernel.cs
@@ -1,6 +1,7 @@
|
|||||||
using Cosmos.HAL;
|
using Cosmos.HAL;
|
||||||
using Cosmos.System.Network.Config;
|
using Cosmos.System.Network.Config;
|
||||||
using Cosmos.System.Network.IPv4.UDP.DHCP;
|
using Cosmos.System.Network.IPv4.UDP.DHCP;
|
||||||
|
using Cosmos.System.Network.IPv4;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -27,7 +28,7 @@ namespace CMLeonOS
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建全局CosmosVFS实例
|
// 创建全局CosmosVFS实例
|
||||||
Sys.FileSystem.CosmosVFS fs = new Sys.FileSystem.CosmosVFS();
|
public static Sys.FileSystem.CosmosVFS fs = new Sys.FileSystem.CosmosVFS();
|
||||||
|
|
||||||
private Shell shell;
|
private Shell shell;
|
||||||
private UserSystem userSystem;
|
private UserSystem userSystem;
|
||||||
@@ -38,6 +39,10 @@ namespace CMLeonOS
|
|||||||
// 系统启动时间(用于uptime命令)
|
// 系统启动时间(用于uptime命令)
|
||||||
public static DateTime SystemStartTime;
|
public static DateTime SystemStartTime;
|
||||||
|
|
||||||
|
// 网络配置信息
|
||||||
|
public static Cosmos.HAL.NetworkDevice NetworkDevice = null;
|
||||||
|
public static string IPAddress = "Unknown";
|
||||||
|
|
||||||
protected override void BeforeRun()
|
protected override void BeforeRun()
|
||||||
{
|
{
|
||||||
// Console.Clear();
|
// Console.Clear();
|
||||||
@@ -64,9 +69,9 @@ namespace CMLeonOS
|
|||||||
{
|
{
|
||||||
throw new Exception("No network devices are available.");
|
throw new Exception("No network devices are available.");
|
||||||
}
|
}
|
||||||
var netDevice = NetworkDevice.Devices[0];
|
NetworkDevice = NetworkDevice.Devices[0];
|
||||||
using var dhcp = new DHCPClient();
|
using var dhcp = new DHCPClient();
|
||||||
if (netDevice.Ready == true) {
|
if (NetworkDevice.Ready == true) {
|
||||||
ShowSuccess("Network device ready.");
|
ShowSuccess("Network device ready.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -74,7 +79,8 @@ namespace CMLeonOS
|
|||||||
ShowError("Network device is not ready.");
|
ShowError("Network device is not ready.");
|
||||||
}
|
}
|
||||||
dhcp.SendDiscoverPacket();
|
dhcp.SendDiscoverPacket();
|
||||||
Console.WriteLine($"Local IP: {NetworkConfiguration.CurrentAddress.ToString()}");
|
IPAddress = NetworkConfiguration.CurrentAddress.ToString();
|
||||||
|
Console.WriteLine($"Local IP: {IPAddress}");
|
||||||
ShowSuccess("Network started.");
|
ShowSuccess("Network started.");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -130,7 +136,7 @@ namespace CMLeonOS
|
|||||||
int seconds = uptime.Seconds;
|
int seconds = uptime.Seconds;
|
||||||
|
|
||||||
Console.WriteLine($"System uptime: {days} days, {hours} hours, {minutes} minutes, {seconds} seconds");
|
Console.WriteLine($"System uptime: {days} days, {hours} hours, {minutes} minutes, {seconds} seconds");
|
||||||
Console.WriteLine($"Total uptime: {uptime.TotalHours:F2} hours");
|
// Console.WriteLine($"Total uptime: {uptime.TotalHours:F2} hours");
|
||||||
|
|
||||||
// 循环直到登录成功或退出
|
// 循环直到登录成功或退出
|
||||||
while (true)
|
while (true)
|
||||||
|
|||||||
213
Shell.cs
213
Shell.cs
@@ -1,8 +1,12 @@
|
|||||||
|
using CosmosFtpServer;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Sys = Cosmos.System;
|
using Sys = Cosmos.System;
|
||||||
|
using Cosmos.System.Network.IPv4;
|
||||||
|
using EndPoint = Cosmos.System.Network.IPv4.EndPoint;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace CMLeonOS
|
namespace CMLeonOS
|
||||||
{
|
{
|
||||||
@@ -181,6 +185,7 @@ namespace CMLeonOS
|
|||||||
" backup <name> - Backup system files",
|
" backup <name> - Backup system files",
|
||||||
" restore <name> - Restore system files",
|
" restore <name> - Restore system files",
|
||||||
" grep <pattern> <file> - Search text in file",
|
" grep <pattern> <file> - Search text in file",
|
||||||
|
" ping <ip> - Ping IP address (5 times)",
|
||||||
" version - Show OS version",
|
" version - Show OS version",
|
||||||
" about - Show about information",
|
" about - Show about information",
|
||||||
" help <page> - Show help page (1-3)",
|
" help <page> - Show help page (1-3)",
|
||||||
@@ -426,6 +431,12 @@ namespace CMLeonOS
|
|||||||
case "restore":
|
case "restore":
|
||||||
RestoreSystem(args);
|
RestoreSystem(args);
|
||||||
break;
|
break;
|
||||||
|
case "ftp":
|
||||||
|
CreateFTP();
|
||||||
|
break;
|
||||||
|
case "ping":
|
||||||
|
PingIP(args);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ShowError($"Unknown command: {command}");
|
ShowError($"Unknown command: {command}");
|
||||||
break;
|
break;
|
||||||
@@ -1489,5 +1500,207 @@ namespace CMLeonOS
|
|||||||
ShowError($"Error showing uptime: {ex.Message}");
|
ShowError($"Error showing uptime: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CreateFTP()
|
||||||
|
{
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine(" FTP Server");
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
// Console.WriteLine("Starting FTP server...");
|
||||||
|
// Console.WriteLine($"Root directory: 0:\\");
|
||||||
|
// Console.WriteLine($"File system: {Kernel.fs.GetFileSystemType("0:\\")}");
|
||||||
|
// Console.WriteLine($"Available space: {FormatBytes(Kernel.fs.GetAvailableFreeSpace("0:\\"))}");
|
||||||
|
// Console.WriteLine();
|
||||||
|
|
||||||
|
// Console.WriteLine("====================================");
|
||||||
|
// Console.WriteLine(" Connection Information");
|
||||||
|
// Console.WriteLine("====================================");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (Kernel.NetworkDevice != null && Kernel.IPAddress != "Unknown")
|
||||||
|
{
|
||||||
|
Console.WriteLine($"FTP Server Address: ftp://{Kernel.IPAddress}");
|
||||||
|
Console.WriteLine($"FTP Port: 21");
|
||||||
|
Console.WriteLine($"IP Address: {Kernel.IPAddress}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("FTP Server Address: Not available (network not configured)");
|
||||||
|
Console.WriteLine("FTP Port: 21");
|
||||||
|
Console.WriteLine("IP Address: Unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ShowError($"Error while running: {ex.Message}");
|
||||||
|
Console.WriteLine("FTP Server Address: Not available (network not configured)");
|
||||||
|
Console.WriteLine("FTP Port: 21");
|
||||||
|
Console.WriteLine("IP Address: Unknown");
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine(" Login Information");
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine("Default Username: anonymous");
|
||||||
|
Console.WriteLine("Password: (no password required)");
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("Note: You can also use system users to login");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
Console.WriteLine("FTP server is listening for connections...");
|
||||||
|
Console.WriteLine("Press Ctrl+C to stop the server");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
using (var xServer = new FtpServer(Kernel.fs, "0:\\"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ShowSuccess("FTP server started successfully!");
|
||||||
|
// Console.WriteLine($"Server started at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||||
|
// Console.WriteLine();
|
||||||
|
|
||||||
|
xServer.Listen();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ShowError($"FTP server error: {ex.Message}");
|
||||||
|
// Console.WriteLine($"Error occurred at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
ShowWarning("FTP server stopped");
|
||||||
|
// Console.WriteLine($"Server stopped at: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PingIP(string args)
|
||||||
|
{
|
||||||
|
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
if (parts.Length == 0)
|
||||||
|
{
|
||||||
|
ShowError("Error: Please specify IP address");
|
||||||
|
ShowError("Usage: ping <ip>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Kernel.NetworkDevice == null)
|
||||||
|
{
|
||||||
|
ShowError("Error: Network device not initialized");
|
||||||
|
ShowError("Please check network configuration");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string ip = parts[0];
|
||||||
|
|
||||||
|
if (!ParseAddress(ip, out Address address))
|
||||||
|
{
|
||||||
|
ShowError("Invalid IP address.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine($" Pinging {address.ToString()}");
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine($"Using network device: {Kernel.NetworkDevice.Name}");
|
||||||
|
Console.WriteLine($"Local IP: {Kernel.IPAddress}");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
EndPoint endpoint = new EndPoint(Address.Zero, 0);
|
||||||
|
|
||||||
|
int sent = 0;
|
||||||
|
int received = 0;
|
||||||
|
const int echoCount = 5;
|
||||||
|
|
||||||
|
using (var icmp = new ICMPClient())
|
||||||
|
{
|
||||||
|
icmp.Connect(address);
|
||||||
|
|
||||||
|
for (int i = 0; i < echoCount; i++)
|
||||||
|
{
|
||||||
|
icmp.SendEcho();
|
||||||
|
sent++;
|
||||||
|
int time = icmp.Receive(ref endpoint);
|
||||||
|
|
||||||
|
if (time != -1)
|
||||||
|
{
|
||||||
|
received++;
|
||||||
|
Console.WriteLine($"Reply from {address.ToString()}: time={time - 1}ms");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowError("Request timed out.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i < echoCount - 1)
|
||||||
|
{
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
icmp.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine(" Ping Statistics");
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
int lossPercent = (int)((sent - received) / (float)sent * 100);
|
||||||
|
Console.WriteLine($"Packets: Sent = {sent}, Received = {received}, Lost = {sent - received} ({lossPercent}% loss)");
|
||||||
|
Console.WriteLine();
|
||||||
|
|
||||||
|
if (sent == received)
|
||||||
|
{
|
||||||
|
ShowSuccess("Ping completed successfully");
|
||||||
|
}
|
||||||
|
else if (received > 0)
|
||||||
|
{
|
||||||
|
ShowWarning("Ping completed with packet loss");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowError("Ping failed - no response received");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
ShowError($"Ping error: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool ParseAddress(string ip, out Address address)
|
||||||
|
{
|
||||||
|
string[] octetStrings = ip.Split('.');
|
||||||
|
byte[] octets = new byte[4];
|
||||||
|
|
||||||
|
if (octetStrings.Length != 4)
|
||||||
|
{
|
||||||
|
address = Address.Zero;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < octetStrings.Length; i++)
|
||||||
|
{
|
||||||
|
if (byte.TryParse(octetStrings[i], out byte octet))
|
||||||
|
{
|
||||||
|
octets[i] = octet;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
address = Address.Zero;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
address = new Address(octets[0], octets[1], octets[2], octets[3]);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user