261 lines
7.1 KiB
C++
261 lines
7.1 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
lbcnfg.hxx
|
|
|
|
Abstract:
|
|
|
|
Classes to handle IIS load balancing configuration
|
|
|
|
Author:
|
|
|
|
Philippe Choquier (phillich)
|
|
|
|
--*/
|
|
|
|
#if !defined( _LBCNFG_HXX )
|
|
#define _LBCNFG_HXX
|
|
|
|
#if !defined(dllexp)
|
|
#define dllexp __declspec( dllexport )
|
|
#endif
|
|
|
|
#define IISLOADBAL_REGISTRY_KEY "SOFTWARE\\Microsoft\\IISLoadBalancing"
|
|
#define IPLIST_REGISTRY_VALUE "IpList"
|
|
#define PERFMON_REGISTRY_VALUE "Perfmon"
|
|
#define STICKY_REGISTRY_VALUE "StickyDuration"
|
|
|
|
#define IPLIST_VERSION_1 1
|
|
#define IPLIST_VERSION IPLIST_VERSION_1
|
|
|
|
#define PERFLIST_VERSION_1 1
|
|
#define PERFLIST_VERSION PERFLIST_VERSION_1
|
|
|
|
//
|
|
// Private helper classes and functions
|
|
//
|
|
|
|
class CComputerBalanceCnfg {
|
|
public:
|
|
CComputerBalanceCnfg() {}
|
|
~CComputerBalanceCnfg() {}
|
|
BOOL Serialize( CStoreXBF* pX )
|
|
{ return m_ComputerName.Serialize( pX ) &&
|
|
m_IpPrivate.Serialize( pX ) &&
|
|
m_Name.Serialize( pX ); }
|
|
BOOL Unserialize( LPBYTE* ppb, LPDWORD pdw, DWORD dwIpPublic )
|
|
{ return m_ComputerName.Unserialize( ppb, pdw ) &&
|
|
m_IpPrivate.Unserialize( ppb, pdw, dwIpPublic ) &&
|
|
m_Name.Unserialize( ppb, pdw, dwIpPublic ); }
|
|
BOOL Init( LPWSTR pszName, UINT cIpPublic );
|
|
BOOL AddIpPublic()
|
|
{ return m_IpPrivate.AddEntry( L"" )!=INDEX_ERROR &&
|
|
m_Name.AddEntry( L"" )!=INDEX_ERROR; }
|
|
BOOL DeleteIpPublic( UINT iIpPublic )
|
|
{ return m_IpPrivate.DeleteEntry( iIpPublic ) &&
|
|
m_Name.DeleteEntry( iIpPublic ); }
|
|
BOOL SetIpPrivate( UINT iIpPublic, LPWSTR pszIpPrivate, LPWSTR pszName )
|
|
{ return m_IpPrivate.SetEntry( iIpPublic, pszIpPrivate) &&
|
|
m_Name.SetEntry( iIpPublic, pszName ); }
|
|
BOOL GetName( LPWSTR* ppszName )
|
|
{ *ppszName = m_ComputerName.Get(); return TRUE; }
|
|
BOOL GetIpPrivate( UINT iIpPublic, LPWSTR* ppszIpPrivate, LPWSTR* ppszName )
|
|
{ *ppszIpPrivate = m_IpPrivate.GetEntry( iIpPublic );
|
|
*ppszName = m_Name.GetEntry( iIpPublic );
|
|
return *ppszName != NULL && *ppszIpPrivate != NULL; }
|
|
|
|
private:
|
|
CAllocString m_ComputerName;
|
|
CStrPtrXBF m_IpPrivate;
|
|
CStrPtrXBF m_Name;
|
|
} ;
|
|
|
|
|
|
BOOL
|
|
SaveBlobToReg(
|
|
HKEY hKey,
|
|
LPSTR pszRegKey,
|
|
LPSTR pszRegValue,
|
|
CStoreXBF* pX
|
|
);
|
|
|
|
|
|
BOOL
|
|
LoadBlobFromReg(
|
|
HKEY hKey,
|
|
LPSTR pszRegKey,
|
|
LPSTR pszRegValue,
|
|
CStoreXBF* pX
|
|
);
|
|
|
|
//
|
|
// Class giving access to public/private IP addr mapping
|
|
//
|
|
|
|
class CIPMap {
|
|
public:
|
|
dllexp CIPMap();
|
|
dllexp ~CIPMap();
|
|
dllexp VOID Reset();
|
|
|
|
//
|
|
// Serialize all rules info to buffer ( before COM call )
|
|
//
|
|
|
|
dllexp BOOL Serialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer ( using extensible buffer class )
|
|
//
|
|
|
|
dllexp BOOL Unserialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer ( after COM call )
|
|
//
|
|
|
|
dllexp BOOL Unserialize( LPBYTE*, LPDWORD );
|
|
|
|
//
|
|
// Load / save from registry. Should not be used if you access this class through COM
|
|
// and Serialize() / Unserialize()
|
|
//
|
|
|
|
BOOL Load( HKEY hKey, LPSTR pszRegKey, LPSTR pszRegValue );
|
|
BOOL Save( HKEY hKey, LPSTR pszRegKey, LPSTR pszRegValue );
|
|
|
|
public:
|
|
//
|
|
// Server management : Add/Enum/Delete. Enum is 0-based
|
|
// server name should not include leading "\\"
|
|
//
|
|
|
|
dllexp BOOL AddComputer( LPWSTR pszName );
|
|
dllexp BOOL EnumComputer( UINT iComp, LPWSTR* ppszName );
|
|
dllexp DWORD ComputerCount() { return m_Servers.GetNbPtr(); }
|
|
dllexp BOOL DeleteComputer( UINT iComp );
|
|
|
|
//
|
|
// Public IP addr ( a.k.a. NAT resource ) management : Add/Enum/Delete. Enum is 0-based
|
|
// IP addr means IP:port, e.g. 157.56.3.4:80
|
|
//
|
|
|
|
dllexp BOOL AddIpPublic( LPWSTR pszIpPublic, LPWSTR pszName, DWORD dwSticky, DWORD dwAttr );
|
|
dllexp BOOL EnumIpPublic( UINT iIpPublic, LPWSTR* ppszIpPublic, LPWSTR* ppszName, LPDWORD pdwSticky, LPDWORD pdwAttr );
|
|
dllexp DWORD IpPublicCount() { return m_IpPublic.GetNbEntry(); }
|
|
dllexp BOOL DeleteIpPublic( UINT iIpPublic );
|
|
|
|
//
|
|
// Set/Get private IP addr for each (Server, PublicIp) target
|
|
// IP addr means IP:port, e.g. 157.56.3.4:80
|
|
// empty string means no such resource available on specified Server
|
|
//
|
|
|
|
dllexp BOOL SetIpPrivate( UINT iComp, UINT iIpPublic, LPWSTR pszIpPrivate, LPWSTR pszName );
|
|
dllexp BOOL GetIpPrivate( UINT iComp, UINT iIpPublic, LPWSTR* ppszIpPrivate, LPWSTR* ppszName );
|
|
|
|
private:
|
|
CPtrXBF m_Servers; // array of CComputerBalanceCnfg
|
|
CStrPtrXBF m_IpPublic; // list of public IP addresses
|
|
CStrPtrXBF m_Name; // list of names associated with public IP addresses
|
|
CPtrXBF m_Sticky; // array of sticky duration per IP public
|
|
CPtrXBF m_Attr; // array of dword attr per IP public
|
|
|
|
} ;
|
|
|
|
//
|
|
// Class giving access to performance counter list
|
|
//
|
|
|
|
#define LB_WEIGHT_AVAILABILITY_FLAG (DWORD)-2
|
|
#define LB_WEIGHT_NORMALIZED_FLAG (DWORD)-3
|
|
|
|
class CComputerPerfCounters {
|
|
public:
|
|
CComputerPerfCounters();
|
|
~CComputerPerfCounters();
|
|
dllexp VOID Reset();
|
|
|
|
//
|
|
// Serialize all rules info to buffer
|
|
//
|
|
|
|
dllexp BOOL Serialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer ( using extensible buffer class )
|
|
//
|
|
|
|
dllexp BOOL Unserialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer
|
|
//
|
|
|
|
dllexp BOOL Unserialize( LPBYTE*, LPDWORD );
|
|
|
|
BOOL Load( HKEY hKey, LPSTR pszRegKey, LPSTR pszRegValue );
|
|
BOOL Save( HKEY hKey, LPSTR pszRegKey, LPSTR pszRegValue );
|
|
|
|
public:
|
|
// pszPerfCounter : w/o leading "\\" + computer name, but with leading "\"
|
|
// pszServerName : w/ or w/o leading "\\"
|
|
dllexp BOOL AddPerfCounter( LPWSTR pszServerName, LPWSTR pszPerfCounter, DWORD dwWeight );
|
|
dllexp BOOL EnumPerfCounter( UINT iPerfCounter, LPWSTR* ppszServerName, LPWSTR* ppszPerfCounter, DWORD* pdwWeight );
|
|
dllexp BOOL DeletePerfCounter( UINT iPerfCounter );
|
|
dllexp BOOL SetPerfCounterWeight( UINT iPerfCounter, DWORD dwWeight );
|
|
dllexp DWORD PerfCounterCount()
|
|
{ return m_PerfCounters.GetNbEntry(); }
|
|
|
|
private:
|
|
CStrPtrXBF m_PerfCounterServers;
|
|
CStrPtrXBF m_PerfCounters;
|
|
CPtrXBF m_Weight;
|
|
} ;
|
|
|
|
//
|
|
// Class giving access to list of IP addresses on NAT box
|
|
//
|
|
|
|
class CIpEndpointList {
|
|
public:
|
|
CIpEndpointList();
|
|
~CIpEndpointList();
|
|
|
|
dllexp BOOL BuildListFromLocalhost();
|
|
|
|
dllexp VOID Reset();
|
|
|
|
//
|
|
// Serialize all rules info to buffer ( before COM call )
|
|
//
|
|
|
|
dllexp BOOL Serialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer ( using extensible buffer class )
|
|
//
|
|
|
|
dllexp BOOL Unserialize( CStoreXBF* pX );
|
|
|
|
//
|
|
// Un-serialize all rules from buffer ( as result of COM call )
|
|
//
|
|
|
|
dllexp BOOL Unserialize( LPBYTE*, LPDWORD );
|
|
|
|
//
|
|
// Enumerate IP addresses ( 0-based, returns FALSE if no more instance )
|
|
//
|
|
|
|
dllexp BOOL EnumIpEndpoint( UINT iIp, LPWSTR* ppszIp );
|
|
|
|
private:
|
|
CStrPtrXBF m_IpEndpoint; // list of IP addresses
|
|
} ;
|
|
|
|
|
|
#endif |