Ставим Windows 2008 в VirtualBox из консоли

Для начало найдем нужный нам ostype


VBoxManage list ostypes | grep Windows

В списке ищем 2008 винду
ID: Windows2008
Description: Windows 2008

Нашли, теперь создадим нашу ВМ


VBoxManage createvm --name WS1 --ostype Windows2008 --register --basefolder /disk

Получаем ответ, что все ок
Virtual machine ‘WS1’ is created and registered.
UUID: 9bf1df5a-3334-4de2-8571-1e99ffe851c6
Settings file: ‘/disk/WS1/WS1.vbox’

Создаем интерфейс, как сделать смотрите тут

Устанавливаем параметры нашего будущего сервера:


VBoxManage modifyvm WS1 --memory 1024 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 virt2 --vram 16 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on

Создаем диск ~14гб, можно и больше


VBoxManage createhd --filename /disk/WS1.img --size 15000

создаем виртуальный ide


VBoxManage storagectl WS1 --name WSHDD --add ide

И добавляем к нему, наш созданый до этого диск


VBoxManage storageattach WS1 --storagectl WSHDD --port 0 --device 0 --type hdd --medium /disk/WS1.img

Теперь добавим dvd к нашей ВМ , для этого устанавливаем диск с Windows 2008 Server в привод и указваем его


VBoxManage storageattach WS1 --storagectl WSHDD --port 1 --device 0 --type dvddrive --medium host:/dev/cdrom1

Указываем ВМ, что загружаться с нужно с dvd


VBoxManage modifyvm WS1 --boot1 dvd

И запускаем нашу VM с возможностью подключения по vnc


VBoxHeadless -s WS1 -n -m 5900 -o 1234

Теперь просто подключаемся к серверу, где установлен virtualbox c помощью vnc клиента с паролем 1234

И смотрим за процессом установки
Подключаемся

Указываем

Выбираем

Ждем

Рабочий

Вот и все собственно.

Подключаем к ip телефонам cisco доп панель spa500s

И так кто не читал, как настроить tftpd смотрит статью по настройке cisco фонов и tftpd читают ее.

Что нам надо, основное уже создано, теперь в конфиг телефонов добавляем строчку:


Asterisk

Тут мы указываем, что наш sip сервер Asterisk.

А затем просто добавляем номера на каждую кнопку:


fnc=blf+sd;sub=1234@192.168.1.1
fnc=blf+sd;sub=1235@192.168.1.1

Тут:
Unit_1 – номер доп модуля, если у вас их 2, то будет соответсвенно еще Unit_2
Key_1 – номер клавиши
1235@192.168.1.1 – телефон который добавляем и сервер
blf – индекатор занятой линии(будет гореть красным лампа)
sd – быстрый набор

Теперь можно перезагрузить телефон и он автоматически загрузит настройки. Тем кому надо более подробно, прошу качать оффициальный мануал по настройке:
SPA500S_Asterisk_03152010.pdf

Настраиваем git сервер для удаленного использования с клиентом(windows|Linux)

установим сначало git


apt-get install git

Заходим на наш сервер и создаем пользователя


useradd -b /disk -s /bin/bash git -m

тут
-b /disk – домашняя директория
-s /bin/bash – шелл по умолчанию
-m – создать в домашней директории(/disk) папку пользователя git

Теперь нам надо создать пустой репозиторий
для этого идем заходим под вновь созданным пользователем в домашнею папку


su git
cd

создаем каталог с именем нашего проекта


mkdir project_name
cd project_name

инициализируем репозиторий


git --bare init

—bare – указывает, что создать надо пустой репозиторий

Все на этом настройка сервера закончена. Теперь нужно настроить клиент. Для этого качаем windows версию git клиента
Для этого заходим

http://git-scm.com/downloads

И качаем клиент, затем устанавливаем его, запускаем git bash

В самом gitbash переходим в папку с вашим проектом


cd /D/myprohect

И инициализируем удаленный репозиторий


git init
git add .
git commit -m ‘запуск
git remote add origin ssh://git@gitserver:port/disk/git/project
git push origin master

Теперь можно добавлять изменения в репозиторий используя команду:


git commit -am ‘Еще один коммит’
git push origin master

Так же для получения репозитория на другом компьютере достаточно выполнить


git clone ssh://git@gitserver:port/disk/git/project

Для безопасности замените shell в /etc/passwd у нашего пользователя с /bin/bash на /usr/bin/git-shell

Codeigniter. Создаем модель для рейтинга.

И так поехали объяснять как поставить codeigniter,apache и прочее я не буду и изначально расчитываю на набор необходимых знаний , создадим таблицу под нашу будущею систему оценок.
Создаем таблицу, я пишу под mysql, но если у вас есть понимание можно и под psql все сделать и так создаем:


CREATE TABLE `rating`( `rating_id` INT(5) NOT NULL AUTO_INCREMENT, `rate` FLOAT(1), `voted` INT(7), `active` BOOL, PRIMARY KEY (`rating_id`) ); 

rating_id – наш ключ, по которому мы будем находить оценку и работать с ней
rate – сама оценка
voted – кол-во проголосовавших
active – возможность отключить голосовалку без удаления и вернуть обратно

Как же эта система будет взаитмодействовать с другими элементами сайта, да легко. Мы просто
сможем добавить в любую таблицу например article поле rating_id, или в таблицу images то же поле
и привязать к объекту нашу оценку.

Для начало создадим конфигурационный файл в папке applicationconfig создаем rating.php
И добавляем в него наши настройки


$rating_config[‘table_name’] = ‘rating’; // Максимально допустимая оценка
$rating_config[‘max_rate’] = 10; //Добавляем к основному конфигу
$config[‘rating_config’] = $rating_config;
?>

Приступим к реализации, создадим в папке applicationmodels файл Rating.php
со следующим значением:


config->load('rating');
        if (($this->_table_name = $this->config->item('table_name', 'rating_config')) === FALSE) {
            //Если не получил имя таблицы, то выводим окно ошибки
            show_error('Не удалось получить имя таблицы в базе данных для системы оценок');
        }
        $this->_max_rate = $this->config->item('max_rate', 'rating_config');
    }

    /**
     * Создаем оценку
     * @param float $rate - Оценка, по умолчанию 0
     * @param int $voted - Кол-во проголосовавших
     * @param bool $active - Активировать оценку
     * @return bool - результат создания объекта
     */
    public function create($rate = 0, $voted = 0, $active = true) {
        $sql = INSERT INTO  . $this->_table_name .  (rate,voted,active) VALUES(?,?,?);;
        $this->db->query($sql, array($rate, $voted, $active));
        if ($this->db->affected_rows() > 0) {
            $this->rating_id = $this->db->insert_id();
            $this->rate = $rate;
            $this->voted = $voted;
            $this->active = $active;
            return TRUE;
        } else {
            $this->_clear_rate();
            return FALSE;
        }
    }

    /**
     * Удаляем оценку
     * @param type $id - ид оценки, если не указан ид, то пытается удалить текущий объект
     * @return boolean - результат удаления
     */
    public function delete($id = false) {
        if ($id !== false) {
            $this->db->delete($this->_table_name, array('rating_id' => $id));
        } else {
            if (is_numeric($this->rating_id)) {
                $this->db->delete($this->_table_name, array('rating_id' => $this->rating_id));
            } else {
                return FALSE;
            }
        }
        if ($this->db->affected_rows() > 0) {
            if (($id === false) || ($id == $this->rating_id)) {
                $this->_clear_rate();
            }
            return TRUE;
        } else {
            return FALSE;
        }
    }

    /**
     * Клас ищет оценку по ид
     * @param type $id - ид оценки
     * @param type $active - искать только активные
     * @return boolean - true если нашел, ну или false
     */
    public function find_by_id($id, $active = true) {
        $sql = SELECT rating_id,rate,voted,active FROM  . $this->_table_name .  WHERE rating_id=?;
        $result = null;
        if ($active) {
            $sql .=  AND active=?;
            $result = $this->db->query($sql, array($id, $active));
        } else {
            $result = $this->db->query($sql, array($id));
        }
        if ($result->num_rows() > 0) {
            $tmp = $result->row();
            $this->rating_id = $tmp->rating_id;
            $this->rate = $tmp->rate;
            $this->voted = $tmp->voted;
            $this->active = $tmp->active;
            return TRUE;
        } else {
            $this->_clear_rate();
            return FALSE;
        }
    }

    /**
     * Редактируем данные
     * @return boolean результат обновления
     */
    public function edit() {
        if (is_numeric($this->rating_id)) {
            $sql = UPDATE  . $this->_table_name .  SET rate=?,voted=?,active=? WHERE rating_id=?;
            $this->db->query($sql, array($this->rate, $this->voted, $this->active, $this->rating_id));
            if ($this->db->affected_rows() > 0) {
                return TRUE;
            } else {
                return FALSE;
            }
        } else {
            return FALSE;
        }
    }

    /**
     * Добаляем оценку
     * @param type $rate - оценка проголосовавшего
     * @param type $id - ид оценки, если не указывать, то попытается использховать текущий объект
     * @param type $ret - возращать обновленный объект или нет
     * @return boolean если $ret=true, то вернет объект с новыми данными, если $ret=false, то просто вернет true
     */
    public function add_rate($rate, $id = FALSE, $ret = TRUE) {
        $sql = UPDATE  . $this->_table_name .  SET voted = voted+1, rate = ROUND(((rate*(voted-1))+?)/voted,1)  WHERE rating_id=?;
        if ($rate > $this->_max_rate)
            $rate = $this->_max_rate;
        
        if ($id !== FALSE) {
            $this->db->query($sql, array($rate, $id));
        } else {
            if (is_numeric($this->rating_id)) {
                $this->db->query($sql, array($rate, $this->rating_id));
                $id = $this->rating_id;
            } else {
                return FALSE;
            }
        }

        if ($this->db->affected_rows() > 0) {
            if($ret) {
                return $this->find_by_id($id);
            }
            return TRUE;
        } else {
            return FALSE;
        }
    }

    /**
     * Удаляем значения 
     */
    private function _clear_rate() {
        $this->rating_id = NULL;
        $this->rate = NULL;
        $this->voted = NULL;
        $this->active = NULL;
    }

}

?>



Как теперь с эти работать.
В контроллере загрузим нашу модель
$this->load->model(‘rating’);
При загрузке выполнится конструктор и проверит указан ли таблица.

Далее мы можем создать оценку или найти ее.
Если мы используем данный объект в админке и хотим например для вновь созданой статьи добавить оценку, мы просто инициализируем нашу модель
и создаем оценку:


   $this->load->model('rating');
   $this->rating->create();

В случае успеха $this->rating->create() вернет true и обновит данные внутри объекта, если же создать не удалось, то вернет false
как пример использования:


        $this->load->model(‘rating’);

        if($this->rating->create()) {
echo ‘Оценка создана’;
        } else {
echo ‘Не получилось создать оценку’;
        }

После того, как мы создали объект мы можем получить данные о нем обратившись:
$this->rating->rating_id – получим ид созданой оценки
$this->rating->rate – Текущая общая оценка
$this->rating->voted – Кол-во проголосовавших
$this->rating->active – активна или нет

Так же мы можем создавать оценку с уже готовыми параметрами
$this->rating->create(оценку, кол-во проголосовавших, активна или нет)

После того как создали объект мы можем передать $this->rating->rating_id в нужную нам модель.
Например у нас есть модель article и в ней есть возможность к статье прикрепить оценку вызвав (article->add_rating($id_raing))
как пример:


       $this->load->model(‘rating’);
       $this->load->model(‘article’);

       if($this->rating->create()) {
$this->article->add_rating($this->rating->rating_id);
       }

Как получить нам нашу оценку, наша модель article вернула нам id оценки теперь мы с помощью find_by_id можем получить объект оценку.
Пример:


$this->load->model('rating');
$this->load->model('article');
$rating_id = $this->article->get_rating_id();
if($this->rating->find_by_id($rating_id)) {
echo 'Средняя оценка: '.$this->rating->rate;
echo 'Проголосовало: '.$this->rating->voted;
}

Учтите, что find_by_id ищет оценку только ту у которой параметр active = TRUE, если вы хотите искать по всем оценками, то добавьте второй парамметр
$this->rating->find_by_id($rating_id,false);

Редактирование оценки, допустим мы получили оценку и хотим ее сделать не активной, обнулив полностью, тогда код будет такой:


$this->load->model('rating');
$this->load->model('article');
$rating_id = $this->article->get_rating_id();
if($this->rating->find_by_id($rating_id)) {
$this->rating->rate = 0;
$this->rating->voted = 0;
$this->rating->active = false;
if($this->rating->edit()) {
echo 'Данные обновлены';
}
}

Добавление оценки, тут наверно оптимальней использовать ajax и контроллер, который это буедт обрабатовать:


public function add_rating($id, $paramm ) { //тут всякие проверки и пр $this->load->model(‘rating’); if($this->rating->add_rate($paramm,$id)) { echo ‘Обновленная оценка’; echo ‘Средняя оценка: ‘.$this->rating->rate; echo ‘Проголосовало: ‘.$this->rating->voted; }
}

если мы просто хотим обновить оценку без обновления данных в объекте, то нужно указать 3 параметр в false
$this->rating->add_rate($paramm,$id,false) просто запишет обновленные данные в базу, сам объект обновлятся не будет.
Так же можно получить объект и добавить оценку:


$this->load->model('rating');
$this->load->model('article');
$rating_id = $this->article->get_rating_id();
if($this->rating->find_by_id($rating_id)) {
$this->rating->add_rate($paramm);
}

Ну практически и все, так же нашу оценку можно удалить вызвав перед этим find_by_id или указав id оценки
пример с id:


$this->load->model('rating');
$this->load->model('article');
$rating_id = $this->article->get_rating_id();
if($this->rating->find_by_id($rating_id)) {
if($this->rating->delete()) echo 'Удален..';
}

Или же:


$this->load->model('rating');
$this->load->model('article');
$rating_id = $this->article->get_rating_id();
if($this->rating->delete($rating_id)) echo 'Удален..';

Настройка tftpd для автозагрузки настроек по dhcp в Cisco Ip Phone

Ставим tftpd и xinetd


sudo apt-get install xinetd tftpd tftp

Создаем конфиг для tftpd


touch /etc/xinetd.d/tftpd

И приводим его к следующему виду


service tftp
{
        socket_type             = dgram
        protocol                = udp
        wait                    = yes
# Пользователь от которого запускаем
        user                    = nobody 
        server                  = /usr/sbin/in.tftpd
# Директория корневая tftpd
        server_args             = /var/lib/tftpboot
        disable                 = no
# Тут пишем с какого интерфейса принимаем у меня только с локалки, если наодо со всех то делаем 0.0.0.0
        bind                    = 192.168.1.1
}

Создаем если нету директорию tftpd


mkdrip -p /var/lib/tftpboot

И выставляем права


chown nobody -R /var/lib/tftpboot
chmod 777 -R /var/lib/tftpboot

Перезагружаем xinetd


/etc/inet.d/xinetd restart

ставим dhcpd сервер


sudo apt-get install dhcp3-server

правим конфиг


vim /etc/dhcp3/dhcpd.conf

Нам надо 2 опции в обеих указываем адрес нашего tftp server’a:


option voip-tftp-server code 150 = string;
option voip-tftp-server “tftp://192.168.1.1”;
option voip-tftp-server66 code 66 = string;
option voip-tftp-server66 “tftp://192.168.1.1”;

теперь смотрим syslog туда пишет tftpd, при подключение cisco phone обращается по tftp туда за файлом конфигурации
для просмотра пишем:


cat /var/log/syslog | grep tftp

Нас интересуют строчки типа такой:
trying to get file: /Cisco/SPA303/1cce73d22928.cfg
Из строки видно обращение за конфиг файлом по указанному пути.
Теперь нам осталось только создать папку Cisco/SPA303 для этого пишем


cd /var/lib/tftpboot
#переходи м в корень tftpd
mkdir -p Cisco/SPA303
#создаем папку для конфигов данной модели
touch 1cce73d22928.cfg
#создаем конфиг файл

Теперь приводим настройки конфиг файла к следующему виду, тут даны по минимуму настройки




SADMINBLOG
192.168.1.1
1111
Yes
w234WErq
1111

Station_Display_Name – будет отбражать на дисплее телефона имя
Proxy_1_ – адрес сервера asterisk
User_ID_1_ – ид наш
Use_Auth_ID_1_ – использовать для авторизации Auth_ID_1_
Password_1_ – наш пароль

Тут все в минимальных настройках, ip телефон получит по dhcp, самое простое для создания конфиг файла
это настроить ваш cisco фон через web интерфейс, а потом просто зайти по http://ip-address-cisco-phon’a/admin/spacfg.xml
и перенести из этой xml нужные настройки в файл.

Если что-то не будет работать, то ставим syslog server, я скачал на комп виндовый и в веб интерфейсе циски указываем syslog server
и смотрим логи

Делаем резервную копию Виртуальной машины на платформе VirtualBox

И так останавливаем нашу Виртуальную машину


VBoxManage controlvm Имя ВМ savestate

После чего копируем Виртуальную машину


cp /путь к образу/вм.img  /путь к резервной копии/ вмОт.img

и заново запускаем нашу Виртуальную машину


VBoxManage startvm -type=headless Имя ВМ

Вы можете написать для этой операции скрипт, который уже будет копировать, архивировать и отправлять копию куда вам нужно, но основной принцип прост. Как я уже писал, что на момент копирования ВМ будет не доступна.

Автозагрузка виртуальной машины на платформе VirtualBox

Создаем скрипт для будущей автозагрузки


sudo touch /etc/init.d/vboxrun

Теперь открываем файл /etc/init.d/vboxrun из под sudo и приводим его к следующему виду


#!/bin/sh
#Запускаем ВМ 1
tunctl -t virt0 -u username VBoxManage startvm -type=headless VirtMachine1 #Запускаем ВМ 2 из под другого пользователя
tunctl -t virt1 -u username su username –c “BoxManage startvm -type=headless VirtMachine2”

Теперь делаем файл /etc/init.d/vboxrun исполняемым


sudo chmod +x /etc/init.d/vboxrun

Ну и в самом конце делаем наш скрипт System V скриптом


sudo update-rc.d vboxrun defaults 80

Теперь после загрузки системы наш скрипт будет загружаться автоматически, если мы создадим еще одну ВМ, то нужно будет просто добавить ее в наш скрипт

Виртуализация для офиса при помощи VirtualBox

И так поехали, смотрим версию ядра


uname –a

У меня 3.2.0-23-generic-pae, ставим linux-headers для нашего ядра


sudo apt-get install linux-headers-3.2.0-23-generic-pae

Устанавливаем VirtualBox


sudo apt-get install virtualbox

Смотрим типы ос, нам нужна Ubuntu


VBoxManage list ostypes

Создаем виртуальную машину


#name – Имя нашей ВМ
#ostype – тип операционной системы
# register - регистрации ВМ
# basefolder – путь где хранятся файлы настроек ВМ
VBoxManage createvm --name Asterisk --ostype Ubuntu --register --basefolder /disk

Ставим пакеты для настройки сетевого интерфейса


sudo apt-get install bridge-utils  uml-utilities

Теперь настроим сеть, открываем /etc/network/interfaces и меняем старые настройки:


auto eth0
iface eth0 inet static
        address 192.168.1.32
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 192.168.1.1

На новые:


auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static address 192.168.1.32 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 192.168.1.1 bridge_ports eth0 virt0 bridge_fd 9 bridge_hello 2 bridge_maxage 12 bridge_stp off

Создаем интерфейс


#username имя юзера из под которого запускаем ВМ
sudo tunctl -t virt0 -u username

Настраиваем нашу виртуальную машину


#nic1 – тип сетевого интерфейса bridged
#bridgeadapter1 – имя адаптера, которого мы создали для ВМ
#vram – видеопамять в мегабайтах

VBoxManage modifyvm Asterisk --memory 512 --floppy disabled --audio none --nic1 bridged --bridgeadapter1 virt0 --vram 4 --accelerate3d off --boot1 disk --acpi on --cableconnected1 on

Создаем диск


# size – размер указываем в мегабайтах
VBoxManage createhd --filename /disk/Asterisk.img --size 10240

Добавляем виртуальный ide


VBoxManage storagectl Asterisk --name AsteriskHDD --add ide

Подключаем сам диск


# medium – путь к нашему диску
VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 0 --device 0 --type hdd --medium /disk/Asterisk.img

Подключаем установочный диск


VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 1 --device 0 --type dvddrive --medium /home/filipp/ubuntu-12.04-server-i386.iso

Указываем, что загружаемся с dvd привода


VBoxManage modifyvm Asterisk --boot1 dvd

Запускаем нашу ВМ


#n – указывает что запускать vnc server
#m – порт для подключения по vnc
#o – пароль к vnc подключению
# s – сокращенно startvm
VBoxHeadless -s Asterisk -n -m 5900 -o 1234

Теперь подключаемся к нашему серверу на через vnc-client на порт 5900 и ставим Ubuntu
Подключаемся

Если появится ошибка при установке linux This kernel requires the following features not present on the CPU: pae

То надо включить поддержку pae для нашей вирт машины, остановив предварительно нашу ВМ


VBoxManage modifyvm Asterisk --pae on

Установили ОС, а теперь для нормальной производительности ставим guest-additions для этого стаим пакет:


sudo apt-get install virtualbox-guest-additions-iso

iso образ скачался и находится в /usr/share/virtualbox/ теперь нам нужно его подключить

для этого пишем:


VBoxManage storageattach Asterisk --storagectl AsteriskHDD --port 1 --device 0 --type dvddrive --medium /usr/share/virtualbox/VBoxGuestAdditions.iso

И заново запускаем нашу виртуальную машину


VBoxHeadless -s Asterisk -n -m 5900 -o 1234

Монтируем cdrom,если он у вас автоматически не примонтировался


sudo mount -t iso9660 /dev/cdrom /media/cdrom/

обновляем список пакетов


sudo apt-get update

и ставим исходники ядра и gcc


sudo apt-get install linux-headers-3.2.0-23-generic-pae gcc make

Возможно еще понадобится установить минимальный набор иксов для


sudo apt-get install xserver-xorg xserver-xorg-core

после чего из под рута


cd /media/cdrom
./VBoxLinuxAdditions.run

Все настройка Виртуальной машины завершена в дальнейшем, когда настроите доступ к ней напрямую без vnc можно запускать как демона нашу ВМ для этого выполните комманду


VBoxManage startvm -type=headless Asterisk

Добавляем водяной знак к изображению при помощи PHP

Для начало нам нужно создать изображения с водяным знаком, мне проше все это сделать в Photoshop’e. Добавляет дополнительный слой, а основной удаляем и получается прозрачный фон и на него добавим на водяной знак:
Создаем

Полученное изображения сохраняем в формате png

Теперь создадим изображения для миниатюр

Создаем

И так же сохраним его, у нас получилось 2 файла

Основной

Теперь начинаем писать код для нашего скрипта, для начало создадим файл с настройками config.php с таким исходным кодом:



  define('system_slash','\');
//Файлы, которые ищем в директория, расширения через запятую
define('image_mask', '.jpg,.png'); /*
* Размеры миниатюр, не более этого
*/
define('img_min_width', 200);
define('img_min_height', 150); //Путь к водяному знаку для миниатюр
define('image_min_water', 'D:\mytkani\watermark\min.png');
//Путь к водяному знаку
define('image_water', 'D:\mytkani\watermark\max.png'); ?>

Теперь напишем класс, который будет искать нужные нам файл в директории и поддиректориях, создаем файл class_directory_list.php и пишем код:


 file_mask = explode(',', image_mask);
            while (FALSE !== ($file = readdir($handle))) {
                //Поиск поддерикторий
                if($subdir) {
                    if(is_dir($dir.system_slash.$file)) {
                        if(($file != '.')&&($file!='..')) {
                            //Рекурсивно погружаем поддиректории
                            $sdir = new DirectoryList($dir.system_slash.$file,true);
                            $this->concateFileList($sdir->getFileList());
                        }
                    }
                }
                if($this->isFileImage($file)) {
                    $this->file_list[] = $dir.system_slash.$file;
                }
            }

        } else {
            new Exception(Не удалось открыть директорию $dir);
        } 
    }
    
    /**
     * Проверяет соответствует ли файл указанной маске
     * @param string $file Имя файла
     */
    private function isFileImage($file){
        foreach( $this->file_mask as $mask) {
            if( substr(strtolower($file), (strlen($mask)*-1))==$mask) 
                    return true;
        }
        return false;
    }

    /**
     * Возращает массив файлов
     * @return array - Имя файлов
     */
    public function getFileList() {
        return $this->file_list;
    }
    
    /**
     * Объеденяет два листа в один основной
     * @param array $new_list - Указатель на массив с файлами
     */
    private function concateFileList(&$new_list) {
        if(count($new_list)>0) {
            foreach ($new_list as $element) {
                $this->file_list[] = $element;
            }
        }
    }
}

?>

Осталось только создать сам скрипт, который будет добавлять водяной знак на изображения, создаем run.php и пишем в нем:


getFileList();

    //Грузим водяной знак для миниатюры
    $imgWaterMin = imagecreatefrompng(image_min_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для миниатюр);
    $imgWaterMinHeight = imagesy($imgWaterMin);
    $imgWaterMinWidth = imagesx($imgWaterMin);
    imagealphablending($imgWaterMin, true);//устанавливам режим смешивания изображения

    //Грузим стандартный водяной знак
    $imgWater = imagecreatefrompng(image_water);
    if ($imgWaterMin === false)
        new Exception(Ошибка загрузки водяного знака для основных изображений);
    $imgWaterHeight = imagesy($imgWater);
    $imgWaterWidth = imagesx($imgWater);
    imagealphablending($imgWater, true);

    //Теперь загружаем картинки на которые будем наносить водяной знак
    foreach ($file_list as $file) {
        $fmask = substr(strtolower($file), -3);
        switch ($fmask) {
            case 'png':
                $image = imagecreatefrompng($file);
                break;
            case 'jpg':
                $image = imagecreatefromjpeg($file);
                break;
            default :
                new Exception(Нету реализации для обработки данного формата);
                break;
        }
        if ($image === false) {
            echo Не удалось загрузить файл $filen;
        } else {
            imagealphablending($image, true);
            //Добавляем водяной знак
            $imgWidth = imagesx($image);
            $imgHeight = imagesy($image);
            if (($imgHeight <= img_min_height) && ($imgWidth <= img_min_width)) {
                imagecopy($image, $imgWaterMin, $imgWidth - $imgWaterMinWidth, 
                        $imgHeight - $imgWaterMinHeight, 0, 0, $imgWaterMinWidth, $imgWaterMinHeight);
            } else {
                imagecopy($image, $imgWater, $imgWidth - $imgWaterWidth, 
                        $imgHeight - $imgWaterHeight, 0, 0, $imgWaterWidth, $imgWaterHeight);
            }
            //Сохраняем результат
            imagejpeg($image,$file);
            imagedestroy($image);
        }
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Наш скрипт готов, теперь проверим его. В файле run.php в строке


    //Получаем список фалов
    $dir = new DirectoryList('D:\putty_key', true);
    $file_list = $dir->getFileList();

мы указали путь к директории, в ней у нас находятся файлы в которые будет добавлен водяной знак
Директория

Запускаем наш скрипт из консоли или из под веб сервера, обратившись к файлу run.php
И видим результат работы:
Результат
Все графические файлы в указанном каталоге стали с водяным знаком.
Исходник можете скачать по ссылке ImageWater.rar