Модификация дистрибутивов на основе 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
-----------------------------------------------------------------------------------------------------------------