Php Проверка ссылка на доступность

Небольшой php скрипт который проверяет доступность ссылки, для меня приемлемыми были ответы 200,301,302,403,405:

<?php
function is_valid_url($url)
{
$timeout = 10;
$ch = curl_init($url);

// Set request options
curl_setopt_array($ch, array(
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_NOBODY => true,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_USERAGENT => "page-check/1.0"
));

// Execute request
curl_exec($ch);

if(curl_errno($ch)) {
curl_close($ch);
return false;
}

$url = @parse_url($url);

if ( ! $url) {
return false;
}

$url = array_map('trim', $url);
$url['port'] = (!isset($url['port'])) ? 80 : (int)$url['port'];
$path = (isset($url['path'])) ? $url['path'] : '';

if ($path == '')
{
$path = '/';
}

$path .= ( isset ( $url['query'] ) ) ? "?$url[query]" : '';

if ( isset ( $url['host'] ) AND $url['host'] != gethostbyname ( $url['host'] ) )
{

$headers = get_headers_curl("$url[scheme]://$url[host]:$url[port]$path");

$headers = ( is_array ( $headers ) ) ? implode ( "\n", $headers ) : $headers;
preg_match_all ( '#^HTTP/.*\s+[0-9]+\s#i', $headers,$match );
$tmp = explode(' ',$match[0][0]);
//print_r($tmp);
$code = array(200,301,302,403,405);
if(in_array($tmp[1],$code)){
return true ;
}
}
return false;
}
?>

Количество просмотров :233

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Проблема с чтением ftp каталога

Недавно возникла такая проблема, после авторизации на ftp сервере, не хочет считываться каталог. Что я уже не пробовал, устанавливал различные ftp сервера, игрался с пассивным режим и многое другое, оказалось, что проблема была в iptables, все, что нужно, это включить режим nf_conntrack_ftp. Для этого открываем файл /etc/sysconfig/iptables-config идобавляем модуль:

IPTABLES_MODULES="nf_conntrack_ftp"

Количество просмотров :148

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

FTP Сервер pureftpd

Взять можно отсюда: PureFtpd Official Site.

Скачали, распаковали, далее делаем стандартные операции установки из исходников:

Для установки полного функционала сделать ./configure --with-everything

./configure
make
make install

После этого надо удостовериться какая home директория у пользователя ftp Выяснить это можно просмотрев файл /etc/passwd В разных дистрибутивах Linux домашняя директория пользователя ftp имеет разный путь.

К примеру в моем любимом дистрибутиве Centos Linux - каталог /home/ftp

Собственно я надеюсь что менять домашние директории у пользователей вы умеете, если Вам это надо.

В данной статье будет директория /home/ftp

Далее надо создать 2 директории:

mkdir /home/ftp/pub
mkdir /home/ftp/incoming

Создать пользователя ftpadmin , это будет админский аккаунт FTP, его домашняя директория будет /home/ftp

adduser ftpadmin

Далее надо назначить права на директорию incoming

chmod -R 0777 /home/ftp/incoming

Далее надо назначить права на директорию pub

chmod -R 0755 /home/ftp/pub

Сделали.

Ну а теперь запустим сам FTP сервер.

pure-ftpd -4 -A -B -M -l unix -U 022:022

Параметры: -4 - ipv4only, -A - chroot everyone - обязательный параметр (запирает пользователя в его домашней директории) -B - режим демона, -l unix использовать для аутентификации пароли unix, -U - выбираем маску для файлов и директорий - подробнее об этом параметре - man pure-ftpd.

Вариант анонимного FTP с поддержкой учетных записей:

pure-ftpd -4 -A -B -M -l unix -U 022:022

Вариант только анонимного FTP:

pure-ftpd -4 -A -B -M -e -U 022:022

Вариант только НЕ анонимного FTP:

pure-ftpd -4 -A -B -M -E -U 022:022

Все ;) FTP работает

Автозагрузка:

Файл автозагрузки в Centos Linux - /etc/rc.d/rc.local

Просто добавляем в конец файла строчку

pure-ftpd -4 -A -B -M -l unix -U 022:022

Количество просмотров :222

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

phpbb 3.0.X отправка, редактирование, удаление сообщений от нескольких пользователей

Моей супруге понадобился форум, и уж очень ей хотелось, что бы была возможность отправлять сообщения от нескольких пользователей без прелогинивания. Я если честно с phpbb работал не много, и не знаю, насколько грамотно реализовал данную функцию, но реализовал. И так. первое, что мы делаем, это добавляем в таблице _users(у меня phpbb_users) новую колонку -

ALTER TABLE `phpbb_users` ADD `user_id_sec` INT( 14 ) NOT NULL DEFAULT '0' AFTER `user_id`

В этой колонке мы будем указывать id пользователя из профиля которого будет возможность работать от лица данного профиля. Как пример, у нас есть пользователь Admin, его id = 1, и есть пользователь Edd, мы хотим, дать возможность пользователю Admin работать от лица пользователя Edd, для этого в столбце user_id_sec напротив пользователя Edd ставится 1.

user_id		user_id_sec	username
2		     0		 Admin
3		     2		  Edd	

Теперь, открываем файл include/functions_display.php, ищем -

function display_custom_bbcodes()

и добавляем 

global $config;

и внизу этой функции добавляем:

$current = request_var($config['cookie_name'] . '_u', '', false, true);
if ($current){
$template->assign_block_vars('custom_name_me', array(
'NAME_ME_VALUE' => $current,
'NAME_ME_TITLE' => 'Текущий',
'NAME_ME_SELECT' => 'selected="selected"'
));
$sql = 'SELECT user_id,username
FROM ' . USERS_TABLE . "
WHERE user_id_sec = '" .$current. "'";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('custom_name_me', array(
'NAME_ME_VALUE' => $row['user_id'],
'NAME_ME_TITLE' => $row['username'],
'NAME_ME_SELECT' => ''
));
}
}

Дальше открываем posting_buttons.html вашего стиля и в самом низу перед

</div>
<!-- ENDIF -->

вставляем

<br />
<select name="change_me"  title="Change me">
<!-- BEGIN custom_name_me -->
<option {custom_name_me.NAME_ME_SELECT} value="{custom_name_me.NAME_ME_VALUE}">{custom_name_me.NAME_ME_TITLE}</option>
<!-- END custom_name_me -->
</select>

Дальше, открываем viewtopic.php, ищем

$edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || (
$user->data['user_id'] == $poster_id  &&
$auth->acl_get('f_edit', $forum_id) &&
!$row['post_edit_locked'] &&
($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])
)));

//echo $user->data['user_id'];
$delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || (
$user->data['user_id'] == $poster_id &&
$auth->acl_get('f_delete', $forum_id) &&
$topic_data['topic_last_post_id'] == $row['post_id'] &&
($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) &&
// we do not want to allow removal of the last post if a moderator locked it!
!$row['post_edit_locked']
)));

и меняем на:

$sql_sec_id = 'SELECT user_id,username
FROM ' . USERS_TABLE . "
WHERE user_id_sec = '" .$user->data['user_id']. "'";

$result_sec_id = $db->sql_query($sql_sec_id);
$sec_id_user = array();
while ($row_sec_id = $db->sql_fetchrow($result_sec_id))
{
$sec_id_user[] = $row_sec_id['user_id'];
}

$edit_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_edit', $forum_id) || (
($user->data['user_id'] == $poster_id || in_array($poster_id,$sec_id_user)) &&
$auth->acl_get('f_edit', $forum_id) &&
!$row['post_edit_locked'] &&
($row['post_time'] > time() - ($config['edit_time'] * 60) || !$config['edit_time'])
)));

//echo $user->data['user_id'];
$delete_allowed = ($user->data['is_registered'] && ($auth->acl_get('m_delete', $forum_id) || (
($user->data['user_id'] == $poster_id || in_array($poster_id,$sec_id_user)) &&
$auth->acl_get('f_delete', $forum_id) &&
$topic_data['topic_last_post_id'] == $row['post_id'] &&
($row['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']) &&
// we do not want to allow removal of the last post if a moderator locked it!
!$row['post_edit_locked']
)));

Далее идем в posting.php, ищем:

if ($mode == 'edit' && !$auth->acl_get('m_edit', $forum_id))
{
if ($user->data['user_id'] != $post_data['poster_id'])

и меняем на

$sql_sec_id = 'SELECT user_id,username
FROM ' . USERS_TABLE . "
WHERE user_id_sec = '" .$user->data['user_id']. "'";

$result_sec_id = $db->sql_query($sql_sec_id);
$sec_id_user = array();
while ($row_sec_id = $db->sql_fetchrow($result_sec_id))
{
$sec_id_user[] = $row_sec_id['user_id'];
}

if ($mode == 'edit' && !$auth->acl_get('m_edit', $forum_id))
{
if ($user->data['user_id'] != $post_data['poster_id'] && !in_array($post_data['poster_id'],$sec_id_user))
{
trigger_error('USER_CANNOT_EDIT');
}

в начале файла, там где описываются переменные перед

$submit = (isset($_POST['post'])) ? true : false;

добавляем

$current_id = $_POST['change_me'];
$sql = 'SELECT user_id,username
FROM ' . USERS_TABLE . "
WHERE user_id = '" .$current_id. "'";

$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$current_new_name = $row['username'];
}

в этом же файле ищем функцию

function handle_post_delete

и добавляем в начале:

global $sec_id_user;

в этой функции ишем

if ($auth->acl_get('m_delete', $forum_id) || 
($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && 
$auth->acl_get('f_delete', $forum_id) && $post_id == $post_data['topic_last_post_id'] && 
!$post_data['post_edit_locked'] && 
($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])))

и меняем на

if ($auth->acl_get('m_delete', $forum_id) || 
(($post_data['poster_id'] == $user->data['user_id'] || in_array($post_data['poster_id'],$sec_id_user)) 
&& $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id) && 
$post_id == $post_data['topic_last_post_id'] && !$post_data['post_edit_locked'] && 
($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time'])))

Финальный штрих, в файле include/function_posting.php ищем

function submit_post

в начале функции добавляем

global $current_id, $current_new_name;

и меняем в этой функции

'poster_id' => (int) $user->data['user_id'],

на

'poster_id' => (int)$current_id,

в этом же массиве

'post_username' => (!$user->data['is_registered']) ? $username : '',

на

'post_username' => (!$user->data['is_registered']) ? $current_new_name : '',

в этой же функции находим

'topic_first_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),

и меняем на

'topic_first_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $current_new_name : ''),

и еще одно

'topic_last_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),

заменить

'topic_last_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $current_new_name : ''),

Вот и все.


Количество просмотров :352

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Автоматически генерируем тумбнейлы для Youtube роликов и используем их вместе с Lytebox

Итак, есть задача, на сайте выводятся Youtube роликивот в таком формате:

<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/ajNC3W-Dlqk" frameborder="0" allowfullscreen></iframe>

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

<?
    //  $post_new - сообщение которое мы будем обрабатывать
    $post_new= 'Ролик №1:<br> <iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/ajNC3W-Dlqk" frameborder="0" allowfullscreen></iframe><br>
    Ролик №2:<br> <iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/c4XPVvMm4j4" frameborder="0" allowfullscreen></iframe>';
    // Папка для тумбнейлов
    $folder = 'cache';
    
    preg_match_all('/src=[\'"]?([^\'" >]+)[\'" >]/', $post_new, $img);
     foreach($img[1] as $key => $link){
        $tmp_link = explode('/',$link);
        $file = explode('.',array_pop($tmp_link));
        if($tmp_link[2] == 'www.youtube.com'){   
            $name = &$file[0];
            $new_link = 'src="'.$folder.'/'.$name.'_tumb.jpg"';
            if (!file_exists($folder.'/'.$name.'_tumb.jpg')) {
                $homepage = file_get_contents('http://img.youtube.com/vi/'.$name.'/0.jpg');
                file_put_contents($folder.'/'.$name.'_tumb.jpg' , $homepage);
                $homepage = @imagecreatefromjpeg($folder.'/'.$name.'_tumb.jpg');
                $im = @imagecreatefrompng('images/play.png');
                $watermark_width = imagesx($homepage);
                $watermark_height = imagesy($im);
                $alpha_level = 60;
	        //Добавляем вотермарк
                imagecopymerge($homepage, $im, 0, 0, 0, 0, 480, 360, $alpha_level);
                imagejpeg($homepage,$folder.'/'.$name.'_tumb.jpg',75);
            }
            $replace = '<iframe title="YouTube video player" width="480" height="390" src="'.$link.'" frameborder="0" allowfullscreen></iframe>';
            //echo $replace;
            $post_new = str_replace($replace,'<a href="'.$link.'" class="lytebox" data-lyte-options="width:560 height:349"><img '.$new_link.'/></a>',$post_new);
        }
    }
?>

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

Демонстрация работы скрипта


Количество просмотров :527

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Устанавливаем на Centos pure-ftpd + MySQL

Будем считать, что MySQL уже установлен. Для установки pure-ftpd нам необходимо подключить RPMForge. Далее:

yum install pure-ftpd

Добавляем группу и пользователя к которому будут мапиться наши виртуальные пользователи:

groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser

Заходим в консоль MySQL и выполняем:

CREATE DATABASE pureftpd;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';
FLUSH PRIVILEGES;
USE pureftpd;
CREATE TABLE ftpd (
User varchar(16) NOT NULL default '',
status enum('0','1') NOT NULL default '0',
Password varchar(64) NOT NULL default '',
Uid varchar(11) NOT NULL default '-1',
Gid varchar(11) NOT NULL default '-1',
Dir varchar(128) NOT NULL default '',
ULBandwidth smallint(5) NOT NULL default '0',
DLBandwidth smallint(5) NOT NULL default '0',
comment tinytext NOT NULL,
ipaccess varchar(15) NOT NULL default '*',
QuotaSize smallint(5) NOT NULL default '0',
QuotaFiles int(11) NOT NULL default 0,
PRIMARY KEY (User),
UNIQUE KEY User (User)
) TYPE=MyISAM;

Добавляем пользователя

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', 'secret', '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Теперь время отредактировать конфиги, в /etc/pure-ftpd/pure-ftpd.conf

ChrootEveryone yes
[...]
MySQLConfigFile /etc/pure-ftpd/pureftpd-mysql.conf
[...]
CreateHomeDir yes

и в /etc/pure-ftpd/pureftpd-mysql.conf

MYSQLSocket /var/lib/mysql/mysql.sock
#MYSQLServer localhost
#MYSQLPort 3306
MYSQLUser pureftpd
MYSQLPassword ftpdpass
MYSQLDatabase pureftpd
#MYSQLCrypt md5, cleartext, crypt() or password() - md5 is VERY RECOMMENDABLE uppon cleartext
MYSQLCrypt md5
MYSQLGetPW SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetUID SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetGID SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MYSQLGetDir SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTASZ SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")
MySQLGetQTAFS SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

И в завершении добавляем pure-ftpd в автозагрузку и запускаем

chkconfig pure-ftpd on
service pure-ftpd start

Количество просмотров :328

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Samba и sshfs

Что бы ваши Samba пользователи получили доступ к примаунчиным sshfs папкам на удаленном сервере, необходимо использовать опцию -o allow_other. Пример:

sshfs <user>@<host>:</remote> </local> -o allow_other

Количество просмотров :600

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Тестируем скорость канала между серверами.

Есть много способов как это сделать, но мне больше всего нравиться использовать утилиту iperf

И так, для начала устанавливаем epel репозитарий, как это сделать можно прочесть тут. Теперь :

yum install iperf

на одном, и на втором сервере. Далее, на машинке получателе запускаем -

iperf -s -p 65000

а на машинке которая будет отдавать выполняем

iperf -c [ip сервера] -p 65000

Количество просмотров :1033

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Samba: Unable to connect to CUPS server

Если вы не собираетесь использовать на вашем Samba сервере принтеры, и в smbd.log постоянно появляется вот такая ошибка:

Unable to connect to CUPS server localhost:631 – Connection refused

Для, того, что бы избавиться от этой ошибки достаточно добавить в конфиг:

load printers = no
show add printer wizard = no
printing = none
printcap name = /dev/null
disable spoolss = yes

Количество просмотров :497

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Устанавливаем временную зону

Создаем ссылку на обновленную временную зону. Я живу в Киеве, поэтому моя зона Europe/Kiev:

ln -sf /usr/share/zoneinfo/Europe/Kiev /etc/localtime

Проверяем установленную зону в файле /etc/sysconfig/clock

cat /etc/sysconfig/clock | grep ZONE

Вот и все, проверяем при помощи

date

Количество просмотров :718

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс