теперь настраиваем утилиту на отправку и приводим конфиг /etc/ssmtp/ssmtp.conf к таком у виду:
#юзер, который получает почту
root=admin@sadminblog.ru
# MX сервер
mailhub=mail.infobox.ru
# username на сервере
AuthUser=admin@sadminblog.ru
#пароль на сервере :)
AuthPass=Gdyyw2%_$wZy*11HS
hostname=mail.infobox.ru
# Разрешаем указывать свое поле From
FromLineOverride=YES
Теперь открываем /etc/ssmtp/revaliases и пишем в нем:
# mail – юзер системный
# admin@sadminblog.ru исходящий адрес
# mail.infobox.ru почтовый сервер
mail:admin@sadminblog.ru:mail.infobox.ru
На этом настройка нашей маленькой замены для sendmail готова.
добавить статический маршрут в сеть 192.168.0.0/16 через шлюз с ip-адресом 192.168.1.1
route del 0/0 gw IP_gateway
удалить ip-адрес шлюза по умолчанию (default gateway)
echo "1" > /proc/sys/net/ipv4/ip_forward
разрешить пересылку пакетов (forwarding)
hostname
отобразить имя компьютера
host sadminblog.ru
разрешить имя sadminblog.ru хоста в ip-адрес и наоборот
host 62.149.140.85
ip link show
отобразить состояние всех интерфейсов
mii-tool eth0
отобразить статус и тип соединения для интерфейса eth0
ethtool eth0
отображает статистику интерфеса eth0 с выводом такой информации, как поддерживаемые и текущие режимы соединения
netstat -tupn
отображает все установленные сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и PID’ы и имена процессов, обеспечивающих эти соединения
netstat -tupln
отображает все сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и PID’ы и имена процессов, слушающих порты
tcpdump tcp port 80
отобразить весь трафик на TCP-порт 80 (обычно — HTTP)
iwlist scan
просканировать эфир на предмет, доступности беспроводных точек доступа
перенаправление пакетов, адресованных одному хосту, на другой хост
Работа с запущенными процессами. Мониторинг системы и отладка
Команда
Описание
top
отобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (с автоматическим обновлением данных)
ps -eafw
отобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (единожды)
ps -e -o pid,args --forest
вывести PID’ы и процессы в виде дерева
pstree
отобразить дерево процессов
kill -9 98989
«убить» процесс с PID 98989 «на смерть» (без соблюдения целостности данных)
kill -KILL 98989
kill -TERM 98989
Корректно завершить процесс с PID 98989
kill -1 98989
заставить процесс с PID 98989 перепрочитать файл конфигурации
kill -HUP 98989
lsof -p 98989
отобразить список файлов, открытых процессом с PID 98989
lsof /home/user1
отобразить список открытых файлов из директории /home/user1
strace -c ls >/dev/null
вывести список системных вызовов, созданных и полученных процессом ls
strace -f -e open ls >/dev/null
вывести вызовы бибилотек
watch -n1 'cat /proc/interrupts'
отображать прерывания в режиме реального времени
last reboot
отобразить историю перезагрузок системы
last user1
отобразить историю регистрации пользователя user1 в системе и время его нахождения в ней
lsmod
вывести загруженные модули ядра
free -m
показать состояние оперативной памяти в мегабайтах
smartctl -A /dev/hda
контроль состояния жёсткого диска /dev/hda через SMART
smartctl -i /dev/hda
проверить доступность SMART на жёстком диске /dev/hda
tail /var/log/dmesg
вывести десять последних записей из журнала загрузки ядра
tail /var/log/messages
вывести десять последних записей из системного журнала
Монтирование устройств и файловых систем
Команда
Описание
mount /dev/hda2 /mnt/hda2
монтирует раздел ‘hda2’ в точку монтирования ‘/mnt/hda2’. Убедитесь в наличии директории-точки монтирования ‘/mnt/hda2’
umount /dev/hda2
размонтирует раздел ‘hda2’. Перед выполнением, покиньте ‘/mnt/hda2’
fuser -km /mnt/hda2
принудительное размонтирование раздела. Применяется в случае, когда раздел занят каким-либо пользователем
umount -n /mnt/hda2
выполнить размонитрование без занесения информации в /etc/mtab. Полезно когда файл имеет атрибуты «только чтение» или недостаточно места на диске
mount /dev/fd0 /mnt/floppy
монтировать флоппи-диск
mount /dev/cdrom /mnt/cdrom
монтировать CD или DVD
mount /dev/hdc /mnt/cdrecorder
монтировать CD-R/CD-RW или DVD-R/DVD-RW(+-)
mount -o loop file.iso /mnt/cdrom
смонтировать ISO-образ
mount -t vfat /dev/hda5 /mnt/hda5
монтировать файловую систему Windows FAT32
mount -t smbfs -o username=user,password=pass //winclient/share /mnt/share
монтировать сетевую файловую систему Windows (SMB/CIFS)
mount -o bind /home/user/prg /var/ftp/user
«монтирует» директорию в директорию (binding). Доступна с версии ядра 2.4.0. Полезна, например, для предоставления содержимого пользовательской директории через ftp при работе ftp-сервера в «песочнице» (chroot), когда симлинки сделать невозможно. Выполнение данной команды сделает копию содержимого /home/user/prg в /var/ftp/user
Информация о диске: дисковое пространство
Команда
Описание
df -h
отображает информацию о смонтированных разделах с отображением общего, доступного и используемого пространства (Прим.переводчика. ключ -h работает не во всех *nix системах)
ls -lSr |more
выдаёт список файлов и директорий рекурсивно с сортировкой по возрастанию размера и позволяет осуществлять постраничный просмотр
du -sh dir1
подсчитывает и выводит размер, занимаемый директорией ‘dir1’ (Прим.переводчика. ключ -h работает не во всех *nix системах)
du -sk * | sort -rn
отображает размер и имена файлов и директорий, с соритровкой по размеру
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n
показывает размер используемого дискового пространства, занимаемое файлами rpm-пакета, с сортировкой по размеру (fedora, redhat и т.п.)
создать пользователя user1, назначить ему в качестве домашнего каталога /home/user1, в качестве shell’а /bin/bash, включить его в группу admin и добавить комментарий Nome Cognome
изменяет первичную группу текущего пользователя. Если указать «-«, ситуация будет идентичной той, в которой пользователь вышил из системы и снова вошёл. Если не указывать группу, первичная группа будет назначена из /etc/passwd
Выставление/изменение прав на просмотр и редактирование файлов
Команда
Описание
ls -lh
просмотр полномочий на файлы и директории в текущей директории
ls /tmp | pr -T5 -W$COLUMNS
вывести содержимое директории /tmp и разделить вывод на пять колонок
chmod ugo+rwx directory1
добавить полномочия на директорию directory1 ugo(User Group Other)+rwx(Read Write eXecute) — всем полные права. Аналогичное можно сделать таким образом chmod 777 directory1
chmod go-rwx directory1
отобрать у группы и всех остальных все полномочия на директорию directory1.
найти, начиная от корня, все файлы с выставленным SUID
chmod u+s /bin/binary_file
назначить SUID-бит файлу /bin/binary_file. Это даёт возможность любому пользователю запускать на выполнение файл с полномочиями владельца файла.
chmod u-s /bin/binary_file
снять SUID-бит с файла /bin/binary_file.
chmod g+s /home/public
назначить SGID-бит директории /home/public.
chmod g-s /home/public
снять SGID-бит с директории /home/public.
chmod o+t /home/public
назначить STIKY-бит директории /home/public. Позволяет удалять файлы только владельцам
chmod o-t /home/public
снять STIKY-бит с директории /home/public
Специальные атрибуты файлов
Команда
Описание
chattr +a file1
позволить открывать файл на запись только в режиме добавления
chattr +c file1
позволяет ядру автоматически сжимать/разжимать содержимое файла.
chattr +d file1
указавет утилите dump игнорировать данный файл во время выполнения backup’а
chattr +i file1
делает файл недоступным для любых изменений: редактирование, удаление, перемещение, создание линков на него.
chattr +s file1
позволяет сделать удаление файла безопасным, т.е. выставленный атрибут s говорит о том, что при удалении файла, место, занимаемое файлом на диске заполняется нулями, что предотвращяет возможность восстановления данных.
chattr +S file1
указывает, что, при сохранении изменений, будет произведена синхронизация, как при выполнении команды sync
chattr +u file1
данный атрибут указывает, что при удалении файла содержимое его будет сохранено и при необходимости пользователь сможет его восстановить
lsattr
показать атрибуты файлов
Другие полезные команды
Команда
Описание
apropos …keyword
выводит список комманд, которые так или иначе относятся к ключевым словам. Полезно, когда вы знаете что делает программа, но не помните команду
man ping
вызов руководства по работе с программой, в данном случае ping
Настраиваем gearman с хранением очередей в postgres
Для начало добавим в список источников /etc/apt/sources.list :
deb http://ppa.launchpad.net/gearman-developers/ppa/ubuntu raring main
Затем ключ репозитория:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys NUMBER
NUMBER – можно посмотреть запусти apt-get update, при попытке обновить система укажит, что данный ключ не указан и его надо будет добавить, вместо NUMBER
—libpq-table – имя созданной таблице в БД postgres
Теперь в БД создадим таблицу, у меня размер unique_key = 32, так как я использую библиотеку php net_gearman и там для задания unique_key это md5 названия функции и массива параметров, если используете другую библиотеку, то значение может быть иным
Так как exim настрое на работу с mysql, то в нем и создадим таблицу с адресами, которые нужно копировать.
И так заходим в БД и создаем таблицу:
CREATE TABLE IF NOT EXISTS `mail_copy` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`mail` varchar(255) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Сразу же добавляем в таблицу адреса для копирования Добавляем адрес:
insert into `mail_copy`(`mail`,`status`) values(`test@test.ru’,1);
Открываем конфигурационный файл Exim exim.cnf В раздел конфигурации добавляем строчку:
system_filter = /etc/exim/copy_mail.conf
Создаем файл /etc/exim/copy_mail.conf и пишем в нем:
if $sender_address is ${lookup mysql{SELECT `mail` FROM `mail_copy` WHERE `mail`='$sender_address' AND `status`='1' LIMIT 1}}
then
unseen deliver copy@test.ru
endif
И перезагружаем exim, теперь вся почта, которая указана в таблице mail_copy будет копироваться на указанный адрес unseen deliver copy@test.ru
Открываем любой графический редактор и создаем в нем изображение размером 128х48 и рисуем логотип
С право оставляем немного места, т.к. там будет меню и оно прекроет наш логотип. После чего открываем его в painte и жмем Сохранить как, выбираем Монохромный рисунок
Теперь закачиваем картинку на любой http сервер, лучше локальный. И в конфигурационном файле, у меня он раздается по tftp, добавляем следующие параметры
http://192.168.1.1/img3.bmpBMP PictureBMP Picture
Все теперь как только обновится конфиг на вашем устройстве, сразу же появится логотип компании.
2. Скачиваем Fusion Inventory Agent с официального сайта проекта http://debian.fusioninventory.org/downloads/ Нас интересует файл fusioninventory-agent_X.X.XX-X_all.deb, на момент исправления статьи это http://debian.fusioninventory.org/downloads/fusioninventory-agent_2.3.21-2_all.deb
Скачиваем последнюю версию GLPI + FusionInventory с github: https://github.com/fusioninventory/fusioninventory-for-glpi/releases/latest
Далее версия 2015 года.
Для начала установим веб сервер с php
sudo apt-get install apache2 libapache2-mod-php5
теперь ставим mysql
sudo apt-get install mysql-server
указываем наш пароль для root в настройках mysql
Теперь установим саму glpi
sudo apt-get install glpi
Можем произвести настройку базы данных из установщика, для этого соглашаемся на настройку БД
И вводим пароль, который мы ввели на этапе установки mysql
Установка завершена, теперь заходим в нашу систему http://ip-вашего-сервера/glpi/
Вводим логин: glpi пароль: glpi
Смторим, что все у нас работает и приступаем к установке плагина fusioninventory
sudo apt-get install fusioninventory-for-glpi
Теперь заходим в glpi , там идем в меню Настройки->Дополнения и включаем все плагины fusioninventory
Теперь качаем агента для клиентских машин на платформе Windows Заходим http://www.fusioninventory.org/get/ и выбираем нужного нам клиента, я скачал http://prebuilt.fusioninventory.org/stable/windows-i386/fusioninventory-agent_windows-i386_2.2.6-1.exe
и ставим его на Windows машину, в поле Servers addresses указываем наш путь к нашему серверу и добавляем к нему путь к плагину glpi/plugins/fusioninventory
Так же ставим галочку Run agent.. для запуска после установки. Далее выбираем тип запуска, есть 3 типа:
1) Запуск как сервис 2) Запуск через планировщик задач 3) Запуск вручную
Для Windows XP выбирайте 2 пункт, для версий старше 1.
Теперь указываем логин и пароль к системе glpi, я указал дефолтный, но правильней было бы создать отдельного пользователя.
Все установка закончена, теперь заходим в glpi там в меню Дополнения ->FusionInventory и выбираем пункт Управления агентами
Тут у нас должны появится те ПК, на которых мы поставили нашего агента, теперь идем в меню Оборудование->Компьютеры и тут видим всю информацию о тех ПК которые мы подключили к системе.
На этом настройка завершена, теперь можно строить отчеты по ПК и отслеживать изменения в реальном времени.
подключаем наш usb и ищем его с помощью lsusb Bus 001 Device 003: ID 03f0:4117 Hewlett-Packard LaserJet 1018 И так мы наши наш длевайс, запоминаем его ID
Теперь ищем наше устройства в списках usbip
sudo usbip_bind_driver –list
Вот оно: busid 1-1.3 ( 03f0:4117 ) 1-1.3:1.0 -> usblp
Теперь приступ к установке клиентской части usbip, я буду ставить ее на windows. Для этого качаем клиент: http://ignum.dl.sourceforge.net/project/usbip/usbip/usbip-win-preview/usbip-win.zip
И заходим на нашу удаленную машину и распоковываем архив, после чего идем в Пуск->Панель Управления->Установка оборудования
Выбираем установку вручную
Далее показать все устройства
Выбираем установку с диска и указываем папку с драйверами usbip
Теперь открываем cmd переходим в папку с программой и получаем список usb устройств с нашего сервера usbip -l ip-usbip-server
Теперь подключаем нужное нам устройство по его id в usbip usbip -a ip-usbip-server id-device
Все, теперь можно ставить драйвера на наше usb устройство.
И так выведем для начало весь список USB устройств, делаем под sudo
sudo VBoxManage list usbhost
нас интересует:
UUID: 59b370b3-c176-42d5-814b-b805295c9738 VendorId: 0×0529 (0529) ProductId: 0×0001 (0001) Revision: 2.23 (0223) Manufacturer:AKS Product:HASP 2.17 Address: sysfs:/sys/devices/pci0000:00/0000:00:1d.2/usb4/4-2//device:/dev/vboxusb/004/002 Current State: Available
Теперь это же проверим из под нашего vbox юзера
VBoxManage list usbhost
если все так же то пропускаем, если вывод пустой, то тогда нашего пользователя, от которого запускаем ВМ надо добавить в группу vboxusers Создать в файл с правилами для udev /etc/udev/rules.d/10-vboxdrv.rules со следующим содержанием:
VBoxManage usbfilter add 0 --target WS1 --name HASP1C --action hold --active yes --vendorid 0529 --productid 0001 --revision 0223 --manufacturer AKS
0 – номер правила —target WS1 –наша виртуальная машина WS1 —name HASP1C – Имя фильтра —action hold – значит блокируем доступ —vendorid 0529 – берем из вывода VBoxManage list usbhost Остальные параметры оттуда же
Теперь настроим саму виртуальную машину, включим поддержку usb
И так в прошлой статье мы создали модель для нашего рейтинга, но стандартный способ вызова модели в codeigniter не очень нам подходит, так как не позволяет работать с моделью, как с объектом создавая множество объектов данного типа.
Что бы было понятней, в дальнейшем понадобится возвращать внутри объекта каталог, объект оценку и вот тут стандартный способ работы с моделью станет не возможен.
При стандартной работе с моделью
$this->load->model(‘rating’);
Создается один объект и последующие вызовы возвращают указатель на этот объект. В новой версии можно делать так:
$rating = new Rating();
$rating2 = new Rating();
И так изменённая модель Rating
Class Rating {
/**
* Ид оценки
* @var int
*/
public $rating_id = NULL;
/**
* Общая оценка
* @var float
*/
public $rate = NULL;
/**
* Кол-во проголосовавших
* @var int
*/
public $voted = NULL;
/**
* Активна оценка или нет
* @var bool
*/
public $active = NULL;
/**
* Имя нашей таблицы в бд
* @var string
*/
private $_table_name;
/**
* Максимально возможная оценка
* @var int
*/
private $_max_rate = 5;
private $_CI;
public function __construct() {
$this->_CI = & get_instance();
$this->_CI->config->load(‘rating’);
if (($this->_table_name = $this->_CI->config->item(‘table_name’, ‘rating_config’)) === FALSE) {
//Если не получил имя таблицы, то выводим окно ошибки
show_error(‘Не удалось получить имя таблицы в базе данных для системы оценок’);
}
$this->_max_rate = $this->_CI->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 = “INSERTINTO “ . $this->_table_name . “ (rate,voted,active) VALUES;”;
$this->_CI->db->query($sql, array($rate, $voted, $active));
if ($this->_CI->db->affected_rows() > 0) {
$this->rating_id = $this->_CI->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->_CI->db->delete($this->_table_name, array(‘rating_id’ => $id));
} else {
if (is_numeric($this->rating_id)) {
$this->_CI->db->delete($this->_table_name, array(‘rating_id’ => $this->rating_id));
} else {
return FALSE;
}
}
if ($this->_CI->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->_CI->db->query($sql, array($id, $active));
} else {
$result = $this->_CI->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->_CI->db->query($sql, array($this->rate, $this->voted, $this->active, $this->rating_id));
if ($this->_CI->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)+?)/voted,1) WHERE rating_id=?”;
if ($rate > $this->_max_rate)
$rate = $this->_max_rate;
if ($id !== FALSE) {
$this->_CI->db->query($sql, array($rate, $id));
} else {
if (is_numeric($this->rating_id)) {
$this->_CI->db->query($sql, array($rate, $this->rating_id));
$id = $this->rating_id;
} else {
return FALSE;
}
}
if ($this->_CI->db->affected_rows() > 0) {
if ($ret) {
return $this->find_by_id($id);
}
return TRUE;
} else {
return FALSE;
}
}
/**
* Возвращает максимальную оценку
* @return int
*/
public function get_max_rate() {
return $this->_max_rate;
}
/**
* Удаляем значения
*/
private function _clear_rate() {
$this->rating_id = NULL;
$this->rate = NULL;
$this->voted = NULL;
$this->active = NULL;
}
}
?>
Теперь в папке application/controllers создадим два контроллера ajax.php – для обработка ajax запросов rate.php – для тестирования работы
код ajax.php
BASEPATH’))
exit(‘No direct script access allowed’);
class Ajax extends CI_Controller {
public function __construct() {
parent::__construct();
}
/**
* Возращает результат добаления оценки
* param type $id - id оценки
* param type $rate – rate оценка
*/
public function rate($id = false, $rate = false) {
if ($id !== false) {
require_once APPPATH . ‘models/Rating.php’;
$this->load->helper(‘rating’);
$rating = new Rating();
$id = preg_replace(’/[^0-9]/’, ‘’, $id);
if ($rate !== false) {
$rate = preg_replace(’/[^0-9]/’, ‘’, $rate);
$rating->add_rate($rate, $id);
set_rating_cookie(1);
$data[‘rating’] = $rating;
$this->load->view(‘rate/result’, $data);
}
}
}
}
?>
код rate.php
BASEPATH’))
exit(‘No direct script access allowed’);
class Rate extends CI_Controller {
private $rating;
public function __construct() {
parent::__construct();
require_once APPPATH . ‘models/Rating.php’;
}
/**
*
* @param type $id – ид оценки
*/
public function view($id = false) {
if($id!== false) {
$id = preg_replace(’/[^0-9]/’, ‘’, $id);//оставляем только цифры
$this->rating = new Rating();
if ($this->rating->find_by_id($id)) {
$this->load->view(‘head’);
$data[‘rating’] = $this->rating;
$this->load->helper(‘rating’);
$this->load->view(‘rate/result’, $data);
if(!exist_rating_cookie($this->rating->rating_id)) {
$this->load->view(‘rate/voted’, $data);
}
$this->load->view(‘foot’);
}
} else {
$this->load->view(‘head’);
echo ‘
No id rate
’;
$this->load->view(‘foot’);
}
}
}
?>
Теперь создадим хелпер для работы с куками в папке application/helpers создаем rating_helper.php
BASEPATH’))
exit(‘No direct script access allowed’);
/**
* Проверяет и устанавливает куки
* param type $rating_id - ид оценки
* return boolean – результат добавления
*/
function set_rating_cookie($rating_id) {
$CI = & get_instance();
$rating = $CI->input->cookie(‘rating’, TRUE);
if ($rating !== false) {
$rating = unserialize($rating);
if (is_array($rating)) {
if (array_search($rating_id, $rating) === false) {
$rating[] = $rating_id;
} else {
return FALSE;
}
} else {
$rating = array($rating_id);
}
} else {
$rating = array($rating_id);
}
$cookie = array(
‘name’ => ‘rating’,
‘value’ => serialize($rating),
‘expire’ => ‘86500’, //24 часа
‘secure’ => false
);
$CI->input->set_cookie($cookie);
return TRUE;
}
/**
* Функция проверяет существует ли заданая кука для оценки
* param type $rating_id - ид оценки
* return boolean – результат существования
*/
function exist_rating_cookie($rating_id) {
$CI = & get_instance();
$rating = $CI->input->cookie(‘rating’, TRUE);
if ($rating !== false) {
$rating = unserialize($rating);
if (is_array($rating)) {
if (array_search($rating_id, $rating) !== false) {
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
} else {
return FALSE;
}
}
?>
В контроллере rate у нас идет вызов 4 представлений 1. head – шапка сайта 2. rate/result – форма вывода результатов голосования 3. rate/voted – форма для голосования 4. foot – подвал сайт
Теперь создадим их в папке application/view создаем файл head.php
Там же foot.php
%MINIFYHTMLa7c40889d5a4f0a60d6a02dd2ef72f722%
Теперь создадим папку rate и в ней 2 файла result.php и voted.php
Последнию версию можно взять с сайта http://phpvirtualbox.googlecode.com, там же есть документация по установке на различные системы. И так скачиваем и распаковываем:
В конфигах apache смотрим опцию DocumentRoot у меня это /var/www Теперь копирую туда файлы phpvirtualbox
cp -R phpvirtualbox-4.1-10 /var/www/vbox
cd /var/www/vbox
создаем файл настроек
cp config.php-example config.php
И редактируем его
//тут указываем вашего системного юзера под которым работает virtualbox
var $username = ‘vbox’;
var $password = ‘pass’;
var $language = ‘ru’;
Добавляем в /etc/default/virtualbox
VBOXWEB_USER=vbox
VBOXWEB_HOST=127.0.0.1
Теперь небольшой момент, те кто как я пользуются OSE версией, то обнаружат, что у нас отсутствует файл /etc/init.d/vboxweb-service и что бы нам запустить vboxwebsrv пишем:
vboxwebsrv -b -F /dev/null
Тут указываем, что бы он запустился в бэкграунде, а логи выводил в /dev/null. Для дальнейшего использования, нужно будет создать скрипт автозапуска и остановки vboxwebsrv.
Обладателям oracle версии virtualbox нужно просто запустить скрипт
/etc/init.d/vboxweb-service start
Проверяем как запустился наш vboxwebserver
ps aux | grep vboxwebsrv
и видим, что нормально 16482 0.0 0.4 40208 7232 ? Sl 12:25 0:00 /usr/lib/virtualbox/vboxwebsrv -b -F /dev/null
теперь заходим http://ваш-ip-address-server-vm/vbox/ и вводим adminadmin
Если все работает правильно, то увидите такое окно