Создание и балансировка отказоустойчивых служб с помощью 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(); -----------------------------------------------------------------------------------------------------------------