Контроллер домена Samba с базой данных в LDAP
Samba
— программа, которая позволяет обращаться к сетевым дискам на различных
операционных системах по протоколу SMB/CIFS. Имеет клиентскую и
серверную части. Является свободным программным обеспечением, выпущена
под лицензией GPL.
Начиная с третьей версии, Samba предоставляет службы файлов и печати для
различных клиентов Microsoft Windows и может интегрироваться с
операционной системой Windows Server, либо как основной контроллер
домена (PDC), либо как член домена. Она также может быть частью домена
Active Directory.
Вот мы и попробуем запустить контролер домена на FreeBSD с помощью Samba.
Общая информация
Требования
Установка
Конфигурирование
Администрирование сервера samba
Админские привилегии в домене Samba
Сравнение с Windows Server
В данном документе описана установка и настройка домена Samba на
FreeBSD с базой данных в LDAP. Данная статья не позволит вам
осуществлять соединения с сервером по протоколу ssh, описанная
конфигурация позволит создать контроллер домена для клиентов windows.
Необходим shell доступ к серверу freebsd. Все операции должны выполняться от пользователя root.
Убедитесь что ваши порты обновлены перед установкой программ. Имя
сервера serv01 Имя домена smbdomain.local FQDN имя
serv01.smbdomain.local
#cat /etc/host
Содержимое файла /etc/hosts должно иметь вид ниже.
::1 localhost localhost.smbdomain.local
127.0.0.1 localhost localhost.smbdomain.local
192.168.50.195 serv01.smbdomain.local serv01
192.168.50.195 serv01.smbdomain.local.
Нам необходимо установить следующие порты:
/net/openldap24-server
/net/samba3
/net/nss_ldap
/net/smbldap-tools
Примем опции установки по умолчанию.
# cd /usr/ports/net/openldap24-server
# make install clean
# cd /usr/ports/net/samba30
# make install clean
Выберем следующие опции для установки:
[X] LDAP With LDAP support
[X] ADS With Active Directory support
[X] CUPS With CUPS printing support
[X] WINBIND With WinBIND support
[X] ACL_SUPPORT With ACL support
[X] AIO_SUPPORT With Asyncronous IO support
[ ] FAM_SUPPORT With File Alteration Monitor
[X] SYSLOG With Syslog support
[X] QUOTAS With Disk quota support
[X] UTMP With UTMP accounting support
[ ] PAM_SMBPASS With PAM authentication vs passdb backends
[ ] CLUSTER With experimental cluster support
[ ] DNSUPDATE With dynamic DNS update(require ADS)
[ ] EXP_MODULES With experimental modules
[X] POPT With system-wide POPT library
[X] PCH With precompiled headers optimization
[ ] MAX_DEBUG With maximum debugging
[ ] SMBTORTURE With smbtorture
# cd /usr/ports/net/nss_ldap/
# make install clean
# cd /usr/ports/net/smbldap-tools
# make install clean
Настроим конфигурационный файл openldap (/usr/local/etc/openldap/slapd.conf). Создадим пароль для доступа к серверу openldap.
# slappasswd -s very-secure-password
{SSHA}2pCGrVMhMh3cC+LakUXApebb9jwICf5e
Примечание переводчика: обратите внимание дальше по тексту будет
часто встречаться "very-secure-password". Так вот это пароль для доступа
к серверу openldap.
Скопируем строку вывода, она нам понадобится. Теперь откроем наш конфигурационный файл
#vi usr/local/etc/openldap/slapd.conf
и приведем его к такому виду
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/samba.schema
loglevel 256
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# Load dynamic backend modules:
modulepath /usr/local/libexec/openldap
moduleload back_bdb
#######################################################################
# BDB database definitions
#######################################################################
database bdb
suffix "dc=smbdomain,dc=local"
rootdn "cn=Manager,dc=smbdomain,dc=local"
#rootpw = very-secure-password
rootpw {SSHA}2pCGrVMhMh3cC+LakUXApebb9jwICf5e
directory /var/db/openldap-data
# Indices to maintain
index objectClass eq
index cn pres,sub,eq
index sn pres,sub,eq
index uid pres,sub,eq
index displayName pres,sub,eq
index uidNumber eq
index gidNumber eq
index memberUID eq
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
index default sub
Теперь нам необходимо произвести некоторые операции с файлами и папками указанными в этом конфигурационном файле.
# mkdir -p /var/db/openldap-data
# cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/DB_CONFIG
# chown -R ldap:ldap /var/db/openldap-data
# chown -R ldap:ldap /usr/local/etc/openldap/
# chmod -R 0700 /var/db/openldap-data
# chmod 0400 /usr/local/etc/openldap/slapd.conf
Также необходимо скопировать схему samba в директорию со схемами ldap сервера.
# cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/
Добавим в syslog лог файлы ldap сервера. Для этого в файл /etc/syslog.conf необходимо добавить строки
!slapd
*.* /var/log/slapd.log
Теперь создадим лог файл и перезапустим syslog
# touch /var/log/slapd.log
# /etc/rc.d/syslogd restart
Настроим файл /usr/local/etc/nss_ldap.conf, приведем его к виду
base dc=smbdomain,dc=local
bind_policy soft
bind_timelimit 10
host localhost
idle_timelimit 3600
ldap_version 3
nss_base_group ou=Groups,dc=smbdomain,dc=local?one
nss_base_passwd ou=People,dc=smbdomain,dc=local?one
nss_base_passwd ou=Computers,dc=smbdomain,dc=local?one
nss_base_shadow ou=People,dc=smbdomain,dc=local?one
nss_connect_policy persist
nss_paged_results yes
pagesize 1000
port 389
scope one
timelimit 30
Теперь необходимо создать символическую ссылку с /usr/local/etc/nss_ldap.conf на файл /usr/local/etc/openldap/ldap.conf
# rm -/usr/local/etc/openldap/ldap.conf
# ln -s /usr/local/etc/nss_ldap.conf /usr/local/etc/openldap/ldap.conf
# ln -s /usr/local/etc/nss_ldap.conf /usr/local/etc/ldap.conf
Настроим автоматический запуск сервера ldap после загрузки компьютера.
# echo "#enable slapd" >> /etc/rc.conf
# echo slapd_enable=\"YES\" >> /etc/rc.conf
# echo slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/ ldap://127.0.0.1/"' >> /etc/rc.conf
# echo slapd_sockets="/var/run/openldap/ldapi" >> /etc/rc.conf
Ну и пробуем его запустить.
# /usr/local/etc/rc.d/slapd start
Starting slapd.
# ps ax | grep slap
11383 ?? Ss 0:00,01 /usr/local/libexec/slapd -h ldapi://%2fvar
11385 p2 S+ 0:00,00 grep slap
Также необходимо отредактировать файл /etc/nsswitch.conf в частности изменить значение строк group: и passwd:
group: files ldap
group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files
Теперь настроим сервер samba Все общие ресурсы и другие необходимые длся samba файлы расположим в директории /usr/local/samba
# mkdir /usr/local/samba
Создадим файл usermap для сопоставления пользователя с правами администратор
# vi /usr/local/samba/usermap
root = administrator
Удалим конфигурационный файл /usr/local/etc/smb.conf
#rm /usr/local/etc/smb.conf
# vi /usr/local/etc/smb.conf
и приведем его к виду ниже
# Global parameters
[global]
workgroup = SMBDOMAIN
server string = Samba Server
netbios name = serv01
hosts allow = 192.168.50. 127. 10.0.1.
interfaces = fxp0, lo
bind interfaces only = Yes
# passwd backend
encrypt passwords = yes
passdb backend = ldapsam:ldap://serv01.smbdomain.local/
enable privileges = yes
pam password change= Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn * passwd:*all*authentication*tokens*updated*successfully*
unix password sync = Yes
# Log options
log level = 1
log file = /var/log/samba/%m
max log size = 50
syslog = 0
# Name resolution
name resolve order = wins bcast host
# misc
timeserver = Yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
use sendfile = yes
veto files = /*.eml/*.nws/*.{*}/
veto oplock files = /*.doc/*.xls/*.mdb/
deadtime = 120
# Dos-Attribute
map hidden = No
map system = No
map archive = No
map read only = No
store dos attributes = Yes
# printers - configured to use CUPS and automatically load them
load printers = Yes
printcap name = CUPS
printing = cups
cups options = Raw
show add printer wizard = No
# scripts invoked by samba
add user script = /usr/local/sbin/smbldap-useradd -m %u
delete user script = /usr/local/sbin/smbldap-userdel %u
add group script = /usr/local/sbin/smbldap-groupadd -p %g
delete group script = /usr/local/sbin/smbldap-groupdel %g
add user to group script = /usr/local/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/local/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/local/sbin/smbldap-usermod -g %g %u
add machine script = /usr/local/sbin/smbldap-useradd -w %m
# LDAP-iConfiguration
ldap delete dn = Yes
ldap ssl = off
ldap passwd sync = Yes
ldap suffix = dc=smbdomain,dc=local
ldap machine suffix = ou=Computers
ldap user suffix = ou=People
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=Manager,dc=smbdomain,dc=local
idmap backend = ldap:ldap://serv01.smbdomain.local
idmap uid = 10000-20000
idmap gid = 10000-20000
# logon options
logon script = logon.bat
logon path = \%Lprofiles%u
logon path =
logon home = \%L%U
logon drive = H:
# setting up as domain controller
username map = /usr/local/samba/usermap
preferred master = Yes
wins support = Yes
domain logons = Yes
domain master = Yes
local master = Yes
os level = 64
map acl inherit = Yes
unix charset = UTF8
#============================ Share Definitions ==============================
[netlogon]
comment = Network Logon Service
path = /usr/local/samba/netlogon
guest ok = yes
locking = no
[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No
[Profiles]
comment = Network Profiles Service
path = /usr/local/samba/profiles
read only = No
profile acls = yes
hide files = /desktop.ini/ntuser.ini/NTUSER.*/
profile acls = Yes
[printers]
comment = All Printers
path = /var/spool/samba
browseable = No
guest ok = Yes
printable = Yes
use client driver = Yes
default devmode = Yes
[print$]
comment = Printer Drivers
path = /usr/local/samba/printer-drivers
browseable = yes
guest ok = no
read only = yes
write list = root
[data]
comment = Data Directory
path = /usr/local/samba/data
write list = @smbdomain
read only = No
create mask = 0777
directory mask = 0777
Обратите внимание на два параметра
interfaces = fxp0, lo
bind interfaces only = Yes
Значение первого fxp0 необходимо заменить на имя вашего сетевого
интерфейса, или закомментируйте эти две строки. Теперь создадим
следующие директории netlogon, profiles, printer-drivers, директории
общих ресурсов и дадим на них соответствующие права.
# mkdir /usr/local/samba/netlogon
# mkdir /usr/local/samba/profiles
# mkdir /usr/local/samba/printer-drivers
# mkdir /usr/local/samba/data
# chmod 777 /usr/local/samba/profiles
Командой testparm проверим наш файл smb.conf на ошибки.
# testparm /usr/local/etc/smb.conf
Мы должны увидеть что то подобное без ошибок.
Load smb config files from /usr/local/etc/smb.conf
Processing section "[netlogon]"
Processing section "[homes]"
Processing section "[Profiles]"
Processing section "[printers]"
Processing section "[print$]"
Processing section "[data]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions
Теперь сохраним пароль к LDAP серверу в файле secret.tdb samba. Для этого остановим сервер LDAP.
/usr/local/etc/rc.d/slapd stop
Stopping slapd.
Waiting for PIDS: 49851.
# smbpasswd -w very-secure-password
Setting stored password for "cn=Manager,dc=smbdomain,dc=local" in secrets.tdb
Добавим в автозапуск системы запуск сервера samba.
# echo "#enable Samba" >> /etc/rc.conf
# echo nmbd_enable="YES" >> /etc/rc.conf
# echo smbd_enable="YES" >> /etc/rc.conf
# echo winbindd_enable="YES" >> /etc/rc.conf
# echo cupsd_enable="YES" >> /etc/rc.conf
Запустим сервер samba.
# /usr/local/etc/rc.d/samba start
Removing stale Samba tdb files: ....... done
Starting nmbd.
Starting smbd.
Starting winbindd.
Проверим что сервер samba работает.
# ps -ax | grep mdb
1093 ?? Ss 0:00.03 /usr/local/sbin/nmbd -D -s /usr/local/etc/smb.conf
1095 ?? I 0:00.00 /usr/local/sbin/nmbd -D -s /usr/local/etc/smb.conf
1100 ?? Ss 0:00.01 /usr/local/sbin/smbd -D -s /usr/local/etc/smb.conf
Изменим стартовый конфигурационный скрипт samba добавив в зависимости
slapd после cupsd во второй строке REQUIRE: как это сделано ниже
# vi /usr/local/etc/rc.d/samba
#PROVIDE: nmbd smbd
#PROVIDE: winbindd
#REQUIRE: NETWORKING SERVERS DAEMON ldconfig resolv
#REQUIRE: cupsd slapd
#BEFORE: LOGIN
#KEYWORD: shutdown
Настроим smbldap-tools. Запустим файл
/usr/local/share/examples/smbldap-tools/configure.pl И будем отвечать на
вопросы. Мной были добавлены [HIT ENTER] там где не нужно ничего
менять, и [<--- NEEDS CHANGE] где требуются изменения. По просьбе
читателей было введено дополнительно [<--- NEEDS PASSWORD + ENTER]
вместо надписи "very-secure-password". После вопроса ldap tls support
(1/0) [0] будет пауза в работе скрипта, она связана с тем что скрипт
пытается получить SID, это может занять несколько секунд.
# /usr/local/share/examples/smbldap-tools/configure.pl
Use of $# is deprecated at /usr/local/share/examples/smbldap-tools/configure.pl line 314.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
smbldap-tools script configuration
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Before starting, check
. if your samba controller is up and running.
. if the domain SID is defined (you can get it with the 'net getlocalsid')
. you can leave the configuration using the Crtl-c key combination
. empty value can be set with the "." character
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Looking for configuration files...
Samba Configuration File Path [/usr/local/etc/smb.conf] [HIT ENTER]
The default directory in which the smbldap configuration files are stored is shown.
If you need to change this, enter the full directory path, then press enter to continue.
Smbldap-tools Configuration Directory Path [/etc/opt/IDEALX/smbldap-tools/] /usr/local/etc/smbldap-tools [<--- NEEDS CHANGE]
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Let's start configuring the smbldap-tools scripts ...
. workgroup name: name of the domain Samba act as a PDC
workgroup name [smbdomain] [HIT ENTER]
. netbios name: netbios name of the samba controler
netbios name [serv01] [HIT ENTER]
. logon drive: local path to which the home directory will be connected (for NT Workstations). Ex: 'H:'
logon drive [H:] [HIT ENTER]
. logon home: home directory location (for Win95/98 or NT Workstation).
(use %U as username) Ex:'\serv01%U'
logon home (press the "." character if you don't want homeDirectory) [\%L%U] [HIT ENTER]
. logon path: directory where roaming profiles are stored. Ex:'\serv01profiles%U'
logon path (press the "." character if you don't want roaming profile) [\serv01profiles%U] [HIT ENTER]
. home directory prefix (use %U as username) [/home/%U] [HIT ENTER]
. default users' homeDirectory mode [700] [HIT ENTER]
. default user netlogon script (use %U as username) [logon.bat] [HIT ENTER]
default password validation time (time in days) [45] 100000 [<--- NEEDS CHANGE]
. ldap suffix [dc=smbdomain,dc=local] [HIT ENTER]
. ldap group suffix [ou=Groups] [HIT ENTER]
. ldap user suffix [ou=People] [HIT ENTER]
. ldap machine suffix [ou=Computers] [HIT ENTER]
. Idmap suffix [ou=Idmap] [HIT ENTER]
. sambaUnixIdPooldn: object where you want to store the next uidNumber
and gidNumber available for new users and groups
sambaUnixIdPooldn object (relative to ${suffix}) [sambaDomainName=smbdomain] [HIT ENTER]
. ldap master server: IP adress or DNS name of the master (writable) ldap server
ldap master server [serv01.smbdomain.local] [HIT ENTER]
. ldap master port [389] [HIT ENTER]
. ldap master bind dn [cn=Manager,dc=smbdomain,dc=local] [HIT ENTER]
ldap master bind password [] [<--- NEEDS PASSWORD + ENTER]
. ldap slave server: IP adress or DNS name of the slave ldap server: can also be the master one
ldap slave server [serv01.smbdomain.local] [HIT ENTER]
. ldap slave port [389] [HIT ENTER]
. ldap slave bind dn [cn=Manager,dc=smbdomain,dc=local] [HIT ENTER]
. ldap slave bind password [] [<--- NEEDS PASSWORD + ENTER]
. ldap tls support (1/0) [0] [HIT ENTER]
. SID for domain smbdomain: SID of the domain (can be obtained with 'net getlocalsid serv01')
SID for domain smbdomain [S-1-5-21-2609998211-36760486-3473504348] [HIT ENTER]
. unix password encryption: encryption used for unix passwords
unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA) [SSHA] [HIT ENTER]
. default user gidNumber [513] [HIT ENTER]
. default computer gidNumber [515] [HIT ENTER]
. default login shell [/bin/sh] [HIT ENTER]
. default skeleton directory [/etc/skel] [HIT ENTER]
. default domain name to append to mail adress [] [HIT ENTER]
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Use of uninitialized value in concatenation (.) or string at /usr/local/share/examples/smbldap-tools/configure.pl line 314, /usr/local/etc/smbldap-tools/smbldap.conf.old
/usr/local/etc/smbldap-tools/smbldap_bind.conf->/usr/local/etc/smbldap-tools/smbldap_bind.conf.old
writing new configuration file:
/usr/local/etc/smbldap-tools/smbldap.conf done.
/usr/local/etc/smbldap-tools/smbldap_bind.conf done.
Теперь запустим LDAP сервер
# /usr/local/etc/rc.d/slapd start
И создадим структуру базы домена
# smbldap-populate -u 10000 -g 10000 -r 10000
Populating LDAP directory for domain smbdomain (S-1-5-21-2609998211-36760486-3473504348)
(using builtin directory structure)
adding new entry: dc=smbdomain,dc=local
adding new entry: ou=People,dc=smbdomain,dc=local
adding new entry: ou=Groups,dc=smbdomain,dc=local
adding new entry: ou=Computers,dc=smbdomain,dc=local
adding new entry: ou=Idmap,dc=smbdomain,dc=local
adding new entry: uid=root,ou=People,dc=smbdomain,dc=local
adding new entry: uid=nobody,ou=People,dc=smbdomain,dc=local
adding new entry: cn=Domain Admins,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Domain Users,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Domain Guests,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Domain Computers,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Administrators,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Account Operators,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Print Operators,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Backup Operators,ou=Groups,dc=smbdomain,dc=local
adding new entry: cn=Replicators,ou=Groups,dc=smbdomain,dc=local
adding new entry: sambaDomainName=smbdomain,dc=smbdomain,dc=local
Please provide a password for the domain root:
Changing UNIX and samba passwords for root
New password:[<--- NEEDS PASSWORD + ENTER]
Retype new password:[<--- NEEDS PASSWORD + ENTER]
Пароль который вы должны ввести это пароль пользователя administrator
для сервера samba он необязательно должен совпадать с паролем к ldap
серверу.
Теперь нужно настроить winbind (для этого потребовалось перезагрузить samba прим. переводчика)
# net rpc join -S serv01 -Uroot
password:
joined domain smbdomain
Для администрирования сервера можно воспользоваться утилитой microsoft ftp://ftp.microsoft.com/Softlib/MSLFILES/SRVTOOLS.EXE
Посмотреть назначенные привилегии
#net rpc rights list accounts -U administrator%пароль_администратора
Для добавления админских привилегий в домене группе Domain Admins:
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeAddUsersPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeMachineAccountPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeTakeOwnershipPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeBackupPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeRestorePrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeRemoteShutdownPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SePrintOperatorPrivilege
#net rpc rights grant -U administrator%пароль_администратора 'SMBDOMAIN\Domain Admins' SeDiskOpera
Главными отличиями от серверных версий Windows являются:
- отсутствие поддержки для групповых политик (косвенная поддержка
для версии 3.х в принципе возможна, версия Samba 4 будет включать
поддержку групповых политик)
- отсутствие настроек профилей пользователей и компьютеров
- отсутствие поддержки инфраструктуры узлов (sites) и репликации каталога в соответствии с настройками межузловых связей
Ещё одной особенностью следует считать то, что Samba работает
только поверх TCP/IP, тогда как аналогичный сервис в Windows может
предоставляться также поверх IPX и NetBEUI. Однако, сама Microsoft в
последних версиях Windows ориентируется на NBT, так что это отличие
Samba неактуально.
По утверждениям ITLabs, в условиях многопользовательского доступа,
скорость работы в качестве ролей файлового и принт-сервера более чем в
два раза выше по сравнению с Windows Server 2003 с теми же ролями.
Что нас ждет в новой версии? Основным нововведением
разрабатываемой версии 4.0 будет возможность использовать Samba сервер в
качестве контроллера домена Active Directory. Данная возможность
реализована в версиях 3.x, но в сильно урезанном виде. После трех лет
разработки первый технический релиз 4.0.0TP1 был выпущен в январе 2006
года. Впоследствии альфа-релизы появляются регулярно. Последняя версия
4.0.0-alpha13 выпущена 21 сентября 2010 года.
|