Author Archives: alex

Как исправить ошибку “404 NOT FOUND” при “APT-GET UPDATE” на старой Убунту

Когда на определенном выпуске Убунту срок техобслуживания истекает, девелоперы отключают текущие репозитории, и apt-get дает ошибку “404 NOT FOUND”. Тогда надо переключится на репозитории старых выпусков.

1. Издайте в терминале команды:

sudo sed -i -r 's/([a-z]{2}\.)?archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i -r 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

2. Откройте sources.list

sudo leafpad /etc/apt/sources.list

3. Закоментируейте extras.ubuntu.com. Это репо тоже больше не поддерживается:

#deb http://extras.ubuntu.com/ubuntu raring main
#deb-src http://extras.ubuntu.com/ubuntu raring main

4. Теперь можно смело устанавливать новый старый софт:

sudo apt-get update
sudo apt-get upgrade

Как сделать виртуальные хосты на Апачи

Допустим, я жадный и хочу иметь два сайта, где на каждом стоит отдельный ВордПресс: Мой секси сайт и Мой эротик сайт. Я пошел и сделал для каждого сайта два разных домена: moisexysaite.duckdns.org и moieroticsaite.duckdns.org. Как их подключить на один и тот же Апачи на одном и том же компе?

Очень просто. Для этого надо сделать два виртуальных хоста.

pdf-icon Tutorial: Virtual_Hosts

1. Сначала сделаем отдельную папку для каждого из сайтов по имени домена:

sudo mkdir /var/www/moisexysaite.duckdns.org
sudo mkdir /var/www/moieroticsaite.duckdns.org

2. Внутри каждой папки сделаем еще одну папку html:

sudo mkdir /var/www/moisexysaite.duckdns.org/html
sudo mkdir /var/www/moieroticsaite.duckdns.org/html

3. Поставим для папок правильную принадлежность

sudo chown -R $USER:$USER /var/www/moisexysaite.duckdns.org/html
sudo chown -R $USER:$USER /var/www/moieroticsaite.duckdns.org/html

и разрешение.

sudo chmod -R 755 /var/www

4. Создадим конфигурационные файлы для каждого сайта.

Образец такого файла находится в /etc/apache2/sites-available/000-default.conf

sudo leafpad /etc/apache2/sites-available/moisexysaite.duckdns.org.conf
sudo leafpad /etc/apache2/sites-available/moieroticsaite.duckdns.org.conf

5. Скопируем в .conf файлы слдуещее:

a. Для moisexysaite.duckdns.org

<VirtualHost *:80>
ServerAdmin admin@moisexysaite.duckdns.org
ServerName moisexysaite.duckdns.org
ServerAlias www.moisexysaite.duckdns.org
DocumentRoot /var/www/moisexysaite.duckdns.org/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#RedirectMatch ^/$ /wordpress/
</VirtualHost>

b. Для moieroticsaite.duckdns.org

<VirtualHost *:80>
ServerAdmin admin@moieroticsaite.duckdns.org
ServerName moieroticsaite.duckdns.org
ServerAlias www.moieroticsaite.duckdns.org
DocumentRoot /var/www/moieroticsaite.duckdns.org/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#RedirectMatch ^/$ /wordpress/
</VirtualHost>

 

Note:
Примечательна строчка #RedirectMatch ^/$ /wordpress/. Она сейчас закоментирована.

Я полагаю, что на каждом сайте может стоять не один ВордПресс, а два, пять, сто – каждый в своей отдельной папке: wordpress1, wordpress5, wordpress100. Тогда, если вы хотите, чтоб Апачи при получении доменного имени, интернет адреса – moisexysaite.duckdns.org – показывал не просто содержимое html, корневой директории сайта:

virthost1

а сразу переключался на нужный вордпресс – wordpress1, например, то эту строчку надо раскомментировать и изменить так, чтоб она стала:

RedirectMatch ^/$ /wordpress1/

6. Включаем виртуальные хосты, которые мы только что сделали.

sudo a2ensite moisexysaite.duckdns.org
sudo a2ensite moieroticsaite.duckdns.org

Note:
Выключаются виртуальные хосты так:

sudo a2dissite moisexysaite.duckdns.org
sudo a2dissite moieroticsaite.duckdns.org

 

7. Перезагружаем Апачи.

sudo service apache2 restart

Графический переключатель языкового лэйаута для Fbpanel

Xxkb
Fbpanel plugin

Xxkb

На Lxpanel есть графический виджет переключения лэйаута, а на Fbpanel нет, и никогда не знаешь, какой язык в данный момент выставлен. Это неудобно. Поэтому мы установим программу xxkb.

xxkb1

Как переключать язык на клавиатуре я описал тут.

1. Устанавливаем xxkb

sudo apt-get install xxkb

2. В домашней директории сделаем конфигурационный файл.

leafpad .xxkbrc

Скопируем туда следующее и сохраним:

XXkb.image.path: /usr/share/xxkb

XXkb.group.base: 1
XXkb.group.alt: 2

XXkb.mainwindow.enable: no
XXkb.mainwindow.geometry: 15x15
XXkb.mainwindow.image.1: en15.xpm
XXkb.mainwindow.image.2: ru15.xpm
XXkb.mainwindow.image.3:
XXkb.mainwindow.image.4:
XXkb.mainwindow.label.font: -misc-*-r-*-20-*

XXkb.*.border.color: black
XXkb.*.border.width: 0

XXkb.*.label.foreground: white
XXkb.*.label.background: blue4
XXkb.*.label.enable: no

XXkb.mainwindow.type: tray
! possible values - normal, top, tray, wmaker

XXkb.button.enable: no
XXkb.button.geometry: 15x15-60+7
XXkb.button.image.1: en15.xpm
XXkb.button.image.2: bg15.xpm
XXkb.button.image.3:
XXkb.button.image.4:
XXkb.button.label.font: -misc-*-r-*-13-*

XXkb.controls.add_when_start: yes
XXkb.controls.add_when_create: yes
XXkb.controls.add_when_change: no
XXkb.controls.focusout: no
XXkb.controls.two_state: yes
XXkb.controls.button_delete: yes
XXkb.controls.button_delete_and_forget: yes
XXkb.controls.mainwindow_delete: no

XXkb.mousebutton.1.reverse: no
XXkb.mousebutton.3.reverse: no

XXkb.bell.enable: no
XXkb.bell.percent: -50

XXkb.ignore.reverse: no


en15.xpm
и ru15.xpm – это картинки флагов. Они находятся в папаке /usr/share/xxkb.

3. В openbox наладим автостарт.

Откроем файл:

leafpad .config/openbox/autostart

и впейстим в него:

xxkb &

xxkb2

4. Перелогинимся.

Fbpanel plugin

Узнайте номер лэйаута командой

xset -q|grep LED| awk '{ print $10 }'
Номер Обозначение
00000000 en
00000001 EN
00001000 ru
00001001 RU

Откройте файл ~/.config/fbpanel/bottom и впейстите

# Keboard layout

Plugin {
type=genmon
config {
Command = case "$(xset -q|grep LED| awk '{ print $10 }')" in   "00000000") KBD="en" ;;   "00001000") KBD="ru" ;;   "00000001") KBD="EN" ;;   "00001001") KBD="RU" ;;   *) KBD="unknown" ;; esac; echo $KBD
PollingTime = 1
#TextSize = small
TextColor = blue
}
}

Путин еврей

putin_jew1В том, что некоторые люди – евреи, ничего зазорного нет. Евреи вообще люди хорошие и даже гениальные. Вон посмотрите на российскую эстраду – там, если кто не еврей, тот – узбек, и ничего, всем нравится. Мы ж не русские, мы – россияне, а россиянин звучит гордо, это ж тебе не шлюшка Машка Распутина, ой Романова, которой все принца заграничного надо было. Гнилой декаданс. Но дело не в этом. Вот на кого похож Путин? На Александра Матросова похож. У того тоже была майка в полосочку, если не врут – герой, патриот, гражданин России с большой буквы, или не России? За Сталина, за Родину – один черт.

А на кого Путин не похож? На Диму Маликова не похож, а на Видова и подано. Тот вообще предатель. В порнухе снялся и сбежал падонок. Крамаров тоже предатель. Но Путин не такой, хотя на Крамарова похож. Такие же глазки затуманенные. Не, это Видов предатель. Крамаров в порнухе не снимался и поехал за туманом и за запахом тайги. Он же на Путина похож. Вобщем Путин – еврей и все путем.putin_jew_en_expanded

Setup FTP server on ubuntu 14.04

FTP is used to transfer files from one host to another over TCP network. This article explains how to setup FTP server on ubuntu 14.04 .

There are 3 popular FTP server packages available PureFTPD, VsFTPD and ProFTPD. Here i’ve used VsFTPD which is lightweight and less Vulnerability.

Setup FTP server on Ubuntu 14.04

Step 1 » Update repositories .

krizna@leela:~$ sudo apt-get update

Step 2 » Install VsFTPD package using the below command.

krizna@leela:~$ sudo apt-get install vsftpd

Step 3 » After installation open /etc/vsftpd.conf file and make changes as follows.
Uncomment the below lines (line no:29 and 33).

write_enable=YES
local_umask=022

» Uncomment the below line (line no: 120 ) to prevent access to the other folders outside the Home directory.

chroot_local_user=YES

and add the following line at the end.

allow_writeable_chroot=YES

» Add the following lines to enable passive mode.

pasv_enable=Yes
pasv_min_port=40000
pasv_max_port=40100

Step 4 » Restart vsftpd service using the below command.

krizna@leela:~$ sudo service vsftpd restart

Step 5 » Now ftp server will listen on port 21. Create user with the below command.Use /usr/sbin/nologin shell to prevent access to the bash shell for the ftp users .

krizna@leela:~$ sudo useradd -m john -s /usr/sbin/nologin
krizna@leela:~$ sudo passwd john

Step 6 » Allow login access for nologin shell . Open /etc/shells and add the following line at the end.

/usr/sbin/nologin

Now try to connect this ftp server with the username on port 21 using winscp or filezilla client and make sure that user cannot access the other folders outside the home directory.

setup-FTP-server-ubuntu-14-04-1

Please note using ftp on port 21 is a big security risk . it’s highly recommended to use SFTP. Please continue for SFTP configuration

Secure FTP ( SFTP )

SFTP is called as “Secure FTP” which generally use SSH File Transfer Protocol . so we need openssh-server package installed , Issue the below command if it’s not already installed.

krizna@leela:~$ sudo apt-get install openssh-server

Step 7 » Create a new group ftpaccess for FTP users.

krizna@leela:~$ sudo groupadd ftpaccess

Step 8 » Now make changes in this /etc/ssh/sshd_config file.
» Find and comment the below line

Subsystem sftp /usr/lib/openssh/sftp-server

and Add these lines at the end of the file.

Subsystem sftp internal-sftp
Match group ftpaccess
ChrootDirectory %h
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp

Step 9 » Restart sshd service.

krizna@leela:~$ sudo service ssh restart

Step 10 » The below steps must be followed while creating Users for sftp access.
Create user john with ftpaccess group and /usr/bin/nologin shell.

krizna@leela:~$ sudo useradd -m john -g ftpaccess -s /usr/sbin/nologin
krizna@leela:~$ sudo passwd john

Change ownership for the home directory.

krizna@leela:~$ sudo chown root /home/john

Create a folder inside home directory for writing and change ownership of that folder.

krizna@leela:~$ sudo mkdir /home/john/www
krizna@leela:~$ sudo chown john:ftpaccess /home/john/www

Now try to connect server using SFTP ( port : 22 ) and makesure Users can upload files to www directory and cannot access other folders outside home directory.setup FTP server ubuntu 14.04

setup-FTP-server-ubuntu-14-04

If you want use both FTP and SFTP together, please perform above steps ( Step 10 ) while creating users . For existing users, move them to ftpaccess group and create folder structure and ownership changes as below.

krizna@leela:~$ sudo usermod john -g ftpaccess -s /usr/sbin/nologin
krizna@leela:~$ sudo chown root /home/john
krizna@leela:~$ sudo mkdir /home/john/www
krizna@leela:~$ sudo chown john:ftpaccess /home/john/www

Now john can able to upload files to www folder using FTP as well as SFTP.
All the best.

Рассказ

Жили были феи, oни же музы. И были они такие могущественные и прекрасные. А жили они в замке на какой-то планете, как Земля, но не Земля. На той планете не было пиздаболов, мудаков и дураков.

Феи зажигают огоньки. С ними веселей.

fairies3 fairy4

Как апдейтить WordPress

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

Как установить ВордПресс

Чтоб не мучиться, установим FTP по этому туториалу.

1. В терминале выполним следующие команды:

sudo apt-get update 
sudo apt-get install vsftpd
sudo service vsftpd restart

2. Создадим юзера джона и при помощи nologin шелл дадим ему пароль:

sudo useradd -m john -s /usr/sbin/nologin
sudo passwd john

3. Дадим разрешение на использование nologin шелл.

Откройте файл /etc/shells:

sudo leafpad /etc/shells

и в конце добавьте строчку:

/usr/sbin/nologin

4. Дадим разрешение записывать на диск.

Откроем файл /etc/vsftpd.conf и откомментируем линии 31 и 35, чтоб стало:

write_enable=YES
local_umask=022

ftp_server

5. Теперь сделаем портфорвадинг на порт 21 для FTP на тот же IP, который у нас уже зарезервирован для HTTP:

При помощи FileZilla войдем в систему:

В туториале также рекомендуется сделать chroot для домашней директории и использовать SFTP вместо FTP. Порт 21 могут хакнуть.

6. Если вам удалось залогиниться через FileZilla, то теперь можно смело апдейтить ВордПресс.

Когда WordPress не апдейтится

Иногда Вордпресс не апдейтится, темы не устанавливаются, плагины тоже. Появляется оповещение:

Could not create directory.
Installation Failed

Такое происходит из-за мешанины файловых разрешений между FTP и www-data юзерами или потому, что запись на диск в пункте 4 не откомментирована.

Однако есть способ обойти данную проблему, когда Вордпресс будет писать на диск без FTP.

Поместите в самом низу файла wp-config.php следуюшую строчку:

define('FS_METHOD','direct');

wp_update

И все должно заработать.

Коды к Емайл форме 2

Это коды к статье Емайл формa, кэпча и антиспам.

Download: mail2.tar.gz

captcha.css

body {
margin: 0;
padding: 0;
display:inline-block;
}

body:after{
 display:none;
 content: url(/mail/refresh1.png) url(/mail/refresh2.png);
}

table {
margin: 0;
padding: 0;
height: 40px;
border: 0;
}

td {
margin: 0;
padding: 0;
height: 40px;
border: 0;
outline: 0;
}

img {
display:inline-block;
vertical-align:top;
}

input {
    background:url(/mail/refresh1.png) no-repeat;
    cursor:pointer;
    width: 40px;
    height: 40px;
    border:0 none !important;
}

input:hover {
    background:url(/mail/refresh2.png) no-repeat;
}

input:focus {
    border:none !important;
    outline: 0 !important;
    }

input::-moz-focus-inner {border:0;}

compose.css

body {
background-color: none;
color: white;
font-family: Verdana;
font-size: 14px;
margin: 0;
padding: 0;
}

h1 {
font-family: Tahoma;
font-size: 20px;
}

input {
display:inline-block;
vertical-align:top;
}

table {
margin: 0;
padding: 0;
border: 0;
}

td {
  padding-top: 0;
  padding-bottom: 0;
  display:table-cell;
}

iframe {
margin: 0;
padding: 0;
border: 0;
}

compose.html

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">

  <title>Compose</title>

</head>
<body>

<!-- === Копируй отсюда  === -->
<iframe src="/cgi-bin/compose.py" width="500" height="300" frameBorder="1"></iframe> 
<!-- === и досюда  ========= -->

</body>
</html>

index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="refresh" content="0;url=/mail/compose.html">
  <link rel="canonical" href="/mail/compose.html"/>
  <title>Home</title>
</head>
<body>

<a href="/mail/compose.html">Home</a>

</body>
</html>

response.css

body {
background-color: darkmagenta  ;
color: white;
font-family: Verdana;
font-size: 14px;
}

h1 {
font-family: Tahoma;
font-size: 20px;
}

response.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <base target="_parent" />
<link rel="stylesheet" type="text/css" href="response.css">

<title>Спасибо</title>

</head>
<body>

<h1>Thank you</h1>Name: aaa<br>Email: a@gmail.com<br>Subject: done<br><br>done

</body>
</html>

settings.txt

path_blocks = /var/www/html/mail/blocks.txt
path_font = /var/www/html/mail/alfphabet.ttf
path_mail_dir = /var/www/html/mail/
path_response = /var/www/html/mail/response.html
path_template = /var/www/html/mail/template.txt
path_tokens = /var/www/html/mail/tokens.txt

N_tokens = 50

url_captcha_css = /mail/captcha.css
url_compose_css =/mail/compose.css
url_mail_dir = /mail/
url_mail_cgi = /cgi-bin/mail_alex/
url_open = /wordpress/index.php/response

code_bg_color = (253, 0, 211, 255)
code_dots_color = (0, 0, 0, 255)
code_dots_n = 3000
code_text_color = (255, 255, 255, 255)

email_to = vasqpupkin@mail.ru
sender_name = Мой секси сайт
smtp_login = moisexisite@gmail.com
smtp_password = T&ldkwtE4P
smtp_port = 587
smtp_security_type = TLS
smtp_server = smtp.gmail.com

mail_form_width = 400

template.txt

<!doctype html>

<html lang="en">
<head>
  <meta charset="utf-8">
  <base target="_parent" />
<link rel="stylesheet" type="text/css" href="response.css">

<title>Спасибо</title>

</head>
<body>

[msg]

</body>
</html>

captcha.py

#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi, os, base64, ast
import mail_f

path_mail_dir, url_mail_dir, path_tokens, url_captcha_css, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font = '','','','','','','','',''

if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='path_mail_dir':
    path_mail_dir = val
   elif var=='url_mail_dir':
    url_mail_dir = val
   elif var=='path_tokens':
    path_tokens = val
   elif var=='url_captcha_css':
    url_captcha_css = val
   elif var=='code_text_color':
    code_text_color  = ast.literal_eval(val)
   elif var=='code_bg_color':
    code_bg_color  = ast.literal_eval(val)
   elif var=='code_dots_color':
    code_dots_color  = ast.literal_eval(val)
   elif var=='code_dots_n':
    code_dots_n  = int(val) 
   elif var=='path_font':
    path_font = val
   
else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()
 

T = mail_f.Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font)

path_out=T[0]
code_txt=T[1]


with open(path_out, "rb") as image_file:
    s = base64.b64encode(image_file.read())

with open(path_tokens, "a") as f:
    f.write(code_txt+'\n')

if os.path.exists(path_out):
 os.remove(path_out)

img='<img src="data:image/png;base64,'+s+'" height="40" width="120" alt="" title="Enter code">'


print 'Content-type: text/html\n\n'
print '<!doctype html>'

print '<html lang="en">'
print '<head>'
print '<meta charset="utf-8">'
print '<link rel="stylesheet" type="text/css" href="'+url_captcha_css+'">'
print '<title>Captcha</title>'
print '</head>'
print '<body>'
 
print '<form action="/cgi-bin/captcha.py" method="post">'
print '<table>'
print '<tr><td>'
print img
print '</td><td>'
print '<input type="submit" name="" value="">'
print '</td></tr></table>'
print '</form>'

print '</body>'
print '</html>'

compose.py

#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi, os, sys

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import mail_f

url_compose_css, mail_form_width = '',''


if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='url_compose_css':
    url_compose_css = val
   elif var=='mail_form_width':
    mail_form_width  = int(val) 
   
else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()
 

################################


print 'Content-type: text/html\n\n'

print '<!doctype html>'

print '<html lang="en">'
print '<head>'
print '<meta charset="utf-8">'
print '<link rel="stylesheet" type="text/css" href="'+url_compose_css+'">'
print "<base target='_parent' />"
print '<title>Compose</title>'
print '</head>'
print '<body>'
 

T=mail_f.mail_form_fields()

print '<form style="width: '+str(mail_form_width)+'px;" '+T[6]+'>'
print 'Name:<br>'
print '<input '+T[0]+' style="width: 100%;" type="text"><br><br>'
print 'Email:<br>'
print '<input '+T[1]+' style="width: 100%;" type="text" pattern="[^@]+@[^@]+\.[^@]+"><br><br>'
print 'Subject:<br>'
print '<input '+T[2]+' style="width: 100%;" type="text"><br><br>'
print 'Message:<br>'
print '<textarea '+T[3]+' style="width: 100%; height: '+str(mail_form_width/2.0)+'px;"></textarea><br>'

print '<table width="100%">'
print '<tr valign="middle">'
print '<td align="right">'
print 'Enter&nbsp;code:&nbsp;'
print '</td>'
print '<td>'
print '<input '+T[4]+' maxlength="6" size="7" type="text" pattern="[A-Z]{6}">'
print '&nbsp;</td>'
print '<td align="right">'
print '     <table>'
print '     <tr>'
print '     <td>'
print '     <iframe '+T[5]+' marginwidth="0" marginheight="0" hspace="0"  vspace="0" frameborder="0" scrolling="no" height="45" width="160"></iframe>'
print '     </td>'
print '     </tr>'
print '     </table>'
print '</td>'
print '</tr>'
print '<tr>'
print '<td></td>'
print '<td></td>'
print '<td align="right"><input value="Submit" type="submit"></td>'
print '</tr>'
print '</table>'
print '</form>'
print '</body>'
print '</html>'

mail_f.py

#!/usr/bin/python
#-*-coding:utf-8-*-

""" Функции для Мэил"""

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import random, string


def mail_form_fields():
 return ('name="name"', 'name="from"', 'name="subject"', 'name="message"', 'name="code"', 'src="/cgi-bin/captcha.py"', 'action="/cgi-bin/send.py" method="post"')


def Code(path_mail_dir, url_mail_dir, code_text_color, code_bg_color, code_dots_color, code_dots_n, path_font):
 """Random Code Generator"""
 size=6
 chars=string.ascii_uppercase
 code_txt=''.join(random.choice(chars) for _ in range(size))

 # Random string -----------------------

 img_width=120
 img_height=40
 img_font_size = 20
 img_padding=20


 path_out=path_mail_dir+code_txt+'.png'

 # Code Text  -------------------------

 img = Image.new("RGBA", (img_width, img_height), code_bg_color)
 draw = ImageDraw.Draw(img)


 i=0
 while i< code_dots_n:
  draw.point((random.randrange(5, img_width-5) , random.randrange(5, img_height-5) ), code_dots_color)
  i=i+1

 font = ImageFont.truetype(path_font, img_font_size)
 w, h = draw.textsize(code_txt, font)
 img_padding_hor=(img_width-w)/2.0
 img_padding_vert=(img_height-h)/2.0

 draw.text((img_padding_hor, img_padding_vert), code_txt, fill=code_text_color, font=font)

 img.save(path_out)
 
 return(path_out, code_txt)

send.py

#!/usr/bin/python
#-*-coding:utf-8-*-

path_settings='/var/www/html/mail/settings.txt'


import cgitb
cgitb.enable()

import cgi
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import os, time, re, sys

sender_name, email_to , smtp_security_type, smtp_server , smtp_port, smtp_login , smtp_password, path_template, path_response, path_blocks, url_compose_css, url_open , path_tokens, N_tokens = '','','','','','','','','','','','','',''


form = cgi.FieldStorage()
Errors=[]

Name, From, Subject, Message, Code = '','','','', ''
a, b, c, d = '','','',''
http_user_agent, remote_addr, http_referer = '', '', ''

if os.path.exists(path_settings):
 f=open(path_settings)
 s=f.read()
 f.close()
 
 L=s.split('\n')
 
 for item in L:
  if '=' in item:
   l=item.split('=')
   var=l[0].strip()
   val=l[1].strip()
   
   if var=='sender_name':
    sender_name = val
   elif var=='email_to':
    email_to = val
   elif var=='smtp_security_type':
    smtp_security_type = val
   elif var=='smtp_server':
    smtp_server = val
   elif var=='smtp_port':
    smtp_port = int(val) 
   elif var=='smtp_login':
    smtp_login = val
   elif var=='smtp_password':
    smtp_password = val
   elif var=='path_template':
    path_template = val
   elif var=='path_response':
    path_response = val
   elif var=='path_blocks':
    path_blocks = val
   elif var=='url_compose_css':
    url_compose_css = val
   elif var=='url_open':
    url_open = val
   elif var=='path_tokens':
    path_tokens = val
   elif var=='N_tokens':
    N_tokens = int(val)

else:
 print 'Content-type: text/html\n\n'
 print '<!doctype html>'
 print 'Not found: settings.txt'
 sys.exit()


try:
 http_user_agent=cgi.escape(os.environ["HTTP_USER_AGENT"])
except:
 http_user_agent='none'
try:
 remote_addr=cgi.escape(os.environ["REMOTE_ADDR"])
except:
 remote_addr='none'
try:
 http_referer=cgi.escape(os.environ["HTTP_REFERER"])
except:
 http_referer='none'
 
 
 

try:
 Name=form['name'].value.strip()
 Name=re.sub(r'<[^>]*?>', '', Name)
 a='Name: '+ Name
 if len(Name)==0:
  Errors.append('Name: none')
except:
 Errors.append('Name: none')
try:
 From = form['from'].value.strip()
 From = re.sub(r'<[^>]*?>', '', From)
 b='Email: '+ From
except:
 Errors.append('Email: none')
try:
 Subject=form['subject'].value.strip()
 Subject=re.sub(r'<[^>]*?>', '', Subject)
 c='Subject: '+ Subject
except:
 Errors.append('Subject: none')
try:
 Message = form['message'].value.strip()
 #Message = re.sub(r'<[^>]*?>', '', Message)
 
 d= Message.strip()
 

except:
 Errors.append('Message: none')

try:
 Code = form['code'].value.strip()
except:
 Errors.append('Error: code mismatch')


if len(Errors) == 0:
 EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")
 if not EMAIL_REGEX.match(From):
  Errors.append('Email is invalid: '+From)

if len(Errors) == 0:
 if os.path.exists(path_tokens)==False:
  Errors.append('Error: code mismatch')
 else:
  f=open(path_tokens, 'r')
  s=f.read()
  f.close()
  
  L=s.split()
  
  if Code not in L:
   Errors.append('Error: code mismatch')
  L.reverse()
  i=0
  l=[]
  OUT=[]
  for line in L:
   if i < N_tokens:
    if len(line)>0:
     OUT.append(line)
     i=i+1
  OUT.reverse()
  if len(OUT) >0:
   f=open(path_tokens, 'w')
   for line in OUT:
    f.write(line+'\n')
   f.close()



html='<h1>Thank you</h1>'+a+'<br>'+b+'<br>'+c+'<br>'*2+d.replace('\n', '<br>')

if len(Errors) == 0:
 try:
  msg = MIMEMultipart()
  msg['From'] = sender_name+' <'+smtp_login+'>'
  msg['Reply-To'] = Name+' <'+From+'>'
  msg['To'] = email_to
  msg['Subject'] = Subject
  msg['Date'] = time.strftime("%c")
  
  Message= \
Message+'\n\n'\
+'HTTP_USER_AGENT = '+http_user_agent+'\n'\
+'REMOTE_ADDR = '+remote_addr+'\n'\
+'HTTP_REFERER = '+http_referer+'\n\n'\
  
  msg.attach(MIMEText(Message, 'plain'))

  # Опции для SMTP сервера ---------
  
  if smtp_security_type =='TLS':
   server = smtplib.SMTP(smtp_server, smtp_port)
   server.starttls()
  
  if smtp_security_type =='SSL':
   server = smtplib.SMTP_SSL(smtp_server, smtp_port)
   
  server.ehlo()
  server.login(smtp_login, smtp_password)
  text = msg.as_string()
  
  # Checking blocks.txt ----------
  block='no'
  if os.path.exists(path_blocks):
   f=open(path_blocks, 'r')
   s=f.read()
   f.close()
   
   H=[http_user_agent, remote_addr, http_referer] # Headers
   L=s.split('\n')
   
   for item in L:
    h=''
    v=''
    if '=' in item:
     l=item.split('=')
     h=l[0].strip()
     v=l[1].strip()
     if v in H:
      block='yes'
      break
      
  if block=='no':
   server.sendmail(From, email_to, text)
   
  server.close()
  
  #----------------------------------
  
 except Exception as e:
  
  i=0
  for item in e:
   
   item=str(item)
   if i==0:
    item='Error: '+item
   
   item=item.replace('<', '&lt;')
   item=item.replace('>', '&gt;')
   
   Errors.append(item)
   i=1+1

if len(Errors)>0:
 html='<h1>Please correct</h1>'
 for item in Errors:
  html=html+item+'<br>'
 html=html+'<br>Email delivery failed.'

f=open(path_template, 'r')
s=f.read()
f.close()

s=s.replace('[msg]', html)

f=open(path_response, 'w')
f.write(s)
f.close()

print 'Content-type: text/html\n\n'
print '<meta http-equiv="refresh" content="0;url='+url_open+'">'
print '<link rel="canonical" href="'+url_open+'"/>'

iframe.html

<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<title>Response</title>
</head>
<body>
 
<!-- === Копируй отсюда  === -->
<iframe src="/mail/response.html" width="500" height="300" frameBorder="0"></iframe> 
<!-- === и досюда  ========= -->

</body>
</html>

Как сделать фавикон в ВордПрессе

katy_favicon1

1. Сделай картинку размером 16×16 пикселей и сохрани ее в формате ICO под именем favicon.ico.

katy_favicon2

2. Помести favicon.ico в папку /var/www/html/wordpress.

3. Пойди в папку со своей активной темой:

/var/www/html/wordpress_katy/wp-content/themes/purplequest

4. Открой файл header.php

5. Скопируй в него следующее:

<link rel="icon" href="<?php bloginfo('siteurl'); ?>/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="<?php bloginfo('siteurl'); ?>/favicon.ico" type="image/x-icon" />

katy_favicon4

6. Сохрани.

7. Перезагрузи браузер.

katy_favicon3

Меняем URL WordPress сайта

Прежде, чем вносить изменения в MySQL, сделайте бэкап.

Допустим, мы установили ВордПресс по инструкции с параметрами:

Имя базы данных wordpress_katy_perry
Имя пользователя базы данных katy
Пароль юзера базы данных roar
Адрес компьютера с базой данных localhost

и он работает замечательно, а потом сделали домен, чтоб показать наш секси сайт корешам, а кореша видят:

unable-to-connect

Почему? Потому что мы ранее сделали:

Адрес компьютера с базой данных localhost

a теперь требуется:

Адрес компьютера с базой данных moisexysite.duckdns.org

Надо изменить значения переменных siteurl и home

Пойди: Dashboard > Settings > General и поменяй:

WordPress Address (URL) http://moisexysite.duckdns.org/wordpress
Site Address (URL) http://moisexysite.duckdns.org/wordpress

А из командной строки оно делается так:

mysql -u katy -p

Пароль: roar

mysql> use wordpress_katy_perry;
mysql> show tables;

+--------------------------------+
| Tables_in_wordpress_katy_perry |
+--------------------------------+
| katy_commentmeta               |
| katy_comments                  |
| katy_links                     |
| katy_options                   |
| katy_postmeta                  |
| katy_posts                     |
| katy_term_relationships        |
| katy_term_taxonomy             |
| katy_termmeta                  |
| katy_terms                     |
| katy_usermeta                  |
| katy_users                     |
+--------------------------------+

Нас интересует таблица katy_options

mysql> select * from katy_options WHERE option_id = 1;

+-----------+-------------+----------------------------+----------+
| option_id | option_name | option_value               | autoload |
+-----------+-------------+----------------------------+----------+
|         1 | siteurl     | /wordpress | yes      |
+-----------+-------------+----------------------------+----------+
mysql> select * from katy_options WHERE option_id = 2;

+-----------+-------------+----------------------------+----------+
| option_id | option_name | option_value               | autoload |
+-----------+-------------+----------------------------+----------+
|         2 | home        | /wordpress | yes      |
+-----------+-------------+----------------------------+----------+

Надо сделать так, чтоб значения siteurl и home стали http://moisexisite.duckdns.org/wordpress

Издаем команды:

mysql> UPDATE katy_options SET option_value = 'http://moisexisite.duckdns.org/wordpress' WHERE option_name = 'siteurl';
mysql> UPDATE katy_options SET option_value = 'http://moisexisite.duckdns.org/wordpress' WHERE option_name = 'home';

 

Проверяем:

mysql> select * from katy_options WHERE option_id = 1 OR option_id = 2;

+-----------+-------------+------------------------------------------+----------+
| option_id | option_name | option_value                             | autoload |
+-----------+-------------+------------------------------------------+----------+
|         1 | siteurl     | http://moisexisite.duckdns.org/wordpress | yes      |
|         2 | home        | http://moisexisite.duckdns.org/wordpress | yes      |
+-----------+-------------+------------------------------------------+----------+

Теперь идем на http://moisexisite.duckdns.org. Log in. Log out. И все должно заработать.

Таким образом можно и другие параметры поменять:

Имя блога

mysql> select * from katy_options WHERE option_id = 3;

+-----------+-------------+----------------------------+----------+
| option_id | option_name | option_value               | autoload |
+-----------+-------------+----------------------------+----------+
|         3 | blogname    | Мой секси сайт             | yes      |
+-----------+-------------+----------------------------+----------+

Описание блога

mysql> select * from katy_options WHERE option_id = 4;

+-----------+-----------------+-----------------------------+----------+
| option_id | option_name     | option_value                | autoload |
+-----------+-----------------+-----------------------------+----------+
|         4 | blogdescription | Just another WordPress site | yes      |
+-----------+-----------------+-----------------------------+----------+