Мониторинг UNIX-серверов c помощью Nagios и SNMP Андрей Бешков # cd /usr/ports/net-mgmt/net-snmp # make install clean # cd /usr/ports/net-mgmt/nagios-plugins # make install clean # apt-get update # apt-get install net-snmp net-snmp-utils # Местонахождение системы в реальном мире syslocation Rostov-on-Don Kranoarmejskaya str. Building 1 testlab 407 # Контакты администратора syscontact Andrew Beshkov admin@example.com tel. 390-34-89 # Сервисы, предоставляемые системой sysservices = 79 rocommunity InK12345 rwcommunity 12r341289j # service snmpd start # chkconfig snmpd on # chkconfig snmpd --list # /usr/local/etc/rc.d/snmpd.s # snmpwalk –m ALL -c InK12345 -v1 penguin .iso.org.dod.internet.mgmt.mib-2.system com2sec nagios 10.10.21.55/32 InK12345 group MyROGroup v2c nagios view all included .1 80 access MyROGroup "" any noauth exact all none none # snmpwalk –m ALL -c InK12345 -v2с penguin .iso.org.dod.internet.mgmt.mib-2.system # /usr/local/nagios/libexec/check_snmp -H penguin -o .1.3.6.1.2.1.1.3.0 -C InK12345 -P 2c -P, --protocol=[1|3]\n\ -P, --protocol=[1|2c|3]\n\ if (proto == NULL || (strcmp(proto,DEFAULT_PROTOCOL) == 0) ) { /* default protocol version */ asprintf(&proto, DEFAULT_PROTOCOL); asprintf(&authpriv, "%s%s", "-c ", community); } else if ( strcmp (proto, "2c") == 0 ) { /* snmpv2c args */ asprintf(&proto, "%s", "2c"); asprintf(&authpriv, "%s%s", "-c ", community); } # make install define command{ command_name check_snmp_oid command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ -u $ARG5$ -l "" -P $ARG6$ } # Описываем шаблон хоста define host{ name generic-host notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 max_check_attempts 10 notification_interval 120 notification_period 24x7 notification_options d,u,r register 0 } define host{ use generic-host host_name Linux alias Standard Linux Server address penguin check_command check-host-alive } define host{ use generic-host host_name FreeBSD alias Standart FreeBSD Server address reddaemon check_command check-host-alive } define hostgroup{ hostgroup_name onix-servers alias Onix Servers contact_groups onix-admins members Linux, FreeBSD } # Описываем шаблон сервиса define service{ name generic-service active_checks_enabled 1 passive_checks_enabled 1 parallelize_check 1 obsess_over_service 1 check_freshness 0 notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 notification_interval 120 notification_period 24x7 notification_options w,u,c,r max_check_attempts 3 normal_check_interval 1 retry_check_interval 1 contact_groups onix-admins register 0 } define service{ use generic-service host_name Linux service_description System Uptime is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.2.1.1.3.0!InK12345! ""! ""! ""!2c } hrStorageDescr.2 = STRING: Real Memory hrStorageDescr.3 = STRING: Swap Space hrStorageDescr.4 = STRING: / hrStorageDescr.5 = STRING: /home hrStorageDescr.6 = STRING: /proc/bus/usb hrStorageAllocationUnits.2 = INTEGER: 1024 Bytes hrStorageAllocationUnits.3 = INTEGER: 1024 Bytes hrStorageAllocationUnits.4 = INTEGER: 4096 Bytes hrStorageAllocationUnits.5 = INTEGER: 4096 Bytes hrStorageAllocationUnits.6 = INTEGER: 1024 Bytes hrStorageSize.2 = INTEGER: 54156 hrStorageSize.3 = INTEGER: 216836 hrStorageSize.4 = INTEGER: 273087 hrStorageSize.5 = INTEGER: 196780 hrStorageSize.6 = INTEGER: 0 hrStorageUsed.2 = INTEGER: 52564 hrStorageUsed.3 = INTEGER: 11220 hrStorageUsed.4 = INTEGER: 235014 hrStorageUsed.5 = INTEGER: 8755 hrStorageUsed.6 = INTEGER: 0 define service{ use generic-service host_name Linux service_description Space on / is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.2.1.25.2.3.1.6.4!InK12345!218470!245778!blocks!2c } disk / 180000 disk /home 760000 dskPath.1 = STRING: / dskPath.2 = STRING: /home dskDevice.1 = STRING: /dev/sda1 dskDevice.2 = STRING: /dev/sda6 dskPercent.1 = INTEGER: 86 dskPercent.2 = INTEGER: 4 dskErrorFlag.1 = INTEGER: 1 dskErrorFlag.2 = INTEGER: 0 dskErrorMsg.1 = STRING: /: less than 80% free (= 86%) dskErrorMsg.2 = STRING: define service{ use generic-service host_name Linux service_description Space on / check 2 is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.9.1.9.1!InK12345!80!90!% } load 12 20 30 define service{ use generic-service host_name Linux service_description CPU Load 1 min is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.10.1.5.1!InK12345!60!90!% } exec users /bin/sh /usr/bin/count_users.sh exec mailqueue /bin/sh /usr/bin/count_mail.sh who | wc -l exit 0 mailq | tail -n 1 | cut -f5 -d " " exit 0 extNames.1 = STRING: users extNames.2 = STRING: mailqueue extCommand.1 = STRING: /bin/sh /usr/bin /count_users.sh extCommand.2 = STRING: /bin/sh / usr/bin/count_mail.sh extResult.1 = INTEGER: 0 extResult.2 = INTEGER: 0 extOutput.1 = STRING: 1 extOutput.2 = STRING: 2 extErrFix.1 = INTEGER: 0 extErrFix.2 = INTEGER: 0 extErrFixCmd.1 = STRING: extErrFixCmd.2 = STRING: define service{ use generic-service host_name Linux service_description Users is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.8.1.101.1!InK12345!20!30!users } define service{ use generic-service host_name Linux service_description Mail queue is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.8.1.101.2!InK12345!40!80!messages } execfix mailqueue /bin/sh /usr/bin/repair_mailqueue.sh exec .1.3.6.1.4.1.2021.50 multi_line_test /bin/sh/tmp/mytest.sh echo "first line" echo "second line" exit 5 .1.3.6.1.4.1.2021.50.1.1 = INTEGER: 1 .1.3.6.1.4.1.2021.50.2.1 = STRING: "multi_line_test" .1.3.6.1.4.1.2021.50.3.1 = STRING: "/bin/sh /tmp/mytest.sh" .1.3.6.1.4.1.2021.50.100.1 = INTEGER: 5 .1.3.6.1.4.1.2021.50.101.1 = STRING: "first line" .1.3.6.1.4.1.2021.50.101.2 = STRING: "second line" .1.3.6.1.4.1.2021.50.102.1 = INTEGER: 0 .1.3.6.1.4.1.2021.50.103.1 = "" file /tmp/tinka.txt 12 fileIndex.1 = INTEGER: 1 fileName.1 = STRING: /tmp/tinka.txt fileSize.1 = INTEGER: 15 kB fileMax.1 = INTEGER: 12 kB fileErrorFlag.1 = INTEGER: true(1) fileErrorMsg.1 = STRING: /tmp/tinka.txt: size exceeds 12kb (= 15kb) define service{ use generic-service host_name Linux service_description size of /tmp/tinka.txt is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.15.1.3.1!InK12345!12!20!kbytes } proc httpd 3 6 proc automount 1 1 proc csserver 2 prIndex.1 = INTEGER: 1 prIndex.2 = INTEGER: 2 prIndex.3 = INTEGER: 3 prNames.1 = STRING: httpd prNames.2 = STRING: automount prNames.3 = STRING: csserver prMin.1 = INTEGER: 3 prMin.2 = INTEGER: 1 prMin.3 = INTEGER: 0 prMax.1 = INTEGER: 6 prMax.2 = INTEGER: 1 prMax.3 = INTEGER: 3 prCount.1 = INTEGER: 1 prCount.2 = INTEGER: 1 prCount.3 = INTEGER: 0 prErrorFlag.1 = INTEGER: 1 prErrorFlag.2 = INTEGER: 0 prErrorFlag.3 = INTEGER: 0 prErrMessage.1 = STRING: Too few httpd running (# = 1) prErrMessage.2 = STRING: prErrMessage.3 = STRING: prErrFix.1 = INTEGER: 0 prErrFix.2 = INTEGER: 0 prErrFix.3 = INTEGER: 0 prErrFixCmd.1 = STRING: prErrFixCmd.2 = STRING: prErrFixCmd.3 = STRING: memIndex.0 = INTEGER: 0 memErrorName.0 = STRING: swap memTotalSwap.0 = INTEGER: 216836 memAvailSwap.0 = INTEGER: 209784 memTotalReal.0 = INTEGER: 54156 memAvailReal.0 = INTEGER: 9320 memTotalFree.0 = INTEGER: 219104 memMinimumSwap.0 = INTEGER: 16000 memShared.0 = INTEGER: 0 memBuffer.0 = INTEGER: 5728 memCached.0 = INTEGER: 13832 memSwapError.0 = INTEGER: 0 memSwapErrorMsg.0 = STRING: define service{ use generic-service host_name Linux service_description Physical memory Free is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.4.6.0!InK12345!""!""!kbytes!2c } define service{ use generic-service host_name Linux service_description Total memory Free is_volatile 0 check_period 24x7 check_command check_snmp_oid!.1.3.6.1.4.1.2021.4.11.0!InK12345!20000:10000!9999:0!kbytes!2c } rwuser initial rwuser nagios rouser nagios createUser initial MD5 t2inKES10er DES group MyRWGroup usm nagios group MyROGroup usm nagios group MyRWGroup usm initial access MyRWGroup "" any noauth exact all all none createUser initial MD5 t2inKES10er DES # snmpusm -v3 -u initial -n "" -l authNoPriv -a MD5 -A t2inKES10er localhost create nagios initial # snmpusm -v3 -u nagios_user -n "" -l authNoPriv -a MD5 -A t2inKES10er localhost passwd t2inKES10er R18nm12KDM $ snmpget -v3 -u nagios -n "" -a MD5 -A R18nm12KDM -x DES 10.10.21.75 sysUpTime.0 $ /usr/local/nagios/libexec/check_snmp -H 10.10.21.75 -o sysUpTime.0 -L authPriv -U nagios_user1 -a MD5 -A R18nm12KDM -X R18nm12KDM -P 3 define command{ command_name check_snmp_oid_v3 command_line $USER1$/check_snmp -H $HOSTADDRESS$ -o $ARG1$ -w $ARG2$ -c $ARG3$ -L $ARG4$ -U $ARG5$ -a $ARG6$ -A $ARG7$ -X $ARG8$ -u $ARG9$ -l "" -P $ARG10$ } define service{ use generic-service host_name Linux service_description Total memory Free v3 is_volatile 0 check_period 24x7 check_command check_snmp_oid_v3!.1.3.6.1.4.1.2021.4.11.0!20000:10000!9000:0!authPriv!nagios!MD5!R18nm12KDM!R18nm12KDM!kbytes!3 } Использование бездисковых Linux-станций с загрузкой по сети Андрей Маркелов # HOST MAC GROUPS COMMENTS ws-oper1 0002B3655065 hi_res # Операционист №1 ws-oper2 0002B3651075 hi_res # Операционист №2 ws-oper3 0002B365A021 hi_res ssh_en # Операционист №3 # Опции сессий # # Первая сессия должна обязательно начинаться с номера 0. # При отсутствии необходимости выбора сессии, например, когда вы используете только rdesktop, можно снять # комментарий со следующего параметра, и исключить меню выбора сессий. #AUTOSTART=On SESSION_0_TITLE="Windows 2003 terminal server (16 bit color depth)" SESSION_0_TYPE=rdesktop SESSION_0_RDESKTOP_SERVER=192.168.0.1 SESSION_0_RDESKTOP_OPTIONS="-u Administrator -p password -a 16" SESSION_1_TITLE="VNC server" SESSION_1_TYPE=vncviewer SESSION_1_VNCVIEWER_SERVER=192.168.0.2 SESSION_2_TITLE="Telnet server" SESSION_2_TYPE=telnet SESSION_2_TELNET_SERVER=192.168.0.3 SESSION_3_TITLE="SSH server" SESSION_3_TYPE=ssh SESSION_3_SSH_SERVER=192.168.0.4 # Общие опции # # Раскладка клавиатуры. В случае работы с rdesktop она роли не играет KEYBOARD_MAP=en_us # Опции XServer # SCREEN_RESOLUTION="1024x768" SCREEN_COLOR_DEPTH="16" SCREEN_HORIZSYNC="30-64" SCREEN_VERTREFRESH="56-87" MOUSE_RESOLUTION=100 # Опции печати # PRINTER_0_NAME=usb PRINTER_0_DEVICE=/dev/usb/lp0 PRINTER_2_TYPE=U Пакетный фильтр OpenBSD Денис Назаров ext_if = “fxp0” external_addr = “{ 192.168.0.13/32, 192.168.0.113/32 }” pass in on $ext_if from any to $external_addr keep state pass out on $ext_if from $external_addr to any port 1337 keep state table const “{ 192.168.0.0/24, 192.186.13.0/24 }” table persist block in quick log on $ext_if from to any pass in on $int_if from to $internal_addr keep state # pfctl –t badhosts –T add 81.146.13.16 table persts file “/etc/pf/spam” file “/etc/pf/openrelays” block from to any port 25 /etc/pf/spam 204.168.0.13 213.145.168.2 /etc/openrelay 213.146.16.0/24 166.15.13.5/28 block all pass out proto tcp from any to any flags S/SA keep state pass in proto tcp from any to any port 25 flags S/SA keep state (adaptive.end – number of states) / (adaptive.end – adaprive.start) set timeout tcp.first 120 set timeout tcp.established 86400 set timeout { adaptive.start 6000, adaptive.end 12000 } set limit states 10000 set limit states 20000 set limit frags 20000 set limit scr-nodes 2000 set limit { states 20000, frags 20000, src-nodes 2000 } set fingerprints "/etc/pf.os.devel" scrub in all rdr on em1 inet proto tcp to port 80 -> $web_server port 80 from port to port # pfctl –T load –f /etc/pf.conf Виртуальные войны Сравнительное тестирование VMware Workstation и Cooperative Linux Михаил Платов # bw_mem -P 1 -W 1 1024K rd|wr|cp # bw_pipe -P 1 -W1 -M 32768K # time make vmlinux Обзор эмулятора mips64emul Александр Байрак ./configure – help ./configure gmake gmake install dd if=/dev/zero of=/disk.img bs=1 count=512 seek=1100000000 mips64emul –X –D2 –d disk.img –d bc:pmaxcd.iso –j netbsd.pmax gunzip netbsd-INSTALL.gz mips64emul –X –D2 –d disk.img netbsd-INSTALL mips64emul –X –M64 –D2 –d disk.img Лейся песня, или сервер потокового аудио своими руками Сергей Яремчук 1 1 Здесь впишите название потока, оно будет видно в проигрывателе Жанр мелодий Краткое описание потока playlist basic playlist.txt oss 44100 2 /dev/dsp 1 test Здесь пишем адрес или имя, куда отправляем поток 8000 passwd /example.ogg 2 5 80 64000 44100 2 #find /home/sound -name *.ogg > /usr/local/share/ices/playlist.txt /home/sound/Song.ogg # ices /usr/share/ices/ices-playlist.xml http://имя_узла:8000/example.ogg ls /var/log/ices/ mkdir /var/log/ices Танцуем Самбу Роман Гребенников [section] key = value boolean1 = true boolean2 = false [section] struct = { key1 = value1 key2 = value2 ... } [logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = DOMAIN.RU dns_lookup_kdc = false dns_lookup_realm = false [realms] DOMAIN.RU = { kdc = controller.domain.ru admin_server = controller.domain.ru default_domain = domain.ru } [domain_realm] .domain.ru = DOMAIN.RU domain.ru = DOMAIN.RU domain = DOMAIN.RU DOMAIN = DOMAIN.RU C:\>ktpass -princ host/NIX$@DOMAIN.RU -mapuser unixuser -pass SuperPass667 -out nix.keytab # kinit DomainUser # Имя домена, с которым требуется работать workgroup = DOMAIN # Доменное имя машины, которое должно совпадать с dns-именем и переменной среды HOSTNAME netbios name = NIX # Описание сервера, видимое в «Сетевом окружении» server string = Unix Server # Разделитель названия домена и учетной записи. В Windows это знак «\», но в этом случае он может вызвать проблемы # как символ начала escape-последовательности, поэтому его потребуется заменить. По умолчанию идет знак «+», # но «/» привычнее winbind separator = / # Использовать домен по умолчанию. Внешне будет проявляться отсутствием доменного префикса перед учетной записью winbind use default domain = yes # Область идентификаторов пользователей, на которую будут отображаться доменные аккаунты idmap uid = 7000-10000 # Область идентификаторов групп, на которую будут отображаться доменные группы idmap gid = 7000-10000 # Автоматически нумеровать пользователей и группы winbind enum users = yes winbind enum groups = yes # Шаблон домашнего каталога для доменных пользователей. Впоследствии будет создаваться автоматически template homedir = /home/DOMAIN/%U # Шаблон командного интерпретатора для доменных пользователей template shell = /bin/bash # Режим безопасности. В режиме ads для аутентификации samba использует исключительно Active Directory, # не обращая внимания на локальные аккаунты security = ads # Шифровать ли пароли. По умолчанию контроллер домена не работает с открытыми паролями. encrypt passwords = yes # Реалм Kerberos, используемый для аутентификации realm = DOMAIN.RU # Параметр, включающий поддержку выбора алгоритмов шифрации в процессе работы. Необходимость использования зависит # от настроек контроллера домена. На Win2003 включен по умолчанию client use spnego = yes # Адрес контроллера домена password server = controller.domain.ru # Шаблон имен файлов логов, где %m – имя машины log file = /var/log/samba3/%m.log # Уровень подробности логов. На первых порах желательно поднять это значение до 4, что позволит достаточно точно # диагностировать проблему. log level = 2 # Максимальный размер лог-файлов. 0 – неограничено. max log size = 0 # Список сетевых интерфейсов, с которыми будет работать демон interfaces = 192.168.1.14 # Не трогать остальные сетевые интерфейсы bind interfaces only = yes # Пример папки # Название [html] # Список пользователей, у которых есть право использовать эту папку. В данном случае это все доменные пользователи. # Знак @ обозначает группу. valid users = @"DOMAIN/Domain Users" # Путь, на который ссылается сама папка path = /var/www/htdocs # Чувствительна ли папка к регистру букв case sensitive = no # Будет ли видна папка в «Сетевом окружении» browseable = yes # Владелец файла при записи в папку force user = root # Группа, назначаемая файлу при записи force group = apache # Можно ли зайти на папку без пароля public = no # Можно ли в нее писать writable = yes # Является ли папка принтером printable = no # Маска создаваемых файлов create mask = 0640 # Пользователи, имеющие полный контроль над папкой admin users = @"DOMAIN/Domain Admins" # net ads join -U DomainAdministrator passwd: files group: files shadow: files passwd: files winbind group: files winbind shadow: files # getent passwd [тип] [влияние] [название модуля] [параметры] # сразу загружаем все пользовательские переменные окружения (модуль всегда возвращает положительный результат) auth required /lib/security/pam_env.so # Если пользователь есть в локальной базе, то пускаем его (это условие достаточно для входа в систему) auth sufficient /lib/security/pam_unix.so ї likeauth nullok # Если предыдущий пункт не сработал, то запретить вход (модуль всегда возвращает отрицательный результат) auth required /lib/security/pam_deny.so auth required /lib/security/pam_env.so # Если пользователь есть в локальной базе, то пускаем его (это условие достаточно для входа в систему) auth sufficient /lib/security/pam_unix.so ї likeauth nullok # Если аутентификация в AD сработала, то разрешаем доступ (это условие достаточно для входа в систему) auth sufficient /lib/security/pam_winbind.so ї use_first_pass # Если предыдущий пункт не сработал, то запретить вход (модуль всегда возвращает отрицательный результат) auth required /lib/security/pam_deny.so account required /lib/security/pam_require.so root @unixoids session required /lib/security/pam_mkhomedir.so umask=0077 Использование программы nLite Максим Костышин W2KSP4_rus.exe /u /x:название_временного_каталога update.exe /s:имя_каталога_дистрибутива @ECHO OFF TITLE nLite post cleanup - Please Wait... reg delete HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\RunOnce /v nlite /f del /f /q %SystemRoot%\inf\nlite.cmd rem Коррекция языка по умолчанию и переключения клавиатуры reg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" /v "1" /t REG_SZ /d "00000409" /f reg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" /v "2" /t REG_SZ /d "00000419" /f reg add "HKEY_CURRENT_USER\Keyboard Layout\Toggle" /v "Hotkey" /t REG_SZ /d "2" /f reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" /v "1" /t REG_SZ /d "00000409" /f reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" /v "2" /t REG_SZ /d "00000419" /f reg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle" /v "Hotkey" /t REG_SZ /d "2" /f reg.exe = 2,,,,,,_x,Ш,0,0 … [AddReg] HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", "nLite",0x00020000,"%%systemroot%%\inf\nlite.cmd" … HKCU,"Environment","TEMP",0x00020000,"%TEMP_DIR%" HKCU,"Environment","TMP",0x00020000,"%TEMP_DIR%" … [Strings] TEMP_DIR="%USERPROFILE%\Local Settings\Temp" … Запись дисков CD-R/RW в Linux Часть 1 Владимир Мешков ioctl(sg_fd, SG_IO, struct sg_io_hdr *) typedef struct sg_io_hdr { int interface_id; /*'S' for SCSI generic (required) */ int dxfer_direction; /* data transfer direction */ unsigned char cmd_len; /* SCSI command length ( <= 16 bytes) */ unsigned char mx_sb_len; /* max length to write to sbp */ unsigned short iovec_count; /* 0 implies no scatter gather */ unsigned int dxfer_len; /* byte count of data transfer */ void * dxferp; /* points to data transfer memory or scatter gather list */ unsigned char * cmdp; /* points to command to perform */ unsigned char * sbp; /* points to sense_buffer memory */ unsigned int timeout; /* MAX_UINT->no timeout (unit: millisec) */ unsigned int flags; /* 0 -> default, see SG_FLAG... */ int pack_id; /* unused internally (normally) */ void * usr_ptr; /* unused internally */ unsigned char status; /* scsi status */ unsigned char masked_status; /* shifted, masked scsi status */ unsigned char msg_status; /* messaging level data (optional) */ unsigned char sb_len_wr; /* byte count actually written to sbp */ unsigned short host_status; /* errors from host adapter */ unsigned short driver_status; /* errors from software driver */ int resid; /* dxfer_len - actual_transferred */ unsigned int duration; /* time taken by cmd (unit: millisec) */ unsigned int info; /* auxiliary information */ } sg_io_hdr_t; /* 64 bytes long (on i386) */ typedef struct sg_iovec { void * iov_base; /* starting address */ size_t iov_len; /* length in bytes */ } sg_iovec_t #include #include #include #include #include #include #include #define SG_DEV "/dev/sg0" // имя файла устройства // Макрос для пересчета координат сектора из MSF формата в LBA #define MSF2LBA(Min, Sec, Frame) (((Min * 60 + Sec) * 75 + Frame) - 150) int sg_fd; // файловый дескриптор typedef struct { __u8 rez; // reserved __u8 ctrl :4; // Control __u8 adr :4; // ADR __u8 tno; // TNO (always 0) __u8 point; // POINT __u8 min; // AMIN __u8 sec; // ASEC __u8 frame; // AFRAME __u8 zero; // 0 __u8 pmin; // PMIN __u8 psec; // PSEC __u8 pframe; // PFRAME } __attribute__ ((packed)) pma_t; int send_cmd(__u8 *cmd, __u8 cmdlen, unsigned int direction, __u8 *data, __u32 datalen, unsigned int timeout) { int k = 0; sg_io_hdr_t io_hdr; /* В sense_buffer будет сохранена информация о состоянии устройства после выполнения команды */ __u8 sense_buffer[32]; /* Формируем запрос к sg-драйверу – заполняем поля структуры sg_io_hdr_t необходимыми значениями */ memset(&io_hdr, 0, sizeof(sg_io_hdr_t)); io_hdr.interface_id = 'S'; io_hdr.cmd_len = cmdlen; // длина команды io_hdr.mx_sb_len = sizeof(sense_buffer); io_hdr.dxfer_direction = direction; // направление передачи данных io_hdr.dxfer_len = datalen; // размер данных io_hdr.dxferp = data; // указатель на блок данных io_hdr.cmdp = cmd; // указатель на командный пакет io_hdr.sbp = sense_buffer; io_hdr.timeout = timeout; /* Посылаем устройству команду */ if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) { perror("SG_IO ioctl"); return -1; } /* Отобразим содержимое sense_buffer, если при выполнении команды произошла ошибка. Это позволит установить * причину ошибки */ if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) { if (io_hdr.sb_len_wr > 0) { printf("Sense data: "); for (k = 0; k < io_hdr.sb_len_wr; ++k) { if ((k > 0) && (0 == (k % 10))) printf("\n "); printf("0x%02x ", sense_buffer[k]); } printf("\n"); } if(io_hdr.masked_status) printf("SCSI status=0x%x\n", io_hdr.status); if(io_hdr.host_status) printf("Host_status=0x%x\n", io_hdr.host_status); if(io_hdr.driver_status) printf("Driver_status=0x%x\n", io_hdr.driver_status); return -1; } return 0; } int test_unit_ready() { __u8 testCmdBlk[6]; /* Prepare TEST UNIT command */ memset(testCmdBlk, 0, 6); if(send_cmd(testCmdBlk, 6, SG_DXFER_NONE, NULL, 0, 20000) < 0) { printf("Unit not ready\n"); return -1; } return 0; } int read_pma() { int i, k; __u8 read_pma_cmd[10]; __u8 *pma_data_buff; // здесь будут сохранены результаты чтения PMA __u16 buff_size = 0xFFFF; // размер блока памяти для хранения считываемых данных __u16 pma_data_length = 0; // реальная длина записей PMA __u32 lba; int pma_entries = 0; // число записей PMA pma_t *pma; /* Проверяем готовность устройства к приему команды */ if(test_unit_ready() < 0) exit(-1); pma_data_buff = (__u8 *)malloc(buff_size); memset(pma_data_buff, 0, buff_size); /* Формируем командный пакет */ memset(read_pma_cmd, 0, 10); read_pma_cmd[0] = 0x43; // код команды READ_TOC/PMA/ATIP read_pma_cmd[2] = 3; // поле Format Field = 011b, читаем PMA read_pma_cmd[7] = 0xFF; read_pma_cmd[8] = 0xFF; /* Посылаем устройству команду */ if(send_cmd(read_pma_cmd, 10, SG_DXFER_FROM_DEV, pma_data_buff, buff_size, 20000) < 0) return -1; /* Считываем длину записей PMA. Размер поля PMA Data Length (2 байта) не учитывается */ memcpy(&pma_data_length, pma_data_buff, 2); pma_data_length = __swab16(pma_data_length); printf("PMA data length - %d\n", pma_data_length); /* Определяем число записей PMA */ pma_entries = (pma_data_length - 2)/11; printf("PMA entries - %d\n", pma_entries); /* Размер данных PMA точно известен и равен pma_data_length. Выделяем блок памяти для данных PMA и копируем их туда * из pma_data_buff. После этого можно освободить блок памяти, на который указывает pma_data_buff */ pma = (pma_t *)malloc(pma_data_length); memset((void *)pma, 0, pma_data_length); memcpy((void *)pma, pma_data_buff + 4, pma_data_length); free(pma_data_buff); /* Отображаем данные PMA */ printf("Entry\tADR\tCTRL\tPoint\tZero\tMin\tSec\tFrame\tPMin\tPsec\tPFrame\tLBA\n"); for(i = 0; i < pma_entries; i++) { printf("%d\t", i); printf("%X\t", (pma + i)->adr); printf("%X\t", (pma + i)->ctrl); printf("%X\t", (pma + i)->point); printf("%d\t", (pma + i)->zero); printf("%d\t", (pma + i)->min); printf("%d\t", (pma + i)->sec); printf("%d\t", (pma + i)->frame); printf("%d\t", (pma + i)->pmin); printf("%d\t", (pma + i)->psec); printf("%d\t", (pma + i)->pframe); lba = MSF2LBA((pma + i)->pmin, (pma + i)->psec, (pma + i)->pframe); if((pma + i)->adr != 1) printf("---\n"); else printf("%u\n", lba); } free(pma); return 0; } int main() { if((sg_fd = open(SG_DEV, O_RDWR)) < 0) { perror("open"); return -1; } /* Считываем PMA */ if(read_pma() < 0) printf("Cannot read PMA\n"); close(sg_fd); return 0; } int get_conf(__u16 f_num) { __u8 get_conf_cmd[10]; __u8 data_buff[16]; // результаты чтения __u32 data_length = 0; // реальная длина данных __u16 current_prof = 0; // значение текущего профиля __u16 f_code = 0; // код свойства /* Ждем готовность устройства */ if(test_unit_ready() < 0) exit(-1); /* Формируем командный пакет */ memset(data_buff, 0, 16); memset(get_conf_cmd, 0, 10); get_conf_cmd[0] = 0x46; // код команды GET CONFIGURATION get_conf_cmd[1] = 2; // RT= 10b get_conf_cmd[8] = 16; /* В поле Starting Feature Number заносим код свойства */ f_num = __swab16(f_num); memcpy((get_conf_cmd + 2), (void *)&f_num, 2); /* Посылаем устройству команду */ if(send_cmd(get_conf_cmd, 10, SG_DXFER_FROM_DEV, data_buff, 16, 20000) < 0) return -1; /* Определяем длину считанных данных */ memcpy((void *)&data_length, data_buff, 4); data_length = __swab32(data_length); printf("\nFeature data length - %u\n", data_length); /* Если длина считанных данных равна 4, то запрашиваемое свойство не поддерживается */ if(data_length == 4) return -1; /* Определяем значение текущего профиля */ memcpy((void *)¤t_prof, data_buff + 6, 2); current_prof = __swab16(current_prof); printf("Current profile - 0x%.4X\n", current_prof); /* Код свойства, значение должно совпадать с параметром f_num */ memcpy((void *)&f_code, (data_buff + 8), 2); f_code = __swab16(f_code); printf("Feature Code - 0x%.4X\n", f_code); printf("Byte 4: 0x%X\n", data_buff[12]); /* Проверяем значение бита CD-RW. Если бит установлен в единицу – запрашиваемое свойство устройством * поддерживается */ if(data_buff[12] & 0x02) printf("Feature CD TAO support\n\n"); else return -1; return 0; } bugtraq стр. 63 GET / HTTP/1.0\n [space] x 8000\n [space] x 8000\n [space] x 8000\n 8000 раз Создаем кроссплатформенное приложение на основе FLTK Антон Борисов tar xzvf fltk-1.1.5-source.tar.bz2 cd fltk-1.1.5 ./configure --prefix=/usr/local/fltk-1.1.5 --enable-xft --enable-threads make && make install tar xzvf pngwriter-0.5.0.tgz cd pngwriter make && make install My_CPP_Test.cpp // HEADERS #include #include #include #include // GLOBALS Fl_Menu_Bar *m; Fl_File_Chooser *fc; #define FONT_SIZE 14 void fc_callback(Fl_File_Chooser *fc, void *data) { if(fc->value()) { printf( "Chosen file: \"%s\"\n", fc->value() ); } return; } void open_cb(Fl_Widget*, void*) { fc->callback(fc_callback); fc->show(); while(fc->shown()) Fl::wait(); if( fc->count() == 1 ) { printf("File was selected\n"); } } void quit_cb(Fl_Widget*, void*) { exit(0); } Fl_Menu_Item MenuEng[] = { { "&File", 0, 0, 0, FL_SUBMENU }, { "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb }, { "&Save", FL_CTRL + 's', 0 }, { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 }, { 0 }, { "&Help", 0, 0, 0, FL_SUBMENU }, { "&About", FL_CTRL + 'a' , 0 }, { 0 }, { 0 } }; int main(int argc, char **argv) { Fl_Window *window = new Fl_Window(300, 300, "Sample"); window->color(FL_WHITE); m = new Fl_Menu_Bar(0, 0, 640, 25); m->copy(MenuEng); m->box(FL_UP_BOX); m->textcolor(FL_BLUE); m->textfont(FL_TIMES); m->textsize(FONT_SIZE); fc = new Fl_File_Chooser(".", "*.{txt,cpp}", Fl_File_Chooser::SINGLE, "File_Chooser_Dialog"); window->show(); window->callback( (Fl_Callback *)quit_cb, window ); return Fl::run(); } {"&File", 0, 0, 0, FL_SUBMENU }, { "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb }, { "&Save", FL_CTRL + 's', 0 }, { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 }, { 0 }, Makefile FLTK=/usr/local/fltk/bin/fltk-config OPTIONS=--compile My_CPP_Test: $(FLTK) $(OPTIONS) My_CPP_Test.cpp clean: rm My_CPP_Test rebuild: make clean; make My_CPP_Test bash-2.05b$ strip My_CPP_Test #include void save_cb(Fl_Widget*, void*) { pngwriter iris(300,300,0,"iris.png"); for(int a = 1; a < 301; a++) for(int b = 1; b < 301; b++) iris.plotHSV( a, b, double(a)/500.0, double(b)/500.0, 1.0); iris.setgamma(0.7); iris.close(); } -I/usr/local/include -L/usr/local/lib { "&Save", FL_CTRL + 's', (Fl_Callback *)save_cb }, FLTK=/usr/local/fltk/bin/fltk-config INCLUDE=`$(FLTK) –cflags` INCLUDE2=-I/usr/local/include -L/usr/local/lib LIBS=`$(FLTK) --ldstaticflags` LIBS2=-lm -lXext -lX11 -lsupc++ -lpng -lpngwriter -lz –lfreetype FLAGS=-O3 -Wall -Wno-deprecated FLAGS2=-lsupc++ CC=g++ My_CPP_Test: $(CC) $(INCLUDE) $(INCLUDE2) -o My_CPP_Test My_CPP_Test.cpp $(LIBS) $(LIBS2) clean:# rm My_CPP_Test rebuild: make clean; make My_CPP_Test Файловая система NTFS извне и изнутри Крис Касперски ECHO xxx > file:attr1; ECHO yyy > file:attr2; more < file:attr1; more  < file:attr2 Листинг 1. Структура файловой записи FILE Record Header ; заголовок Attribute 1 ; атрибут 1 Attribute 2 ; атрибут 2 ... ; … Attribute N ; атрибут N End Marker (FFFFFFFFh) ; маркер конца Разработка сценария регистрации пользователей в сети Часть1 Иван Коробко [attr1=”val1” [attr2=”val2”…]] [attr1=”val1” [attr2=”val2”…]] [attr1=”val1” [attr2=”val2”…]] …………………………. "chr(13)+chr(10)" $en=chr(13)+chr(10) ' переход на новую строку ; накопление переменной $t="" $t=$t+"<_@wksta>"+$en $t=$t+"" @ProductType "+$en $t=$t+"< Parameter2> "+var1+ ""+$en …… $t=$t+"" ; формирование XML-файла $filename=@wksta+".xml" $fso = CreateObject("Scripting.FileSystemObject") $MyFile = $fso.CreateTextFile($filename, True, TRUE) $MyFile.WriteLine($t) $MyFile.Close A) $strComputer=”” $strNameSpace=”” $strClass=”” $objElements = GetObject( "winmgmts: {ImpersonationLevel=Impersonate}!//" & $strComputer & ”/ ” &$strNameSpace & ”: ” & $strClass) For each $Element in $objElements $Temp=$Element.Value Next Б) $strComputer=”” $strNameSpace=”” $strClass=”” $objWMIService = GetObject( "winmgmts: {ImpersonationLevel=Impersonate}!//" & $strComputer & ”/ ” & $strNameSpace) $colItems = $objWMIService.InstancesOf($strClass ) For Each $Element in $colItems $Temp=$Element.Value Next В) $strComputer=”” $strNameSpace=”” $strClass=”” $objWMIService = GetObject("winmgmts: {ImpersonationLevel=Impersonate }!// " & $strComputer & ”/ ” & $strNameSpace) $colItems = objWMIService.ExecQuery(“SELECT поле_1, поле_2, …, поле_n FROM” & $strClass ) For Each $Element in$colItems $Temp=$Element.Value Next $strComputer=”.” SELECT поле_1, поле_2, …, поле_n FROM strClass $strComputer=”” $strNameSpace=” Root\Cimv2” $strClass=”Win32_Value” $objWMIService = GetObject( " winmgmts: // " & $strComputer & ”/ ” & $strNameSpace) $colItems = objWMIService.ExecQuery(“SELECT поле_1, поле_2, …, поле_n FROM” & $strClass ) For Each $Element in $colItems $Temp=$Element.Value Next $PC = @WKSTA $en=chr(10) $objWMIService = GetObject( "winmgmts://" + $pc+"/Root/Cimv2") $colItems = $objWMIService.ExecQuery( "Select * from Win32_BIOS") For Each $objItem in $colItems ? " BIOS Name : " + $objItem.Name ? " Version : " + $objItem.Version ? " Manufacturer : " + $objItem.Manufacturer ? " SMBIOS Version : " + $objItem.SMBIOSBIOSVersion Next $wmi_array="Win32_BIOS","Win32_Processor",……" $ж=… for $a=0 to $ж $objWMIService = GetObject( "winmgmts://@wksta/root/cimv2" ) $colItems = $objWMIService.ExecQuery( "Select * from "+ $wmi_array[$ж]) For Each $objItem in $colItems select case $a=0 $mb1=$objItem.Name $mb2=$objItem.Manufacturer $mb3=$objItem.SMBIOSBIOSVersion $mb4=$objItem.Version $lx1=" $mb1 " $lx2=" $mb2 " $lx3=" $mb3 " $lx4=" $mb4 " $t="$t $lx220 $en $lx222 $en $lx224 $en $lx226 $en" case $a=1 $cpu_arhitect="x86","MIPS","ALPHA", "Power PC" $cpu_socket="","Other","Unknown","Daughter Board","ZIF Socket","Replacement/Piggy Back","None","LIF Socket","Slot 1", "Slot 2", "370 Pin Socket", "Slot A", "Slot M","","","Socket 478" $i=$objItem.Architecture $ii=$cpu_arhitect[$i] $cpu1=$objItem.Name + ", " + $objItem.MaxClockSpeed + " Mhz" $cpu2=$objItem.Version + ", Level " + $objItem.Level $i=$objItem.UpgradeMethod $ii=$cpu_socket[$i] $cp1=$objItem.ExtClock+"Mhz" $cp2=$objItem.L2CacheSize+"Kb" $lx5=" $cpu1 " $lx6=" $cpu2 " $lx7=" $ii " $lx8=" $cp1 " $lx9=" $cp2 " $t="$t $lx230 $en $lx232 $en $lx234 $en $lx236 $en $lx238 $en" case $a=2 ………………………… End Select Next $path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" do $loop = ENUMKEY($path, $Index) ? $loop until $loop="" $en=chr(10)+chr(13) $t=$t+" " $i=1 $path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" do $loop = ENUMKEY($path, $Index) $name=readvalue($path+" \"+$loop,"DisplayName") if $name<>"" $t=$t+" " +$name+ " "$en ? " " +$name+ " " Else if $loop<>"" $t=$t+" " +$loop + " "$en ? " " +$loop + " " endif endif $Index = $Index + 1 $i=$Index+1 until $loop="" $t=$t+" " MessageBox($t, "",0,0) $obj=GetObject("Protocol://ClassName") For each $SubClass in $ClassName ? $SubClass.Property Next $obj=GetObject("ADs:") For Each $provider IN $obj $t=$t + $provider.name + chr(13) Next MessageBox($t, "",0,0) LDAP://HostName[:PortNumber][/DistinguishedName] WinNT:[//DomainName[/ComputerName[/ObjectName[,className]]]] $obj = GetObject ("LDAP://DC=Domain_name1/DC=Domain_name2/DC=Domain_name3/OU=OU_Name_Level1/OU=OU_Name_Level2…/OU=OU_Name_Level /CN=CN_Name") $obj = GetObject ("LDAP://DC=RU/DC=Domain1/OU=Group1/OU=Group4/CN=User3") $obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Level…,OU=OU_Name_Level2 ,OU=OU_Name_Level1/DC=…") $obj=GetObject("LDAP://CN=User3,OU=Group4,OU=Group3,DC=Domain1, dc=RU") /// LDAP://server/DC=domain,DC=ru SELECT поле 11,поле 21...поле n1 FROM путь WHERE objectClass="тип_объекта" $DomainName="Domain" $objConnection = CreateObject("ADODB.Connection") $objCommand = CreateObject("ADODB.Command") $objConnection.Provider = "ADsDSOObject" $objConnection.Open "Active Directory Provider" $objCommand.ActiveConnection = $objConnection $objCommand.CommandText = "SELECT printerName, serverName FROM " _ & " 'LDAP://"& $DomainName & "' WHERE objectClass='printQueue'" $objCommand.Properties("Cache Results") = False $objRecordSet = $objCommand.Execute $objRecordSet.MoveFirst Do Until $objRecordSet.EOF $temp=$temp & "Printer Name: " & $objRecordSet.Fields("printerName").Value & " Server Name: " & $objRecordSet.Fields("serverName").Value & chr(13) $objRecordSet.MoveNext Loop Messagebox($tem,"",0,0) $objRoot = GetObject("LDAP://RootDSE") $strDefaultDomainNC = $objRoot.Get("DefaultNamingContext") $strGetArg=@userid ; определение имени пользователя. $strADSQuery = "SELECT department, physicaldeliveryofficename, telephonenumber, title FROM 'LDAP:// " + $strDefaultDomainNC + "' WHERE samAccountName = '" + $strGetArg + "'" $objADOConn = createObject("ADODB.Connection") $objADOConn.Provider = "ADsDSOObject" $objADoConn.Open ("Active Directory Provider") $objADOCommand = CreateObject("ADODB.Command") $objADOCommand.ActiveConnection = $objADOConn $objADOCommand.CommandText = $strADSQuery $objQueryResultSet = $objADOCommand.Execute $objRoot_m1=$objQueryResultSet.Fields("department") $objRoot_m2=$objQueryResultSet.Fields("physicaldeliveryofficename") $objRoot_m3=$objQueryResultSet.Fields("telephonenumber") $objRoot_m4=$objQueryResultSet.Fields("title") $ini_file="@wksta.ini" $user_name="user" $user1=writeprofilestring("$ini_file", $user_name,"department",$objRoot_m1) $user2=writeprofilestring("$ini_file", $user_name,"location",$objRoot_m2) $user3=writeprofilestring("$ini_file", $user_name,"telephone",$objRoot_m3) $user4=writeprofilestring("$ini_file", $user_name,"title",$objRoot_m4) $user5=writeprofilestring("$ini_file", $user_name,"User ID","@userID") $user6=writeprofilestring("$ini_file", $user_name,"Full Name","@fullname") $objRoot1=readprofilestring("$ini_file", $user_name,"department") $objRoot2=readprofilestring("$ini_file", $user_name,"location") $objRoot3=readprofilestring("$ini_file", $user_name,"telephone") $objRoot4=readprofilestring("$ini_file", $user_name,"title") $t=$t+" $objRoot1 " $t=$t+" $objRoot2 " $t=$t+" $objRoot3 " $t=$t+" $objRoot4 " …… del "$ini_file" Создание и настройка сервера терминалов Роман Марков regedit -s Titles.reg Altaddr /SET Altaddr /SET 195.131.101.xxx