Создание и балансировка отказоустойчивых служб с помощью Cisco Content Switch
Виталий Банковский
# Маршрут по умолчанию
ip route 0.0.0.0 0.0.0.0 66.66.66.193 1
# Физический интерфейс CCS, который подключен к коммутатору
# локальной сети и привязан к виртуальному интерфейсу
# circuit VLAN3
interface ethernet-13
bridge vlan 3
# Виртуальный интерфейс, на котором определены наши
# виртуальные маршрутизаторы
circuit VLAN3
# Локальный адрес виртуального маршрутизатора
# «Virtual router 1». Служит для обращения
# к серверам DNS и работы протокола VRRP
ip address 10.40.12.203 255.255.255.240
# Идентификатор виртуального маршрутизатора
ip virtual-router 1
# Адрес VIP. К этому адресу обращаются сервера
# в локальной сети
ip redundant-interface 1 10.40.12.195
# *************************************************
# Аналогично, локальный адрес виртуального
# маршрутизатора «Virtual router 2».
ip address 66.66.66.203 255.255.255.240
# Идентификатор виртуального маршрутизатора
IP VIRTUAL-ROUTER 2
# Адрес VIP. К этому адресу обращаются клиенты
# из Интернета
IP REDUNDANT-INTERFACE 2 66.66.66.195
# *************************************************
# Определение правила, по которому будет определяться
# работоспособность серверов DNS. Здесь определены IP-адреса
# обоих демонов (DNS cache и MyDNS) на обоих серверах
# Сервер dns1, демон DNS cache
keepalive dns1-cache
ip address 10.40.12.196
active
# Сервер dns1, демон MyDNS
keepalive dns1
ip address 10.40.12.200
active
# Сервер dns2, демон dns cache
keepalive dns2-cache
ip address 10.40.12.197
active
# Сервер dns2, демон MyDNS
keepalive dns2
ip address 10.40.12.201
active
# ***************************************************
# Далее описаны службы MyDNS и DNS cache, к которым
# обращается CCS
service dns1
protocol udp
port 53
ip address 10.40.12.200
keepalive type named dns1
active
SERVICE DNS1-CACHE
keepalive type named dns1-cache
protocol udp
port 53
ip address 10.40.12.196
active
service dns2
protocol udp
port 53
ip address 10.40.12.201
keepalive type named dns2
active
SERVICE DNS2-CACHE
protocol udp
port 53
ip address 10.40.12.197
keepalive type named dns2-cache
active
#******************************************************
# Следующая секция – определение правил, которые используются
# для обработки запросов, приходящих на CCS.
# Имя владельца сервиса
OWNER EXAMPLE
# Разрешить прием и отправку DNS-запросов
dns both
# Определение сервиса. В данном случае – сервис DNS
# для обработки запросов извне
CONTENT DNS
# Адрес VIP, на который приходят запросы
vip address 66.66.66.195
PROTOCOL UDP
port 53
# Добавить сервисы dns1 и dns2 как один
# из доступных сервисов
add service dns2
add service dns1
active
# Определение сервиса для обработки
# запросов, приходящих из локальной сети
CONTENT DNS-CACHE
# Адрес VIP, на который приходят запросы
vip address 10.40.12.195
PROTOCOL UDP
PORT 53
# Добавление сервисов mdns1-cache и mdns2-cache
add service dns1-cache
ADD SERVICE DNS2-CACHE
active
# Включение трансляции адресов для прокотола UDP
GROUP DNS
vip address 66.66.66.195
add service dns1
add service dns2
active
GROUP DNS-CACHE
vip address 10.40.12.195
add service dns1-cache
add service dns2-cache
active
circuit VLAN3
ip address 10.40.12.204 255.255.255.240
ip virtual-router 1
ip redundant-interface 1 10.40.12.195
ip address 66.66.66.204 255.255.255.240
ip virtual-router 2
ip redundant-interface 2 66.66.66.195
sh virtual-routers
show service dns1
show service dns1
show service dns1-cache
# Проверка работы DNS cache для внешних доменов
DIG +SHORT @10.40.12.195 GOOGLE.COM
# Проверка работы DNS cache для доменов обслуживаемых MyDNS
DIG +SHORT @66.66.66.195 HOST.EXAMPLE.COM
WATCH -N 1 'DIG +SHORT @10.40.12.195 GOOGLE.COM'
sh summary
CONTENT HTTPD.EXAMPLE.COM
# Адрес VIP, на который приходят запросы
vip address 66.66.66.195
PROTOCOL TCP
PORT 80
advanced-balance sticky-srcip
add service www1
add service www2
active
-----------------------------------------------------------------------------------------------------------------
Особенности сервера коллективной работы Zimbra
Сергей Яремчук
127.0.0.1 localhost.localdomain localhost
$ tar xzvf zcs-4.5.6_GA_1044.UBUNTU6.tgz
$ cd zcs
$ sudo ./install.sh
$ ./install.sh -u
$ sudo rm –Rf /opt/zimbra
$ sudo cp *.properties /opt/zimbra/tomcat/webapps/zimbra/WEB-INF/classes/msgs/
$ sudo cp *.properties /opt/zimbra/tomcat/webapps/zimbraAdmin/WEB-INF/classes/msgs/
$ sudo cp ZsMsg*.properties /opt/zimbra/conf/msgs/
$ sudo /etc/init.d/zimbra restart
$ su - zimbra
$ zmcontrol restart
$ sudo /etc/init.d/zimbra restart
-----------------------------------------------------------------------------------------------------------------
Используем дополнительные возможности Windows Messenger
Иван Коробко
…
…
<%@ Language=VBScript CODEPAGE=1251%>
…
…
<%VBSCRIPT CODE%>
<%
VBSCRIPT CODE
%>
http://***/*.png
***
***
http://**<%VBSCRIPT CODE%>*
1
false
…
2
false
…
<%
Dim UserName = HttpContext.Current.User.Identity.Name
userName = userName.SubString(userName.LastIndexOf("\")+1)
%>
<%
Dim UserName = HttpContext.Current.User.Identity.Name
UserName = userName.SubString(userName.LastIndexOf("\")+1)
%>
http://wmtabs/p1.png
Входящие письма
Входящие письма
http://mail/exchange/<%Response.Write(userName)%>/Входящие/?Cmd=contents&part=1&View=Three%20Line
1
false
http://wmtabs/p2.png
Новое письмо
Создание нового письма
http://mail/exchange/<%Response.Write(userName)%>/Исходящие/?cmd=new
2
false
http://wmtabs/p3.png
Отпраленные письма
Отпраленные письма
http://mail/exchange/<%Response.Write(userName)%>/Отправленные/?Cmd=contents&part=1&View=Three%20Line
3
false
http://wmtabs/p4.png
Календарь
Календарь
http://mail/exchange/<%Response.Write(userName)%>/Календарь/?Cmd=contents&part=1&View=Three%20Line
4
false
http://wmtabs/p5.png
Задачи
Задачи
http://mail/exchange/<%Response.Write(userName)%>/Задачи/?Cmd=contents&part=1&View=Three%20Line
5
false
http://wmtabs/p6.png
Настройка параметров почты в Windows Messenger
Настройка параметров почты в Windows Messenger
http://mail/exchange/<%Response.Write(userName)%>/?Cmd=options
6
false
-----------------------------------------------------------------------------------------------------------------
Настраиваем и тестируем HPC MPI-кластер
Иван Максимов
cat /etc/sysconfig/networking-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.31.255
IPADDR=192.168.31.1
NETMASK=255.255.255.0
NETWORK=192.168.31.0
ONBOOT=yes
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
// query-source address * port 53;
};
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
// Указание, в каком файле находится описание прямой зоны
// cluster и то, что сервер является главным для этой зоны
zone "cluster" IN {
type master;
file "cluster";
allow-update { none; };
};
// Указание, где находится описание обратного преобразования
// для зоны cluster
zone "31.168.192.in-addr.arpa" {
notify no;
type master;
file "192.168.31";
allow-update { none; };
};
include "/etc/rndc.key";
/sbin/chkconfig --level 345 xinetd on
/sbin/chkconfig --level 345 tftp on
/sbin/service tftp start
/sbin/service xinetd start
default-lease-time 600;
max-lease-time 7200;
authoritative;
ddns-update-style none;
option domain-name "cluster";
option routers 192.168.31.1;
option domain-name-servers 192.168.31.1;
option swap-path code 128 = string;
option swap-size code 129 = integer 32;
subnet 192.168.31.0 netmask 255.255.255.0 {
range 192.168.31.11 192.168.31.21
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.31.255;
group {
filename "linux-install/pxelinux.0";
option root-path "/diskless/root";
next-server 192.168.31.1;
host m01 {
option host-name "m01.cluster";
hardware ethernet 00:0E:0C:4D:16:95;
fixed-address 192.168.31.11;
}
# Полный конфигурационный файл не приводится
# ввиду неактуальности и однотипности настройки
… … … … …
host m12 {
option host-name "m12.cluster";
hardware ethernet 01:0E:0C:4D:19:95;
fixed-address 192.168.31.21;
}
}
}
allow booting;
allow bootp;
DHCPDARGS=eth0
# export filesystems for dumb nodes
# Экспорт корневой файловой системы доступной только
# для чтения
/diskless/root 192.168.31.0/24(ro,sync,no_root_squash)
# Экспорт файловой системы с программами для всех модулей
/usr/local 192.168.31.0/24(ro,sync,no_root_squash)
# Файловая система с файлами бездисковых клиентов,
# к которым необходим доступ на запись
/diskless/snapshot 192.168.31.0/24(rw,sync,no_root_squash)
# Файловая система для хранения swap-файлов
# бездисковых машин
/diskless/swap 192.168.31.0/24(rw,sync,no_root_squash)
# Домашний каталог пользователей с доступом на запись
/home 192.168.31.0/24(rw,sync,no_root_squash)
restrict 192.168.31.0 mask 255.255.255.0 nomodify notrap
restrict 127.0.0.1
restrict 127.127.1.0
restrict 127.127.27.0 nomodify
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
m11 cpu=4
m10 cpu=4
m09 cpu=4
m08 cpu=4
m07 cpu=4
m06 cpu=4
m05 cpu=4
m04 cpu=2
m03 cpu=2
m02 cpu=2
m01 cpu=2
master cpu=2
-rsh=ssh -with-device=ch_p4 --with-comm=shared --prefix=/usr/local/gmpich-1.2.7p1 -f90=gfortran
m11:4
m10:4
m09:4
m08:4
m07:4
m06:4
m05:4
m04:2
m03:2
m02:2
m01:2
parallel:2
rsync -a -e / /diskless/root/
ls -l /diskless/snapshot
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /tmp tmpfs defaults 0 0
parallel:/usr/local /usr/local nfs defaults,ro 0 0
parallel:/home /home nfs defaults,rw 0 0
127.0.0.1 m01.cluster m01 localhost.localdomain localhost
restrict 127.0.0.1
server parallel.cluster
server 127.127.1.0 # local clock
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys
-----------------------------------------------------------------------------------------------------------------
Пакетный режим запуска «1С:Предприятие 7.7»
Андрей Луконькин
1cv7.exe MODE [ /M | /D<Путь> | /U<Путь> | /N<Имя> | /P<Пароль> | /@<ИмяФайла> | /T<Путь> | /L<Параметр>]
c:\1cv7\bin\1cv7.exe CONFIG /Dc:\1cv7\db /NAdmin /P111 /@C:\lCV7\Backup
-----------------------------------------------------------------------------------------------------------------
Реализуем нестандартные правила управления доступом на основе архитектуры организации в Windows Server 2003
Вадим Андросов
Set objSysInfo = CreateObject("ADSystemInfo")
userOU = getOU(objSysInfo.UserName)
compOU = getOU(objSysInfo.ComputerName)
if compOU <> userOU then
set shellObj = CreateObject("WScript.Shell")
shellObj.exec "shutdown /l"
end if
function getOU(dn)
getOU = right(dn, len(dn) - instr(1, dn, ",", vbTextCompare))
end function
CN=John Zoidberg,OU=Aid post,OU= Planet Express,DC=futurama,DC=mult
function isOULocked(dn)
Set objOU = GetObject("LDAP://" & dn)
isOULocked = objOU.OULocked
if isEmpty(isOULocked) then isOULocked = false
end function
function setOULocked(dn, lock)
Set objOU = GetObject("LDAP://" & dn)
objOU.OULocked = lock
objOU.setInfo
end function
function getParent(dn)
if UCase(Left(dn, 2))="DC" then
getParent = ""
else
getParent = right(dn, len(dn) - instr(1, dn, ",", vbTextCompare))
end if
end function
function isAllowed(userDN, compDN)
isAllowed = STATE_ALLOWED
dim compOU, userOU
compOU = getParent(compDN)
userOU = getParent(userDN)
if isOuLocked(compOU) then
isAllowed = STATE_LOCKED
exit function
end if
if userOU = compOU then
exit function
end if
if getOUState(compOU) = STATE_EXPLICIT then
isAllowed = STATE_EXPLICIT
exit function
end if
dim compTreeRoot
compTreeRoot = getTreeRoot(compOU)
if compTreeRoot <> getTreeRoot(userOU) then
if compTreeRoot <> EMPTY_STR then isAllowed = STATE_TREE
exit function
end if
end function
function getTreeRoot(dn)
if (dn=EMPTY_STR) then
getTreeRoot = dn
exit function
end if
if (getOUState(dn)=STATE_TREE) then
getTreeRoot = dn
exit function
end if
getTreeRoot = getTreeRoot(getParent(dn))
end function
Function disableUser(userDN, compDN)
Set dso = GetObject("LDAP:")
Set userObj = dso.OpenDSObject("LDAP://" & userDN, "punisher@complex.ua", "P@ssw0rd", ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)
userObj.accountDisabled = true
userObj.description = "Unallowed access on " & compDN
userObj.SetInfo
end function
set objwmiservice=getobject("winmgmts://./root/cimv2")
strwql="select * " & "from __instancecreationevent " & "where targetinstance isa 'Win32_NTLogEvent' " & "and targetinstance.EventIdentifier = 672"
set objeventsource=objwmiservice.execnotificationquery(strwql)
While True
set objeventobject=objeventsource.nextevent()
domain = getDomain
user = objEventobject.TargetInstance.InsertionStrings(0)
comp = getCompName(objEventobject.TargetInstance.InsertionStrings(9))
check user, comp, domain
Wend
getUserADsPath = EMPTY_STR
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = "Select ADsPath from 'LDAP://" & domain & "' " & "Where objectClass='" & className & "' and " & nameField & "='" & name & "'"
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
if not objRecordSet.EOF then getObjectADsPath = objRecordSet.Fields(0).value
end function
function getCompName(ip)
set info = createObject("ADSystemInfo")
Set objWMIService = GetObject("winmgmts:\\.\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MicrosoftDNS_AType WHERE IPAddress = '" & ip & "'")
For Each objItem in colItems
fullName = objItem.OwnerName
getCompName = left(fullName, len(fullName) - len(info.domainDNSName) - 1)
next
end function
function getCompName(ip)
set info = createObject("ADSystemInfo")
Set objWMIService = GetObject("winmgmts:\\.\root\MicrosoftDNS")
Set colItems = objWMIService.ExecQuery("SELECT * FROM MicrosoftDNS_AType WHERE IPAddress = '" & ip & "'")
For Each objItem in colItems
fullName = objItem.OwnerName
getCompName = left(fullName, len(fullName) - len(info.domainDNSName) - 1)
next
end function
Function disableUser(userPath, compPath)
Set userObj = GetObject(userPath)
userObj.accountDisabled = true
userObj.description = " Unallowed access on " & compPath
userObj.SetInfo
end function
function check(user, computer, domain)
set info = createObject("ADSystemInfo")
userPath = getObjectADsPath(user, "user", "SAMAccountName", domain)
if userPath = EMPTY_STR then exit function
compPath = getObjectADsPath(computer, "computer", "cn", domain)
if isAllowed(userPath, compPath) <> STATE_ALLOWED then disableUser userPath, compPath
end function
function findManager(startOU)
findManager = ""
if startOU = "" then exit function
set ou = getObject("LDAP://" & startOU)
manDN = ou.managedBy
if manDN <> "" then
findManager = manDN
exit function
else
findManager = findManager(getParent(startOU))
end if
end function
function getMail(dn)
set userObj = getObject("LDAP://" & dn)
getMail = userObj.get("mail")
end function
function informManager(manDN, userDN, compDN)
Set objEmail = CreateObject("CDO.Message")
objEmail.From = getMail(userDN)
objEmail.To = getMail(manDN)
objEmail.Subject = "Unallowed login"
objEmail.Textbody = "User: " & userDN & chr(10) & "Computer: " & compDN & chr(10) & "When: " & date & " " & time
objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp_server "
objEmail.Configuration.Fields.Update
objEmail.Send
end function
Set objSysInfo = CreateObject("ADSystemInfo")
userDN = objSysInfo.UserName
compDN = objSysInfo.ComputerName
if isAllowed(userDN, compDN) = STATE_ALLOWED then WScript.Quit
disableUser userDN, compDN
informManager findManager(getParent(compDN)), userDN, compDN
set shellObj = CreateObject("WScript.Shell")
shellObj.exec "shutdown /l"
function installOUMenu(id, name, scriptPath)
Set root= GetObject("LDAP://rootDSE")
sConfig = root.Get("configurationNamingContext")
sPath = "LDAP://cn=organizationalUnit-Display,cn=409,cn=DisplaySpecifiers," & sConfig
Set obj= GetObject(sPath)
sValue = id & "," & name & "," & scriptPath
vValue = Array(sValue)
obj.PutEx 3, "adminContextMenu", vValue
obj.SetInfo
end function
Set oArgs = WScript.Arguments
dim lock, state
Set ouObj = getObject(oArgs.item(0))
if isOULocked(ouObj) then
lock = "yes"
else
lock = "no"
end if
state = getOUState(ouObj)
msgbox "Name: " & ouObj.ou & chr(10) & "Locked: " & lock & chr(10) & "State: " & state, vbInformation, "Additional attributes"
installOUMenu 100, "ArchitectureEx: OU Info", "c:\ou_info.vbs"
function setSubtreeLock(startFromOU, lock)
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = _
"Select ADsPath from '" & startFromOU & "' " & "Where objectClass='organizationalUnit'"
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
Do Until objRecordSet.EOF
ouPath = objRecordSet.Fields(0).value
set ouObj = getObject(ouPath)
ouObj.OULocked = lock
ouObj.setInfo
objRecordSet.MoveNext
Loop
end function
Set oArgs = WScript.Arguments
setSubtreeLock oArgs.item(0), true
-----------------------------------------------------------------------------------------------------------------
Нетривиальный синтаксис в PHP, или Головоломки для кодера
Александр Майоров
scalar;
?>
5 ) break;
++$var;
}
?>
'localhost',
'login'=>'root',
'pass'=>'',
'db_name'=>'mysql',
'boolean'=>false,
'int'=>123,
'float'=>123.456,
'array'=>array(0,1,2,3)
);
?>
preg_match(“/.*?<\/p>/i”, $str);
preg_match(“‡
.*?
‡i”, $str);
-----------------------------------------------------------------------------------------------------------------
Выбираем фрэймворк-среду для веб-разработки
Кирилл Сухов
// используемая база данных
var $test = array('driver' => 'mysql',
// команда соединения (в данном случае можно
// использовать 'mysql_connect' или 'mysql_pconnect'
'connect' => 'mysql_connect',
// хост базы данных
'host' => 'localhost',
//имя пользователя
'login' => 'geol',
// пароль пользователя
'password' => 'superpassword',
// название базы данных
'database' => 'cake',
// название проекта
'prefix' => 'cake');
}
if (!defined('ROOT'))
{
// путь к директории, которая содержит каталог приложения
define('ROOT', dirname(dirname(dirname(__FILE__))));
}
if (!defined('APP_DIR'))
{
// путь к каталогу приложения
define ('APP_DIR', basename(dirname(dirname(__FILE__))));
}
if (!defined('CAKE_CORE_INCLUDE_PATH'))
{
// путь к ядру CakePHP
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}
class Item extends AppModel {
var $id;
...
}
class UsersController extends AppController {
function register() {
...
}
...
}
class CategoriesController extends AppController
{
var $scaffold;
}
VALID_NOT_EMPTY, 'itemid' => VALID_NUMBER, 'email' => VALID_EMAIL );
}
?>
class FooComponent extends Object
{
function bar(&$controller)
{
}
}
class FooComponent extends Object
{
var $someVar = null;
var $controller = true;
function startup(&$controller)
{
// This method takes a reference to the controller which is loading it.
// Perform controller initialization here.
}
function doFoo()
{
$this->someVar = 'foo';
}
}
var $components = array('Foo');
$ foo =& new Foo();
$ php acl.php initdb
> symfony init-app app_name
>init-module app_name module_name
forward('default', 'module');
}
}
?>
$response= new sfResponse();
$response->getParameterHolder()->set('foo', 'bar');
echo $response->getParameterHolder()->get('foo');
=> 'bar'
$response->setParameter('foo', 'bar');
echo $response->getParameter('foo');
=> 'bar'
class MyClass
{
protected $parameter_holder = null;
public function initialize ($parameters = array())
{
$this->parameter_holder = new sfParameterHolder();
$this->parameter_holder->add($parameters);
}
public function getParameterHolder()
{
return $this->parameter_holder;
}
}
$fooObject = new MySuperClass();
-----------------------------------------------------------------------------------------------------------------