Автоматический сбор и архивация фото/видеонаблюдения

    ЗАДАЧА


    Однажды, начальство потребовало круглосуточно вести запись происходящего в офисах. А также, в рабочее время — периодически публиковать фото из офисов на сайте.

    От моего предшественника мне досталось:
    • Несколько офисов с умными видеокамерами D-Link, которые фотографируют происходящее
    • Сервер на FreeBSD
    • Сайт организации, куда должен попадать снимок с каждой камеры
    • Сетевая папка в локальной сети, где должны храниться архивы записей

    Известно:

    — Сервер FreeBSD не доступен извне
    — Хостер не любит, когда к его FTP подключаются чаще, чем раз в минуту
    — Учитывая качество и толщину каналов связи, камеры не пишут видео, а делают периодические фото

    На момент постановки задачи, видеокамеры самостоятельно вразнобой подключались к FTP хостера и выкладывали снимки по расписанию каждую минуту. В результате чего, хостер периодически блокировал доступ по FTP к сайту.



    РЕШЕНИЕ

    Решение — теория

    Решением этой задачки стал один из уроков по информационной безопасности, данный мне однажды в СПбГУ ИТМО. В уроке говорилось о зонах безопасности, об их уровнях, и о правилах чтения/записи между уровнями.

    В двух словах: приложение с высшим уровнем безопасности, например — 1, может читать и писать в приложение уровня 2 или 3. Но приложение 2, не может ни читать, ни писать в приложение 1, хотя может читать и писать в приложение 3.

    На самом деле правила несколько сложнее, но я упростил для облегчения восприятия.

    Who is who

    Схема взаимодействия всех вышеуказанных элементов выстроилась простая:
    Камеры складывают фотографии на мой сервер по FTP, сервер их копирует в сетевую папку, а также публикует на хостинге.



    Сервер здесь выступает уровнем 1, имеющим доступ ко всем остальным уровням. Нетрудно заметить, что здесь есть как-бы нарушение правила: камерам, имеющим более низкий 2й уровень, дано право писать на 1й уровень. По-хорошему, следовало сервер научить читать картинку с камер, а не открывать им доступ, но в данном случае, общая безопасность системы не пострадала. Объясняю: хитрость в том, что камеры пишут в FTP-папку, имеющую тот же уровень безопасности, что и у камер, т.е. 2й. Папка находится отдельно от всех остальных и содержит только текущие изображения с камер. Любой кто подключится к FTP используя логин и пароль с камеры, получит только несколько фотографий офисов, но не сможет увидеть всех архивов.

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

    Но не будем унывать. Камеры висят не в самом удобном месте для физического доступа, а чтобы в них покопаться — нужно знать пароль,… а еще нужно надеть маску или выключить свет, прежде чем камеру свинтить, но и эти действия спалят злоумышленника, т.к. известно кто в какое время где был.

    Вернемся к нашим баранам

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

    Решение — практика

    1. Устанавливаем и настраиваем на FreeBSD-сервере ProFTP (о вкусах не спорят, я просто предлагаю понятный вариант) и ffmpeg.
    2. Создаем папку для видеокамер и папку для архива (например, где-нибудь в папке /usr/)
    3. Создаем в ProFTP учетную запись для видеокамер и отдаем ей созданную папку
    4. Настраиваем камеры, используя их веб-интерфейс, таким образом, чтобы они круглосуточно и, к примеру, ежеминутно (кому какой период подойдет), подключались к нашему серверу по FTP и сохраняли фотографию.
    5. Очень важно также, настроить камерам правильную дату, время и автоматическую синхронизацию с местным NTP-сервером точного времени.
    6. Вспоминаем параметры подключения к FTP нашего хостинга.
    7. Пишем хитроумный SH-скрипт и заносим его в cron с частотой выполнения, аналогичной частоте выкладывания фотографий камерами, т.е. раз в минуту.
    8. Наслаждаемся и идем докладывать начальству.


    И наконец сердце решения — скрипт, собственной наработки:
    #!/bin/sh
    
    ## Запоминаем дату. Требуется, чтобы делать
    ## архив отправленных файлов, на будущее
    day="`date +%Y-%m-%d`"
    archive="/store/STORE/cam_archive"
    ## Данные для подключения по FTP
    
    ## Имя пользователя
    FTPUSER='*********'
    
    ## IP-адрес или доменное имя хоста
    FTPHOST='***.***.***.***'
    
    ## Пароль FTP
    FTPPASS='************'
    
    ## Удалённый каталог, в который будем пересылать файл
    REMOTEDIR="/www/img"
    
    ## Локальный каталог откуда будем копировать файлы
    LOCALDIR="/store/STORE/cam"
    
    ## Входим в локальный каталога, откуда будем копировать файлы
    cd $LOCALDIR
    
    # Пишем в лог новую дату
    echo .
    echo -================================================-
    date
    
    ## Создаём каталог, куда будем ложить копии отправленных файлов
    mkdir $archive/$day >/dev/null 2>&1
    
    ## Запоминаем время для имени файла.
    time1=`date +%H_%M_%S`
    
    ## Копируем файлы в созданную нами директорию, текущего дня.
    # Для каждой камеры создается своя папка (по имени файла, который создает камера)
    echo Сохраняем снимки в архив.
    for file in $(ls -1 *.jpg)
    do
     camfolder=`echo ${file} | sed 's/\.jpg//'`
     mkdir $archive/$day/$camfolder >/dev/null 2>&1
     cp $file $archive/$day/$camfolder/$time1\_$file
    done
    
    # Топорный метод для определения подходящего времени, чтобы выложить снимки на сайт
    # grep дает ответ, есть ли в строке minutes1 текущая минута времени minutes2
    minutes1='01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59'
    minutes2=`date +%M`
    result=`echo ${minutes1} | grep ${minutes2}`
    
    # Публикуем снимки на сайте, только если время в пределах режима работы учреждения (>=10 and <=18 and !result)
    if [ `date +%H` -ge 10 ] && [ `date +%H` -le 18 ] && [ -n "$result" ]
    then {
    echo Публикуем снимки на FTP.
    ## Здесь начинается подключение к FTP-серверу и выгрузка снимков
    ftp -n $FTPHOST <<EOF
    quote USER $FTPUSER
    quote PASS $FTPPASS
    binary
    cd $REMOTEDIR
    dir
    mput *
    a
    EOF
    }
    fi
    
    # Если настал новый день (часы=00 and минуты=00), тогда делаем видео из папки вчерашнего дня.
    if [ `date +%H` -eq '00' ] && [ `date +%M` -eq '00' ]
    then {
    
    # вычислим вчерашний день
    LASTDAY=`date -v-1d +"%Y-%m-%d"`
    
    ## заходим в эту папку
    cd $archive/$LASTDAY/
    
    ## проходим по всем подпапкам и чистим их от пустых и недогруженных файлов
    ## фотографии с моих камер всегда имеют размер более 10k, поэтому все что меньше - однозначно недогружено
    find $archive/$LASTDAY/ -size -10k -print | {
    while read files
        do
        rm "${files}"
        done
    }
    
    ## Проходим по всем папкам камер по очереди, выполняя три действия
    for camfolders in $(ls -1 -U)
    do
    ## 1. Переименование файлов в ряд с именами в виде порядковых номеров
       y=0
       ls -1 $archive/$LASTDAY/$camfolders/*.jpg | {
       while read files2
           do
           y=`expr ${y} + 1`
           mv ${files2} $archive/$LASTDAY/$camfolders/img`printf %04d ${y}`.jpg
           done
       }
    
    ## 2. Конвертируем все в видеоряд
    ## TODO: требуется настройка высокого качества видео
       ffmpeg -f image2 -i $archive/$LASTDAY/$camfolders/img%04d.jpg -r 6 -s 720x576 $archive/$LASTDAY/$camfolders\_$LASTDAY.avi
    
    ## 3. Удаляем все изображения из папки
       rm -rf $camfolders
    
    done
    
    }
    fi
    exit 0
    


    Работа для напильника:

    • Качество сжатия видеозаписи, мягко говоря, страдает ужасно. Не могу разобраться в хитроумных параметрах ffmpeg. А возможно, что не хватает кодеков. Прошу тех кто сталкивался — подсказать подходящий перечень ключей.
    • Злоумышленник-инсайдер, прикинувшись камерой, может устроить некислый дефейс уважаемому сайту, если конечно узнает пароль от FTP. Нужно либо закрыться как-то, либо научить сервер заходить в веб-интерфейс камер и скачивать с них текущее изображение (у камеры для этого предусмотрен статичный адрес cam1/snapshot.php, а аутентификация производится на базе .htaccess). Посоветуйте, пожалуйста, при помощи каких команд и утилит это можно решить.
      UPD: решение этого момента подсказал Akint. Чуть позже добавлю в код.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 38

      +2
      Хороший подход к решению вопроса, подробно рассматриваете разные варианты, но ИМХО, модель Белла-ЛаПадула притянута несколько за уши. Использование ее в тексте немного затрудняет понимание. хотя решение не экзотическое (это только мое мнение).
        0
        Спасибо!
        Не то чтобы за уши, но именно ее подход лежит в основе, как решение возможных проблем безопасности.
        +1
        Первый раз с такими ограничениями сталкиваюсь у хостинга.
          0
          Зависит от тарифа. Логичное ограничение для защиты от DoS.
          0
          Качество сжатия видеозаписи, мягко говоря, страдает ужасно. Не могу разобраться в хитроумных параметрах ffmpeg. А возможно, что не хватает кодеков. Прошу тех кто сталкивался — подсказать подходящий перечень ключей.

          У меня вот такой строчкой кодируется:

          ffmpeg -r 5 -b 500kb -i cam1/jpg/$ymd/%05d.jpg -y cam1/avi/$ym/cam1_$ymd.avi

          Качество устраивает.
            0
            А разве здесь не должно быть ключей -f image2?
              0
              Честно сказать, уже просто не помню. Как говорится, сделал и забыл. Но работает вот именно так, как написал.
                0
                Спасибо. Попробовал. Качество стало немного лучше и четче, но не регулируется. Битрейт все-равно 200кб/с и на картинке jpeg-артефакты. Хотелось бы еще немного улучшить качество дотянув до исходного.

                Между:
                ffmpeg -r 6 -b 4096k -i img%04d.jpg -s 704x576 -y cam1.avi

                и
                ffmpeg -r 6 -b 2048k -i img%04d.jpg -s 704x576 -y cam1.avi

                в результате нет никакой разницы: файл получается того же размера и качества.

                Вот результат испытаний:
                ffmpeg -r 6 -b 4096k -i img%04d.jpg -s 704x576 -y cam1.avi
                ffmpeg version 0.7.6, Copyright © 2000-2011 the FFmpeg developers
                built on Oct 28 2011 11:52:30 with gcc 4.2.1 20070719 [FreeBSD]
                configuration: --prefix=/usr/local --mandir=/usr/local/man --enable-shared --enable-gpl --enable-postproc --enable-avfilter --enable-pthreads --enable-x11grab --enable-memalign-hack --enable-runtime-cpudetect --cc=cc --extra-cflags='-msse -I/usr/local/include/vorbis -I/usr/local/include' --extra-ldflags='-L/usr/local/lib ' --extra-libs=-pthread --disable-debug --disable-libaacplus --disable-indev=alsa --disable-outdev=alsa --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libcelt --disable-libdirac --disable-libfaac --enable-libfreetype --enable-frei0r --disable-libgsm --enable-libmp3lame --enable-libopencv --enable-libopenjpeg --disable-librtmp --enable-libschroedinger --disable-ffplay --disable-libspeex --enable-libtheora --disable-vaapi --disable-vdpau --disable-libvo-aacenc --disable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid
                libavutil 50. 43. 0 / 50. 43. 0
                libavcodec 52.122. 0 / 52.122. 0
                libavformat 52.110. 0 / 52.110. 0
                libavdevice 52. 5. 0 / 52. 5. 0
                libavfilter 1. 80. 0 / 1. 80. 0
                libswscale 0. 14. 1 / 0. 14. 1
                libpostproc 51. 2. 0 / 51. 2. 0
                [image2 @ 0x805422020] max_analyze_duration 5000000 reached at 5000000
                Input #0, image2, from 'img%04d.jpg':
                Duration: 00:03:49.83, start: 0.000000, bitrate: N/A
                Stream #0.0: Video: mjpeg, yuvj420p, 704x576 [PAR 72:72 DAR 11:9], 6 fps, 6 tbr, 6 tbn, 6 tbc
                Incompatible pixel format 'yuvj420p' for codec 'mpeg4', auto-selecting format 'yuv420p'
                [buffer @ 0x805449f00] w:704 h:576 pixfmt:yuvj420p tb:1/1000000 sar:72/72 sws_param:
                [buffersink @ 0x805449f80] auto-inserting filter 'auto-inserted scaler 0' between the filter 'src' and the filter 'out'
                [scale @ 0x805449fe0] w:704 h:576 fmt:yuvj420p -> w:704 h:576 fmt:yuv420p flags:0x4
                Output #0, avi, to 'cam1.avi':
                Metadata:
                ISFT : Lavf52.110.0
                Stream #0.0: Video: mpeg4, yuv420p, 704x576 [PAR 1:1 DAR 11:9], q=2-31, 200 kb/s, 6 tbn, 6 tbc
                Stream mapping:
                Stream #0.0 -> #0.0
                Press [q] to stop, [?] for help
                [mjpeg @ 0x805410020] overread 44 587kB time=00:00:15.66 bitrate= 306.7kbits/s
                Last message repeated 1 times 5131kB time=00:03:23.33 bitrate= 206.7kbits/s
                [mjpeg @ 0x805410020] overread 9
                [mjpeg @ 0x805410020] EOI missing, emulating
                frame= 1377 fps= 93 q=12.0 Lsize= 5776kB time=00:03:49.83 bitrate= 205.9kbits/s
                video:5738kB audio:0kB global headers:0kB muxing overhead 0.673392%


                Снимок с камеры:


                Тот же кадр из видеозаписи:
            +1
            ИМХО за минуту перерыва между снимками злоумышленник может сделать очень многое. Так что задача скорее демонстрировать фото из офисов или просто учебная.
            А вот по хорошему очень здорово как сделано в демо у ivideon. Реальный офис и действительно видно что происходит.
              0
              Да красиво, но для меня, учитывая качество картинки с моих камер, на которых ничего не видно (лиц, например), кроме происходящего, а также сильно узкие и нестабильные каналы связи — приемлемо. Можно только участить кол-во снимков в минуту.
                +1
                В любом случае происходящее лучше видеть хотя бы 3 раза в секунду, чем 1 раз в минуту. Мы себе сделали похожее решение. Причем на некоторых офисах 512 Кбит. Работает замечательно.
                  +2
                  С таким подходом, да и результатом, можно было просто муляжей камер натыкать. Экономия на безопасности достаточно часто выливается в куда более серьёзные финансовые потери, нежели аренда нормального канала и покупка качественных камер. Попробуйте вдолбить это в голову начальству. В Сети масса примеров успешного применения видеосистем. Удачи.
                    0
                    Вы думаете я не пробовал? Просто это технически не реализуемо.
                    Например, на Дворцовой площади, кроме радиодоступа, ни о чем мечтать не приходится. Но и с ним большие проблемы. Рядом находятся правительственные объекты, оснащенные радиоглушилками, которые ограничивают возможные места установки отправной точки «последней мили». На данный момент там используется роутер Yota. Уровень сигнала отличный, но вот качество передачи хромает. Никаких 10 мегабит нет. Дай бог 1Мбит/с по нисходящему, а по восходящему вообще 64Кбит/с с перебоями. А на канале не только камера, а еще и два рабочих компьютера и SIP-телефон. Лучшего решения на сегодняшний день нет.

                    Как максимум, я могу увеличить число кадров в минуту, но есть разумный предел — это расхождение во времени между сервером и всеми камерами. Может наступить момент, когда сервер будет хватать по несколько раз одну и ту же фотографию.
                      0
                      Установить полноценный видеорегистратор на саму точку, а картинки уже с него вытягивать не вариант?
                        0
                        Это в планах. Оборудование закупят, но еще не скоро, а совсем без видеоархива хуже чем так.
                  0
                  Короче говоря, у нас в России работают с тем, что есть, выжимая из этого целесообразный максимум.
                  0
                  То есть, ломается ваш локальный сервер, там находится пароль от ftp и сносятся все записи на удаленном сервере. Профит!?
                  Логичнее бы было, чтобы какой-то удаленный сервер сам ходил на ваш внутренний и все собирал, чтобы не было возможности удалить или модифицировать что-то на внешнем сервере.
                    0
                    Точно также ломается удаленный, получается пароль от моего, входится и удаляется… тоже самое. Фишка в том, какой сервер легче защитить, тот который где-то удаленно, или тот, который здесь, под боком, в серверной?
                    Настроенный тобой лично, с мониторингом, файерволом, активной защитой и т.п.
                      0
                      Локальный проще сломать физически.
                      Я расскажу один пример из жизни.
                      Был офис, там много чего интересного было, стояло видеонаблюдение, все писалось на некий локальный сервер. Когда же офис обнесли, украв очень много исходников (происки конкурентов в бандитском Екатеринбурге), техники, то сервер со всеми записями тупо украли… в итоге никаких доказательств.
                      А про удаленный скорее всего даже не будут знать злоумышленники.
                        0
                        Не до конца написал)
                        Так вот, имея доступ к локальному серверу, злоумышленник легко на удаленном удалит все следы.
                          0
                          Здесь все понятно. Поэтому бекап записей делается на сетевое хранилище в другом офисе. Придется обносить оба офиса в центре города, находящихся под защитой вневедомственной охраны и сигнализации.
                      +1
                      Мало обрабатываются ошибки. Ну и потом, местами странновато выглядит, например, если FTP-сервер по любой причине даст ощутимый таймаут, Вы не поймаете начало суток, т.к. Вы ловите ровно 00:00 — и не сделаете ролик.
                        0
                        А разве крон не запустит второй скрипт параллельно уже запущенному? По моим наблюдениям — запустит.
                          +1
                          Нет, на следующей минуте он его запустит. Но в коде-то стоит if [ `date +%H` -eq '00' ] && [ `date +%M` -eq '00' ]. Четкая вбитая проверка на 00:00.
                            0
                            Дык, FTP отвалится и тогда… ага, понял.
                            Тогда лучше будет запомнить время запуска скрипта, на случай задержек на FTP, и уже его сравнивать с 00:00. Спасибо!
                          0
                          А про ошибки Вы правы, хотя я старался писать так, чтобы они не могли возникнуть в принципе. Все можно исправить.
                          +4
                          Нужно либо закрыться как-то, либо научить сервер заходить в веб-интерфейс камер и скачивать с них текущее изображение (у камеры для этого предусмотрен статичный адрес cam1/snapshot.php, а аутентификация производится на базе .htaccess). Посоветуйте, пожалуйста, при помощи каких команд и утилит это можно решить.

                          В самом простом случае авторизация через .htaccess и скачивание делается так:
                          wget --http-user="cam_user" --http-password="cam_password" -q -O "/path/where/to/save" "http://path/to/snapshot"


                          Ещё небольшой совет.
                          Вот этот кусок кода
                          find $archive/$LASTDAY/ -size -10k -print | {
                          while read files
                          do
                          rm "${files}"
                          done
                          }

                          можно заменить на
                          find $archive/$LASTDAY/ -size -10k -print0 | xargs -0 rm
                          На мой взгляд, эстетичнее выглядит и легче воспринимается =)
                            0
                            Вот это реально крутой совет! Да прибудет с Вами карма! Спасибо.
                            Буду модернизировать код скрипта прямо здесь, чтобы всем было видно.
                              0
                              Запрос:
                              wget --http-user="******" --http-password="******" -q -O "/home/admin/cam1.jpg" "http://192.168.0.213/cgi-bin/video.jpg"

                              Сохраняет в cam1.jpg вот это:
                              Protected ObjectProtected ObjectThis object is protected.

                              Пока не разобрался. Если знаете о чем я, подскажите пожалуйста, куда копать, чтобы время не терять.
                                0
                                Разобрался. Кому интересно.
                                Нужен был параметр --auth-no-challenge, чтобы логин/пароль отсылались сразу камере.

                                Получилось так:
                                wget --timeout=6 --tries=2 --auth-no-challenge --user='*********' --password='*********' -q -O "/store/STORE/sad37.jpg" "http://192.168.200.13/cgi-bin/video.jpg"

                                Здесь:
                                --timeout=6 Ограничивает время ожидания ответа камеры в 6 секунд. Мало-ли, связи нет.
                                --tries=2 Ограничивает кол-во попыток повтора загрузки при ошибках (по-умолчанию их 20).
                                -q Отключает вывод (тихий режим)
                                -O file Указывает куда сохранять загруженное.
                                  0
                                  А если добавить ключ -b, тогда можно запустить загрузку фотографий на всех камерах практически одновременно и она пройдет в фоновом режиме. Сложность только в том, чтобы «запалить» окончание всех загрузок, чтобы продолжить работу скрипта.

                                  Коллеги, у кого есть идеи?
                                    0
                                    Узнал, что wget возвращает результат работы в виде числа от 1 до 8. Пока не пойму, как его применить.
                                      +1
                                      Сомневаюсь, что Вам помогут эти числа…
                                      Wget may return one of several error codes if it encounters problems.
                                      0 No problems occurred.
                                      1 Generic error code.
                                      2 Parse error---for instance, when parsing command-line options, the
                                      .wgetrc or .netrc…
                                      3 File I/O error.
                                      4 Network failure.
                                      5 SSL verification failure.
                                      6 Username/password authentication failure.
                                      7 Protocol errors.
                                      8 Server issued an error response.


                                      Могу предложить альтернативный вариант. wget -b выдаёт pid процесса, можно ловить момент, когда этот процесс завершится. Однако, по-моему, рациональнее будет не плодить сущности и скачивать просто по очереди.
                                        0
                                        Скачивая по-очереди, можно не уложиться в минуту и крон запустит вторую копию скрипта. И так может дойти до большого кол-ва копий в памяти… Я не прав?
                              0
                              Вот каждый раз, когда вижу подобное, сразу же возникает вопрос — а для чего все это сделано?

                              Если кто-то что-то со стола стырит — концов не найдешь (скажу больше, в моем прошлом офисе была такая же фигня — архив с камер AXIS с поиском по архиву и прочими фишечками — начальство захотело. Каждые 5 секунд — фото. Когда что-то там вперли — да, видно, что рядом была уборщица, но вот что она шкафчик открывала — не видно. Все, камеры бесполезны. Ну у нас-то еще и традиционное наблюдение было).

                              Чтобы публиковать фотки «просто так, типа вот мы работаем» — достаточно настроить одну камеру раз в час прямо на сайт публиковать (хотя премодерация все же нужна, ИМХО, чтобы не было снимков пустого офиса и подобного — каждый пусть придумает в меру своей испорченности/информированности :).

                              Смотреть, рабтоают ли сотрудники и когда кто пришел — ну да, наверное вот это и есть основное применение такого.

                                0
                                  0
                                  Стараемся этого не допускать. Несмотря на мар... странности начальства.
                                  0
                                  А вы не примеряйте на себя. Раз сделано — были причины. И уверяю Вас, что в данном случае — вполне адекватные. Например, видно когда пришли или ушли сотрудники, когда пришел или ушел охранник, были ли какие-нибудь происшествия, сколько было посетителей, чем сотрудники занимались и т.п. Для реальной охраны объектов будет закуплено специальное оборудование и нормальные видеокамеры, где различимы лица. У этого оборудования другие задачи. И одно оборудование с другим не должно пересекаться, ни технически, ни по задачам, тогда смысл существования одного из них пропадет.

                                Only users with full accounts can post comments. Log in, please.