USE [sophos4]
GO
/****** Object: UserDefinedFunction [dbo].[ExtractTextSegments] Script Date: 10/30/2009 09:32:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER FUNCTION [dbo].[ExtractTextSegments]
(
@in NTEXT,
@left NVARCHAR(256),
@right NVARCHAR(256)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @Ret NVARCHAR(MAX);
SET @Ret = '';
DECLARE @offset INT, @start INT, @end INT, @rightlen INT;
SELECT @offset=1,
@start=0,
@end=0,
@rightlen = LEN(@right);
WHILE 1=1
BEGIN
SELECT @start = PATINDEX('%'+@left+'%',SUBSTRING(@in,@offset,4000)),
@end = PATINDEX('%'+@right+'%',SUBSTRING(@in,@offset,4000));
if COALESCE(@start,0) = 0 OR COALESCE(@end,0) = 0
BEGIN
break;
END
SELECT @Ret = @Ret + SUBSTRING(@in,@offset+@start-1,@end-@start+@rightlen),
@offset = @offset + @end + @rightlen - 1;
END
RETURN @Ret;
END
GO
USE [sophos4]
GO
/****** Object: StoredProcedure [dbo].[ReportRun_UpdateConfiguration] Script Date: 10/30/2009 09:36:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ReportRun_UpdateConfiguration]
@RowsetFilter INT = 0
AS BEGIN
SET NOCOUNT ON;
DECLARE @DefaultPolicyTag NVARCHAR(64)
SET @DefaultPolicyTag = N'*Default*'
DECLARE @PolicyID INT, @xml NVARCHAR(MAX), @ComputerID INT;
if OBJECT_ID('tempdb..#XMLParserOutput') IS NOT NULL
BEGIN
DROP TABLE #XMLParserOutput;
END;
CREATE TABLE #XMLParserOutput
(
Source nvarchar(512) COLLATE DATABASE_DEFAULT,
Value1 NVARCHAR(1048) COLLATE DATABASE_DEFAULT,
Value2 NVARCHAR(1048) COLLATE DATABASE_DEFAULT,
Value3 NVARCHAR(1048) COLLATE DATABASE_DEFAULT,
RN INT IDENTITY(1,1)
);
DECLARE @UpstreamPolicyLocations TABLE
(
PolicyID INT,
Location NVARCHAR(1024),
Position INT
);
DECLARE curUpstream CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT ID, PolicyXML FROM dbo.Policies WHERE Type=9;
OPEN curUpstream;
FETCH NEXT FROM curUpstream INTO @PolicyID, @xml;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM #XMLParserOutput
INSERT INTO #XMLParserOutput EXEC dbo.XMLParser3V @xml,
@PolicyID ,
'' ,
'//c:sourceSite[not(c:custom)]',
'.//@uri',
'@searchOrder'
INSERT INTO @UpstreamPolicyLocations SELECT Source,Value1,Value2 FROM #XMLParserOutput
FETCH NEXT FROM curUpstream INTO @PolicyID, @xml
END;
CLOSE curUpstream;
DEALLOCATE curUpstream;
DECLARE @DownstreamPolicyLocations TABLE
(
PolicyID INT,
Location NVARCHAR(1024),
Position INT
);
DECLARE curDownstream CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT ID, PolicyXML FROM dbo.Policies WHERE Type=10;
OPEN curDownstream;
FETCH NEXT FROM curDownstream INTO @PolicyID, @xml;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM #XMLParserOutput;
INSERT INTO #XMLParserOutput EXEC dbo.XMLParser3V @xml,
@PolicyID ,
'' ,
'//c:targetSite[not(c:custom)]',
'.//@uri';
INSERT INTO @DownstreamPolicyLocations SELECT Source,Value1,0 FROM #XMLParserOutput;
FETCH NEXT FROM curDownstream INTO @PolicyID, @xml;
END
CLOSE curDownstream;
DEALLOCATE curDownstream;
INSERT INTO @DownstreamPolicyLocations
SELECT p.ID, N'\\'+c.Name+N'\SophosUpdate' , 0
FROM dbo.Policies p
INNER JOIN dbo.ComputerPolicyMapping cpm ON p.ID=cpm.PolicyID
INNER JOIN dbo.AliveComputers c ON cpm.ComputerID=c.ID
WHERE p.Type=10;
DECLARE @UpdatePolicyLocations TABLE
(
PolicyID INT,
Location NVARCHAR(1024),
Position INT
);
DECLARE curUpdate CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT ID, PolicyXML FROM dbo.Policies WHERE Type=18;
OPEN curUpdate;
FETCH NEXT FROM curUpdate INTO @PolicyID, @xml;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM #XMLParserOutput;
INSERT INTO #XMLParserOutput EXEC dbo.XMLParser3V @xml,
@PolicyID ,
'' ,
'//u:sourceSite',
'.//@uri',
'@searchOrder';
INSERT INTO @UpdatePolicyLocations SELECT Source,Value1,Value2 FROM #XMLParserOutput;
FETCH NEXT FROM curUpdate INTO @PolicyID, @xml;
END;
CLOSE curUpdate;
DEALLOCATE curUpdate;
DECLARE @LegacyUpdatePolicyLocations TABLE
(
PolicyID INT,
Location NVARCHAR(1024),
Position INT
);
DECLARE curLegacyUpdate CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT ID, N'' + dbo.ExtractTextSegments(PolicyXML, '', '' ) +
dbo.ExtractTextSegments(PolicyXML, '', '' ) + N''
FROM dbo.Policies
WHERE Type=1 AND Name NOT LIKE N'*%';
OPEN curLegacyUpdate;
FETCH NEXT FROM curLegacyUpdate INTO @PolicyID, @xml;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM #XMLParserOutput;
INSERT INTO #XMLParserOutput EXEC dbo.XMLParser3V @xml,
@PolicyID ,
'' ,
'//server',
'./@ConnectionAddress',
'./parent::primary_location',
'./parent::secondary_location';
INSERT INTO @LegacyUpdatePolicyLocations SELECT Source,Value1,
CASE WHEN Value3 IS NOT NULL THEN 2
WHEN Value2 IS NOT NULL THEN 1
ELSE 0
END
FROM #XMLParserOutput WHERE Value1<>N'';
FETCH NEXT FROM curLegacyUpdate INTO @PolicyID, @xml;
END
CLOSE curLegacyUpdate;
DEALLOCATE curLegacyUpdate;
DECLARE @EMLibraryCIDPaths TABLE
(
ComputerID INT,
CIDpath NVARCHAR(1024)
);
DECLARE curEML CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
SELECT ComputerID, N''+dbo.ExtractTextSegments(StatusXML,N'',N'')+N'' FROM dbo.EMLibraryServers;
OPEN curEML;
FETCH NEXT FROM curEML INTO @ComputerID, @xml;
WHILE @@FETCH_STATUS = 0
BEGIN
DELETE FROM #XMLParserOutput;
INSERT INTO #XMLParserOutput EXEC dbo.XMLParser3V @xml,
@ComputerID ,
'' ,
'//path';
INSERT INTO @EMLibraryCIDPaths SELECT Source,Value1 FROM #XMLParserOutput;
FETCH NEXT FROM curEML INTO @ComputerID, @xml;
END;
CLOSE curEML;
DEALLOCATE curEML;
if OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual1') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual1
(
ComputerHost NVARCHAR(512),
Share NVARCHAR(1024),
LocationListPosition INT,
DomainName NVARCHAR(512),
DNSName NVARCHAR(512),
IPAddress BIGINT,
RN INT IDENTITY(1,1)
);
END ;
IF @RowsetFilter = 0 OR @RowsetFilter = 1
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual1;
INSERT INTO #ReportRun_UpdateConfiguration_actual1 (ComputerHost,Share,LocationListPosition,DomainName,DNSName,IPAddress)
SELECT c.Name AS ComputerHost,
pl.Location AS Share,
pl.Position AS LocationListPosition,
COALESCE(c.DomainName,N'') AS DomainName,
COALESCE(c.DNSName,N'') AS DNSName,
COALESCE(c.IPAddress,0) AS IPAddress
FROM @UpstreamPolicyLocations pl
INNER JOIN dbo.ComputerPolicyMapping cpm ON pl.PolicyID = cpm.PolicyID
INNER JOIN dbo.AliveComputers c ON c.ID = cpm.ComputerID
WHERE cpm.Type = 9
ORDER BY c.Name, pl.Position;
SELECT * FROM #ReportRun_UpdateConfiguration_actual1 ORDER BY RN;
END;
IF OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual2') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual2
(
ComputerHost NVARCHAR(512),
Share NVARCHAR(1024),
EndpointsUsing1 INT,
EndpointsUsing2 INT,
DomainName NVARCHAR(512),
DNSName NVARCHAR(512),
IPAddress BIGINT,
RN INT IDENTITY(1,1)
);
END;
IF @RowsetFilter = 0 OR @RowsetFilter = 2
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual2;
INSERT INTO #ReportRun_UpdateConfiguration_actual2 (ComputerHost,Share,EndpointsUsing1,EndpointsUsing2,DomainName,DNSName,IPAddress)
SELECT COALESCE(c.Name,N'') AS ComputerHost,
COALESCE(upd2.Location,down.Location,N'') AS Share,
COALESCE(upd2.EndpointsUsing1,0) AS EndpointsUsing1,
COALESCE(upd2.EndpointsUsing2,0) AS EndpointsUsing2,
COALESCE(c.DomainName,N'') AS DomainName,
COALESCE(c.DNSName,N'') AS DNSName,
COALESCE(c.IPAddress,0) AS IPAddress
FROM
(
SELECT upd1.Location,SUM(upd1.EndpointsUsing1) AS EndpointsUsing1,SUM(upd1.EndpointsUsing2) AS EndpointsUsing2
FROM (
SELECT upd.PolicyID AS PolicyID,
upd.Location AS Location,
upd.Position AS Position,
CASE WHEN upd.Position = 1 THEN ISNULL(endp1.EndpointsUsing,0) ELSE 0 END AS EndpointsUsing1,
CASE WHEN upd.Position = 2 THEN ISNULL(endp1.EndpointsUsing,0) ELSE 0 END AS EndpointsUsing2
FROM @UpdatePolicyLocations upd
LEFT OUTER JOIN (SELECT p.ID AS PolicyID, count(cpm.PolicyID) AS EndpointsUsing
FROM dbo.Policies p LEFT OUTER JOIN
dbo.ComputerPolicyMapping cpm ON p.ID=cpm.PolicyID
WHERE cpm.Type = 18 AND
cpm.ComputerID IN (SELECT ComputerID FROM dbo.ComputerPolicyMapping WHERE PolicyID IN (SELECT ID FROM dbo.Policies WHERE Type=1 AND Name LIKE N'*%' ))
GROUP BY p.ID) endp1 ON endp1.PolicyID = upd.PolicyID
) upd1
GROUP BY Location
) upd2
FULL OUTER JOIN @DownstreamPolicyLocations down ON down.Location = upd2.Location
LEFT OUTER JOIN dbo.ComputerPolicyMapping cpm ON down.PolicyID = cpm.PolicyID
LEFT OUTER JOIN dbo.AliveComputers c ON c.ID = cpm.ComputerID
ORDER BY COALESCE(c.Name,N''), COALESCE(upd2.Location,down.Location,N'');
SELECT * FROM #ReportRun_UpdateConfiguration_actual2 ORDER BY RN;
END
if OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual3') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual3
(
ComputerHost NVARCHAR(512),
Share NVARCHAR(1024),
PolicyName NVARCHAR(512),
LocationListPosition INT,
DomainName NVARCHAR(512),
DNSName NVARCHAR(512),
IPAddress BIGINT,
RN INT IDENTITY(1,1)
);
END;
IF @RowsetFilter = 0 OR @RowsetFilter = 3
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual3;
INSERT INTO #ReportRun_UpdateConfiguration_actual3 (ComputerHost,Share,PolicyName,LocationListPosition,DomainName,DNSName,IPAddress)
SELECT COALESCE(c.Name,N'') AS ComputerHost,
COALESCE(upd.Location,down.Location,'') AS Share,
CASE WHEN def.Value IS NULL THEN COALESCE(p.Name,'') ELSE @DefaultPolicyTag END AS PolicyName,
COALESCE(upd.Position,0) AS LocationListPosition,
COALESCE(c.DomainName,N'') AS DomainName,
COALESCE(c.DNSName,N'') AS DNSName,
COALESCE(c.IPAddress,0) AS IPAddress
FROM @UpdatePolicyLocations upd
INNER JOIN dbo.Policies p ON upd.PolicyID = p.ID
FULL OUTER JOIN @DownstreamPolicyLocations down ON upd.Location = down.Location
LEFT OUTER JOIN dbo.ComputerPolicyMapping cpmdown ON down.PolicyID = cpmdown.PolicyID
LEFT OUTER JOIN dbo.AliveComputers c ON c.ID = cpmdown.ComputerID
LEFT OUTER JOIN dbo.Defaults def ON p.ID=def.Value
ORDER BY COALESCE(upd.Location,down.Location,''), COALESCE(c.Name,N''),COALESCE(p.Name,'');
SELECT * FROM #ReportRun_UpdateConfiguration_actual3 ORDER BY RN;
END;
if OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual4') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual4
(
PolicyName NVARCHAR(512),
GroupName NVARCHAR(512),
GroupPath NVARCHAR(2048),
NumberOfEndpoints INT,
RN INT IDENTITY(1,1)
);
END;
IF @RowsetFilter = 0 OR @RowsetFilter = 4
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual4;
INSERT INTO #ReportRun_UpdateConfiguration_actual4 (PolicyName,GroupName,GroupPath,NumberOfEndpoints)
SELECT CASE WHEN def.Value IS NULL THEN COALESCE(p.Name,'') ELSE @DefaultPolicyTag END AS PolicyName,
COALESCE(g.Name,N'') AS GroupName,
COALESCE(gp.PathAndName,N'') AS GroupPath,
COALESCE(endp.NumberOfEndpoints,0) AS NumberOfEndpoints
FROM dbo.Policies p
LEFT OUTER JOIN dbo.GroupPolicyMapping gpm ON p.ID=gpm.PolicyID
LEFT OUTER JOIN dbo.Groups g ON gpm.GroupID=g.ID
LEFT OUTER JOIN dbo.GroupPathAndNameTable() gp ON gpm.GroupID=gp.GroupID
LEFT OUTER JOIN (SELECT GroupID, count(*) AS NumberOfEndpoints
FROM dbo.ComputerGroupMapping cpm
GROUP BY GroupID) endp ON endp.GroupID = gpm.GroupID
LEFT OUTER JOIN dbo.Defaults def ON p.ID=def.Value
WHERE p.Type=18 AND
gpm.GroupID IN (SELECT GroupID FROM dbo.GroupPolicyMapping WHERE PolicyID IN (SELECT ID FROM dbo.Policies WHERE Type=1 AND Name LIKE N'*%' ))
ORDER by p.Name, COALESCE(gp.PathAndName,N'');
SELECT * FROM #ReportRun_UpdateConfiguration_actual4 ORDER BY RN;
END
if OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual5') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual5
(
ComputerHost NVARCHAR(512),
Share NVARCHAR(1024),
PolicyName NVARCHAR(512),
LocationListPosition INT,
DomainName NVARCHAR(512),
DNSName NVARCHAR(512),
IPAddress BIGINT,
RN INT IDENTITY(1,1)
);
END;
IF @RowsetFilter = 0 OR @RowsetFilter = 5
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual5;
INSERT INTO #ReportRun_UpdateConfiguration_actual5 (ComputerHost,Share,PolicyName,LocationListPosition,DomainName,DNSName,IPAddress)
SELECT COALESCE(c.Name,N'') AS ComputerHost,
COALESCE(upd.Location,eml.CIDpath,N'') AS Share,
CASE WHEN def.Value IS NULL THEN COALESCE(p.Name,'') ELSE @DefaultPolicyTag END AS PolicyName,
COALESCE(upd.Position,N'') AS LocationListPosition,
COALESCE(c.DomainName,N'') AS DomainName,
COALESCE(c.DNSName,N'') AS DNSName,
COALESCE(c.IPAddress,0) AS IPAddress
FROM @LegacyUpdatePolicyLocations upd
INNER JOIN dbo.Policies p ON upd.PolicyID = p.ID
FULL OUTER JOIN @EMLibraryCIDPaths eml ON upd.Location = eml.CIDpath
LEFT OUTER JOIN dbo.AliveComputers c ON c.ID = eml.ComputerID
LEFT OUTER JOIN dbo.Defaults def ON p.ID=def.Value
ORDER BY COALESCE(upd.Location,eml.CIDpath,N''), COALESCE(p.Name,N'');
SELECT * FROM #ReportRun_UpdateConfiguration_actual5 ORDER BY RN;
END;
if OBJECT_ID('tempdb..#ReportRun_UpdateConfiguration_actual6') IS NULL
BEGIN
CREATE TABLE #ReportRun_UpdateConfiguration_actual6
(
PolicyName NVARCHAR(512),
GroupName NVARCHAR(512),
GroupPath NVARCHAR(2048),
NumberOfEndpoints INT,
RN INT IDENTITY(1,1)
);
END;
IF @RowsetFilter = 0 OR @RowsetFilter = 6
BEGIN
DELETE FROM #ReportRun_UpdateConfiguration_actual6;
INSERT INTO #ReportRun_UpdateConfiguration_actual6 (PolicyName,GroupName,GroupPath,NumberOfEndpoints)
SELECT CASE WHEN def.Value IS NULL THEN COALESCE(p.Name,'') ELSE @DefaultPolicyTag END AS PolicyName,
COALESCE(g.Name,N'') AS GroupName,
COALESCE(gp.PathAndName,N'') AS GroupPath,
COALESCE(endp.NumberOfEndpoints,0) AS NumberOfEndpoints
FROM dbo.Policies p
LEFT OUTER JOIN dbo.GroupPolicyMapping gpm ON p.ID=gpm.PolicyID
LEFT OUTER JOIN dbo.Groups g ON gpm.GroupID=g.ID
LEFT OUTER JOIN dbo.GroupPathAndNameTable() gp ON gpm.GroupID=gp.GroupID
LEFT OUTER JOIN (SELECT GroupID, count(*) AS NumberOfEndpoints
FROM dbo.ComputerGroupMapping cpm GROUP BY GroupID) endp ON endp.GroupID = gpm.GroupID
LEFT OUTER JOIN dbo.Defaults def ON p.ID=def.Value
WHERE p.Type=1 AND p.Name NOT LIKE N'*%'
ORDER by p.Name, COALESCE(gp.PathAndName,N'');
SELECT * FROM #ReportRun_UpdateConfiguration_actual6 ORDER BY RN;
END
if OBJECT_ID('tempdb..#XMLParserOutput') IS NOT NULL
BEGIN
DROP TABLE #XMLParserOutput;
END;
RETURN 0;
END;
GO