Added phone numbers in the hosted organization. part 2.
This commit is contained in:
parent
a735808a04
commit
ce04966e91
22 changed files with 4642 additions and 4442 deletions
|
@ -2401,3 +2401,188 @@ INSERT [dbo].[Providers] ([ProviderId], [GroupId], [ProviderName], [DisplayName]
|
||||||
VALUES(1501, 45, N'RemoteDesktopServices2012', N'Remote Desktop Services Windows 2012', N'WebsitePanel.Providers.RemoteDesktopServices.Windows2012,WebsitePanel.Providers.RemoteDesktopServices.Windows2012', N'RDS', 1)
|
VALUES(1501, 45, N'RemoteDesktopServices2012', N'Remote Desktop Services Windows 2012', N'WebsitePanel.Providers.RemoteDesktopServices.Windows2012,WebsitePanel.Providers.RemoteDesktopServices.Windows2012', N'RDS', 1)
|
||||||
END
|
END
|
||||||
GO
|
GO
|
||||||
|
|
||||||
|
-- Added phone numbers in the hosted organization.
|
||||||
|
|
||||||
|
IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='PackageIPAddresses' AND COLS.name='OrgID')
|
||||||
|
BEGIN
|
||||||
|
ALTER TABLE [dbo].[PackageIPAddresses] ADD
|
||||||
|
[OrgID] [int] NULL
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[AllocatePackageIPAddresses]
|
||||||
|
(
|
||||||
|
@PackageID int,
|
||||||
|
@OrgID int,
|
||||||
|
@xml ntext
|
||||||
|
)
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
DECLARE @idoc int
|
||||||
|
--Create an internal representation of the XML document.
|
||||||
|
EXEC sp_xml_preparedocument @idoc OUTPUT, @xml
|
||||||
|
|
||||||
|
-- delete
|
||||||
|
DELETE FROM PackageIPAddresses
|
||||||
|
FROM PackageIPAddresses AS PIP
|
||||||
|
INNER JOIN OPENXML(@idoc, '/items/item', 1) WITH
|
||||||
|
(
|
||||||
|
AddressID int '@id'
|
||||||
|
) as PV ON PIP.AddressID = PV.AddressID
|
||||||
|
|
||||||
|
|
||||||
|
-- insert
|
||||||
|
INSERT INTO dbo.PackageIPAddresses
|
||||||
|
(
|
||||||
|
PackageID,
|
||||||
|
OrgID,
|
||||||
|
AddressID
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
@PackageID,
|
||||||
|
@OrgID,
|
||||||
|
AddressID
|
||||||
|
|
||||||
|
FROM OPENXML(@idoc, '/items/item', 1) WITH
|
||||||
|
(
|
||||||
|
AddressID int '@id'
|
||||||
|
) as PV
|
||||||
|
|
||||||
|
-- remove document
|
||||||
|
exec sp_xml_removedocument @idoc
|
||||||
|
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[GetPackageIPAddresses]
|
||||||
|
(
|
||||||
|
@PackageID int,
|
||||||
|
@OrgID int,
|
||||||
|
@FilterColumn nvarchar(50) = '',
|
||||||
|
@FilterValue nvarchar(50) = '',
|
||||||
|
@SortColumn nvarchar(50),
|
||||||
|
@StartRow int,
|
||||||
|
@MaximumRows int,
|
||||||
|
@PoolID int = 0,
|
||||||
|
@Recursive bit = 0
|
||||||
|
)
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
|
||||||
|
-- start
|
||||||
|
DECLARE @condition nvarchar(700)
|
||||||
|
SET @condition = '
|
||||||
|
((@Recursive = 0 AND PA.PackageID = @PackageID)
|
||||||
|
OR (@Recursive = 1 AND dbo.CheckPackageParent(@PackageID, PA.PackageID) = 1))
|
||||||
|
AND (@PoolID = 0 OR @PoolID <> 0 AND IP.PoolID = @PoolID)
|
||||||
|
AND (@OrgID = 0 OR @OrgID <> 0 AND PA.OrgID = @OrgID)
|
||||||
|
'
|
||||||
|
|
||||||
|
IF @FilterColumn <> '' AND @FilterColumn IS NOT NULL
|
||||||
|
AND @FilterValue <> '' AND @FilterValue IS NOT NULL
|
||||||
|
SET @condition = @condition + ' AND ' + @FilterColumn + ' LIKE ''' + @FilterValue + ''''
|
||||||
|
|
||||||
|
IF @SortColumn IS NULL OR @SortColumn = ''
|
||||||
|
SET @SortColumn = 'IP.ExternalIP ASC'
|
||||||
|
|
||||||
|
DECLARE @sql nvarchar(3500)
|
||||||
|
|
||||||
|
set @sql = '
|
||||||
|
SELECT COUNT(PA.PackageAddressID)
|
||||||
|
FROM dbo.PackageIPAddresses PA
|
||||||
|
INNER JOIN dbo.IPAddresses AS IP ON PA.AddressID = IP.AddressID
|
||||||
|
INNER JOIN dbo.Packages P ON PA.PackageID = P.PackageID
|
||||||
|
INNER JOIN dbo.Users U ON U.UserID = P.UserID
|
||||||
|
LEFT JOIN ServiceItems SI ON PA.ItemId = SI.ItemID
|
||||||
|
WHERE ' + @condition + '
|
||||||
|
|
||||||
|
DECLARE @Addresses AS TABLE
|
||||||
|
(
|
||||||
|
PackageAddressID int
|
||||||
|
);
|
||||||
|
|
||||||
|
WITH TempItems AS (
|
||||||
|
SELECT ROW_NUMBER() OVER (ORDER BY ' + @SortColumn + ') as Row,
|
||||||
|
PA.PackageAddressID
|
||||||
|
FROM dbo.PackageIPAddresses PA
|
||||||
|
INNER JOIN dbo.IPAddresses AS IP ON PA.AddressID = IP.AddressID
|
||||||
|
INNER JOIN dbo.Packages P ON PA.PackageID = P.PackageID
|
||||||
|
INNER JOIN dbo.Users U ON U.UserID = P.UserID
|
||||||
|
LEFT JOIN ServiceItems SI ON PA.ItemId = SI.ItemID
|
||||||
|
WHERE ' + @condition + '
|
||||||
|
)
|
||||||
|
|
||||||
|
INSERT INTO @Addresses
|
||||||
|
SELECT PackageAddressID FROM TempItems
|
||||||
|
WHERE TempItems.Row BETWEEN @StartRow + 1 and @StartRow + @MaximumRows
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
PA.PackageAddressID,
|
||||||
|
PA.AddressID,
|
||||||
|
IP.ExternalIP,
|
||||||
|
IP.InternalIP,
|
||||||
|
IP.SubnetMask,
|
||||||
|
IP.DefaultGateway,
|
||||||
|
PA.ItemID,
|
||||||
|
SI.ItemName,
|
||||||
|
PA.PackageID,
|
||||||
|
P.PackageName,
|
||||||
|
P.UserID,
|
||||||
|
U.UserName,
|
||||||
|
PA.IsPrimary
|
||||||
|
FROM @Addresses AS TA
|
||||||
|
INNER JOIN dbo.PackageIPAddresses AS PA ON TA.PackageAddressID = PA.PackageAddressID
|
||||||
|
INNER JOIN dbo.IPAddresses AS IP ON PA.AddressID = IP.AddressID
|
||||||
|
INNER JOIN dbo.Packages P ON PA.PackageID = P.PackageID
|
||||||
|
INNER JOIN dbo.Users U ON U.UserID = P.UserID
|
||||||
|
LEFT JOIN ServiceItems SI ON PA.ItemId = SI.ItemID
|
||||||
|
'
|
||||||
|
|
||||||
|
print @sql
|
||||||
|
|
||||||
|
exec sp_executesql @sql, N'@PackageID int, @OrgID int, @StartRow int, @MaximumRows int, @Recursive bit, @PoolID int',
|
||||||
|
@PackageID, @OrgID, @StartRow, @MaximumRows, @Recursive, @PoolID
|
||||||
|
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ALTER PROCEDURE [dbo].[GetPackageUnassignedIPAddresses]
|
||||||
|
(
|
||||||
|
@ActorID int,
|
||||||
|
@PackageID int,
|
||||||
|
@OrgID int,
|
||||||
|
@PoolID int = 0
|
||||||
|
)
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SELECT
|
||||||
|
PIP.PackageAddressID,
|
||||||
|
IP.AddressID,
|
||||||
|
IP.ExternalIP,
|
||||||
|
IP.InternalIP,
|
||||||
|
IP.ServerID,
|
||||||
|
IP.PoolID,
|
||||||
|
PIP.IsPrimary,
|
||||||
|
IP.SubnetMask,
|
||||||
|
IP.DefaultGateway
|
||||||
|
FROM PackageIPAddresses AS PIP
|
||||||
|
INNER JOIN IPAddresses AS IP ON PIP.AddressID = IP.AddressID
|
||||||
|
WHERE
|
||||||
|
PIP.ItemID IS NULL
|
||||||
|
AND PIP.PackageID = @PackageID
|
||||||
|
AND (@PoolID = 0 OR @PoolID <> 0 AND IP.PoolID = @PoolID)
|
||||||
|
AND (@OrgID = 0 OR @OrgID <> 0 AND PIP.OrgID = @OrgID)
|
||||||
|
AND dbo.CheckActorPackageRights(@ActorID, PIP.PackageID) = 1
|
||||||
|
ORDER BY IP.DefaultGateway, IP.ExternalIP
|
||||||
|
END
|
||||||
|
GO
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -3205,23 +3205,25 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void AllocatePackageIPAddresses(int packageId, string xml)
|
public static void AllocatePackageIPAddresses(int packageId, int orgId, string xml)
|
||||||
{
|
{
|
||||||
SqlParameter[] param = new[]
|
SqlParameter[] param = new[]
|
||||||
{
|
{
|
||||||
new SqlParameter("@PackageID", packageId),
|
new SqlParameter("@PackageID", packageId),
|
||||||
|
new SqlParameter("@OrgID", orgId),
|
||||||
new SqlParameter("@xml", xml)
|
new SqlParameter("@xml", xml)
|
||||||
};
|
};
|
||||||
|
|
||||||
ExecuteLongNonQuery("AllocatePackageIPAddresses", param);
|
ExecuteLongNonQuery("AllocatePackageIPAddresses", param);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IDataReader GetPackageIPAddresses(int packageId, int poolId, string filterColumn, string filterValue,
|
public static IDataReader GetPackageIPAddresses(int packageId, int orgId, int poolId, string filterColumn, string filterValue,
|
||||||
string sortColumn, int startRow, int maximumRows, bool recursive)
|
string sortColumn, int startRow, int maximumRows, bool recursive)
|
||||||
{
|
{
|
||||||
IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
|
IDataReader reader = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
|
||||||
"GetPackageIPAddresses",
|
"GetPackageIPAddresses",
|
||||||
new SqlParameter("@PackageID", packageId),
|
new SqlParameter("@PackageID", packageId),
|
||||||
|
new SqlParameter("@OrgID", orgId),
|
||||||
new SqlParameter("@PoolId", poolId),
|
new SqlParameter("@PoolId", poolId),
|
||||||
new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)),
|
new SqlParameter("@FilterColumn", VerifyColumnName(filterColumn)),
|
||||||
new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)),
|
new SqlParameter("@FilterValue", VerifyColumnValue(filterValue)),
|
||||||
|
@ -3266,12 +3268,13 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region VPS - External Network Adapter
|
#region VPS - External Network Adapter
|
||||||
public static IDataReader GetPackageUnassignedIPAddresses(int actorId, int packageId, int poolId)
|
public static IDataReader GetPackageUnassignedIPAddresses(int actorId, int packageId, int orgId, int poolId)
|
||||||
{
|
{
|
||||||
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
|
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
|
||||||
"GetPackageUnassignedIPAddresses",
|
"GetPackageUnassignedIPAddresses",
|
||||||
new SqlParameter("@ActorID", actorId),
|
new SqlParameter("@ActorID", actorId),
|
||||||
new SqlParameter("@PackageID", packageId),
|
new SqlParameter("@PackageID", packageId),
|
||||||
|
new SqlParameter("@OrgID", orgId),
|
||||||
new SqlParameter("@PoolId", poolId));
|
new SqlParameter("@PoolId", poolId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1161,13 +1161,13 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Package IP Addresses
|
#region Package IP Addresses
|
||||||
public static PackageIPAddressesPaged GetPackageIPAddresses(int packageId, IPAddressPool pool,
|
public static PackageIPAddressesPaged GetPackageIPAddresses(int packageId, int orgId, IPAddressPool pool,
|
||||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive)
|
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive)
|
||||||
{
|
{
|
||||||
PackageIPAddressesPaged result = new PackageIPAddressesPaged();
|
PackageIPAddressesPaged result = new PackageIPAddressesPaged();
|
||||||
|
|
||||||
// get reader
|
// get reader
|
||||||
IDataReader reader = DataProvider.GetPackageIPAddresses(packageId, (int)pool, filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive);
|
IDataReader reader = DataProvider.GetPackageIPAddresses(packageId, orgId, (int)pool, filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive);
|
||||||
|
|
||||||
// number of items = first data reader
|
// number of items = first data reader
|
||||||
reader.Read();
|
reader.Read();
|
||||||
|
@ -1190,10 +1190,15 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
DataProvider.GetUnallottedIPAddresses(packageId, serviceId, (int)pool));
|
DataProvider.GetUnallottedIPAddresses(packageId, serviceId, (int)pool));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<PackageIPAddress> GetPackageUnassignedIPAddresses(int packageId, IPAddressPool pool)
|
public static List<PackageIPAddress> GetPackageUnassignedIPAddresses(int packageId, int orgId, IPAddressPool pool)
|
||||||
{
|
{
|
||||||
return ObjectUtils.CreateListFromDataReader<PackageIPAddress>(
|
return ObjectUtils.CreateListFromDataReader<PackageIPAddress>(
|
||||||
DataProvider.GetPackageUnassignedIPAddresses(SecurityContext.User.UserId, packageId, (int)pool));
|
DataProvider.GetPackageUnassignedIPAddresses(SecurityContext.User.UserId, packageId, orgId, (int)pool));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<PackageIPAddress> GetPackageUnassignedIPAddresses(int packageId, IPAddressPool pool)
|
||||||
|
{
|
||||||
|
return GetPackageUnassignedIPAddresses(packageId, 0, pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void AllocatePackageIPAddresses(int packageId, int[] addressId)
|
public static void AllocatePackageIPAddresses(int packageId, int[] addressId)
|
||||||
|
@ -1202,10 +1207,10 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
string xml = PrepareIPsXML(addressId);
|
string xml = PrepareIPsXML(addressId);
|
||||||
|
|
||||||
// save to database
|
// save to database
|
||||||
DataProvider.AllocatePackageIPAddresses(packageId, xml);
|
DataProvider.AllocatePackageIPAddresses(packageId, 0, xml);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ResultObject AllocatePackageIPAddresses(int packageId, string groupName, IPAddressPool pool, bool allocateRandom, int addressesNumber, int[] addressId)
|
public static ResultObject AllocatePackageIPAddresses(int packageId, int orgId, string groupName, IPAddressPool pool, bool allocateRandom, int addressesNumber, int[] addressId)
|
||||||
{
|
{
|
||||||
#region Check account and space statuses
|
#region Check account and space statuses
|
||||||
// create result object
|
// create result object
|
||||||
|
@ -1282,7 +1287,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
// save to database
|
// save to database
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
DataProvider.AllocatePackageIPAddresses(packageId, xml);
|
DataProvider.AllocatePackageIPAddresses(packageId, orgId, xml);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -1329,7 +1334,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
|
|
||||||
// allocate
|
// allocate
|
||||||
return AllocatePackageIPAddresses(packageId, groupName, pool,
|
return AllocatePackageIPAddresses(packageId, 0, groupName, pool,
|
||||||
true, number, new int[0]);
|
true, number, new int[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -386,24 +386,24 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
}
|
}
|
||||||
|
|
||||||
[WebMethod]
|
[WebMethod]
|
||||||
public PackageIPAddressesPaged GetPackageIPAddresses(int packageId, IPAddressPool pool,
|
public PackageIPAddressesPaged GetPackageIPAddresses(int packageId, int orgId, IPAddressPool pool,
|
||||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive)
|
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows, bool recursive)
|
||||||
{
|
{
|
||||||
return ServerController.GetPackageIPAddresses(packageId, pool,
|
return ServerController.GetPackageIPAddresses(packageId, orgId, pool,
|
||||||
filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive);
|
filterColumn, filterValue, sortColumn, startRow, maximumRows, recursive);
|
||||||
}
|
}
|
||||||
|
|
||||||
[WebMethod]
|
[WebMethod]
|
||||||
public List<PackageIPAddress> GetPackageUnassignedIPAddresses(int packageId, IPAddressPool pool)
|
public List<PackageIPAddress> GetPackageUnassignedIPAddresses(int packageId, int orgId, IPAddressPool pool)
|
||||||
{
|
{
|
||||||
return ServerController.GetPackageUnassignedIPAddresses(packageId, pool);
|
return ServerController.GetPackageUnassignedIPAddresses(packageId, orgId, pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
[WebMethod]
|
[WebMethod]
|
||||||
public ResultObject AllocatePackageIPAddresses(int packageId, string groupName, IPAddressPool pool, bool allocateRandom, int addressesNumber,
|
public ResultObject AllocatePackageIPAddresses(int packageId,int orgId, string groupName, IPAddressPool pool, bool allocateRandom, int addressesNumber,
|
||||||
int[] addressId)
|
int[] addressId)
|
||||||
{
|
{
|
||||||
return ServerController.AllocatePackageIPAddresses(packageId, groupName, pool, allocateRandom,
|
return ServerController.AllocatePackageIPAddresses(packageId, orgId, groupName, pool, allocateRandom,
|
||||||
addressesNumber, addressId);
|
addressesNumber, addressId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,7 +108,7 @@ namespace WebsitePanel.Portal
|
||||||
public PackageIPAddress[] GetPackageIPAddresses(int packageId, IPAddressPool pool, string filterColumn, string filterValue,
|
public PackageIPAddress[] GetPackageIPAddresses(int packageId, IPAddressPool pool, string filterColumn, string filterValue,
|
||||||
string sortColumn, int maximumRows, int startRowIndex)
|
string sortColumn, int maximumRows, int startRowIndex)
|
||||||
{
|
{
|
||||||
packageAddresses = ES.Services.Servers.GetPackageIPAddresses(packageId, pool,
|
packageAddresses = ES.Services.Servers.GetPackageIPAddresses(packageId, 0, pool,
|
||||||
filterColumn, filterValue, sortColumn, startRowIndex, maximumRows, true);
|
filterColumn, filterValue, sortColumn, startRowIndex, maximumRows, true);
|
||||||
return packageAddresses.Items;
|
return packageAddresses.Items;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ namespace WebsitePanel.Portal
|
||||||
public PackageIPAddress[] GetPackageIPAddresses(int packageId, IPAddressPool pool, string filterColumn, string filterValue,
|
public PackageIPAddress[] GetPackageIPAddresses(int packageId, IPAddressPool pool, string filterColumn, string filterValue,
|
||||||
string sortColumn, int maximumRows, int startRowIndex)
|
string sortColumn, int maximumRows, int startRowIndex)
|
||||||
{
|
{
|
||||||
packageAddresses = ES.Services.Servers.GetPackageIPAddresses(packageId, pool,
|
packageAddresses = ES.Services.Servers.GetPackageIPAddresses(packageId, 0, pool,
|
||||||
filterColumn, filterValue, sortColumn, startRowIndex, maximumRows, true);
|
filterColumn, filterValue, sortColumn, startRowIndex, maximumRows, true);
|
||||||
return packageAddresses.Items;
|
return packageAddresses.Items;
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,19 @@ namespace WebsitePanel.Portal
|
||||||
{
|
{
|
||||||
return packageAddresses.Count;
|
return packageAddresses.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PackageIPAddress[] GetPackageIPAddresses(int packageId, int orgId, IPAddressPool pool, string filterColumn, string filterValue,
|
||||||
|
string sortColumn, int maximumRows, int startRowIndex)
|
||||||
|
{
|
||||||
|
packageAddresses = ES.Services.Servers.GetPackageIPAddresses(packageId, orgId, pool,
|
||||||
|
filterColumn, filterValue, sortColumn, startRowIndex, maximumRows, true);
|
||||||
|
return packageAddresses.Items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetPackageIPAddressesCount(int packageId, int orgId, IPAddressPool pool, string filterColumn, string filterValue)
|
||||||
|
{
|
||||||
|
return packageAddresses.Count;
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Package Private IP Addresses
|
#region Package Private IP Addresses
|
||||||
|
|
|
@ -32,7 +32,7 @@
|
||||||
<wsp:AllocatePackagePhoneNumbers id="allocatePhoneNumbers" runat="server"
|
<wsp:AllocatePackagePhoneNumbers id="allocatePhoneNumbers" runat="server"
|
||||||
Pool="PhoneNumbers"
|
Pool="PhoneNumbers"
|
||||||
ResourceGroup="Web"
|
ResourceGroup="Web"
|
||||||
ListAddressesControl="" />
|
ListAddressesControl="lync_phonenumbers" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace WebsitePanel.Portal.Lync
|
||||||
private void BindPhoneNumbers()
|
private void BindPhoneNumbers()
|
||||||
{
|
{
|
||||||
|
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.PhoneNumbers);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, PanelRequest.ItemID, IPAddressPool.PhoneNumbers);
|
||||||
|
|
||||||
if (ips.Length > 0)
|
if (ips.Length > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace WebsitePanel.Portal.Lync
|
||||||
|
|
||||||
private void BindPhoneNumbers()
|
private void BindPhoneNumbers()
|
||||||
{
|
{
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.PhoneNumbers);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, PanelRequest.ItemID, IPAddressPool.PhoneNumbers);
|
||||||
|
|
||||||
if (ips.Length > 0)
|
if (ips.Length > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle"></asp:Localize>
|
<asp:Localize ID="locTitle" runat="server" meta:resourcekey="locTitle"></asp:Localize>
|
||||||
</div>
|
</div>
|
||||||
<div class="FormBody">
|
<div class="FormBody">
|
||||||
<wsp:PackagePhoneNumbers id="webAddresses" runat="server"
|
<wsp:PackagePhoneNumbers id="phoneNumbers" runat="server"
|
||||||
Pool="PhoneNumbers"
|
Pool="PhoneNumbers"
|
||||||
EditItemControl=""
|
EditItemControl=""
|
||||||
SpaceHomeControl=""
|
SpaceHomeControl=""
|
||||||
|
@ -43,7 +43,7 @@
|
||||||
<table cellspacing="6">
|
<table cellspacing="6">
|
||||||
<tr>
|
<tr>
|
||||||
<td><asp:Localize ID="locIPQuota" runat="server" meta:resourcekey="locIPQuota" Text="Number of Phone Numbes:"></asp:Localize></td>
|
<td><asp:Localize ID="locIPQuota" runat="server" meta:resourcekey="locIPQuota" Text="Number of Phone Numbes:"></asp:Localize></td>
|
||||||
<td><wsp:Quota ID="addressesQuota" runat="server" QuotaName="Lync.PhoneNumbers" /></td>
|
<td><wsp:Quota ID="phoneQuota" runat="server" QuotaName="Lync.PhoneNumbers" /></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
|
|
@ -56,5 +56,50 @@ namespace WebsitePanel.Portal.Lync {
|
||||||
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.Localize locTitle;
|
protected global::System.Web.UI.WebControls.Localize locTitle;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// phoneNumbers элемент управления.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Автоматически создаваемое поле.
|
||||||
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::WebsitePanel.Portal.UserControls.PackagePhoneNumbers phoneNumbers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// secQuotas элемент управления.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Автоматически создаваемое поле.
|
||||||
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::WebsitePanel.Portal.CollapsiblePanel secQuotas;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// QuotasPanel элемент управления.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Автоматически создаваемое поле.
|
||||||
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::System.Web.UI.WebControls.Panel QuotasPanel;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// locIPQuota элемент управления.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Автоматически создаваемое поле.
|
||||||
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::System.Web.UI.WebControls.Localize locIPQuota;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// phoneQuota элемент управления.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Автоматически создаваемое поле.
|
||||||
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
/// </remarks>
|
||||||
|
protected global::WebsitePanel.Portal.Quota phoneQuota;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ using WebsitePanel.Providers.Common;
|
||||||
|
|
||||||
namespace WebsitePanel.Portal.UserControls
|
namespace WebsitePanel.Portal.UserControls
|
||||||
{
|
{
|
||||||
public partial class AllocatePackagePhoneNumbers : WebsitePanelControlBase
|
public partial class AllocatePackagePhoneNumbers : WebsitePanelModuleBase
|
||||||
{
|
{
|
||||||
private IPAddressPool pool;
|
private IPAddressPool pool;
|
||||||
public IPAddressPool Pool
|
public IPAddressPool Pool
|
||||||
|
@ -129,6 +129,7 @@ namespace WebsitePanel.Portal.UserControls
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultObject res = ES.Services.Servers.AllocatePackageIPAddresses(PanelSecurity.PackageId,
|
ResultObject res = ES.Services.Servers.AllocatePackageIPAddresses(PanelSecurity.PackageId,
|
||||||
|
PanelRequest.ItemID,
|
||||||
ResourceGroup, Pool,
|
ResourceGroup, Pool,
|
||||||
radioExternalRandom.Checked,
|
radioExternalRandom.Checked,
|
||||||
Utils.ParseInt(txtExternalAddressesNumber.Text),
|
Utils.ParseInt(txtExternalAddressesNumber.Text),
|
||||||
|
@ -136,7 +137,8 @@ namespace WebsitePanel.Portal.UserControls
|
||||||
if (res.IsSuccess)
|
if (res.IsSuccess)
|
||||||
{
|
{
|
||||||
// return back
|
// return back
|
||||||
Response.Redirect(HostModule.EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), ListAddressesControl));
|
Response.Redirect(HostModule.EditUrl("ItemID", PanelRequest.ItemID.ToString(), ListAddressesControl,
|
||||||
|
PortalUtils.SPACE_ID_PARAM + "=" + PanelSecurity.PackageId));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -129,6 +129,7 @@ namespace WebsitePanel.Portal.UserControls
|
||||||
}
|
}
|
||||||
|
|
||||||
ResultObject res = ES.Services.Servers.AllocatePackageIPAddresses(PanelSecurity.PackageId,
|
ResultObject res = ES.Services.Servers.AllocatePackageIPAddresses(PanelSecurity.PackageId,
|
||||||
|
0,
|
||||||
ResourceGroup, Pool,
|
ResourceGroup, Pool,
|
||||||
radioExternalRandom.Checked,
|
radioExternalRandom.Checked,
|
||||||
Utils.ParseInt(txtExternalAddressesNumber.Text),
|
Utils.ParseInt(txtExternalAddressesNumber.Text),
|
||||||
|
|
|
@ -73,7 +73,8 @@
|
||||||
OnSelected="odsExternalAddressesPaged_Selected"
|
OnSelected="odsExternalAddressesPaged_Selected"
|
||||||
onselecting="odsExternalAddressesPaged_Selecting">
|
onselecting="odsExternalAddressesPaged_Selecting">
|
||||||
<SelectParameters>
|
<SelectParameters>
|
||||||
<asp:QueryStringParameter Name="packageId" QueryStringField="SpaceID" DefaultValue="0" />
|
<asp:QueryStringParameter Name="packageId" QueryStringField="SpaceID" DefaultValue="0" />
|
||||||
|
<asp:QueryStringParameter Name="orgId" QueryStringField="ItemID" DefaultValue="0" />
|
||||||
<asp:Parameter Name="pool" DefaultValue="0" />
|
<asp:Parameter Name="pool" DefaultValue="0" />
|
||||||
<asp:ControlParameter Name="filterColumn" ControlID="searchBox" PropertyName="FilterColumn" />
|
<asp:ControlParameter Name="filterColumn" ControlID="searchBox" PropertyName="FilterColumn" />
|
||||||
<asp:ControlParameter Name="filterValue" ControlID="searchBox" PropertyName="FilterValue" />
|
<asp:ControlParameter Name="filterValue" ControlID="searchBox" PropertyName="FilterValue" />
|
||||||
|
|
|
@ -118,7 +118,8 @@ namespace WebsitePanel.Portal.UserControls
|
||||||
|
|
||||||
protected void btnAllocateAddress_Click(object sender, EventArgs e)
|
protected void btnAllocateAddress_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Response.Redirect(HostModule.EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), AllocateAddressesControl));
|
Response.Redirect(HostModule.EditUrl("ItemID", PanelRequest.ItemID.ToString(), AllocateAddressesControl,
|
||||||
|
PortalUtils.SPACE_ID_PARAM + "=" + PanelSecurity.PackageId));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void gvAddresses_RowDataBound(object sender, GridViewRowEventArgs e)
|
protected void gvAddresses_RowDataBound(object sender, GridViewRowEventArgs e)
|
||||||
|
|
|
@ -1,39 +1,10 @@
|
||||||
// Copyright (c) 2011, Outercurve Foundation.
|
//------------------------------------------------------------------------------
|
||||||
// All rights reserved.
|
// <автоматически создаваемое>
|
||||||
|
// Этот код создан программой.
|
||||||
//
|
//
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
|
||||||
// are permitted provided that the following conditions are met:
|
// повторной генерации кода.
|
||||||
//
|
// </автоматически создаваемое>
|
||||||
// - Redistributions of source code must retain the above copyright notice, this
|
|
||||||
// list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// - Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
//
|
|
||||||
// - Neither the name of the Outercurve Foundation nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from this
|
|
||||||
// software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by a tool.
|
|
||||||
// Runtime Version:2.0.50727.3074
|
|
||||||
//
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if
|
|
||||||
// the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace WebsitePanel.Portal.UserControls {
|
namespace WebsitePanel.Portal.UserControls {
|
||||||
|
@ -42,62 +13,56 @@ namespace WebsitePanel.Portal.UserControls {
|
||||||
public partial class PackagePhoneNumbers {
|
public partial class PackagePhoneNumbers {
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// messageBox control.
|
/// messageBox элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
|
protected global::WebsitePanel.Portal.UserControls.SimpleMessageBox messageBox;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// btnAllocateAddress control.
|
/// btnAllocateAddress элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.Button btnAllocateAddress;
|
protected global::System.Web.UI.WebControls.Button btnAllocateAddress;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// searchBox control.
|
/// searchBox элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::WebsitePanel.Portal.SearchBox searchBox;
|
protected global::WebsitePanel.Portal.SearchBox searchBox;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// gvAddresses control.
|
/// gvAddresses элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.GridView gvAddresses;
|
protected global::System.Web.UI.WebControls.GridView gvAddresses;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// odsExternalAddressesPaged control.
|
/// odsExternalAddressesPaged элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.ObjectDataSource odsExternalAddressesPaged;
|
protected global::System.Web.UI.WebControls.ObjectDataSource odsExternalAddressesPaged;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// btnDeallocateAddresses control.
|
/// btnDeallocateAddresses элемент управления.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Auto-generated field.
|
/// Автоматически создаваемое поле.
|
||||||
/// To modify move field declaration from designer file to code-behind file.
|
/// Для изменения переместите объявление поля из файла конструктора в файл кода программной части.
|
||||||
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
protected global::System.Web.UI.WebControls.Button btnDeallocateAddresses;
|
protected global::System.Web.UI.WebControls.Button btnDeallocateAddresses;
|
||||||
}
|
}
|
||||||
|
|
|
@ -117,7 +117,7 @@ namespace WebsitePanel.Portal.VPS
|
||||||
if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS_EXTERNAL_NETWORK_ENABLED))
|
if (PackagesHelper.IsQuotaEnabled(PanelSecurity.PackageId, Quotas.VPS_EXTERNAL_NETWORK_ENABLED))
|
||||||
{
|
{
|
||||||
// bind list
|
// bind list
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.VpsExternalNetwork);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.VpsExternalNetwork);
|
||||||
foreach (PackageIPAddress ip in ips)
|
foreach (PackageIPAddress ip in ips)
|
||||||
{
|
{
|
||||||
string txt = ip.ExternalIP;
|
string txt = ip.ExternalIP;
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace WebsitePanel.Portal.VPS
|
||||||
|
|
||||||
private void BindExternalIPAddresses()
|
private void BindExternalIPAddresses()
|
||||||
{
|
{
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.VpsExternalNetwork);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.VpsExternalNetwork);
|
||||||
foreach (PackageIPAddress ip in ips)
|
foreach (PackageIPAddress ip in ips)
|
||||||
{
|
{
|
||||||
string txt = ip.ExternalIP;
|
string txt = ip.ExternalIP;
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace WebsitePanel.Portal.VPSForPC
|
||||||
|
|
||||||
private void BindExternalIPAddresses()
|
private void BindExternalIPAddresses()
|
||||||
{
|
{
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.VpsExternalNetwork);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.VpsExternalNetwork);
|
||||||
foreach (PackageIPAddress ip in ips)
|
foreach (PackageIPAddress ip in ips)
|
||||||
{
|
{
|
||||||
string txt = ip.ExternalIP;
|
string txt = ip.ExternalIP;
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace WebsitePanel.Portal
|
||||||
{
|
{
|
||||||
ddlIpAddresses.Items.Add(new ListItem("<Select IP>", ""));
|
ddlIpAddresses.Items.Add(new ListItem("<Select IP>", ""));
|
||||||
|
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, IPAddressPool.WebSites);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(PanelSecurity.PackageId, 0, IPAddressPool.WebSites);
|
||||||
foreach (PackageIPAddress ip in ips)
|
foreach (PackageIPAddress ip in ips)
|
||||||
{
|
{
|
||||||
string fullIP = ip.ExternalIP;
|
string fullIP = ip.ExternalIP;
|
||||||
|
|
|
@ -179,7 +179,7 @@ namespace WebsitePanel.Portal
|
||||||
|
|
||||||
// bind unassigned IP addresses
|
// bind unassigned IP addresses
|
||||||
ddlIpAddresses.Items.Clear();
|
ddlIpAddresses.Items.Clear();
|
||||||
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(site.PackageId, IPAddressPool.WebSites);
|
PackageIPAddress[] ips = ES.Services.Servers.GetPackageUnassignedIPAddresses(site.PackageId, 0, IPAddressPool.WebSites);
|
||||||
foreach (PackageIPAddress ip in ips)
|
foreach (PackageIPAddress ip in ips)
|
||||||
{
|
{
|
||||||
string fullIP = ip.ExternalIP;
|
string fullIP = ip.ExternalIP;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue