Модификация дистрибутивов на основе Windows Installer Иван Коробко %SystemRoot%\System32\msiexec.exe /i *.msi %SystemRoot%\System32\msiexec.exe /fa /qn /jm *.msi c:\Windows\system32\msiexec.exe /fa/qn/jm "acdsee10.msi" Листинг 1. Шаблон доступа к базе в msi-файле Set obj = CreateObject ("WindowsInstaller.Installer") Set base = obj.OpenDatabase (MSI,Mode) base.OpenView(SQL-query).Execute base.Commit Листинг 2. Чтение полей в указанной таблице Set obj = CreateObject("WindowsInstaller.Installer") Set ob = obj.OpenDatabase ("C:\ACDSee\ACDSee 10 Photo Manager.msi",0) set View=ob.OpenView("SELECT Property, Value FROM Property") View.Execute Do Set Record = View.Fetch If Record Is Nothing Then Exit Do Wscript.Echo Record.StringData(1) + vbTab+vbTab+Record.StringData(2) Loop Set View = Nothing Листинг 3. Создание нового атрибута в таблице Set a = CreateObject("WindowsInstaller.Installer") Set b = a.OpenDatabase ("C:\acdsee\ACDSee 10 Photo Manager.msi",1) b.OpenView("INSERT INTO Property ? (Property.Property, Property.Value) VALUES ('PIDKEY', '1234567890')").Execute b.Commit Листинг 4. Удаление существующего атрибута в таблице Set a = CreateObject("WindowsInstaller.Installer") Set b = a.OpenDatabase ("C:\acdsee\ACDSee 10 Photo Manager.msi",1) b.OpenView("DELETE FROM Property WHERE 'PIDKEY'='1234567890')").Execute b.Commit Листинг 5. Изменение значений существующих полей таблицы Set a = CreateObject("WindowsInstaller.Installer") Set b = a.OpenDatabase ("C:\acdsee\ACDSee 10 Photo Manager.msi",1) b.OpenView("UPDATE Feature SET Level='0' WHERE Feature='DevDetect'").Execute b.Commit ----------------------------------------------------------------------------------------------------------------- Новшества в Windows Server 2008: транзакционная файловая система Андрей Бирюков IntPtr tx = CreateTransaction(IntPtr.Zero, IntPtr.Zero,0,0,0,0, null); If (!DeleteFileTransactedW(file1, tx)) CommitTransaction(tx); RollBackTransaction(tx); CloseHandle(tx); ----------------------------------------------------------------------------------------------------------------- История одной установки Linux на ноутбуке Павел Закляков # yum install madwifi #rpm -Fhv kernel-2.6.....rpm # make # make install # depmod -a echo "1">/sys/devices/platform/asus-laptop/wlan echo "0">/sys/devices/platform/asus-laptop/wlan ----------------------------------------------------------------------------------------------------------------- Jabberd2 – простой и нетребовательный к ресурсам XMPP-сервер Михаил Кондрин ./configure --prefix=/usr --sysconfdir=/etc/jabberd --enable-db --with-sasl=cyrus --enable-debug sed -ir 's/^#define fnmatch/\/\/#define fnmatch/' config.h sed -ir 's/^#error Cyrus SASL/\/\/#error Cyrus SASL/' sx/cyrus_sasl.c router /var/jabberd/pid/router.pid jabberd/router local3 127.0.0.1 5347 jabberd change-me change-me-too jabberd resolver /var/jabberd/pid/resolver.pid jabberd/resolver local3 127.0.0.1 5347 jabberd change-me _xmpp-server._tcp _jabber._tcp s2s /var/jabberd/pid/s2s.pid jabberd/s2s local3 127.0.0.1 5347 jabberd change-me 0.0.0.0 5269 resolver c2s /var/jabberd/pid/c2s.pid jabberd/c2s local3 127.0.0.1 5347 jabberd change-me myrealm.ru 0.0.0.0 5222 /usr/lib/jabberd db /var/jabberd/db myrealm.ru /var/jabberd/pid/sm.pid 127.0.0.1 5347 jabberd change-me jabberd/sm local3 /usr/lib/jabberd db /var/jabberd/db root@myrealm.ru /usr/lib/jabberd .... active .... conference.myrealm.ru conference.myrealm.ru 127.0.0.1 5347 change-me-too /var/jabberd/spool/rooms /var/jabberd/log /var/jabberd/pid/mu-conference.pid 255 Public Chatrooms This service is for public chatrooms. http://www.myrealm.ru/ 40 /var/jabberd/logs/ /var/jabberd/logs/style.css has become available has left is now known as root@myrealm.ru useradd -d /var/jabber -s null jabber mkdir /var/jabber/db chown -R jabber /var/jabber/db $ORIGIN myrealm.ru. jabber A 192.168.1.252 myrealm.ru. A 192.168.1.252 conference CNAME jabber _jabber._tcp SRV 5 0 5269 jabber _xmpp-server._tcp SRV 5 0 5269 jabber _xmpp-client._tcp SRV 5 0 5222 jabber kadmin >add xmpp/jabber.myrealm.ru >ext xmpp/jabber.myrealm.ru pwcheck: saslauthd mech_list: gssapi plain /usr/sbin/saslauthd -a kerberos5 root root\00MYREALM.RU\00 mike mike\00MYREALM.RU\00 cat passwd.txt | db_load -n -t hash -c database=myrealm.ru -h ./ -T authreg.db #!/bin/bash progs="router resolver sm c2s s2s" user=jabber.jabber progsPath="/usr/bin" confPath="/etc/jabberd" pidPath="/var/jabberd/pid" Start ( ) { echo "Initializing jabberd2 processes ..." for prog in ${progs}; do if [ $( pidof -s ${prog} ) ]; then echo -ne "\tprocess [${prog}] already running" sleep 1 continue fi echo -ne "\tStarting ${prog}... " rm -f ${pidPath}/${prog}.pid args="-c ${confPath}/${prog}.xml" sudo -u jabber ${progsPath}/${prog} ${args} -D 2 &> debug${prog}.log & echo sleep 1 done sudo -u jabber ${progsPath}/mu-conference return ${retval} } # Stop ( ) { echo "Terminating jabberd2 processes ..." for prog in ${progs} ; do echo -ne "\tStopping ${prog}... " kill $(cat ${pidPath}/${prog}.pid) && rm -f ${pidPath}/${prog}.pid echo sleep 1 done killall mu-conference return ${retval} } # case "$1" in start) Start ;; stop) Stop ;; restart) Stop Start ;; condrestart) if [ -f /var/lock/subsys/${prog} ]; then Stop sleep 3 Start fi ;; *) echo "Usage:$0 {start|stop|restart|condrestart}" let retval=-1 esac ./configure --enable-cyrus-sasl \ --with-dynamic-prpls=jabber,simple \ --with-static-prpls= \ ----------------------------------------------------------------------------------------------------------------- Кэшируем динамический контент Виталий Банковский tar -xzvf mod_ssl-2.8.4-1.3.20.tar.gz cd mod_ssl-2.8.4-1.3.20 ./configure —with-apache=../apache-1.3.20 make tar -xzvf apache_1.3.20.tar.gz tar zxf mm-1.2.1.tar.gz cd mm-1.2.1 ./configure make make install tar -xzvf mod_accel-1.0.34.tar.gz cd ./configure \ --with-apache=../apache_1.3.20 \ --with-eapi=../mode_ssl-2.8.4-1.3.20/pkg.eapi make # накладывает патчи cd apache_1.3.20 EAPI_MM=../mm-1.2.1 ./configure —enable-rule=EAPI \ --activate-module=src/modules/accel/libaccel.a make make install # Путь, где будут храниться закэшированнные файлы. Уровень иерархии каталогов — 1 AccelCacheRoot /home/dcache 1 # Включить кэширование AccelNoCache off # Начальный URL и адрес оригинального сайта AccelPass / http://10.10.10.11:80/ # Отключить удаление файлов из кэша AccelUnlinkNoCached off # Передавать в переменной X-Host переменную среды Host, пришедшей на акселератор. AccelSetXHost on # Включить передачу IP-адреса посетителя через переменную X-Real-IP нашему сайту AccelSetXRealIP on # Включить переда mkdir /home/dcache chown -R apache.apache /home/dcache #!/bin/sh # chkconfig: 2345 55 25 case "$1" in start) echo -n "Starting: apache" /usr/local/apache/bin/apachectl start echo "." ;; stop) echo -n "Stopping service: apache" killall httpd echo "." ;; restart) $0 stop sleep 2 $0 start ;; *) echo "Usage: /etc/init.d/apache {start|stop|restart}" >&2 exit 1 ;; esac exit 0 /etc/init.d/apache start Листинг 1. Пример программы сайта 0) { # Указываем акселератору, что нужно кэшировать контент header("Pragma: cache"); header("Cache-Control: cache"); } else{ # Указываем акселератору что не нужно кэшировать контент header("Pragma: no-cache"); header("Cache-Control: no-cache"); } # Как и раньше, устанавливаем дату устаревания документа $dt=time(); $dt+=1; header("Expires: " . gmdate("D, d M Y H:i:s",$dt) . " GMT"); # Печатаем контент echo $content; exit;} ?> ----------------------------------------------------------------------------------------------------------------- Управляем списками общих информационных баз Андрей Луконькин [ЗУП sql рабочая] Connect=Srvr="Proliant7";Ref="ZP"; ID=c27a142e-5a9c-477c-a69f-12914a12b347 OrderInList=466944 Folder=/Зарплата OrderInTree=32768 External=0 ----------------------------------------------------------------------------------------------------------------- Установка цепочки серверов сертификации как часть внедрения PKI в домене Часть 1 Станислав Шпак [Version] Signature= "$Windows NT$" [Certsrv_Server] RenewalKeyLength=4096 RenewalValidityPeriod=Years RenewalValidityPeriodUnits=20 [CRLDistributionPoint] [AuthorityInformationAccess] certutil.exe –setreg ca\DSConfigDN CN=Configuration,DC=dedicated,DC=root ----------------------------------------------------------------------------------------------------------------- OpenBSD. Имидж – ничто, безопасность – все! Максим Гришков $ cd /usr/src # tar -xvzf /usr/sys.tar.gz # tar -xvzf /usr/src.tar.gz $ cd /usr # tar -xvzf /usr/xenocara.tar.gz # mkdir /usr/src/patches $ cd /usr/src/patches # tar -xvzf /usr/4.3.tar.gz $ cd /usr/src/patches/4.3/common $ head -n 11 001_openssh.patch $ head 003_xorg.patch $ head 005_pcb.patch $ cd /usr/src # export CVSROOT=anoncvs@anoncvs.de.openbsd.org:/cvs # cvs -d$CVSROOT up -rOPENBSD_4_3 -Pd $ cd /usr # export CVSROOT=anoncvs@anoncvs.de.openbsd.org:/cvs # cvs -d$CVSROOT checkout -rOPENBSD_4_3 -P src # cp /bsd /bsd.old $ cd /usr/src/sys/arch/i386/conf # config GENERIC # cd ../compile/GENERIC # make clean && make depend && make # make install boot> bsd.old # rm -rf /usr/obj/* $ cd /usr/src # make obj # cd /usr/src/etc && env DESTDIR=/ make distrib-dirs # cd /usr/src # make build ----------------------------------------------------------------------------------------------------------------- Настраиваем TLS/SASL-шифрование и аутентификацию в MTA Sendmail Андрей Маркелов # openssl genrsa 1024 > sendmail.key # openssl req -new -key sendmail.key -out sendmail.csr # openssl ca -in sendmail.csr -out sendmail.crt # Директория с сертификатами define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl # Сертификат CA, выдавшего сертификат нашему серверу. # Не забудьте его также скопировать в указанную директорию define(`confCACERT', `/etc/pki/CA/cacert.pem')dnl # Сертификат нашего сервера, используемый во время # приема почты define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.crt')dnl # Приватный ключ нашего сервера define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.key')dnl # Сертификат и приватный ключ нашего сервера, используемый для отправления почты на другой сервер. # Для простоты используем те же, файлы, что и в первом случае define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.crt')dnl define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.key')dnl # openssl ca -in sendmail.csr -out sendmail.crt EHLO station18.example.com STARTTLS QUIT # openssl genrsa 1024 > andrey.key # openssl req -new -key andrey.key -out andrey.csr # openssl ca -in andrey.csr -out andrey.crt # cat andrey.key andrey.crt > andrey.pem # openssl pkcs12 -export -in andrey.pem -out testusercert.p12 -name "Andrey's Personal cert" # cat /etc/mail/access # openssl x509 -in cacert.pem -noout -subject -issuer # man ascii ----------------------------------------------------------------------------------------------------------------- Java: торжественное обращение с jar и атрибутами MANIFEST.MF Алексей Саенко // Создание нового jar-файла jar cf file.jar список_файлов // Просмотр содержимого архива jar tf file.jar // Извлечение содержимого из jar-файла jar xf file.jar package pkg; public class Main { public static void main(String[] args) { System.out.println("main(): запущен"); } } URL fileUrl = new File("file.jar").toURL(); URL url = new URL("jar", "", fileUrl + "!/"); public static final String MAIN_METHOD = "main"; public void runMainMethod(String className) throws Exception { String[] args = new String[1]; Class clazz; Method mainMethod; // Создадим ClassLoader URLClassLoader urlClassLoader = new URLClassLoader(new URL[] { url }); // Загрузка класса класслоадером clazz = urlClassLoader.loadClass(className); // Получение main-метода и проверка, является ли он точкой входа mainMethod = clazz.getMethod(MAIN_METHOD, args.getClass()); mainMethod.setAccessible(true); int mods = mainMethod.getModifiers(); if (mainMethod.getReturnType() != void.class || !Modifier.isStatic(mods) || !Modifier.isPublic(mods)) { throw new NoSuchMethodException(MAIN_METHOD); } else { // Запуск метода с объектом, у которого надо выполнить метод, и параметрами. // null показывает, что метод статический mainMethod.invoke(null, args); } } private String getMainClassName() throws IOException { JarURLConnection connection = (JarURLConnection) url.openConnection(); Attributes attributes = connection.getMainAttributes(); return attributes.getValue(Attributes.Name.MAIN_CLASS); } import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.jar.Manifest; public class JarAttributeWriter { private static final String LINE_TEMPLATE = "%s: %s\n"; // Метод генерирует текстовый файл – манифест с именем filename public void generateManifest(String filename) { StringBuffer buf = new StringBuffer(); buf.append(getLine("Manifest-Version", "1.0")); buf.append(getLine("Created-By", this.getClass().getName())); buf.append(getLine("Attribute_1", "Value_1")); buf.append(getLine("Attribute_2", "Value_2")); try { InputStream inputStream = new ByteArrayInputStream(buf.toString().getBytes("UTF-8")); Manifest manifest = new Manifest(inputStream); OutputStream outputStream = new FileOutputStream(filename); manifest.write(outputStream); } catch (IOException e) { e.printStackTrace(); } } // Метод возвращает одну строку манифеста. Метод format() - аналог printf // в C – осуществляет форматированный вывод private String getLine(String attributeName, String attributeValue) { return String.format(LINE_TEMPLATE, attributeName, attributeValue); } } import java.io.IOException; import java.util.jar.Attributes; import java.util.jar.JarFile; public class JarAttributeReader { private static final String OUTPUT_TEMPLATE = "%s=%s"; // Метод считывает все атрибуты из jar-файла filename Attributes getAllAttributes(String filename) throws IOException { JarFile jarFile; Attributes attributes; jarFile = new JarFile(filename); attributes = jarFile.getManifest().getMainAttributes(); return attributes; } // Метод печатает в консоли атрибуты со значениями void printAllAttributesWithValues(String filename) { try { Attributes attributes = getAllAttributes(filename); for (Object o : attributes.keySet()) { System.out.println(String.format(OUTPUT_TEMPLATE, o, attributes.getValue(o.toString()))); } } catch (IOException e) { e.printStackTrace(); } } } ----------------------------------------------------------------------------------------------------------------- Знакомимся с YAML Сергей Супрунов node_ip 10.0.0.51 node_user arc node_password xidughei email_list arc,hunter,engineer sms_list hunter12@sms.mob.ru 10.0.0.51 arc xidughei arc hunter engineer hunter12@sms.mob.ru ip 10.0.0.51 user arc password xidighei email arc,hunter,engineer sms hunter12@sms.mob.ru node = {'ip': '10.0.0.51', 'user': 'arc', 'password': 'xidighei'} email_list = ['arc', 'hunter', 'engineer'] sms_list = ['hunter12@sms.mob.ru'] node: ip: 10.0.0.51 user: arc password: xidighei email_list: - arc - hunter - engineer sms_list: - hunter12@sms.mob.ru $ irb irb(main):001:0> require 'yaml' irb(main):002:0> config = YAML::load(open('config.yml')) => {"node"=> {"user"=>"arc", "ip"=>"10.0.0.51", "password"=>"xidighei"}, "sms_list"=>["hunter12@sms.mob.ru"], "email_list"=>["arc", "hunter", "engineer"]} irb(main):003:0> puts config['node']['ip'] 10.0.0.51 $ cat hash.yml ? - 1 - 2 - 3: three : some digits $ irb irb(main):001:0> require 'yaml' irb(main):002:0> config = YAML::load(open('slohash.yml')) => {[1, 2, {3=>"three"}]=>"some digits"} irb(main):003:0> config.keys[0] => [1, 2, {3=>"three"}] irb(main):004:0> config[c.keys[0]] => "some digits" +: plus :: colon # Массив (как элемент хэша) Moderators: [Site Admin, Dr.Moder, Polizei] # Хэш (как элемент хэша) Location: {host: localhost, port: 5432} Date1: 2008-01-01 Date2: 01.02.2008 Time: 12:45 StringDate: "2008-01-01" $ python >>> import yaml, datetime >>> config = yaml.load(open('config.yml')) >>> config >>> config['Date1'].year PortAsString: !!str 80 Email list: - arc - &h hunter - engineer SMS list: - *h # заменится на hunter simple: one two three continued: > one two three pre: | one two three >>> print config['simple'] >>> print config['continued'] >>> print config['pre'] png: !!binary | iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAIAAAAmdTLBAAAAAXNSR0IArs4c6QAAAARnQU1B AACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAA Ah5JREFUOE+lVEsoRFEYPoowxORRk5SFBQsLNRtrS1ZKKXaSZEFeyQx5K6OQiPFME6XIKyYZ jUKTEqmRZiFlMyk1Hum614zju3PvXGfunZFyOp05c+75vv///seJoZSS/wzgI4+HK+q2051u cb1zRbtFtB8Cp7NCe8ZrZ+rjkP7CSrD6evSfzSn+vW7t5XD8i5cfLbofT111EutF2LSdEPdM Ej+YT723LAuD9zg5U/r+phrJEm3ukbeutM+TKYUihBe4D7MBZgc2dMUlBapZ2ZCjsMyfixSK FzJesFWd2uJwCXij0YhVAZgW9aBjKeCFKCQ4gvg7FyIkAbR4HNb1GUor8lght1NJgcMRGS8s ljtXZNkR8eU1uZgsfs1BBHOWjPc3Ji6dheGrO7JhExMbWIb/lv0EVUb4Jh198RIqcIH6WOWb ZF/CQzP2rHKW4qlfTz1OQp/uubZkFV6JX+tkGiiwqozjbwgPEbU/Odfqhy/wf+xIzA47UaD0 4UqMPyKBePwSf4RAFT9Ugb8hAdpF/Ne2+XJWDoFUP2z+wSuVAKvCsUb4mZJQ/t99nCkTFa4V GfEExp970+F8CI9ftx199kf89VyysNXC1F9wyy+UuZZ/EhmN62CdcMMFUK7G4wgU8CKaENQY WhsNTt99mv5TDtx2xMIzoUMjS0WJdXeX3EzGo7vxtKiekAjvj0h/PA07qGuUBtYPSyF1jKFa te/PNwvDAKJ/owerAAAAAElFTkSuQmCC >>> c = yaml.load(open('r.yml')) >>> open('r.png', 'w').write(c['png']) $ cat many.yml --- # Server host: localhost port: 80 --- # Client user: root homedir: /var/client/home $ cat perl.pl #!/usr/local/bin/perl use YAML::Tiny; $config = YAML::Tiny->read('many.yml'); $server = $config->[0]; $client = $config->[1]; print "Connect to $server->{host}:$server->{port}\n"; print " as $client->{user} from $client->{homedir}\n"; $ ./perl.pl Connect to localhost:80 as root from /var/client/home use YAML::Tiny; $config = YAML::Tiny->read('config.yml')->[0]; $host = $config->{'host'}; import yaml config = yaml.load(open('config.yml')) host = config['host'] require 'yaml' config = YAML::load(open('config.yml')) host = config['host'] ----------------------------------------------------------------------------------------------------------------- Профессиональное использование консоли с помощью GNU Screen Дмитрий Васильев $ which screen $ screen $ screen top # Отключить вывод лицензионной информации при старте Screen startup_message off # Открыть оболочку для работы chdir screen -t Work # Открыть оболочку для управления конфигурацией chdir /etc screen -t Configuration # Открыть оболочку для просмотра логов chdir /var/log screen -t Logs # Выбрать первое окошко после старта select 0 -----------------------------------------------------------------------------------------------------------------