Резервное копирование Hyper-VPower. Shell-скрипт и утилита HVBackup Сергей Горбановский HVBackup --all --output c:\backup HVBackup --list VM1,VM2 --output \\yourserver\backup HVBackup --file list.txt --output c:\backup $FullPath = $script:MyInvocation.MyCommand.Path $SBaseFileName = [System.IO.Path]::GetFileNameWithoutExtension($FullPath) $script:SIniFile = Join-Path -Path $script:SDirPath -ChildPath $SBaseFileName".ini" Get-Content $script:SIniFile | ForEach-Object -begin {$SSettings=@{}} -process { $k = [regex]::split($_,'='); if(($k[0].CompareTo("") -ne 0) -and ($k[0].StartsWith("[") -ne $True)) { $SSettings.Add($k[0], $k[1]) } } [string]$BackupPath = $SSettings.Get_Item("BackupPath") $VMs = Get-WmiObject -Computername localhost -Namespace root\Virtualization -Query "Select * from MSVM_Computersystem where Description like'%Virtual%' AND (EnabledState = 2 OR EnabledState=3 OR EnabledState=32768 OR EnabledState=32769)" $VMs = Get-WmiObject -Computername localhost -Namespace root\Virtualization -Query "Select * from MSVM_Computersystem where Description like'%Virtual%'" $Items = @(Get-ChildItem -Path $Path\*) | Sort-Object -Property CreationTime $VMBackupTime = Measure-Command {&$script:BackupExe --backup --outputformat "{0}_{2:dd-MM-yyyy_HH-mm-ss}.zip" --output "$VMPath" --list "$VMName"} Write-Log "Бэкап $VMName занял $VMBackupTime" $VMBackupTime = Measure-Command {&$script:BackupExe --backup --outputformat "{0}_{2:dd-MM-yyyy_HH-mm-ss}.zip" --output "$VMPath" --list "$VMName"" –compressionlevel 0} Trap { # Все критические ошибки в процессе работы будут записаны в лог $TrapMessage = $error[0].ToString() + " " + $error[0].InvocationInfo.PositionMessage Write-Log "$TrapMessage";Continue; } [Backup] BackupPath=E:\Backup\Hyper-V\ MaxBackupsActive=3 MaxBackupsInactive=1 LazyMode=1 BackupExe=.\HVBackup\HVBackup.exe [Email] SendEmail=1 Sender=HVBackup@mycompany.ru Receipt=admin@mycompany.ru Server=mail.mycompany.ru Login=hvbackup Password=password Port=25 SSL=0 TrustAnyCert=0 ----------------------------------------------------------------------------------------------------------------- Бюджетная виртуализация. Оптимизация NFS и iSCSI Александр Руденко #sysctl -w <имяПараметра>=<Значение> #sysctl -w net.ipv4.tcp_low_latency=1 #cat /proc/sys/net/ipv4/tcp_low_latency # cat /proc/fs/nfsd/threads # echo 128 > /proc/fs/nfsd/threads RPCNFSDCOUNT=8 # cat /proc/net/rpc/nfsd # nfsstat -rc # cat /proc/mounts # mount -o rsize=8192,wsize=8192 SRV-01-CO-01:/NFS_Store/ /mnt ----------------------------------------------------------------------------------------------------------------- Балансировка нагрузки Exchange Server в виртуальной среде Сергей Барамба New-ClientAccessArray –Name "CAS-array" –FQDN "cas.domain.com" -Site "default-first-site-name" ----------------------------------------------------------------------------------------------------------------- Эмуляторы Android. Часть 3. Google SDK Рашид Ачилов c:> adb -e mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system c:> adb -e remount c:> adb -e shell rm /system/app/SdkSetup.apk /system/app/LicenseChecker.apk c:> adb -e push com.android.vending-3.10.14.apk /system/app с:> emulator -avd test-4.1 -partition-size 250 -no-snapshot-load с:> adb shell mount -o rw,remount -t yaffs2 /dev/block/mtdblock03 /system c:> adb push su /system/xbin/su c:> adb shell chmod 4755 /system/xbin/su c:> adb push Superuser.apk /system/app c:> adb remount c:> adb push busybox /system/xbin/busybox c:> adb push installbusybox.sh /system/xbin/installbusybox.sh c:> adb shell chmod 0755 /system/xbin/installbusybox.sh c:> adb shell installbusybox.sh mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system cat /system/xbin/busybox > /data/local/busybox chmod 755 /data/local/busybox cd /data/local ./busybox cp /data/local/busybox /system/xbin cd /system/xbin chmod 755 busybox ./busybox --install -s /system/xbin rm /data/local/busybox с:> adb push mkfs.yaffs2.arm /system/app c:> adb shell chmod 0777 /system/app/mkfs.yaffs2.arm c:> adb shell /system/app/mkfs.yaffs2.arm /system /sdcard/system.img c:> adb pull /sdcard/system.img c:\temp ----------------------------------------------------------------------------------------------------------------- Распределенная VPN-сеть на брандмауэрах Cisco: проблемы и решения Александр Морозов Листинг 1. Установка компонентов и подготовка базы данных #Установка сервера баз данных yum install mysql-server # Собственно установка сервера FreeRADIUS yum install freeradius # Установка модуля FreeRADIUS для работы с сервером баз данных MySQL yum install freeradius-mysql # Создание базы данных mysql> create database radius; set password for 'radius'@'localhost' = password('ПАРОЛЬ'); grant all privileges on radius.* to radius@localhost; # Cоздание таблиц в базе данных mysql –d radius < /etc/raddb/sql/mysql/schema.sql # Изменение таблицы raddact mysql> use radius; alter table radacct add sourceport varchar(5); alter table radacct add destinationport varchar(5); alter table radacct add sourceip varchar(15); alter table radacct add destinationip varchar(15); Листинг 2. Основные директивы главного файла конфигурации /etc/raddb/radius.conf # Директива задает, на каком порту слушать и в каком режиме работать (в нашем случае только учет трафика, т.е. accounting) listen { ipaddr = * port = 0 type = acct } # Подключение файла конфигурации брандмауэров. # Листинг файла см. ниже $INCLUDE clients.conf modules { # Подключение всех модулей из каталога $INCLUDE /etc/modules/ # Подключение модуля для работы с базой данных (производится с помощью отдельного файла sql.conf) $INCLUDE sql.conf } # Подготовка информации об учете трафика preacct { ModifyCiscoAVPair preprocess # Задействуем модуль, который создает уникальный идентификатор каждой сессии acct_unique } # Запись информации об учете трафика в базу данных accounting { sql } Листинг 3. Пример конфигурации файла clients.conf # Название устройства, которое шлет пакеты Accounting-request client f1.khabarovsk { # IP-адрес интерфейса локальной сети брандмауэра в филиале ipaddr = 172.16.21.1 # Общий ключ secret = СЕКРЕТНАЯ ФРАЗА # Тип устройств nastype = cisco } Cisco-AVPair = "ip:source-port=1257" Cisco-AVPair = "ip:destination-port=80" Cisco-AVPair = "ip:source-ip=172.16.21.212" Cisco-AVPair = "ip:destination-ip=173.194.47.128" Листинг 4. Функция замены атрибутов в модуле attr_rewrite attr_rewrite ModifyCiscoAVPair { # Какой атрибут искать attribute = Cisco-AVPair # Указание искать в пакете searchin = packet # Указание, какую подстроку искать searchfor = "ip:" # Указание, на какую подстроку заменить replacewith = "ip-" # Указание не создавать новый атрибут new_attribute = no # Указание, сколько совпадений искать max_matches = 10 } #ATTRIBUTE Cisco-Service-Info 251 string #ATTRIBUTE Cisco-Command-Code 252 string #ATTRIBUTE Cisco-Control-Info 253 string #ATTRIBUTE Cisco-Xmit-Rate 255 integer ATTRIBUTE ip-source-port 252 string ATTRIBUTE ip-destination-port 253 string ATTRIBUTE ip-source-ip 254 string ATTRIBUTE ip-destination-ip 255 string "ip-source-port=1257" "ip-destination-port=80" "ip-source-ip=172.16.21.212" "ip-destination-ip=173.194.47.128" ,sourceport, destinationport, sourceip, destinationip '%{ip-source-port}', '%{ip-destination-port}', '%{ip-source-ip}', '%{ip-destination-ip}' ----------------------------------------------------------------------------------------------------------------- Мониторинг аппаратуры в Linux Петр Семилетов sensors-detect sensors amdconfig --odgt aticonfig --odgt nvidia-settings -q gpucoretemp nvidia-smi -q -d TEMPERATURE nvclock -T hddtemp _дисковое_устройство_ hddtemp /dev/sda hddtemp -b hddtemp /dev/sd[abc] ncat localhost 7634 hddtemp -D /dev/sda smartctl --test=short _устройство_ smartctl --long=short _устройство_ smartctl --test=conveyance _устройство_ smartctl --test=short /dev/sda ----------------------------------------------------------------------------------------------------------------- AIX PS/2. Особенности использования для архитектуры x86 Антон Борисов Листинг 1. Конфигурация для запуска и установки AIX в эмуляторе Bochs megs: 8 boot: disk panic: action=ask ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 ata0-master: type=disk, path="newvolume.img", mode=flat floppy_bootsig_check: disabled=1 floppya: 1_44=boot_scsi/Boot_Disk1_0024.img display_library: sdl vga: extension=vbe bochs -f ./bochsrc df -v updatep -ac $ tar cvf - /usr/man/cat1 | compress > man1.tar.Z # ls *.Z | cpio -ov > /dev/rfd0 $ cat diskette.img | cpio -vi Листинг 2. Классический пример простой программы на базе Motif-библиотеки #include #include /* объявляем прототип Callback-функции */ void pushed_fn(Widget , XtPointer , XmPushButtonCallbackStruct *); main(int argc, char **argv) { Widget top_wid, button; XtAppContext app; top_wid = XtVaAppInitialize(&app, "Push", NULL, 0, &argc, argv, NULL, NULL); button = XmCreatePushButton(top_wid, "Push_me", NULL, 0); /* управление кнопкой закрепляется за Xt-подсистемой */ XtManageChild(button); /* прикрепляем функцию к виджету */ XtAddCallback(button, XmNactivateCallback, pushed_fn, NULL); /* отображаем иерархию виджетов */ XtRealizeWidget(top_wid); /* входим в цикл обработки событий */ XtAppMainLoop(app); } void pushed_fn(Widget w, XtPointer client_data, XmPushButtonCallbackStruct *cbs) { printf("Don't Push Me!\n"); } $ cc push.c -o push -lXm -lXt -lX11 Листинг 3. Пример программы на базе библиотеки curses // подключаем заголовочный файл #include // задаем переменные для работы с окном int r,c, nrows, ncols; void draw(char dc) { // перемещаем курсор на позицию r (строка), c (колонка) move(r,c); delch(); // заменяем символ в позиции курсора на dc insch(dc); // обновляем экран refresh(); // go to next row r++; // check for need to shift right or wrap around if (r == nrows) { r = 0; c++; if (c == ncols) c = 0; } } main() { int i; char d; WINDOW *wnd; // библиотека curses инициализирует окно wnd = initscr(); // отменяем ожидание подтверждения нажатия Enter cbreak(); // отменяем отображение символа noecho(); // определяем размеры окна getmaxyx(wnd,nrows,ncols); // очищаем окно, перемещаем курсор в позицию (0,0) clear(); // обновляем экран для применения последних изменений refresh(); r = 0; c = 0; while (1) { // получаем символ с клавиатуры d = getch(); // если нажата клавиша 'q', то выходим if (d == 'q' ) break; // отображаем символ draw(d); } // восстанавливаем начальное окно и завершаем работу endwin(); } Листинг 4. Ошибка в сборке программы из-за отсутствующей функции getmaxyx() $ cc -i curses.c -o curses -lcurses ----------------------------------------------------------------------------------------------------------------- UserGate Web Filter. Обзор возможностей Сергей Яремчук $ echo 'deb http://dc.entensys.com/ubuntu precise extra' | sudo tee -a /etc/apt/sources.list $ wget http://dc.entensys.com/ubuntu/entensys.gpg -O - | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install webfilter ----------------------------------------------------------------------------------------------------------------- Паттерны highload-разработки. Часть 1. Кэширование Александр Календарев static someData = NULL; getData() { if (someData) return someData(); someData = CalculateData(); return someData; } SELECT * FROM user WHERE id=$id function foo() { ... $user=new User(); $profileData = $user->getData(); $pay = $profileData['pay']; } function bar() { ... $user=new User(); $profileData = $user->getData(); $balance = $profileData['balance']; } function baz() { ... $user=new User(); $profileData = $user->getData(); $rate = $profileData['rating']; } class User { static $data = null; public function getData($id) { if (self::$data) return self::$data; self::$data =$this->execSQL("SELECT * FROM user WHERE $id=$id"); return self::$data; } ... } ----------------------------------------------------------------------------------------------------------------- Работаем с каталогом Active Directory. Учетные записи с ограниченным сроком действия Иван Коробко Листинг 1. Чтение значения атрибута accountExpires PS> $user=[ADSI]"LDAP://" PS> $value = $user.ConvertLargeIntegerToInt64($user. accountExpires.Value) PS> $value Листинг 2. Преобразование значения в дату PS> if ($value -lt [system.int64]::MaxValue) >> { >> $date = [datetime]::FromFileTime($value).ToString("dd MMM yyyy") >> $date >> } Листинг 3. Вычитание дат >> $today = [datetime]::Today >> $today.AddDays(-1) Листинг 4. Формирование списка пользователей в заданном контейнере $objAD=[ADSISearcher]"" $Guid = ("01 0D AA F1 8C 8E 50 42 A1 44 A3 C1 4F 25 ↵ 1D 3D") -replace " ", "" $objAD.SearchRoot = [ADSI]"LDAP://" $objAD.Filter="(&(objectclass=person)(!objectclass=computer)(!userAccountControl=514))" $objAD.FindAll() |% { $user=$_.getdirectoryentry() …} Листинг 5. Формирование списка пользователей с ограниченным сроком действия $objAD=[ADSISearcher]"" $Guid = ("01 0D AA F1 8C 8E 50 42 A1 44 A3 C1 4F 25 1D 3D") -replace " ", "" $objAD.SearchRoot = [ADSI]"LDAP://" $objAD.Sort.PropertyName = "accountExpires" $objAD.Sort.Direction=0 $objAD.Filter="(&(objectclass=person)(!objectclass=computer)(!userAccountControl=514))" $objAD.FindAll() |% { $user=$_.getdirectoryentry() $value = $user.ConvertLargeIntegerToInt64($user.accountExpires.Value) if ($value -lt [system.int64]::MaxValue) { $date = [datetime]::FromFileTime($value).ToString("dd MMM yyyy") if ((New-TimeSpan $date).Ticks -lt 0 ) { $temp = "{0} * {1} * {2} * {3}" -f [string]($user.description) , $date Write-Host $temp } } } Листинг 6. Формирование виртуальной таблицы. Пример $tmpObj=@() $DataArray="A","B", "C", "D", "E", "F" for ($i=0 ; $i -lt $DataArray.Count; $i++) { $objVirt = New-Object PSObject Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Number" -Value ([string]($i+1)) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Data" -Value ([string]$DataArray[$i]) $tmpObj+=$objVirt } $tmpObj | Out-GridView Листинг 7. Вывод данных в CSV-файл $tmpObj | Export-Csv -Path c:\temp.csv -Encoding Unicode -Delimiter "`t" -Force Листинг 8. Экспорт данных из Active Directory в CSV-файл $tmpObj=@() $i=1 $objAD.FindAll() |% { $user=$_.getdirectoryentry() $value = $user.ConvertLargeIntegerToInt64($user.accountExpires.Value) if ($value -lt [system.int64]::MaxValue) { $date = [datetime]::FromFileTime($value) if ((New-TimeSpan $date).Ticks -lt 0 ) { $objVirt = New-Object PSObject Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "№" -Value ([string]$i) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Дата" -Value ([string]([datetime]$date).AddDays(-1).ToString("dd MMM yyyy")) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "ФИО" -Value ([string]$user.description) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Комната" -Value ([string]$user.physicalDeliveryOfficeName) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Телефон" -Value ([string]$user.telephoneNumber) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Подразделение" -Value ([string]$user.department) Add-Member -InputObject $objVirt -MemberType NoteProperty -Name "Должность" -Value ([string]$user.title) $tmpObj+=$objVirt $i++ } } } $fileName = [string] ([datetime]::Now.ToString("yyyy.MM.dd")) $tmpObj | Export-Csv -Path c:\$filename.csv -Encoding Unicode -Delimiter "`t" -Force Листинг 9. Фильтр для поиска в промежутке дат if (((New-TimeSpan $date).Ticks -lt 0 ) –and ($date –lt ([datetime]::Now).AddDays(7))) { … } Листинг 10. Отправка сообщения по электронной почте $days = … … $smtpServer = "mail.post.ru" $msg = new-object Net.Mail.MailMessage $smtp = new-object Net.Mail.SmtpClient($smtpServer) $fromDay = [string] ([datetime]::Now.ToString("dd.MM.yyyy")) $toDay = [string] ([datetime]::Now.AddDays($days).ToString("dd.MM.yyyy")) $msg.Body=($tmpObj |ConvertTo-Html -Body "

Отчет по учетным записям с истекающим сроком действия в течение $days дней

").replace("", "
") $msg.IsBodyHTML = $true $msg.From = "support@post.ru" $msg.To.Add = "support@post.ru" $msg.Subject = "Отчет по учетным записям $fromDay - $toDay" $smtp.Send($msg) ----------------------------------------------------------------------------------------------------------------- Программирование для Android. Это просто! Сергей Ильичев PATH="$HOME/android/android-sdk-linux/tools:$HOME/android/android-sdk-linux/platform-tools:$PATH" $android avd $android create avd -n em1 -t 1 -c 512M $android list targets $ emulator @em1 ----------------------------------------------------------------------------------------------------------------- Стандарты в Linux. Инструментальная поддержка и проблемы Денис Силаков void func() { return 1; } __asm__(".symver func, func@VER_1"); void func() { return 2; } __asm__(".symver func, func@VER_2"); void func_old() { return 1; } __asm__(".symver func_old, func@VER_1"); ----------------------------------------------------------------------------------------------------------------- Сервер приложений JBoss. Java-язык, платформа Михаил Ушаков cp jdk-6u45-linux-i586.bin /usr/java/ cd /usr/java/ && chmod +x jdk-6u45-linux-i586.bin ./ jdk-6u45-linux-i586.bin wget -O jboss-as-distribution-6.0.0.Final.zip http://sourceforge.net/projects/jboss/files/JBoss/JBoss-6.0.0.Final/jboss-as-distribution-6.0.0.Final.zip/download mkdir /usr/local/jboss mv jboss-as-distribution-6.0.0.Final.zip /usr/local/jboss cd /usr/local/jboss unzip –q jboss-as-distribution-6.0.0.Final.zip /usr/sbin/groupadd jboss /usr/sbin/useradd –s /bin/bash –g jboss jboss chown –Rf jboss:jboss /usr/local/jboss/jboss-6.0.0.Final JAVA_HOME=/usr/java/jdk1.6.0._45 export JAVA_HOME JBOSS_HOME=/usr/local/jboss/jboss-6.0.0.Final: export JBOSS_HOME cp /usr/local/jboss/jboss-6.0.0.Final/bin/jboss_init_redhat.sh /etc/init.d/jboss #description:JBoss Application Server #processname:jboss6 #chkconfig:2345 95 20 JBOSS_HOME=${JBOSS_HOME:-"/usr/local/jboss/jboss-6.0.0.Final"} JBOSS_USER=${JBOSS_USER:-"jboss"} JAVA_PATH =${JBOSS_HOME:-"/usr/java/jdk1.6.0_45"} JBOSS_HOST="0.0.0.0" JBOSS_BIND_ADDR=${JBOSS_HOST:- "-b $JBOSS_HOST"} сhmod 755 jboss /sbin/chkconfig –level 2345 jboss on HtmlAdaptor An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application /* JBossAdmin java:/jaas/jmx-console JAVA_OPTS="–Dprogram.name=$PROGNAME $JAVA_OPTS" JAVA_OPTS="$JAVA_OPTS -Xms128m –Xmx256m" JAVA_OPTS="$JAVA_OPTSDhttp.proxyHost=192.168.198.2 -Dhttp.proxyPort=3128" MySQLConnections jdbc:mysql://localhost:3306/JbossDB com.mysql.jdbc.Driver michael ~*\SeCuRePassWd/*~ 2 20 5 com.mysql.jdbc.integration.jboss.ExtendedMysqlExceptionSorter com.mysql.jdbc.integration.jboss.MysqlValidConnectionChecker java:/MySQLConnections ----------------------------------------------------------------------------------------------------------------- Учимся работать по-новому Константин Кондаков SELECT* FROM ( SELECT reg.* , profiles.*, ) registrationView reg_is_confirmed = 1 AND ORDER BY reg_date_created DESC # rpm -Uvh /tmp/po*.rpm -----------------------------------------------------------------------------------------------------------------