Мониторим домены

Небольшой скрипт на php для мониторинга освободившихся доменов в помощь лентяям.

 

<?php

$domains = array(
    'domain1.ru',
    'domain2.ru'
);

$email = 'my@email.com';

foreach($domains as $domain)
{
    $inf = check_domain($domain);
    if(!isset($inf['free-date']))
    {
        $text = 'DOMAIN ' . $domain . ' FREE';
        mail($email,$text, $text);
    }
}

function check_domain( $domain )
{
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL,'r01.ru/domain/whois/check-domain.php?domain=' . $domain);
    curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
    $result = curl_exec($curl);
    $info = array();
    $infoField = array(
        'free-date',
        // 'domain','type','descr','state','nic-hdl','person','phone','fax-no','e-mail','reg-till','created','changed', 'registrar'
    );
    foreach($infoField as $field)
    {
        preg_match('#' . $field . ': (.*)#',$result,$m);
        $info[$field] = isset($m[1]) ? strip_tags($m[1]) : '';
    }
    return $info;
}

Запускать скрипт по крону, раз в 5-10 минут.

PS Письма по-умолчанию будут падать в спам.

URL без завершающих слэшей и www

Часто бывает нужно убрать www и завершающие слэши из всех URL. Данную операцию достаточно просто выполнить при помощи кода в .htaccess

#Если вы хотите, чтобы всегда был домен с www
RewriteCond %{HTTP_HOST} ^domen\.ru
RewriteRule ^(.*)$ http://www.domen.ru/$1 [R=301,L]

#Если вы хотите, чтобы всегда был домен без www
RewriteCond %{HTTP_HOST} ^www\.domen\.ru
RewriteRule ^(.*)$ http://domen.ru/$1 [R=301,L]

#Добавить завершающий слэш
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

#Удалить завершающий слэш
RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteRule ^(.*)(/)$ $1 [L,R=301]

Расширение всех файлов в XML формате

Не нашел нигде список всех расширений файлов, но зато наткнулся на сайт http://open-file.ru в котором приведен весь список расширений. Решил написать небольшой скрипт, который вытянет все расширения с описаниями и типами в XML файл.

Ниже код скрипта:


<?php

set_time_limit(0);
$url = 'http://open-file.ru';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$result = curl_exec($ch);
preg_match('~<p>(.*)</p>~',$result,$match);
preg_match_all('~<a href="(/types/.*/)">.*</a>~Us',$match[1],$match);
$extension = array();
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<extensions>';
foreach( $match[1] as $link )
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, ( $url . $link ));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    $result = curl_exec($ch);
    preg_match( '~<table>(.*)</table>~Us', $result, $table );

    $reg = array(
        '~<tr><td>.*<a href="/types/.*">(.*)</a>.*</td>',
        '<td>.*<a href="/types/.*/">(.*)</a>.*</td><td>',
        '.*<a href="/types/.*">(.*)</a>.*</td></tr>~'
    );

    preg_match_all(implode($reg),$table[1],$data);
    foreach( $data[1] as $key => $ext )
    {
        $xml .= '
            <extension>
                <name><![CDATA[' . $ext . ']]></name>
                <type><![CDATA[' . $data[2][$key] . ']]></type>
                <description><![CDATA[' . $data[3][$key] . ']]></description>
           </extension>
';
   }
}

$xml .= '</extensions>';

file_put_contents('tmp/extensions.xml' , iconv( 'cp1251', 'utf8', $xml ) );

Архив со всеми расширениями файлов в формате XML: extensions.xml.zip

Скрипт для отправки обновлений на почту

Для одного проекта понадобилось высылать заказчику обновления ( pack ), так как это рутинная задача, я решил написать простой скрипт на shell:

 

#!/bin/sh 

# Мыльник куда отправляем пакет с обновлениями 
EMAIL=$1 

# Директория с проектом 
PROJECT=/var/www/my_project 

# Дата ( для заголовка письма и названия файла архива с обновлением ) 
DATE=`date +%d-%m-%Y_%H-%M` 

# Название файла архива с обновлением 
TARNAME=pack_my_project_$DATE.tgz 

# Локальная директория в которой сохраняются архивы с обновлениями 
PACK=pack/$TARNAME 

# Изменения в проекте ( git ) 
CHANGE=`cd $PROJECT && git diff --stat | awk 'NF != 7 {print $1}' && cd - > /dev/null` 

# Тема письма с архивом обновления 
SUBJECT='Обновление project от $DATE' 

# Тело письма, опционально 
BODY='' 

# Создаем архив с изменениями и отправляем письмо
cd $PROJECT && \
tar czf $PACK $CHANGE > /dev/null && \
( ( echo $BODY $CHANGE ); uuencode $PACK $TARNAME ) \ 
| mail -s "Обновление project от $DATE" $EMAIL && \
cd - > /dev/null 

в .zshrc прописываем путь к директории к скрипту и ставим разрешение на выполнение файла

Отправляем:

 $ my_project_update.sh test@gmail.com 

Сообщение с паком уйдет на почту.

TODO: Мою задачу скрипт решает полностью, но его можно доработать:
1) проверка наличия параметра $1
2) проверка, что в проекте реально есть изменения

Быстрое добавление множества директорий в .gitignore

Часто в проекте есть директория uploads/ с вложениями, содержимое в которых не нуждаются в поддержки версионности, для того чтобы не утомлять себя ручным вводом каждой директории можно воспользоваться командой:

 $ ls -l uploads | awk {'print "/uploads/"$9"/*"'} > ../.gitignore 

Дело сделано, нужные директории теперь не будут включены в репозитарий.

Шелл на PHP

Небольшая тулза на PHP+Ajax, которая позволяет выполнять shell команды.

Вот код:

<?php
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' )
{
if(!empty($_POST['command']))
{
exec($_POST['command'], $result);
if(is_array($result)) {
foreach($result as $str)
$res[] = htmlspecialchars($str);
$res = isset($res) ? implode("<br />", $res) : '';
} else {
$res = $result;
}
echo $res;
}
exit();
}
?>

<!DOCTYPE HTML>
<html>
<head>
<title>Shell</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
function clear(c) {
c.attr("value", "");
}
$(document).ready(function() {
var c = $("input[name='command']");
clear(c);
c.focus(function() {
$("span").hide();
});
c.blur(function() {
$("span").show();
});
c.keyup(function(event) {
if(event.keyCode == 13)
$.post('sh.php', { command: $(this).val() }, function(data) {
$("div").html(data);
clear(c);
});
});
});
</script>
<style type="text/css">
* {background: #000; border: 0; color: green; font: 62.5% Arial, Helvetica, sans-serif; width: 100%;}
body {font-size: 1.5em; margin: 0; padding: 0;}
input {background-color: #000; font-size: 1em; width: 80%;}
div {background: #000; font-size: 1em; height: 100%;min-height: 20px;width: 90%;}
strong {color: #fff;}
hr {color: #fff; background-color: #fff; height: 1px; margin-top: 0; width: 100%;}
blink {font-size: 1.5em;}
p {
background: #fff url(http://www.catb.org/~esr/hacker-emblem/glider.png) no-repeat top right;
display: block;
height: 55px;
right: 20px;
position: absolute;
width: 55px;
}
</style>
</head>
<body>
<?php system('hostname')?>&gt;<span><blink>_</blink></span>
<input name="command" />
<hr />
<p></p>
<div></div>
</body>
</html>

Скрипт добавления нового виртуального хоста

[announce]Как-то поднадоело мне постоянно редактировать вручную httpd.conf и /etc/hosts и я решил написать скрипт, который бы позволил автоматизировать этот процесс[/announce]
Вот такой скрипт:

#!/bin/sh

# Константы:
HOSTS='/tc/hosts'; # Путь к файлу hosts
HTTPD_CONF='/etc/httpd/conf/extra/httpd-vhosts.conf';

# Путь к файлу с настройками виртуальных хостов
DIR_HTTP='/srv/http/'; # Путь к директориям с хостами
IP_MASK='127.0.0.'; # Маска по которой будет формироваться новый IP
INDEX_FILE='index.php'; # Index файл в корневой папке нового виртуального хоста
DIR_LOG='/var/log/httpd/'; # Путь к папке с логами
EMAIL_ADMIN='wikide@gmail.com'; # Email админестратора

# Функция вывода ошибок
get_error() {
    echo $1;
    exit 0;
}

# Функция проверки ip
check_ip() {
    if [ "`cat $HOSTS | grep \"$ip\"`" ]; then
        echo 1;
    fi
}

# Проверяем наличея параметра с именем хоста
if [ "$1" ]; then
    if [ "$2" ]; then
        # Если задан свой IP
        new_ip=$2;
        if [ "`check_ip $new_ip`" ]; then # Проверка на наличее в файле
            get_error 'Такой ip адрес - '$new_ip' уже занят. Введите другой или пусть скрипт '$0' сам сгенерирует ip адресс для нового хоста.';
        fi;
    else
        # Получаем IP автоматически
        new_ip=$IP_MASK$((`tail -1 $HOSTS | awk '{ split($1, ip, "."); print ip[4]}'`+1));
    fi

    # Если корневая папка нового хоста уже существует
    if [ -d $DIR_HTTP$1/ ]; then
        get_error 'Директория '$1' уже есть в '$DIR_HTTP'. Подберите другое имя.';
    else
        # Создаем корневую директорию виртуального хоста
        mkdir $DIR_HTTP$1;
        echo -e "
    <html>
     <head>
      <title>New host</title>
     </head>
     <body>
        <h1>Created host '$1'!</h1>
     </body>
    </html>"
> $DIR_HTTP$1'/index.php';
  
    # Запись в hosts
        sudo echo $new_ip  $1 | sudo tee -a $HOSTS 1>/dev/null;

    # Запись в конфиг Apache
        sudo echo -e "#Create date: `date '+%F %T'`
          DirectoryIndex $INDEX_FILE
          ServerAdmin $EMAIL_ADMIN
          DocumentRoot \"$DIR_HTTP$1/\"
          ServerName $1
          ServerAlias $1
          ErrorLog \"$DIR_LOG$1.log\"
          CustomLog \"$DIR_LOG$1\" common"
| sudo tee -a $HTTPD_CONF 1>/dev/null;

        # Перезапускаем сервер
        sudo apachectl restart;

        # Выводими сообщение

        echo 'Виртуальный хост "'$1'" успешно создан'
    fi
else
    get_error 'Нужно обязательно указать название нового хоста $0 NAME_HOST [IP_HOST]';
fi

exit 0;

Скрипт запуска wifi в ARCH Linux

[announce]Небольшой скрипт для подключения к сетям wifi в ARCH linux [/announce]

 

#!/bin/bash

# Определяем интрфейс ( в моем случае это - wlan0)
if [ "$2" ]; then 
	dev=$2;
else 
	dev="wlan0";
fi

# Действие
case "$1" in
	start)
		sudo ifconfig $dev up;
		sudo wpa_supplicant -B -i$dev -c/etc/wpa_supplicant.conf;
		sleep 3;
		sudo dhcpcd $dev 2>/dev/null;
	;;
	stop)	
		sudo killall -9 dhcpcd 3>/dev/null;
		sudo killall -9 wpa_supplicant 3>/dev/null;
		sudo ifconfig $dev down;
	;;
	list)
		sudo ifconfig $dev up;
		sleep 1;
		sudo iwlist $dev scanning;
		sudo ifconfig $dev down;
	;;
	restart)
		$0 stop;
		$0 start;
	;;
	status)
		echo -n 'IP arrdess: '; ifconfig wlan0 | grep "inet addr" | awk '{print $2}' | sed 's/addr://'
		echo -n "Essid: "; iwconfig wlan0 | grep "Ralink STA" | awk '{print $4}' | sed 's/ESSID://'
	;;
	*)

	if [ "$1"  ]; then
		echo "usage: $0 {start|stop|list|restart}"; 
	else 
		echo "Restarting";
		$0 restart;
	fi

esac

exit 0

Вот такой вот скрипт :)
Идею взял с http://wiki.archlinux.org/index.php/Asus_Eee_PC_901с

 

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

Вот очередной велосипед на тему показа статуса аккумулятора для нэтбука на ARCH Linux :)

Вот такой получается скрипт на sh (думаю все ясно из комментов):

#!/bin/zsh

# Определяем уровень заряда аккумулятора на текущий момент
remaining_bat=`cat /proc/acpi/battery/BAT0/state | grep remaining | awk {'print $3'}`;

# Определяем 100% заряда для аккумулятора
full_bat=`cat /proc/acpi/battery/BAT0/info | grep full | awk {'print $4'}`;

# Определяем подключён сетевой провод или нет
stat=`cat /proc/acpi/battery/BAT0/state | grep charging | awk {'print $3'}`;

if [ $stat = 'charging' ]; then
stat='+'; # Провод подключён ( ноут зяряжеается )
else if [ $stat = 'charged' ]; then
stat=''; # ( Аккумулятор зяряжен)
else
stat='-'; # Провод не подключён ( ноут разряжается )
fi
fi

# получаем заряд батареи в % ( Школьная математика - Рулит! :) )
bat=$(($remaining_bat*100/$full_bat));

# основные цвета ( ESC - последовательности, подробнее - $ man console_codes )
RED="\033[31m"; # Красный
YELLOW="\033[33m"; # Жёлтый
WHITE="\033[38m"; # Белый

# Цвет по-умолчанию
DEFAULT="\033[0m";

if [ $bat -lt 10 ]; then # Если заряд аккамулятора меньше 10% (краасные цвет)
result="$RED$stat$bat";
else if [ $bat -lt 30 ]; then # Если заряд аккамулятора меньше 30% (жёлтый цвет)
result="$YELLOW$stat$bat";
else
result="$WHTE$stat$bat"; # Заряд аккамулятора больше 30% ( белый цвет )
fi
fi

# Выводим результат
echo -e $result%%$DEFAULT;

exit 0;

Далее говорим zsh о том, что нужно выводить в PROMPT результат этого скрипта.
В файле ~/.zshrc в функции precmd() прописываем где-нибудь в начале:

precmd() {
   BAT=`binf.sh`;
   PROMPT="battery:(`echo $BAT`)::%{$reset_color%}%{$fg_bold[green]%}%m {$reset_color%}::%{$fg_bold[crey]%}[ %~ ]%{$rese    +t_color%}> "
.....

Как-то вот так, где binf.sh — скрипт выше.
Обязательно нужно, чтобы binf.sh лежал по пути в переменной PATH, я для этой цели создал папку bin в домашней директории и сделал ссылку на файл в папке /bin

В precmd() — можно запихнуть любые команды, которые будут выполнятся при обновлении командной строки.

HTML 5

[announce]Пора переходить[/announce]

Думаю пришло время переходить на html5 в нем достаточно много интересных вещей, пока не совсем понимаю как работает видео плеер на html5, но пока с видео траблы, у меня не запустился плеер html5 в FF, а это уж совсем значит никуда не годиться.

Вот что новенького появилось (движение в сторону упрощения, что не может не радовать :) ):

  • Логическая разбивка (header, footer, nav …) и это есть прикольно! :)
  • Доктайп стал очень простым — !DOCTYPE html
  • У ссылок можно использовать атрибут — target
  • Тэг script может не содержать никакие атрибуты
  •  

    В IE чтобы вся эта красота заработала нужно вставить небольшой код javascript в документе на HTML5:

    Так:

    <!-- [if IE] -->
    <script>
    document.createElement('header');
    document.createElement('nav');
    document.createElement('section');
    document.createElement('article');
    document.createElement('aside');
    document.createElement('footer');
    </script>
    <!-- [endif]-->
    

    Или так:

    <!--[if IE]>
      <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
    

     

    Конечно я уже привык к XHTML и мне даже нравилась его строгость, но ничего не поделаешь, время идет и приходят новые более совершенные технологии. :-D

    Я прочитал из этого ресураса о html5 http://dimox.name/hello-html5-goodbye-xhtml2/

Подключение tinymce

[announce]Постоянно забываю как подключать его.. Пусть будет здесь![/announce]
Подключение TinyMCE к textarea по классу

tinyMCE.init({	
...
mode : "specific_textareas",
editor_selector : "mceEditor"
});

Подключение TinyMCE к textarea по ID

tinyMCE.init({
...
mode : "exact",
elements : "elm1,elm2"
});

...

<textarea id="elm1" ...

Источник: http://wiki.moxiecode.com/index.php/TinyMCE:Configuration/mode

JQuery Uploadify

[announce]Удобный плагин для загрузки файлов на сервер. [/announce]

Дескрипшон

http://www.uploadify.com — удобный инструмент если нужно быстро создать в CMS возможность загрузки нескольких файлов.Плагин для JQuery.

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

Файлы

<script type="text/javascript" src="http://aa/admin/spaw2/empty/jquery.uploadify.v2.1.0.min.js"></script>
<script type="text/javascript" src="http://aa/admin/spaw2/empty/swfobject.js"></script>

Код

$(document).ready(function() {
 $("#uploadify").uploadify({   
     'uploader'    :'uploadify.swf',
     'script'      : 'functions.php',   
     'checkscript' : 'check.php',   
     'cancelImg'   : 'cancel.png',
     'queueID'     : 'fileQueue',   
     'auto'        : true,   
     'multi'       : true,   
     'fileDesc'    : 'jpg',   
     'fileExt'     : '*.jpg',  
     'onComplete'  : function(event,queueID,fileObj,response,dat{$('#response').append(response);}  });
});

Настройки

uploader — путь до самого флэш загрузчика uploadify.swf
script — это путь до нашего файла обработчика, у меня это файл functions.php, но в архиве с библотекой он именуется как uploadify.php.
checkscript
— путь до скрипта, который будет проверять наш файл до загрузки его на сервер. В файле, идущем в архиве с плагином, проверяют существования файла с таким же именем на сервере.
cancelImg — путь до картинки, которая будет символизировать удаления файла.
queueID
— id элемента, в котором будет содержаться список выбранных нами файлов. По умолчанию он создаётся ниже браузерной кнопки выбора файла.
auto — параметр, отвечающий, будут ли файлы загружаться автоматически сразу после их выбора, или нет. Если стоит значение false, то для начала загрузки можно использовать этот код:
  <a href="javascript:$('#uploadify').uploadifyUpload();">Загрузить файлы.</a>

Естественно, можно повесить вместо ссылки картинку или кнопку, тут уже на Ваш выбор.
multi
— будет ли наш плагин служить для загрузки нескольких файлов, иль не будет.
fileDesc
— типы файлов в диалоге выбора.
fileExt
— расширения файлов, разрешенных для загрузки. Незабываем добавить эти типы файлов и в fileDesc, иначе не сможете выбрать эти файлы в диалоговом окне.
onComplete
— функция, которая будет вызвана сразу после загрузки файла. Данная функция будет вызываться каждый раз, как будет загружен очередной файл.
onAllComplete
— функция, которая будет вызвана сразу после загрузки всех файлов.
buttonText — текст на кнопке (на время написания этого текста на кнопки могла отображатся только надпись на английском языке).

Дока — http://www.uploadify.com/documentation/
Плагин — http://www.uploadify.com

Источник — http://habrahabr.ru/blogs/jquery/71772/