Hungry Mind , Blog about everything in IT - C#, Java, C++, .NET, Windows, WinAPI, ...

DCOM Remote Protocol Specification

Работа с COM/DCOM напоминает фильмы про путешественников, рубящих лианы в непроходимых джунглях индокитая. Нашел полезный документик - Distributed Component Object Model (DCOM) Remote Protocol Specification. Написан, кстати в 2007 году и обновлен в январе 2008-го.

COM умер. COM снова жив.

Adobe Flex Builder 3

Adobe Flex Builder 3 Вышел Adobe Flex Builder 3. Download Adobe Flex Builder 3.

ReSharper 4 EAP has started

ReSharper 4 EAP

Moving to Firefox 3 Beta 3

Firefox 2 меня уже порядочно достал своими утечками памяти (постоянно при 2-3 табах заваливает за 700М), решил попробовать последнюю бету Firefox 3. Красиво, удобно, но привычный для IE 7 или FF 2 вид сайтов куда-то пропал. По-другому стали обрабатываться CSS, какая-то ерунда с JavaScript. Короче, привет дизайнерам.

WCF cyclic references support

WCF DataContract serializer isn't by default aware of cyclic object graphs. If you encounter the Object graph for type 'X.Y.Z' contains cycles and cannot be serialized if reference tracking is disabled error - read to the end.

There is a simple solution and it's well documented in the Preserving Object Reference in WCF article. However the code is very chaotic and contains mistakes. I've made several classes to support a simple and powerful control over the DataContract serialization parameters.

Support classes

  1. ApplyCyclicDataContractSerializerOperationBehavior

    An operation behavior and The DataContractSerializerOperationBehavior descendant. Used to inject custom configured DataContractSerializer instances into WCF pipeline.

    internal class ApplyCyclicDataContractSerializerOperationBehavior : DataContractSerializerOperationBehavior{
        private readonly Int32 _maxItemsInObjectGraph;
        private readonly bool _ignoreExtensionDataObject;
        private readonly bool _preserveObjectReferences;
    
        public ApplyCyclicDataContractSerializerOperationBehavior(OperationDescription operationDescription, Int32 maxItemsInObjectGraph, bool ignoreExtensionDataObject, bool preserveObjectReferences)
            : base(operationDescription) {
            _maxItemsInObjectGraph = maxItemsInObjectGraph;
            _ignoreExtensionDataObject = ignoreExtensionDataObject;
            _preserveObjectReferences = preserveObjectReferences;
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, String name, String ns, IList<Type> knownTypes) {
            return (new DataContractSerializer(type, name, ns, knownTypes, _maxItemsInObjectGraph, _ignoreExtensionDataObject, _preserveObjectReferences, null /*dataContractSurrogate*/));
        }
    
        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes) {
            return (new DataContractSerializer(type, name, ns, knownTypes, _maxItemsInObjectGraph, _ignoreExtensionDataObject, _preserveObjectReferences, null /*dataContractSurrogate*/));
        }
    
    }
    
  2. CyclicReferencesAwareContractBehavior

    A contract behavior. Used to apply the DataContractSerializerOperationBehavior operation behavior to every operation within a contract.

    public class CyclicReferencesAwareContractBehavior : IContractBehavior{
        private const Int32 maxItemsInObjectGraph = 0xFFFF;
        private const bool ignoreExtensionDataObject = false;
    
        private bool _on;
    
        public CyclicReferencesAwareContractBehavior(bool on) {
            _on = on;
        }
    
        #region IContractBehavior Members
    
        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) {
        }
    
        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime) {
            ReplaceDataContractSerializerOperationBehaviors(contractDescription, _on);
        }
    
        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime) {
            ReplaceDataContractSerializerOperationBehaviors(contractDescription, _on);
        }
    
        internal static void ReplaceDataContractSerializerOperationBehaviors(ContractDescription contractDescription, bool on) {
            foreach (var operation in contractDescription.Operations) {
                ReplaceDataContractSerializerOperationBehavior(operation, on);
            }
        }
    
        internal static void ReplaceDataContractSerializerOperationBehavior(OperationDescription operation, bool on) {
            if (operation.Behaviors.Remove(typeof(DataContractSerializerOperationBehavior)) || operation.Behaviors.Remove(typeof(ApplyCyclicDataContractSerializerOperationBehavior))) {
                operation.Behaviors.Add(new ApplyCyclicDataContractSerializerOperationBehavior(operation, maxItemsInObjectGraph, ignoreExtensionDataObject, on));
            }
        }
    
        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) {
        }
    
        #endregion
    }
    
  3. CyclicReferencesAwareAttribute

    The most valuable member of the triade. Used to apply cycling support policy to the whole service interface or an individual interface operation.

    [AttributeUsage(AttributeTargets.Interface | AttributeTargets.Method)]
    public class CyclicReferencesAwareAttribute : Attribute, IContractBehavior, IOperationBehavior{
        private readonly bool _on = true;
    
        public CyclicReferencesAwareAttribute(bool on) {
            _on = on;
        }
    
        public bool On {
            get { return (_on); }
        }
    
        #region IOperationBehavior Members
    
        void IOperationBehavior.AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) {
        }
    
        void IOperationBehavior.ApplyClientBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.ClientOperation clientOperation) {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehavior(operationDescription, On);
        }
    
        void IOperationBehavior.ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehavior(operationDescription, On);
        }
    
        void IOperationBehavior.Validate(OperationDescription operationDescription) {
        }
    
        #endregion
    
        #region IContractBehavior Members
    
        void IContractBehavior.AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) {
        }
    
        void IContractBehavior.ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehaviors(contractDescription, On);
        }
    
        void IContractBehavior.ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime) {
            CyclicReferencesAwareContractBehavior.ReplaceDataContractSerializerOperationBehaviors(contractDescription, On);
        }
    
        void IContractBehavior.Validate(ContractDescription contractDescription, ServiceEndpoint endpoint) {
        }
    
        #endregion
    }
    

Examples:

CyclicReferencesAware applied to the whole interface:

[ServiceContract]
[CyclicReferencesAware(true)]
public interface TestFacade
{
    [OperationContract]
    void Hello(SomeData data);
}

CyclicReferencesAware applied to individual operation(s):

[ServiceContract]
public interface TestFacade
{
    [OperationContract]
    [CyclicReferencesAware(true)]
    void Hello(SomeData data);
}

CyclicReferencesAware applied to the whole interface and individual operation(s):

[ServiceContract]
[CyclicReferencesAware(false)]
public interface TestFacade
{
    [OperationContract]
    [CyclicReferencesAware(true)]
    void Hello(SomeData data);
}

MVP and MVC Part 1

Эта статья содержит вступление, общее представление и сравнение трех архитектурных шаблонов построения интерактивных приложений: Model-View-Controller, Model-View-Presenter и Presentation-Abstraction-Control.

Часть 1, Часть 2, TBD.

Вступление

Шаблоны MVC, MVP и PAC служат для удовлетворения требований интерактивных приложений путем разделения обязанностей (Separation Of Concerns), связанных с различными компонентами в пределах архитектуры. Несмотря на схожесть, они отличаются мотивацией и целесообразностью применения в различных ситуациях. Эта статья рассказывает о каждом шаблоне, его истории и мотивациях дизайна с целью правильного понимания и применения.

При обсуждении ахитектурных шаблонов важно понимать, что они возникли из соображений дизайна в контексте специфических условий разработки. По существу, платформенно-зависимые мотивации и детали реализации часто являются частью формального описания шаблона.

Например, основной мотивацией дизайна Model-View-Controller было разделение представления и области знаний (домена приложения). Разграничение ввода и вывода программы, результатом которого стала концепция Контроллера, было лишь побочных эффектом сложностей работы с вводом-выводом. Современные среды разработки прошли длинный путь в ограждении разработчика от подобных сложностей, сводя к нулю необходимость делить ввод и вывод. В подобных средах применение шаблона Model-View-Controller может привести к подходу, который придерживается целей шаблона, но не повторяет его оригинальную структуру, либо соблюдает структуру, но не следует замыслу. Например, первоначальные мотивы шаблона Model-View-Controller могут быть достигнуты путем отделения форм и элементов управления приложения от концептуальной модели или другой стратегии реализации предметной области. Включение контроллера для перехвата пользовательского ввода больше не требуется на платформах, которые сами предоставляют такую функциональность. При попытке использования оригинальной формы шаблона Model-View-Controller в контексте таких сред разработки, полученная архитектура может застрять между строгой реализацией MVC, которая конфликтует с окружением разработки, и реализацией, которая назначает различные обязанности оригинальным компонентам.

Принимая во внимание вышесказанное, можно сделать вывод, что Model-View-Controller был перенесен на язык шаблонов неадекватно. Другими словами, компоненты, заданные шаблоном MVC, не инвариантны относительно среды разработки, а большинство описаний не указывают это явно. Часто это приводит к некорректному применению шаблона.

Еще один совет при изучении и рассмотрении интерактивных шаблонов проектирования - не принимать все слишком серьезно. Многие базовые шаблоны, к примеру, разобранные в фундаментальном труде Э. Гаммы Приемы объектно-ориентированного проектирования. Паттерны проектирования, являются хорошо отточенными шаблонами, которые описывают инвариантные пути решения часто возникающих проблем. Принимая во внимание суть этих шаблонов, обычно, мы не получаем улучшения при использовании конкурирующих конструкций, направленных на решение той же проблемы. С другой стороны, углубляясь в область составных шаблонов, таких как шаблоны интерактивных приложений, модели, стили и пр., изучение таких конструкций пожет показаться просмотром документального фильма о истории самолетов. Это не Контроллер на последнем снимке?

Airplane 1 Airplane 2 Airplane 3 Airplane 4 Airplane 5 Airplane 6

Лучше всего думать об архитектурных шаблонах в сфере научного исскуства. Интерактивные архитектурные шаблоны не являются эквивалентами Закона Тяготения Ньютона. Они лишь представляют собой эволюционирующую попытку достигнуть наилучшей модели, которая удовлетворяет требованиям сегодняшнего дня.

В итоге, при выборе одного шаблона из множества, важно рассматривать их в контексте решения конкретной проблемы, а не, обезопасив пальцы за лямки спецодежды, заявлять "Я использую такие и такие шаблоны". Использование шаблона должно стать последствием возникновения проблемы, для которой есть готовое решение, а не последствием выбора шаблона с последующим подгоном проблемы. Вместе с тем, продолжим.

Шаблон Model–View-Controller

Обзор

Шаблон Model–View-Controller - это методология разделения обязанностей данных приложения, их представления и пользовательского ввода на специализированные компоненты.

Происхождение и Мотивация

Шаблон MVC был изначально придуман в 1978-79 Тригвом Ринскаугом и его изначальной целью было обеспечение пользователя интерфейсом, который позволяет производить манипуляции над многими вариантами отображения данных, как сущностей реального мира. Первоначально шаблон был упомянут, как Thing-Model-View-Editor, а потом Ринскауг и его коллеги сошлись на имени Model-View-Controller (1). Модифицированная версия дизайна Доктора Ринскауга была реализована, как часть библиотеки Xerox PARC под Smalltalk-80. Описание этой реализации можно найти в работе Applications Programming in Smalltalk-80(TM): How to use Model-View-Controller (MVC).

Структура

Следующая диаграмма отображает структуру шаблона Model-View-Controller:

The structure of the Model-View-Controller pattern

Хотя некоторые описания шаблона MVC отображают неявную асоциацию из Представления к Контроллеру, оригинальная реализация MVC в Smalltalk-80 спаривала Представление и Контроллер (2).

Компоненты

Под Моделью подразумевают данные и безнес функции приложения. Они часто имеют вид Доменной Модели, где объекты моделируют сущности реального мира путем олицетворяя их свойства и поведение.

Представление - это визуальное отображения Модели, состоящее из окошек и элементов управления, которые используются приложением.

Контроллер - это компонента, реагирующая на пользовательский ввод (команды от мыши и клавиатуры). Он играет роль моста между человеком и приложением, позволяя пользователю взаимодействовать с отображением и данными.

Взаимосвязи

В контексте шаблона MVC, тройка Model-View-Controller существует для каждого объекта, который подвержен манипуляциям со стороны пользователя.

Модель представляет собой состояние, структуру и поведение отображаемых данных, которыми манипулирует пользователь. Модель не содержит прямой ссылки на Представление или Контроллер, Модель может быть модифицирована Представлением, Контроллером или другими объектами системы. Когда необходимо уведомить Представление или Контроллер, Модель использует шаблон Observer для отправки сообщений об изменившихся данных.

Компоненты Представление и Контроллер работают сообща чтобы дать пользователю возможность видеть Модель и взаимодействовать с ней. Каждое Представление сопоставлено с единственным Контроллером и каждый Контроллер с единственным Представлением. И Представление и Контроллер имеют прямую ссылку на Модель.

В реализации Smalltalk-80 и Представление и Контроллер содержали прямые ссылки друг на друга, хотя ссылка из Представления на Контроллер была по большей части побочным результатом реализации, нежели унаследованной частью шаблона MVC. Ссылка использовалась не для делегирования пользовательского ввода, перехваченного Представлением, Контроллеру, как в случае с шаблоном Dolphin Smalltalk Model-View-Presenter, а использовалась Представлением для инициализации контроллера ссылкой на себя, а также главным Колнтроллером для нахождения активного Контроллера в иерархии Представлений.

Обязанность Представления видится, как вывод информации, в то время как Контроллер занимается вводом. Взаимодействовать с Моделью - общая обязанность Представления и Контроллера. Контроллер взаимодействует с Моделью в связи с реакцией на пользовательский ввод, а Представление - в связи с обновлением. Каждый из них может как угодно использовать и модифицирвать данные Модели.

При получении ввода от пользователя, Контроллер его перехватывает и реагирует соответственно. Какие-то действия пользователя повлекут за собой взаимодействие с Моделью, например, изменение данных или вызов методов, другие могут вызвать визуальные изменения Представления, например, сворачивание меню, подстветка полос прокрутки и пр.

Недопонимание MVC

Одно распостраненное заблуждение насчет связи компонент MVC касается назначения Контроллера, как разделителя Модели от Представления. Да, шаблон MVC разделяет домен приложения от визуализации, но это достигается за счет шаблона Observer, а не за счет Контроллера. Задача последнего - быть посредником между человеком и приложением, а не между Представлением и Моделью.

Developer and UI usability test

Developer watching UI usability test

Vista start menu search

Оказывается, есть быстрый поиск по меню Пуск:
Vista start menu search

What does RAR stand for?

RAR = Roshal ARchiver

Eugene Roshal - автор RAR и WinRAR.

Home Mini Server

В последнее время задумался над покупкой домашнего сервера. Хочется компактную коробку, которую можно забросить на балкон. А еще лучше, чтобы не шумела, - тогда поставить в угол.

Положил глаз на этого зверя. Дороговато, но, как только появится, - куплю!
Shuttle SP35P2 PRO

Можно, конечно, собрать Barebone систему и самому, но врядли у меня из этого получится что-то хорошее. Если на балкон - то можно и не заморачиваться с размерами.

RTM of Windows Vista SP1

Кажется, информация подтвердилась - Vista SP1 ушел в RTM. То же самое с Windows Server 2008. Но...

In mid-March, we will release Windows Vista SP1 to Windows Update...

У многих он уже с неделю установлен и до сегодняшнего дня велась активная дискуссия о RTM-ности образов и файлов, улетевших в сеть раньше анонсов.

Oracle 11g ODAC

Появился Oracle 11g ODAC and Oracle Developer Tools for Visual Studio.

Состав:

  • Oracle Providers for ASP.NET 11.1.0.6.20
  • Oracle Developer Tools for Visual Studio 11.1.0.6.20
  • Oracle Data Provider for .NET 2.0 11.1.0.6.20
  • Oracle Data Provider for .NET 1.x 11.1.0.6.20
  • Oracle Database Extensions for .NET 2.0 11.1.0.6.20 -- for upgrade only
  • Oracle Database Extensions for .NET 1.x 11.1.0.6.20 -- for upgrade only
  • Oracle Provider for OLE DB 11.1.0.6.20
  • Oracle Objects for OLE 11.1.0.6.20
  • Oracle ODBC Driver 11.1.0.6.0
  • Oracle Services for Microsoft Transaction Server 11.1.0.6.0
  • Oracle SQL*Plus 11.1.0.6.0
  • Oracle Instant Client 11.1.0.6.

XML Parsing Error: no element found

Только что пытался запустить сайт на IIS и столкнулся с непонятной ошибкой XML Parsing Error: no element found. Оказалось, сервер просто возвращает пустую страничку.

Также через IIS Admin не получается запустить сайт. В результате не без помощи Sysinternals Tcpview выяснил, что чертов Skype слушает на портах HTTP и HTTPS. Stype: turn HTTP and HTTPS off Пора вводить ограничения на использование портов в начальном диапазоне, как в юниксе.

Hacking WL-500gP Part 2

Продолжаю мучить WL-500gP. В предыдущей части были разобраны такие пункты:

  1. SSH
  2. 4 Gb Flash
  3. Установка пакетов
  4. syslog-ng
  5. Создание пользователей

Эта часть коснется установки и настройки VSFTPD и Samba 3.

Поставить FTP сервер и Samba по отдельности - не проблема. Проблема в том, чтобы везде использовалась одинаковая кодировка и корректно отображалась кириллица. Единственное рабочее решение, которое было найдено - использовать UTF8 на файловой системе и FTP сервер, который позволяет выполнять перекодировку UTF8<->Windows-1251.

Установка и настройка Samba 3

Ставим:

ipkg install samba

Файл конфигурации по-умолчанию отсутствует, создаем:

vim /opt/etc/samba/smb.conf
[global]
workgroup = MYWORKGROUP
guest account = nobody

security = share

browseable = yes
guest ok = yes
guest only = no
log level = 0
log file = /opt/var/log/smbd.log
max log size = 100
encrypt passwords = yes
dns proxy = no
load printers = no
invalid users = root
netbios name = WL500gP
interfaces = br0
bind interfaces only = yes
server string = ASUS WL500g Premium
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_SNDBUF=8192
preserve case = yes
short preserve case = yes

dos charset = CP866
unix charset = UTF-8
display charset = UTF-8

wins support = no
#wins server = 192.168.1.1
time server = yes
os level = 255
local master = no

[PersonalShare]
path = /opt/home/SomeUser
writeable = yes
force user = SomeUser
force group = someuser
browseable = yes

[GroupShare]
path = /opt/home/GroupShare
writeable = yes
force user = SomeGroup
force group = somegroup
browseable = yes
create mode = 0664
directory mode = 0775

[FTP]
path = /opt/home/ftp
writeable = yes
force user = ftp
force group = ftp
browseable = yes
create mode = 0664
directory mode = 0775

Конфигурацию расшареных папок, конечно, поменять на свои. Обратите внимание на выделенные параметры. Безопасность настроена на уровне папок, а не пользователей. Выставлены кодировки.

Скрипт запуска - /opt/etc/init.d/S08samba. Его нужно отредактировать и, желательно, переименовать, чтобы Samba запускалась в самом конце:

sed 's/samba_active=0/samba_active=1/' /opt/etc/init.d/S08samba > /opt/etc/init.d/S95samba
rm -f /opt/etc/init.d/S08samba

Не забываем также про остановку системы, файл /usr/local/sbin/pre-shutdown:

if [ `pidof smbd` -ne "" ]; then
        $log 'Terminating smbd'
        /bin/kill `pidof smbd`
fi
if [ `pidof nmbd` -ne "" ]; then
        $log 'Terminating nmbd'
        /bin/kill `pidof nmbd`
fi

Установка и настройка VSFTPD

VSFTPD - единственный сервер, который удовлетворяет требованиям по кодировке. И то, прийдется поднатужиться для его сборки...

Сборка VSFTPD

С сайта http://vsftpd.devnet.ru/rus/ нужно скачать последний архив в исходниками и скомпилировать его.

Для этого нам понадобятся следующие "маленькие" пакеты:

ipkg install optware-devel
ipkg install buildroot
ipkg install openssl-dev

Можно смело пойти погулять полчасика.

Компилируем:

mkdir -p /opt/usr/src
cd /opt/usr/src
wget http://vsftpd.devnet.ru/files/2.0.5/ext.4/vsftpd-2.0.5.ext4.tar.gz
tar zxvf vsftpd-2.0.5.ext4.tar.gz vsftpd-2.0.5.ext4
cd vsftpd-2.0.5.ext4
cp defs.h defs.h.orig
sed 's/\/etc\/vsftpd\/vsftpd.conf/\/opt\/etc\/vsftpd.conf/' defs.h.orig > defs.h
mv builddefs.h builddefs.h.orig
echo "#ifndef VSF_BUILDDEFS_H"      >> builddefs.h
echo "#define VSF_BUILDDEFS_H"      >> builddefs.h
echo ""                             >> builddefs.h
echo "#undef VSF_BUILD_TCPWRAPPERS" >> builddefs.h
echo "#define VSF_BUILD_PAM"        >> builddefs.h
echo "#define VSF_BUILD_SSL"        >> builddefs.h
echo ""                             >> builddefs.h
echo "#endif /* VSF_BUILDDEFS_H */" >> builddefs.h

make

ipkg install vsftpd

cp vsftpd /opt/sbin/
cp vsftpd.8 /opt/share/man/man8/
cp vsftpd.conf.5  /opt/share/man/man5/

UPD: 05/04/2009

Последняя сборка 2.1.0 (ext.1). Чтобы ее собрать необходимо скачать и поставить свежую версию openssl.

cd /opt/usr/src/
wget http://www.openssl.org/source/openssl-0.9.8k.tar.gz
tar zxvf openssl-0.9.8k.tar.gz
cd openssl-0.9.8k
./config --prefix=/opt --openssldir=/opt shared
make install

Перед выполнением этой команды нужно убить все несистемные процессы - для сборки просто не хватает памяти. Также неплохо, чтобы образовалась следующая картинка:

[root@WL500gP lib]$ ls /opt/lib/*libssl* -al
-rw-r--r-- 1 root root 480756 Apr  5 17:52 /opt/lib/libssl.a
lrwxrwxrwx 1 root root     15 Apr  5 17:52 /opt/lib/libssl.so -> libssl.so.0.9.8
lrwxrwxrwx 1 root root     15 Apr  5 18:13 /opt/lib/libssl.so.0 -> libssl.so.0.9.8
-r-xr-xr-x 1 root root 351912 Apr  5 17:52 /opt/lib/libssl.so.0.9.8

Также нужно поправить файл vsf_findlibs.sh (-lcrypt вместо -lcrypto):

if find_func SSL_library_init ssl.o; then
  echo "-lssl -lcrypto";
fi

Настройка VSFTPD

Создаем пользователей и правильно выставляем права (важно):

echo "ftp:x:2:ftp" >> /etc/group
echo "ftp:x:1000:2:Anonymous FTP user:/opt/home/ftp:/sbin/nologin" >> /etc/passwd

mkdir -p /opt/home/nobody
mkdir -p /opt/home/ftp
mkdir -p /opt/home/ftp/incoming

chown nobody:nobody /opt/home/nobody
chown -R ftp:ftp /opt/home/ftp

chmod 555 /opt/home/nobody
chmod 555 /opt/home/ftp
chmod 775 /opt/home/ftp/incoming

Конфигурация /opt/etc/vsftpd.conf:

# Example config file /opt/etc/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
listen=YES
check_shell=NO
chroot_local_user=YES
secure_chroot_dir=/opt/home/nobody
anon_root=/opt/home/ftp
convert_charset_enable=1
local_charset=UTF-8
remote_charset=WIN1251
syslog_enable=YES
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
vsftpd_log_file=/opt/var/log/vsftpd.log
#
# If you want, you can have your log file in standard ftpd xferlog format
#xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
nopriv_user=nobody
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that turning on ascii_download_enable enables malicious remote parties
# to consume your I/O resources, by issuing the command "SIZE /big/file" in
# ASCII mode.
# These ASCII options are split into upload and download because you may wish
# to enable ASCII uploads (to prevent uploaded scripts etc. from breaking),
# without the DoS risk of SIZE and ASCII downloads. ASCII mangling should be
# on the client anyway..
#ascii_upload_enable=YES
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
ftpd_banner=Welcome.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/opt/etc/vsftpd.banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/opt/etc/vsftpd.chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
ls_recurse_enable=YES

Запускаем:

/opt/sbin/vsftpd >/dev/null 2>&1 &

Пробуем логинится как anonymous. Если сервер отвечает 500 OOPS: child died, то, вероятно, что-то неправильно с правами доступа или путями.

Добавляем в автозапуск:

echo "/opt/sbin/vsftpd /opt/etc/vsftpd.conf >/dev/null 2>&1 &" > /opt/etc/init.d/S60vsftpd
chmod +x /opt/etc/init.d/S60vsftpd

Последний штрих - остановка системы, файл /usr/local/sbin/pre-shutdown:

if [ `pidof vsftpd` -ne "" ]; then
        $log 'Terminating vsftpd'
        /bin/kill `pidof vsftpd`
fi

Не забываю сделать

flashfs save && flashfs commit && flashfs enable

Added smiles to my blog

Всегда хотел добавить поддержку смайлов в блог! :-) 8-)

Copyright 2007-2011 Chabster