Проект iRedMail. Создание почтового сервера Сергей Яремчук $ hostname –f $ cat /etc/hosts 127.0.0.1 mail.example.org localhost localhost.localdomain $ cat /etc/apt/source.list deb http://ru.archive.ubuntu.com/ubuntu/ lucid main restricted deb http://ru.archive.ubuntu.com/ubuntu/ lucid universe $ sudo apt-get update $ sudo apt-get upgrade $ wget –c http://iredmail.googlecode.com/files/iRedMail-0.7.2.tar.bz2 $ tar xjf iRedMail-0.7.2.tar.bz2 $ cd iRedMail-0.7.2 $ sudo bash ./iRedMail.sh ----------------------------------------------------------------------------------------------------------------- Построение корпоративных VPN. Использование IPSec для подключения с Windows Рашид Ачилов remote anonymous { exchange_mode main,aggressive; doi ipsec_doi; situation identity_only; my_identifier fqdn "samag.ru"; nonce_size 16; lifetime time 24 hour; initial_contact on; proposal_check strict; generate_policy unique; ike_frag on; passive on; dpd_delay 0; nat_traversal on; script "linkdown.sh" phase1_down; proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method xauth_psk_server; dh_group 2; lifetime time 3600 sec; } } sainfo anonymous { pfs_group 2; lifetime time 3600 sec; encryption_algorithm camellia,aes,blowfish,3des; authentication_algorithm hmac_sha1,hmac_md5; compression_algorithm deflate; } listen { isakmp 212.20.5.1 [500]; isakmp_natt 212.20.5.1 [4500]; adminsock "/var/run/racoon.sock"; } mode_cfg { conf_source local; network4 172.16.1.1; netmask4 255.255.255.0; pool_size 20; dns4 10.87.1.10; auth_source pam; accounting none; auth_throttle 10; pfs_group 2; default_domain "samag.ru"; split_dns "samag.ru", "nsk.su"; # split_network include 10.87.1.0/24; } remote anonymous { exchange_mode main; doi ipsec_doi; situation identity_only; my_identifier asn1dn; peers_identifier asn1dn; certificate_type x509 "glance.crt" "glance.key"; ca_type x509 "/etc/ssl/rootca/camerged.pem"; verify_identifier on; ... ipfw add 1005 allow ip from any to any via enc0 ipfw add 1460 allow udp from any to me dst-port 500 ipfw add 1465 allow udp from me 500 to any ipfw add 1470 allow udp from any to me dst-port 4500 ipfw add 1475 allow udp from me 4500 to any ----------------------------------------------------------------------------------------------------------------- Обзор DEFT 6.1. Возможности ОС Linux в криминалистике Игорь Штомпель # deft-gui # wine DEFT-Extra-3.0.exe # wine mono-2.6.7-gtksharp-2.12.10-win32-2.exe ----------------------------------------------------------------------------------------------------------------- Система управления и мониторинга RHQ Сергей Яремчук $ sudo apt-get install sun-java6-jre postgresql local all all trust host all all 127.0.0.1/32 trust listen_addresses = '*' shared_buffers = 80MB # по умолчанию 24MB work_mem = 2048 # по умолчанию 1MB statement_timeout = 30s # по умолчанию 0s checkpoint_segments = 10 # по умолчанию 3 # в процессе работы RHQ использует около 55 подключений # к базе данных, плюс часть необходимо зарезервировать # для администратора max_connections = 60 # по умолчанию 100 superuser_reserved_connections = 5 # по умолчанию 3 max_prepared_transactions = 60 $ sudo service postgresql restart $ createuser -h 127.0.0.1 -p 5432 -U postgres -S -D -R rhqadmin $ createdb -h 127.0.0.1 -p 5432 -U postgres -O rhqadmin rhq $ sudo unzip rhq-server-4.0.1.zip –d /opt $ cd /opt/rhq-server-4.0.1/bin $ sudo nano rhq-server.sh RHQ_SERVER_HOME=/opt/rhq-server-4.0.1 RHQ_SERVER_JAVA_HOME=/usr/lib/jvm/java-6-sun JAVA_HOME =/usr/lib/jvm/java-6-sun $ sudo ./rhq-server.sh start $ sudo java -jar rhq-enterprise-agent-4.0.1.jar --install=/opt/rhq-agent ----------------------------------------------------------------------------------------------------------------- DriverPack Solution. Установка драйверов и приложений Максим Сафонов DISM.exe {/Image:<путь_к_папке_образа> | /Online} [параметры_dism] {команда_обслуживания} [<аргумент_обслуживания>] DISM.exe /image:<путь_к_папке_образа> [/Get-Drivers | /Get-DriverInfo | /Add-Driver | /Remove-Driver ] DISM.exe /Online [/Get-Drivers | /Get-DriverInfo ] Program.msi /qb if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( start _install_x64_program.exe start _install_x64_batch_file.bat ) else ( start_install_x86_program.exe start_install_x86_ batch_file.bat ) FOR /F "tokens=2* delims= " %%A IN ('REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HashTab" /v DisplayVersion') DO SET Version=%%B if not "%Version%" == "4.0.0.2" ( install_HashTab2.5.exe ) \\srv1\install\7z\7z-x32.msi /qn \\srv1\install\7z\7z-x64.msi /qn if ((lang=='ru') || (lang=='ua')){ prog[pn]='DRPSu Updater'; cat[pn]=startpack_Additions; cmd1[pn]='DrvUpdater.exe'; cmd2[pn]=''; check[pn]='HKCU\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\DRPSu Updater\\DisplayName'; defaul[pn]=true; wshow[pn]=false; pn++; } if (WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")=="AMD64" ||WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%")!="%PROCESSOR_ARCHITEW6432%"){ prog[pn]='Архиваторы; cat[pn]='Системные'; cmd1[pn]='archx86.bat'; cmd2[pn]='start /wait'; check[pn]='HKLM\\SOFTWARE\\7-Zip\\Path'; defaul[pn]=true; wshow[pn]=true; pn++; } else { prog[pn]='Архиваторы; cat[pn]='Системные'; cmd1[pn]='archx64.bat'; cmd2[pn]='start /wait'; check[pn]='HKLM\\SOFTWARE\\7-Zip\\Path'; defaul[pn]=true; wshow[pn]=true; pn++; } if (WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%")=="AMD64" ||WshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%")!="%PROCESSOR_ARCHITEW6432%") if "%PROCESSOR_ARCHITECTURE%" == "AMD64" ( start /wait archx64.bat ) else ( start /wait archx86.bat ) \\srv1\install\winrar\winrarx86.exe /s \\srv1\install\winrar\winrarx64.exe /s ----------------------------------------------------------------------------------------------------------------- Резервное копирование IIS 7.5 Иван Коробко Листинг 1. Полный список доступных ролей и компонентов сервера с помощью ServerManagerCmd ServerManagerCMD.exe -query c:\smcmd.xml Листинг 2. Установленные компоненты роли Web-Server Get-WindowsFeature -Name Web-* | ? {$_.installed -eq $true} Add-WindowsFeature [-Name] [-IncludeAllSubFeature] [-logPath] [-Restart] Листинг 3. Создание PowerShell-файла, восстанавливающего конфигурацию IIS # Определение исходных данных $Path= "c:\IIS_01.ps1" $temp="" # Удаление предыдущей версии файла, если он есть Remove-Item -Path $Path-ErrorActionsilentlycontinue # Определение списка установленных компонентов $obj = Get-WindowsFeature -NameWeb-*| ?{$_.installed -eq $true } $obj | % {$temp+=$_.Name + "; "} $cmdString = "Add-WindowsFeature -Name$temp" $cmdString=$cmdString.Trim("; ") # Запись данных в файл Out-File -FilePath $Path -InputObject $cmdString start /w pkgmgr.exe /iu:[{packageName1}[;…]] Листинг 4. Создание командного файла, восстанавливающего конфигурацию IIS # Определение исходных данных $temp="" $Path= "c:\IIS_01.bat" $ArrayPowerShell = "Web-Server", "Web-WebServer", "Web-Common-Http", "Web-Static-Content", "Web-Default-Doc", "Web-Dir-Browsing", "Web-Http-Errors", "Web-Http-Redirect", "Web-DAV-Publishing", "Web-App-Dev", "Web-Asp-Net", "Web-Net-Ext", "Web-ASP", "Web-CGI", "Web-ISAPI-Ext", "Web-ISAPI-Filter", "Web-Includes", "Web-Health", "Web-Http-Logging", "Web-Log-Libraries", "Web-Request-Monitor", "Web-Http-Tracing", "Web-Custom-Logging", "Web-ODBC-Logging", "Web-Security", "Web-Basic-Auth", "Web-Windows-Auth", "Web-Digest-Auth", "Web-Client-Auth", "Web-Cert-Auth","Web-Url-Auth", "Web-Filtering", "Web-IP-Security", "Web-Performance", "Web-Stat-Compression", "Web-Dyn-Compression", "Web-Mgmt-Tools", "Web-Mgmt-Console", "Web-Scripting-Tools", "Web-Mgmt-Service", "Web-Mgmt-Compat", "Web-Metabase", "Web-WMI", "Web-Lgcy-Scripting", "Web-Lgcy-Mgmt-Console", "Web-Ftp-Server", "Web-Ftp-Service", "Web-Ftp-Ext" $ArrayPackageManager="IIS-WebServerRole", "IIS-WebServer", "IIS-CommonHttpFeatures", "IIS-StaticContent", "IIS-DefaultDocument", "IIS-DirectoryBrowsing", "IIS-HttpErrors", "IIS-HttpRedirect", "IIS-WebDAV", "IIS-ApplicationDevelopment", "IIS-ASP", "IIS-NetFxExtensibility", "IIS-ASPNET", "IIS-CGI", "IIS-ISAPIExtensions", "IIS-ISAPIFilter", "IIS-ServerSideIncludes", "IIS-HealthAndDiagnostics", "IIS-HttpLogging", "IIS-LoggingLibraries", "IIS-RequestMonitor", "IIS-HttpTracing", "IIS-CustomLogging", "IIS-ODBCLogging", "IIS-Security", "IIS-BasicAuthentication", "IIS-WindowsAuthentication", "IIS-DigestAuthentication", "IIS-ClientCertificateMappingAuthentication", "IIS-IISCertificateMappingAuthentication", "IIS-URLAuthorization", "IIS-RequestFiltering", "IIS-IPSecurity", "IIS-Performance", "IIS-HttpCompressionStatic", "IIS-HttpCompressionDynamic", "IIS-WebServerManagementTools", "IIS-ManagementConsole ", "IIS-ManagementScriptingTools", "IIS-ManagementService", "IIS-IIS6ManagementCompatibility", "IIS-Metabase", "IIS-WMICompatibility", "IIS-LegacyScripts", "IIS-LegacySnapIn ", "IIS-FTPServer", "IIS-FTPSvc", "IIS-FTPExtensibility" # Удаление предыдущей версии файла, если он есть Remove-Item -Path $Path -ErrorActionsilentlycontinue # Определение списка установленных компонентов $obj = Get-WindowsFeature -NameWeb-* | ?{$_.installed -eq $true } $obj | % {[array]$testArray+=$_.Name} # Сопоставление списка названий PowerShell-компонентов к PackageManager компонентам for ($i=0; $i -le $ArrayPowerShell.Length; $i=$i+1) { foreach ($element in $testArray) { if ($ArrayPowerShell[$i] -eq $element) {$temp+=$ArrayPackageManager[$i]+";"} } } $temp=$temp.Trim("; ") # Формирование содержания командного файла $Line1 = "start /w pkgmgr.exe /iu:$temp" $Line2 = "echo %ErrorLevel%" $Line3 = "pause" $CLFR=[char]13+[char]10 # Запись данных в файл Out-File -FilePath $path -InputObject "$Line1$CLFR$Line2$CLFR$Line3" Листинг 5. Создание резервной копии IIS # Определение исходных данных для работы файла $Path="c:\IIS_02.bat" $temp="" $k=[char]34 $enter=[char]13+[char]10 $IISPAth= (direnv:WinDir).value +"\System32\inetsrv\config" $BackupFolder = "c:\IISBackup" $RedirectionConfig = $IISPAth+"\redirection.config" # Проверка на существование и создание папки для резервного копирования if (-Not [System.IO.Directory]::Exists($BackupFolder)) { New-Item -Path $BackupFolder -Type Directory -Force | Out-Null Write-Host "Создана папка для создания резервного копирования конфигурации IIS." } # Получение доступа к конфигурационному файлу для определения типа настройки IIS [xml]$obj=Get-Content $RedirectionConfig $data=$obj.Configuration.ConfigurationRedirection if ($data.Enabled -eq $true) { if ($data.Path -ne "") { Write-Host "Web-Server (IIS) настроен в режиме Фермы." $IISFermaPath=[String]$data.path Copy-Item -Path $IISFermaPath\*.config -Destination $BackupFolder -Force | Out-Null Write-Host "Выполнено резервное копирование настроек фермы IIS в папку $IISFermaPath." $temp=$temp+ "copy $k$BackupFolder\*.config$k $k$IISFermaPath$k $enter" } else { Copy-Item -Path $IISPath\*.config -Destination $BackupFolder -Force | Out-Null Write-Host "Выполнено резервное копирование конфигурации IIS в папку $BackupFolder." } $temp=$temp+ "copy $k$BackupFolder\*.config$k $k$IISPath$k" } $temp | Out-File $Path ----------------------------------------------------------------------------------------------------------------- Tarantool – NoSQL хранилище данных. Опыт внедрения в веб-проектах Александр Календарев > git clone https://github.com/mailru/tarantool.git > cd tatantool >cmake . > make >cd test && ./test-run.py >./test-run.py --start-and-exit >mod/box/tarantool_box –daemonize –c=/path/to/config namespace[0].enabled = 1 namespace[0].index[0].type = "HASH" namespace[0].index[0].unique = 1 namespace[0].index[0].key_field[0].fieldno = 0 namespace[0].index[0].key_field[0].type = "NUM" namespace[0].index[1].type = "TREE" namespace[0].index[1].unique = 0 namespace[0].index[1].key_field[0].fieldno = 1 namespace[0].index[1].key_field[0].type = "STR" namespace[0].index[2].type = "TREE" namespace[0].index[2].unique = 0 namespace[0].index[2].key_field[0].fieldno = 1 namespace[0].index[2].key_field[0].type = "STR" namespace[0].index[2].key_field[1].fieldno = 2 namespace[0].index[2].key_field[1].type = "STR" namespace[0].index[3].type = "HASH" namespace[0].index[3].unique = 0 namespace[0].index[3].key_field[0].fieldno = 3 namespace[0].index[3].key_field[0].type = "NUM" >cd test >./tarantool tarantool> show info tarantool> show stat tarantool> select * from t0 where k0 = 1 tarantool> insert into t0 values (1, "Hello Word") tarantool> select * from t0 where k0 = 1 tarantool> delete from t0 where k0 = 1 tarantool> select * from t0 where k0 = 1 git clone git@github.com:akalend/tarantool.git cd connector/php phpize ./configure sudo make install extension=tarantool.so define('NS',0); $tnt = new Tarantool($host,$port); $tuple = array(1, 'Hello Word','alex', 1023 ); $res = $tnt->insert(NS,$tuple); var_dump($res); // true в случае успеха иначе false define('PRIMARY',0); $count = $tnt->select(NS, PRIMARY,1); $res = $tnt->getTuple(); var_dump($count,$res); define('SECONDARY',1); $count = $tnt-> select(NS, SECONDARY, 'realty'); while( ($res = $tnt->getTuple()) != false){ var_dump($res); } define('MIXED_INDEX',2); $count = $tnt->select(NS, MIXED_INDEX,array('spb', 'realty')); while( ($res = $tnt->getTuple()) != false){ var_dump($res); } define('NUM_INDEX',3); $tnt->select(NS, NUM_INDEX,1025,10,20); while( ($res = $tnt->getTuple()) != false){ var_dump($res); } define('NUM_FIELD',3); $key = 3; $tnt->inc(NS, $key, NUM_FIELD); // increment (+1) $tnt->inc(NS, $key, NUM_FIELD, -1); // decrement (-1) $tnt->inc(NS, $key, NUM_FIELD, 10); // increment (+10) $key = 3; $res = $tnt->update(NS, $key,array(2=>'msk')); FIELD_0 user_id FIELD_1 login FIELD_2 password // md5(password+salt); FIELD_3 email FIELD_4 city_id . . . FIELD_0 user_id FIELD_1 friend_id FIELD_2 name FIELD_3 email FIELD_4 is_new . . . define('NS_FRIENDS',1); define('FRIENDS_ON_TITLE',5); $count = $tnt-> select(NS_FRIENDS, PRIMARY, $user_id, FRIENDS_ON_TITLE); $friends = array(); while( ($res = $tnt->getTuple()) != false){ $friends[] =$res; } FIELD_0 event_id FIELD_1 user_id FIELD_2 event_type (ADD_PHOTO, ADD_COMMENT, ADD_POST и т.д.) FIELD_3 element_id FIELD_4 time_interval . . . ----------------------------------------------------------------------------------------------------------------- Рефлексия по исходникам в Visual Studio. Неиспользуемым типам в проекте не место Алексей Бойко Листинг 1. Получить типы, определенные в сборке var assembly = Assembly.LoadFrom(@"c:\Sample.Assembly.dll"); var types = assembly.GetTypes(); Листинг 2. Сгенерированный шаблоном Visual Studio Add-in метод Exec(...), вызываемый при активации Add-in, и ссылка на объект applicationObject, поддерживающий интерфейс DTE2. public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled) { handled = false; if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) { if(commandName == "AddinExcludeTypes.Connect.AddinExcludeTypes") { handled = true; // Здесь нужно разместить необходимый код return; } } } private DTE2 _applicationObject; Листинг 3. Перебор всех файлов проекта public void Exec(...) { ... // Здесь нужно поместить необходимый код // Получим проект по уникальному имени (можно и по номеру Item(1)) EnvDTE.Project project = _applicationObject.Solution.Projects.Item(@"ClassLibrary1\ClassLibrary1.csproj"); _ProcessItems(project.ProjectItems); ... } // Рекурсивно пройдемся по всем файлам проекта private void _ProcessItems(ProjectItems items) { if (items == null) return; foreach (ProjectItem item in items) { if (item.FileCodeModel != null && item.FileCodeModel.CodeElements != null && item.FileCodeModel.CodeElements.Count != 0) _ProcessCodeElements(item.FileCodeModel.CodeElements); _ProcessItems(item.ProjectItems); } } Листинг 4. Определение, что именно содержится в CodeElement switch(codeElement.Kind) { case vsCMElement.vsCMElementClass: var codeClass = (CodeClass)codeElement; ... break; case vsCMElement.vsCMElementEnum: var codeEnum = (CodeEnum)codeElement; ... break; case vsCMElement.vsCMElementNamespace var codeNamespace = (CodeNamespace)codeElement; ... break; // и т.д. ... } Листинг 5. Поиск всех типов в документе private void _ProcessCodeElements(CodeElements codeElements) { foreach (CodeElement codeElement in codeElements) _ProcessCodeElement(codeElement); } private void _ProcessCodeElement(CodeElement codeElement) { if (codeElement.IsCodeType) _ProcessType(codeElement as CodeType); else switch (codeElement.Kind) { // Если namespace case vsCMElement.vsCMElementNamespace: _ProcessCodeElements(((CodeNamespace)codeElement).Members); break; } } Листинг 6. Проверка, что тип публичный private void _ProcessType(CodeType codeType) { // Если тип не публичный if (codeType.Access != vsCMAccess.vsCMAccessPublic) return; var usedInProjects = _FindAllReference(codeType as CodeElement); ... Листинг 7. Выполнение Find All References из кода Add-in _applicationObject.ExecuteCommand("Edit.FindAllReferences", String.Empty); Листинг 8. Полная процедура выполнения Find Аll References private List _FindAllReference(CodeElement codeElement) { var projectItem = codeElement.ProjectItem; // запомним состояние окна bool isOpen = projectItem.IsOpen; // если окно закрыто, нужно его открыть иначе codeElement.ProjectItem.Document = null if (!isOpen) projectItem.Open(); // Установим курсор на определении типа var document = projectItem.Document; document.Activate(); ((TextSelection)document.Selection).MoveToPoint(codeElement.StartPoint, false); // выполним "Find All References" _applicationObject.ExecuteCommand("Edit.FindAllReferences", String.Empty); // если документ изначально был закрыт if (!isOpen) codeElement.ProjectItem.Document.Close(); // получим результаты поиска return _GrabFindResults(); } Листинг 9. Прочитать содержимое окна (возвращает не все, что нужно, см. ниже) Window findWindow = applicationObject.Windows.Item(Constants.vsWindowKindFindSymbolResults); string result = findWindow.Caption; Regex regex = new Regex("[0-9]+"); int resultCount = Convert.ToInt32(regex.Match(findWindow.Caption).Value); // если количество найденных элементов < 2, значит, тип нигде не используется if (resultCount < 2) return null; List projects = new List(); for (int ii = 0; ii < resultCount; ii++) { // на всякий случай убедимся, что окно с результатами поиска активно findWindow.Activate(); _applicationObject.ExecuteCommand("Edit.GoToNextLocation", String.Empty); // проект, к которому относится файл var project = _applicationObject.ActiveDocument.ProjectItem.ContainingProject; if (!projects.Exists(ee => ee.UniqueName == project.UniqueName)) projects.Add(project); } -----------------------------------------------------------------------------------------------------------------