|
@@ -1,20 +1,20 @@
|
|
/* Copyright (C) 2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
|
|
/* Copyright (C) 2016 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
|
|
- *
|
|
|
|
|
|
+ *
|
|
* You can redistribute this program and/or modify it under the terms of
|
|
* You can redistribute this program and/or modify it under the terms of
|
|
* the GNU Lesser Public License as published by the Free Software Foundation,
|
|
* the GNU Lesser Public License as published by the Free Software Foundation,
|
|
* either version 3 of the License, or (at your option) any later version.
|
|
* either version 3 of the License, or (at your option) any later version.
|
|
*/
|
|
*/
|
|
|
|
+
|
|
|
|
+using ISCSI.Server;
|
|
|
|
+using ISCSIConsole.Mods;
|
|
using System;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
-using System.ComponentModel;
|
|
|
|
|
|
+using System.Configuration;
|
|
|
|
+using System.Linq;
|
|
using System.Net;
|
|
using System.Net;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.Sockets;
|
|
using System.Net.Sockets;
|
|
-using System.Text;
|
|
|
|
-using System.Threading;
|
|
|
|
using System.Windows.Forms;
|
|
using System.Windows.Forms;
|
|
-using ISCSI.Server;
|
|
|
|
-using DiskAccessLibrary;
|
|
|
|
using Utilities;
|
|
using Utilities;
|
|
|
|
|
|
namespace ISCSIConsole
|
|
namespace ISCSIConsole
|
|
@@ -33,14 +33,14 @@ namespace ISCSIConsole
|
|
|
|
|
|
private void MainForm_Load(object sender, EventArgs e)
|
|
private void MainForm_Load(object sender, EventArgs e)
|
|
{
|
|
{
|
|
- Version version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
|
|
|
- this.Text += " v" + version.ToString(3);
|
|
|
|
|
|
+ var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
|
|
|
|
+ Text += " v" + version.ToString(3);
|
|
m_server.OnLogEntry += Program.OnLogEntry;
|
|
m_server.OnLogEntry += Program.OnLogEntry;
|
|
|
|
|
|
- List<IPAddress> localIPs = GetHostIPAddresses();
|
|
|
|
- KeyValuePairList<string, IPAddress> list = new KeyValuePairList<string, IPAddress>();
|
|
|
|
|
|
+ var localIPs = GetHostIPAddresses();
|
|
|
|
+ var list = new KeyValuePairList<string, IPAddress>();
|
|
list.Add("Any", IPAddress.Any);
|
|
list.Add("Any", IPAddress.Any);
|
|
- foreach (IPAddress address in localIPs)
|
|
|
|
|
|
+ foreach (var address in localIPs)
|
|
{
|
|
{
|
|
list.Add(address.ToString(), address);
|
|
list.Add(address.ToString(), address);
|
|
}
|
|
}
|
|
@@ -60,14 +60,14 @@ namespace ISCSIConsole
|
|
{
|
|
{
|
|
if (!m_started)
|
|
if (!m_started)
|
|
{
|
|
{
|
|
- IPAddress serverAddress = (IPAddress)comboIPAddress.SelectedValue;
|
|
|
|
- int port = Conversion.ToInt32(txtPort.Text, 0);
|
|
|
|
|
|
+ var serverAddress = (IPAddress)comboIPAddress.SelectedValue;
|
|
|
|
+ var port = Conversion.ToInt32(txtPort.Text, 0);
|
|
if (port <= 0 || port > UInt16.MaxValue)
|
|
if (port <= 0 || port > UInt16.MaxValue)
|
|
{
|
|
{
|
|
MessageBox.Show("Invalid TCP port", "Error");
|
|
MessageBox.Show("Invalid TCP port", "Error");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- IPEndPoint endpoint = new IPEndPoint(serverAddress, port);
|
|
|
|
|
|
+ var endpoint = new IPEndPoint(serverAddress, port);
|
|
try
|
|
try
|
|
{
|
|
{
|
|
m_server.Start(endpoint);
|
|
m_server.Start(endpoint);
|
|
@@ -96,41 +96,45 @@ namespace ISCSIConsole
|
|
|
|
|
|
private void btnAddTarget_Click(object sender, EventArgs e)
|
|
private void btnAddTarget_Click(object sender, EventArgs e)
|
|
{
|
|
{
|
|
- AddTargetForm addTarget = new AddTargetForm();
|
|
|
|
- DialogResult addTargetResult = addTarget.ShowDialog();
|
|
|
|
|
|
+ var addTarget = new AddTargetForm();
|
|
|
|
+ var addTargetResult = addTarget.ShowDialog();
|
|
if (addTargetResult == DialogResult.OK)
|
|
if (addTargetResult == DialogResult.OK)
|
|
{
|
|
{
|
|
- ISCSITarget target = addTarget.Target;
|
|
|
|
- ((SCSI.VirtualSCSITarget)target.SCSITarget).OnLogEntry += Program.OnLogEntry;
|
|
|
|
- target.OnAuthorizationRequest += new EventHandler<AuthorizationRequestArgs>(ISCSITarget_OnAuthorizationRequest);
|
|
|
|
- target.OnSessionTermination += new EventHandler<SessionTerminationArgs>(ISCSITarget_OnSessionTermination);
|
|
|
|
- m_targets.Add(target);
|
|
|
|
|
|
+ var target = addTarget.Target;
|
|
try
|
|
try
|
|
{
|
|
{
|
|
- m_server.AddTarget(target);
|
|
|
|
|
|
+ AddTarget(target);
|
|
}
|
|
}
|
|
- catch (ArgumentException ex)
|
|
|
|
|
|
+ catch (Exception ex)
|
|
{
|
|
{
|
|
MessageBox.Show(ex.Message, "Error");
|
|
MessageBox.Show(ex.Message, "Error");
|
|
- return;
|
|
|
|
}
|
|
}
|
|
- listTargets.Items.Add(target.TargetName);
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void AddTarget(ISCSITarget target)
|
|
|
|
+ {
|
|
|
|
+ ((SCSI.VirtualSCSITarget)target.SCSITarget).OnLogEntry += Program.OnLogEntry;
|
|
|
|
+ target.OnAuthorizationRequest += ISCSITarget_OnAuthorizationRequest;
|
|
|
|
+ target.OnSessionTermination += ISCSITarget_OnSessionTermination;
|
|
|
|
+ m_targets.Add(target);
|
|
|
|
+ m_server.AddTarget(target);
|
|
|
|
+ listTargets.Items.Add(target.TargetName);
|
|
|
|
+ }
|
|
|
|
+
|
|
private void btnRemoveTarget_Click(object sender, EventArgs e)
|
|
private void btnRemoveTarget_Click(object sender, EventArgs e)
|
|
{
|
|
{
|
|
if (listTargets.SelectedIndices.Count > 0)
|
|
if (listTargets.SelectedIndices.Count > 0)
|
|
{
|
|
{
|
|
- int targetIndex = listTargets.SelectedIndices[0];
|
|
|
|
- ISCSITarget target = m_targets[targetIndex];
|
|
|
|
- bool isTargetRemoved = m_server.RemoveTarget(target.TargetName);
|
|
|
|
|
|
+ var targetIndex = listTargets.SelectedIndices[0];
|
|
|
|
+ var target = m_targets[targetIndex];
|
|
|
|
+ var isTargetRemoved = m_server.RemoveTarget(target.TargetName);
|
|
if (!isTargetRemoved)
|
|
if (!isTargetRemoved)
|
|
{
|
|
{
|
|
MessageBox.Show("Could not remove iSCSI target", "Error");
|
|
MessageBox.Show("Could not remove iSCSI target", "Error");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- List<Disk> disks = ((SCSI.VirtualSCSITarget)target.SCSITarget).Disks;
|
|
|
|
|
|
+ var disks = ((SCSI.VirtualSCSITarget)target.SCSITarget).Disks;
|
|
LockUtils.ReleaseDisks(disks);
|
|
LockUtils.ReleaseDisks(disks);
|
|
m_targets.RemoveAt(targetIndex);
|
|
m_targets.RemoveAt(targetIndex);
|
|
listTargets.Items.RemoveAt(targetIndex);
|
|
listTargets.Items.RemoveAt(targetIndex);
|
|
@@ -139,23 +143,23 @@ namespace ISCSIConsole
|
|
|
|
|
|
private void ISCSITarget_OnAuthorizationRequest(object sender, AuthorizationRequestArgs e)
|
|
private void ISCSITarget_OnAuthorizationRequest(object sender, AuthorizationRequestArgs e)
|
|
{
|
|
{
|
|
- string targetName = ((ISCSITarget)sender).TargetName;
|
|
|
|
|
|
+ var targetName = ((ISCSITarget)sender).TargetName;
|
|
m_usageCounter.NotifySessionStart(targetName);
|
|
m_usageCounter.NotifySessionStart(targetName);
|
|
UpdateUI();
|
|
UpdateUI();
|
|
}
|
|
}
|
|
|
|
|
|
private void ISCSITarget_OnSessionTermination(object sender, SessionTerminationArgs e)
|
|
private void ISCSITarget_OnSessionTermination(object sender, SessionTerminationArgs e)
|
|
{
|
|
{
|
|
- string targetName = ((ISCSITarget)sender).TargetName;
|
|
|
|
|
|
+ var targetName = ((ISCSITarget)sender).TargetName;
|
|
m_usageCounter.NotifySessionTermination(targetName);
|
|
m_usageCounter.NotifySessionTermination(targetName);
|
|
UpdateUI();
|
|
UpdateUI();
|
|
}
|
|
}
|
|
|
|
|
|
private void UpdateUI()
|
|
private void UpdateUI()
|
|
{
|
|
{
|
|
- if (this.InvokeRequired)
|
|
|
|
|
|
+ if (InvokeRequired)
|
|
{
|
|
{
|
|
- this.Invoke((MethodInvoker)UpdateUI);
|
|
|
|
|
|
+ Invoke((MethodInvoker)UpdateUI);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -166,9 +170,9 @@ namespace ISCSIConsole
|
|
|
|
|
|
if (listTargets.SelectedIndices.Count > 0)
|
|
if (listTargets.SelectedIndices.Count > 0)
|
|
{
|
|
{
|
|
- int targetIndex = listTargets.SelectedIndices[0];
|
|
|
|
- ISCSITarget target = m_targets[targetIndex];
|
|
|
|
- bool isInUse = m_usageCounter.IsTargetInUse(target.TargetName);
|
|
|
|
|
|
+ var targetIndex = listTargets.SelectedIndices[0];
|
|
|
|
+ var target = m_targets[targetIndex];
|
|
|
|
+ var isInUse = m_usageCounter.IsTargetInUse(target.TargetName);
|
|
btnRemoveTarget.Enabled = !isInUse;
|
|
btnRemoveTarget.Enabled = !isInUse;
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -180,13 +184,13 @@ namespace ISCSIConsole
|
|
|
|
|
|
private static List<IPAddress> GetHostIPAddresses()
|
|
private static List<IPAddress> GetHostIPAddresses()
|
|
{
|
|
{
|
|
- List<IPAddress> result = new List<IPAddress>();
|
|
|
|
- foreach (NetworkInterface netInterface in NetworkInterface.GetAllNetworkInterfaces())
|
|
|
|
|
|
+ var result = new List<IPAddress>();
|
|
|
|
+ foreach (var netInterface in NetworkInterface.GetAllNetworkInterfaces())
|
|
{
|
|
{
|
|
- IPInterfaceProperties ipProperties = netInterface.GetIPProperties();
|
|
|
|
- foreach (UnicastIPAddressInformation addressInfo in ipProperties.UnicastAddresses)
|
|
|
|
|
|
+ var ipProperties = netInterface.GetIPProperties();
|
|
|
|
+ foreach (var addressInfo in ipProperties.UnicastAddresses)
|
|
{
|
|
{
|
|
- if (addressInfo.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
|
|
|
|
|
|
+ if (addressInfo.Address.AddressFamily == AddressFamily.InterNetwork)
|
|
{
|
|
{
|
|
result.Add(addressInfo.Address);
|
|
result.Add(addressInfo.Address);
|
|
}
|
|
}
|
|
@@ -199,5 +203,47 @@ namespace ISCSIConsole
|
|
{
|
|
{
|
|
UpdateUI();
|
|
UpdateUI();
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private void LoadConfigButton_Click(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ if (0 != m_targets.Count)
|
|
|
|
+ {
|
|
|
|
+ MessageBox.Show("Remove all targets before load config");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ LoadFromConfig();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void LoadFromConfig()
|
|
|
|
+ {
|
|
|
|
+ var entries = ((List<AutoLoadEntry>)ConfigurationManager.GetSection("autoLoad")).Where(p => p.Enable).ToArray();
|
|
|
|
+ if (entries.Length != entries.Select(p => p.Iqn).Distinct().Count())
|
|
|
|
+ {
|
|
|
|
+ MessageBox.Show("Config error: Iqn should no duplicate");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ var arr = new ISCSITarget[entries.Length];
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < arr.Length; i++)
|
|
|
|
+ {
|
|
|
|
+
|
|
|
|
+ arr[i] = entries[i].CreateTarget();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ foreach (var target in arr)
|
|
|
|
+ {
|
|
|
|
+ AddTarget(target);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void MainForm_Shown(object sender, EventArgs e)
|
|
|
|
+ {
|
|
|
|
+ if (IPAddress.TryParse(ConfigurationManager.AppSettings["Listen"], out var ipAddress)) comboIPAddress.Text = ipAddress.ToString();
|
|
|
|
+ if (int.TryParse(ConfigurationManager.AppSettings["Port"], out var port)) txtPort.Text = port.ToString();
|
|
|
|
+ if ("true" == ConfigurationManager.AppSettings["AutoLoadConfig"]) LoadFromConfig();
|
|
|
|
+ if ("true" == ConfigurationManager.AppSettings["AutoStart"]) btnStart_Click(null, null);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|