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

Небольшой скрипт на 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() - можно запихнуть любые команды, которые будут выполнятся при обновлении командной строки.