Проект OpenNebula. Решение для организации IaaS Сергей Яремчук $ sudo apt-cache show opennebula | grep -i version $ sudo apt-get install bridge-utils $ sudo nano /etc/network/interfaces …. auto eth0 iface eth0 inet manual auto br0 iface br0 inet static address 192.168.1.100 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 dns-search example.com bridge_ports eth0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off $ sudo service networking restart $ brctl show $ sudo apt-get install libsqlite3-dev libxmlrpc-c3-dev g++ ruby libopenssl-ruby libssl-dev ruby-dev libxml2-dev libmysqlclient-dev libmysql++-dev libsqlite3-ruby libexpat1-dev rake rubygems libxml-parser-ruby1.8 libxslt1-dev genisoimage scons ruby-json ruby-sinatra thin1.8 lvm2 ruby-mysql ruby-password ruby-sequel curl make gcc g++ libsqlite3-dev libcurl4-openssl-dev $ sudo gem install nokogiri $ sudo apt-get install openssh-server $ sudo apt-get install nfs-kernel-server $ sudo nano /etc/exports /var/lib/one 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash,anonuid=10000,anongid=10000) $ sudo service nfs-kernel-server start $ sudo dpkg -i Ubuntu-12.04-opennebula_3.6.0-1_amd64.deb $ sudo /usr/share/one/install_gems $ sudo apt-get install mysql-server $ mysql -u root –p mysql> CREATE USER 'oneadmin'@'localhost' IDENTIFIED BY 'oneadmin'; mysql> CREATE DATABASE opennebula; mysql> GRANT ALL PRIVILEGES ON opennebula.* TO 'oneadmin' IDENTIFIED BY 'oneadmin'; mysql> quit; $ sudo passwd oneadmin $ id oneadmin $ sudo groupadd -g 111 oneadmin $ sudo useradd -u 104 -m oneadmin -d /var/lib/one/ -s /bin/bash –g oneadmin $ su oneadmin oneadmin $ nano ~/.bash_profile export ONE_LOCATION=/var/lib/one export ONE_AUTH=$ONE_LOCATION/.one/one_auth export ONE_XMLRPC=http://localhost:2633/RPC2 export PATH=$ONE_LOCATION/bin:/usr/local/bin:/var/lib/gems/1.8/bin/:/var/lib/gems/1.8/:$PATH oneadmin$ source ~/.bash_profile oneadmin$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys oneadmin$ cat ~/.ssh/config Host * StrictHostKeyChecking no oneadmin$ ssh example.org oneadmin$ mkdir ~/.one $ oneuser passwd 0 p@ssw0rd oneadmin$ echo "oneadmin:p@ssw0rd" > ~/.one/one_auth oneadmin$ chmod 600 ~/.one/one_auth oneadmin$ exit $ sudo nano /etc/one/oned.conf #DB = [ backend = "sqlite" ] DB = [ backend = "mysql", server = "localhost", port = 3306, user = "oneadmin", passwd = "oneadmin", db_name = "opennebula" ] $ su oneadmin oneadmin$ one stop oneadmin$ one start oneadmin$ onevm list onehost create --im --vm kvm --net dummy oneadmin$ onehost create example.org --im im_kvm --vm vmm_kvm --net dummy oneadmin$ onehost list oneadmin$ oneuser list oneadmin$ sunstone-server start $ sudo nano /etc/one/occi-server.conf #:host: 127.0.0.1 :host: 0.0.0.0 :port: 4567 oneadmin$ occi-server start oneadmin$ occi-storage list ----------------------------------------------------------------------------------------------------------------- Hyper-ускорение с виртуализацией от компании Microsoft Антон Борисов net use Z: \\Server_IP\MyShare /user:MyName Листинг 1. Проверяем состояние сервиса управления виртуализацией Hyper-V C:\Users\Administrator>sc query vmms cscript hvremote.wsf /add:hyperv cscript hvremote.wsf /anondcom:grant cmdkey /add:servername /user:servername\account /pass cscript hvremote.wsf /mmc:enable cscript hvremote.wsf /show /target:othercomputername cscript hvremote.wsf /show /target:HyperV_2012_IP_Address cscript hvremote.wsf /mode:client /mmc:enable > netsh firewall set portopening ALL 137 "Hyper-V Management" > netsh firewall set portopening ALL 445 "Hyper-V Management" > netsh advfirewall firewall set rule group="Remote Volume Management" new enable=yes > netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes > netsh advfirewall firewall set rule group="Remote Volume Management" new enable=yes > netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes > qemu-img convert -f raw -O vpc vm-disk-ide0.raw vm-disk-ide0.vhd ----------------------------------------------------------------------------------------------------------------- Bacula, или Еще раз о backup Даниил Прахин apt-get install bacula-director-common bacula-director-mysql bacula-storage bacula-client bacula-common @/etc/bacula/папка/конфигурационного/файла.conf Director { #Описание глобальных параметров Director #Name, Password – идентификатор Director и пароль для подключения консоли управления #DirAddress, Dir Port – IP-адрес (FQDN-имя) и порт, на котором Director обслуживает запросы #Working Directory, PID Directory – каталоги, в которых будут храниться статус и PID-файлы процесса #Query File – расположение файла, содержащего структуру SQL-запросов к каталогу – БД #SD Connect Timeout, FD Connect Timeout – время, в течение которого Director будет пытаться установить соединение с SD и FD соответственно #Maximum Concurrent Jobs – максимальное количество одновременно выполняемых заданий #Messages – ссылка на описание используемой системы оповещения и логирования Name = Bacula-Director Password = "Director" DirAddress = 192.168.66.101 Dir Port = 9101 Working Directory = "/var/run/bacula" PID Directory = "/var/run/bacula" Query File = "/usr/share/bacula/scripts/query.sql" FD Connect Timeout = 5 minutes SD Connect Timeout = 5 minutes Maximum Concurrent Jobs = 10 Messages = Bacula-Director } Catalog { #Описание каталога – БД, хранящей все сведения о выполненных заданиях, сохраненных файлах #Name – название, используемое для каталога. Именно оно используется в настройках клиентов. #DB Name – имя используемой БД #User, Password – имя и пароль для доступа к БД Name = Bacula-Catalog DB Name = bacula User = bacula Password = bacula } Messages { #Описание системы логирования и оповещения о событиях в работе Director #Name – название системы логирования #File – в лог-файл сохраняем всю информацию о работе #Catalog – в БД пишем все сообщения об ошибках #Console – всю информацию выводим на консоль Name = Bacula-Director File = "/var/log/bacula/bacula-dir.log" = all Catalog = error, fatal, terminate, notsaved Console = all } Client { #Описание клиента ХР, данные которого будем резервировать #Name, Address, FD Port, Password – соответственно имя, IP-адрес (FQDN-имя), порт и пароль для доступа к клиенту #Catalog – название БД, в которую будем записывать информацию обо всех заданиях #File Retention, Job Retention – время, в течение которого в БД будет храниться информация о выполненных заданиях и сохраненных файлах. #По истечении указанного периода вся информация из БД будет удалена. Файлы резервных копий при этом сохраняются! Name = Client1 Address = 192.168.66.102 FD Port = 9102 Password = "Client1" Catalog = Bacula-Catalog File Retention = 30 days Job Retention = 30 days } Client { #Аналогично конфигурируем второго клиента Name = Client2 Address = 192.168.66.101 FD Port = 9102 Password = "Client2" Catalog = Bacula-Catalog File Retention = 30 days Job Retention = 30 days } Job { #Ресурс, полностью описывающий задание резервного копирования. По сути, он отвечает на вопросы: #Что будем резервировать (FileSet), на какой носитель (Storage), как (backup/restore/level) и когда (Schedule)? #В общем случае каждому клиенту соответствует одно задание, но если файлов для резервирования действительно много, #то можно процесс резервирования описать несколькими заданиями, каждое из которых резервирует свою часть файлов #Name – идентификатор задания, удобно, когда соответствует идентификатору клиента #Enabled=Yes– разрешаем автоматическое выполнение по расписанию, иначе – запуск в ручном режиме #Type – тип задания. Backup – резервное копирование #Client – указываем клиента, для которого подготовлено задание #Pool – пул томов, который будет использоваться для хранения данных #FileSet – указываем используемый набор файлов, подлежащих резервному копированию #Schedule – указываем расписание, которое будем использовать #Messages – указываем идентификатор используемой системы оповещения и логирования Name = Client1 Enabled = Yes Type = Backup Client = Client1 Pool = Client1 FileSet = Job1 Schedule = Job1 Messages = Job } Pool { #Ресурс, описывающий пул томов (Volume), используемый для хранения данных #Name – идентификатор пула #Pool Type=Backup – единственно возможное значение #Storage – идентификатор службы хранения данных #Label Format – шаблон имени файла резервной копии #Use Volume Once – указываем для каждой копии использовать отдельный файл Name = Client1 Pool Type = Backup Storage = Client1 Label Format = "Cli1-BackUp-" Use Volume Once = yes } Storage { #Описание используемой службы хранения #Name – идентификатор службы хранения #Device – идентификатор устройства хранения #Media Type – тип хранимых данных. Совершенно произвольное название, описывает тип хранимых данных. Для каждого Storage желательно иметь уникальное значение. #Address, SDPort, Password – IP-адрес (FQDN-имя), порт и пароль для доступа к SD Name = Client1 Device = Client1 Media Type = File-XP Address = 192.168.66.101 SD Port = 9103 Password = "Storage" } FileSet { #Описываем набор файлов, которые будем резервировать на клиенте #Name – идентификатор набора файлов #Include, Exclude – соответственно набор файлов, которые надо включить в резервную копию и файлы, которые необходимо исключить из резервной копии #IgnoreCase – для Windows-клиентов – игнорируем регистр имени файлов #Compression, Signature – указываем, какой использовать алгоритм сжатия и контрольной суммы #Recurse – копировать каталоги рекурсивно #CheckFileChanges – проверка корректности переноса резервируемых файлов по сети #FSType – тип используемой на клиенте файловой системы #RegExDir – регулярное выражение, применяемое ТОЛЬКО к имени директории #WildDir, Wild – wildcard строка, применяема, соответственно ТОЛЬКО к имени директории и имени файла #File – путь к файлам, подлежащим резервному копированию Name = Job1 Include { options { IgnoreCase = yes; Compression = GZIP; Signature = SHA1; Recurse = yes; CheckFileChanges = yes; fstype = ntfs; RegExDir = "^C:/Documents and Settings/[^/]+$"; WildDir = "C:/Documents and Settings/*/Мои документы"; Wild = "C:/Documents and Settings/*/Мои документы/*" }; File = "C:/Documents and Settings" Options { Exclude = yes; IgnoreCase = yes; Wild = "C:/Documents and Settings/*"; } } Schedule { #Описание расписания для задания Job1 #Необходимо выполнять полную резервную копию каждую пятницу в 17:00 #А инкрементную копию – с понедельника по четверг в 17:00 Name = Job1 Run = Level=Full fri at 17:00 Run = Level=Incremental mon-thu at 17:00 } Messages { #Описание системы сообщений и логирования для выполненных заданий #Всю информацию будем высылать на почту системному администратору ROOT #Дописывать (Append) в лог-файл, а также выводить на консоль и сохранять в БД информацию об ошибках Name = Job Mailcommand = "/bin/mail -s \"BACULA: %t %e of %c %l \" root@localhost" Mail = root@localhost = all Append = "/var/log/bacula/bacula-job.log" = all Console = error, fatal, terminate, notsaved Catalog = error, fatal, terminate, skipped, notsaved } #Для каждого клиента необходимо подготовить одно задание для восстановления данных Job { #Name – идентификатор задания #Type=Restore – тип задания – восстановление данных. #В отличие от резервного копирования (Type=BackUp) в заданиях восстановления данных параметр Enabled не используется! #Client, FileSet, Pool, Storage – соответственно указание клиента, набора файлов, используемого пула и службы хранения #Where – указывает путь, по которому необходимо восстановить данные из архива. Если значение Where не указывается, #то данные будут восстановлены в тот каталог, из которого они были сохранены. Поскольку это может привести #к перезаписи уже существующих важных файлов. Рекомендуется восстановление осуществлять в дополнительный каталог. #Messages – указываем идентификатор используемой системы оповещения и логирования Name = Client1-Restore Type = Restore Client = Client1 FileSet = Job1 Pool = Client1 Storage = Client1 Where = "D:/BACULA-RESTORE" Messages = Job } #По аналогии готовится задание для клиента под управлением ОС Alt-Linux Job{ Name = Client2 Enabled = Yes Type = BackUp Client = Client2 Pool = Client2 FileSet = Job2 Schedule = Job2 Messages = Job } Pool { Name = Client2 Pool Type = Backup Storage = Client2 Use Volume Once = Yes Label Format = "Cli2-Backup-" } Storage { Name = Client2 Device = Client2 Media Type = File-Lin Address = 192.168.66.101 SDPort = 9103 Password = "Storage" } FileSet { Name = Job2 Include { Options { AclSupport = Yes; Compression = GZIP; Signature = MD5; }; File = "/etc" } } Schedule { Name = Job2 Run = Level=Full sun at 23:00 Run = Level=Incremental mon-fri at 17:00 } Job { Name = Client2-Restore Type = Restore Client = Client2 FileSet = Job2 Pool = Client2 Storage = Client2 Where = "/var/bacula-restore" Messages = Job } Storage { #В данном ресурсе определяем глобальные параметры SD #Name, SDAddress, SDPort – соответственно имя, IP-адрес (FQDN-имя), порт SD #Working Directory, PID Directory – папки, в которых хранится стат и PID-файл демона #Client Connect Wait – время ожидания соединения от клиента #Messages – описания системы оповещения и логирования Name = Bacula-Storage SDAddress = 192.168.66.101 SDPort = 9103 Working Directory = "/var/run/bacula" PID Directory = "/var/run/bacula" Client Connect Wait = 5 minutes Messages = Bacula-Storage } Director { #Описываем параметры Director для управления SD. #Name – имя Director, которому разрешено управлять данным SD #Password – пароль для подключения Name = Bacula-Director Password = "Storage" } #Описание устройств хранения/каталогов, в которых будут храниться резервные копии Device { #Name – логическое имя устройства хранения, любое удобное обозначение #Archive Device – каталог, содержащий резервные копии #AutomaticMount – автоматически монтировать устройство хранения #LabelMedia – автоматическое название для каждого записанного тома #Device Type = File – указываем, что архив будет храниться в файле на диске #Media Type – произвольное обозначение типа устройства хранения #Removable Media – указываем, что устройство хранения не сменное – жесткий диск Name = Client1 Archive Device = "/bacula-backup/client1" AutomaticMount = Yes LabelMedia = Yes Device Type = File Media Type = File-XP Removable Media = No } Device { Name = Client2 Archive Device = "/bacula-backup/client2" AutomaticMount = Yes LabelMedia = Yes Device Type = File Media Type = File-Lin Removable Media = No } Messages { #В данном ресурсе описываем систему оповещения и логирования #Для SD пишем всю информацию в лог-файл и выводим на консоль информацию обо всех ошибках и сбоях храним в каталоге Name = Bacula-Storage File = "/var/log/bacula/bacula-sd.log" = all Console = all Catalog = error, fatal, terminate, notsaved } FileDaemon { #Описываем глобальные параметры клиента #Name, FDPort, WorkingDirectory, PID Directory – соответственно имя клиента, порт, рабочие каталоги #Maximum Concurent Jobs-количество одновременно выполняемых заданий, нам достаточно 1 Name = Client1 FDPort = 9102 WorkingDirectory = "C:\\Program Files\\Bacula\\Working" PID Directory = "C:\\Program Files\\Bacula\\Working" Maximum Concurent Jobs = 1 } Director { #Описываем параметры Director для управления FD #Name – имя Director, которому разрешено управлять данным FD, #Password – пароль для подключения Name = Bacula-Director Password = "Client1" } Messages { #Все сообщения об ошибках сохраняем в лог-файле и передаем Director Name = Standart Director = Bacula-Director = all, !skipped, !restored File = "C:\\Bacula-Logs\Client-XP\Client1" = all } Director { #Name, Address, DIRPort, Password – соответственно имя #Director, его IP-адрес или FQDN-имя сервиса, порт, а также пароль, необходимый для прохождения процедуры аутентификации Name = Bacula-Director Address = 192.168.66.101 DIRPort = 9101 Password = "Director" } apt-get install bacula-bat ----------------------------------------------------------------------------------------------------------------- Microsoft SharePoint. Обработка события появления нового пользователя Алексей Бойко Листинг 1. Получение ссылки на скрытый список пользователей SPWeb web = …; SPList userInformationList = web.SiteUserInfoList; Листинг 2. Получение новых пользователей с помощью UserProfileManager.GetChanges private List _GetNewAccounts(SPSite site, DateTime utcDate) { SPServiceContext context = SPServiceContext.GetContext(site); UserProfileManager profileManager = new UserProfileManager(context); UserProfileChangeQuery changeQuery = new UserProfileChangeQuery { // нас интересуют только события создания и удаления Add = true, Delete = true, Update = false, // произошедшие с профилями не раньше заданного времени ChangeTokenStart = new UserProfileChangeToken(utcDate), UserProfile = true, SingleValueProperty = false, MultiValueProperty = false, UpdateMetadata = false, Colleague = false, DistributionListMembership = false, OrganizationMembership = false, SiteMembership = false, QuickLink = false, Anniversary = false, Custom = false, PersonalizationSite = false, WebLog = false, }; UserProfileChangeCollection changes = profileManager.GetChanges(changeQuery); List newAccounts = new List(); if (changes != null && changes.Count != 0) { var accounts = changes .Select(cc => ((UserProfileChange)cc).AccountName) .Distinct(); foreach (var account in accounts) { var lastAccountChange = changes .Cast() .Where(cc => cc.AccountName == account) .OrderByDescending(cc => cc.EventTime) .First(); // если последнее событие – это добавление (а не удаление) if (lastAccountChange.ChangeType == ChangeTypes.Add) newAccounts.Add(account); } } return newAccounts; } ----------------------------------------------------------------------------------------------------------------- Построение корпоративных VPN. IKED – альтернатива ipsec-tools Рашид Ачилов # sysctl net.key.preferred_oldsa=0 # cd /usr/ports/security/racoon2 && make all install clean # (cd /usr/local/etc/racoon2) && ls -1a setval { CERTDIR "/etc/ssl/certs"; MY_FQDN "node1.deltahw.ru"; PEERS_FQDN "www.deltahw.ru"; PUB_KEY "node1.crt"; PRI_KEY "node1.key"; PEERS_PUB_KEY "deltahw.crt"; MY_NET "10.87.11.0/24"; PEERS_NET "10.87.1.0/24"; MY_GWADDRESS "170.70.70.1"; PEERS_GWADDRESS "212.20.5.1"; PH1UP_SCR "/usr/local/etc/racoon2/hook/ph1-up"; PH1DOWN_SCR "/usr/local/etc/racoon2/hook/ph1-down"; }; include "/usr/local/etc/racoon2/vals.conf"; interface { ike { 170.70.70.1 port 500; 170.70.70.1 port 4500; }; spmd { unix "/var/run/racoon2/spmif"; }; spmd_password "/usr/local/etc/racoon2/spmd.pwd"; }; resolver { resolver on; nameserver 8.8.8.8; dns_query 170.70.70.1; }; include "/usr/local/etc/racoon2/default.conf"; include "/usr/local/etc/racoon2/tunnel_ike.conf"; default { remote { acceptable_kmp { ikev1; }; ikev1 { logmode normal; kmp_sa_lifetime_time 3600 sec; kmp_sa_lifetime_byte infinite; interval_to_send 20 sec; times_per_send 1; ipsec_sa_nego_time_limit 30 sec; kmp_enc_alg { aes128_cbc; 3des_cbc; }; kmp_hash_alg { sha1; md5; }; kmp_dh_group { modp2048; modp1024; }; kmp_auth_method { psk; }; random_pad_content on; }; }; policy { ipsec_mode tunnel; ipsec_level require; }; ipsec { ipsec_sa_lifetime_time infinite; ipsec_sa_lifetime_byte infinite; }; sa { esp_enc_alg { aes128_cbc; 3des_cbc; }; esp_auth_alg { hmac_sha1; hmac_md5; }; }; }; ipsec ipsec_ah_esp { ipsec_sa_lifetime_time 28800 sec; sa_index { ah_01; esp_01; }; }; ipsec ipsec_esp { ipsec_sa_lifetime_time 600 sec; sa_index esp_01; }; sa ah_01 { sa_protocol ah; ah_auth_alg { hmac_sha1; hmac_md5; }; }; sa esp_01 { sa_protocol esp; esp_enc_alg { aes256_cbc; aes192_cbc; aes128_cbc; blowfish_cbc; 3des_cbc; }; esp_auth_alg { hmac_sha1; hmac_md5; }; }; remote 212.20.5.1 { acceptable_kmp { ikev1; }; ikev1 { logmode debug; exchange_mode main; my_id x509_subject "${CERTDIR}/${PUB_KEY}"; peers_id x509_subject "${CERTDIR}/${PEERS_PUB_KEY}"; peers_ipaddr "${PEERS_GWADDRESS}" port 500; kmp_enc_alg { aes192_cbc; aes128_cbc; 3des_cbc; }; kmp_hash_alg { sha1; }; kmp_dh_group { modp1024; }; kmp_auth_method { rsasig; }; my_public_key x509pem "${CERTDIR}/${PUB_KEY}" "${CERTDIR}/${PRI_KEY}"; peers_public_key x509pem "${CERTDIR}/${PEERS_PUB_KEY}" ""; verify_pubkey on; send_cert on; nonce_size 16; initial_contact on; proposal_check strict; passive off; need_pfs on; dpd_delay 0; script { phase1_up "${PH1UP_SCR}"; phase1_down "${PH1DOWN_SCR}"; }; }; selector_index ike_tun_sel_in; }; selector ike_tun_sel_out { direction outbound; src "${MY_NET}"; dst "${PEERS_NET}"; policy_index 212.20.5.1; }; selector ike_tun_sel_in { direction inbound; dst "${MY_NET}"; src "${PEERS_NET}"; policy_index 212.20.5.1; }; selector ike_local_out { direction outbound; src "${MY_NET}"; dst "${MY_NET}"; policy_index local; }; selector ike_local_in { direction inbound; dst "${MY_NET}"; src "${MY_NET}"; policy_index local; }; policy 212.20.5.1 { action auto_ipsec; remote_index 212.20.5.1; ipsec_mode tunnel; ipsec_index { ipsec_esp; }; ipsec_level require; peers_sa_ipaddr "${PEERS_GWADDRESS}"; my_sa_ipaddr "${MY_GWADDRESS}"; }; policy local { action none; }; ----------------------------------------------------------------------------------------------------------------- Свой ПАК Владимир Заболотский; Вячеслав Медведев; Илья Яковец bunzip2 -dc /win/C\:/drweb-officeshield-image-server_6.0.1.1011020.bz2 | dd of=/dev/sda my %iface_mapping = ( "lan" => 'eth0', "dmz" => 'eth1', "wan" => 'eth2', "wifi" => &getWlanRealName(), ); my %iface_mapping = ( "lan" => 'eth0', "wan2 => 'eth1', ); /opt/drweb/drwebdc -sv –si или /opt/drweb/drwebdc -sv -si -n127.0.0.1 grep X5O /opt/drweb/doc/readme.eicar | /opt/drweb/drwebdc -V – netstat -lnp |grep drw telnet 127.0.0.1 1344 telnet 127.0.0.1 3128 get http://eicar.org/download/eicar.com http/1.1 /etc/init.d/drweb-monitor status egrep '^[^#](.*)(QueueFilters)' /etc/drweb/maild_smtp.conf telnet 127.0.0.1 25 helo test mail from: user@localhost rcpt to: user1@localhost data X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* tail -f /var/log/mail.log ----------------------------------------------------------------------------------------------------------------- Исследуем безопасность Wi-Fi. Практика обхода механизмов защиты Юрий Денисов airodump-ng –ivs –bssid xx:xx:xx:xx:xx:xx -w WEP –channel 1 mon 0 aircrack-ng -a 1 -b xx:xx:xx:xx:xx:xx -n 128 WEP.ivs airodump-ng –bssid xx:xx:xx:xx:xx:xx -w WPA2 –channel 1 mon 0 aircrack-ng -w dic.txt *.cap reaver -i mon0 -b xx:xx:xx:xx:xx:xx ----------------------------------------------------------------------------------------------------------------- Создание key/value-хранилищ данных. Часть 1. Хранение Александр Календарев p[i] = p + i * sizeof(p[0]) struct { void * next; //указатель на следующий элемент списка int32_t data; //непосредственно сами данные } element; struct { void *key; //ключ void * next; //указатель на следующий элемент списка int32_t data; //непосредственно сами данные } list; struct { void * parent; //указатель на родительский элемент дерева void * right; //указатель на правый элемент дерева void * left; //указатель на левый элемент дерева void * data; //указатель на элемент данных int32_t key; //непосредственно сами данные/ключи } element; struct { char data[DATASIZE]; //элемент данных int16_t next; //если данные не входят в один слот размером DATASIZE, //то переменная next содержит индекс следующего элемента корзины } bucket; TCHDB *hdb; int ecode; char *key, *value; /* создание объекта hash-таблицы */ hdb = tchdbnew(); /* открытие БД hash-таблицы */ if(!tchdbopen(hdb, "test.tch", HDBOWRITER | HDBOCREAT)){ ecode = tchdbecode(hdb); fprintf(stderr, "open error: %s\n", tchdberrmsg(ecode)); tchdbdel(hdb); exit(1); } /* некоторые операции записи/извлечения данных */ if(!tchdbput2(hdb, "foo", "hop") { ecode = tchdbecode(hdb); fprintf(stderr, "put error: %s\n", tchdberrmsg(ecode)); } value = tchdbget2(hdb, "foo"); if(value){ printf("%s\n", value); free(value); } else { ecode = tchdbecode(hdb); fprintf(stderr, "get error: %s\n", tchdberrmsg(ecode)); } /* итерация по корзине */ tchdbiterinit(hdb); while((key = tchdbiternext2(hdb)) != NULL){ value = tchdbget2(hdb, key); if(value){ printf("%s:%s\n", key, value); free(value); } free(key); } /* закрытие БД */ if(!tchdbclose(hdb)){ ecode = tchdbecode(hdb); fprintf(stderr, "close error: %s\n", tchdberrmsg(ecode)); } /* удаление объекта БД */ tchdbdel(hdb); TCHDB *hdb = tchdbnew(); // БД для hash-таблиц TCBDB *bdb = tcbdbnew(); // БД для B+Tree деревьев TCFDB *fdb = tcfdbnew(); // БД структур фиксированной длины (динамические hash-структуры) TCTDB *tdb = tctdbnew(); // Табличные БД TCMAP *tcm = tcmapnew(); // MAP-структуры (hash-таблицы) TCLIST *tcl = tclistnew(); // Связанные списки, List TCTREE *tctr = tctreenew();// Упорядоченные деревья TCMDB *tcm = tcmdbnew(); // Hash-memory ДБ TCNDB *tcn = tcndbnew(); // Tree-memory ДБ -----------------------------------------------------------------------------------------------------------------