Заметки Александра Чернышева

Keep in mind!

HP t610 PLUS в качестве домашнего сервера.

Решил обновить свой домашний сервер, главными критериями были: бесшумность и возможность установки нескольких дисков для организации программного RAID массива.
Тут как раз на глаза мне попалось хорошее предложение на HP t610 PLUS.

С первым пунктом, бесшумностью, все обстоит отлично, а вот с возможностью размещения второго диска пришлось повозиться, так как штатно можно установить только один жесткий диск, а распаянных SATA разъемов на плате два. Поэтому включив воображение и вооружившись штангенциркулем начал прикидывать, где тут можно разместить второй диск.
Так же хотелось сохранить функциональность PCI-E слота, для установки второй сетевой карты.

Изогнул кусок оргстекла, по размерам корзины и выпилил отверстия под разъемы.

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

Сделал пропил под кабели LPT и COM и просверлил вентиляционные и крепежные отверстия.

С обратной стороны закрепил оргстекло к корзине на шурупы и заклеил все скотчем.

Фиксатор для разъема сделал из заглушки от компьютерного корпуса.

Второй кабель встает плотно и фиксации не требует.

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

Пропускаем шлейфы и устанавливаем сетевую карту.

Устанавливаем второй жесткий диск и подключаем их к плате.

Здесь видны отверстия для вентиляции пространства между дисками.

В итоге получился отличный, тихий домашний сервер с приятным внешним видом на который успешно встала и работает OpenVZ 7.

30 декабря   hp   linux

Microsoft Media Center Remote Control

Для переназначения действий кнопок, на дистанционном пульте Microsoft RC6, существует программа Advanced MCE Remote Mapper.

Работа с данной программой описана в этом видео.

Список горячих клавиш есть в wiki, так же там есть список поддерживаемых дистанционных пультов.
MCERemote.txt
Kodi_RC6_Win7_Preset.reg

Так же на Microsoft RC6 присутствуют три клавиши, которые возможно запрограммировать: LIVE TV, VOL +, VOL -.


Для этого необходимо выполнить следующие действия:

  1. Расположить пульты (RC6 и тот, с которого пишем команду) инфракрасными портами друг к другу на небольшом расстоянии.
  2. Зажать на RC6 кнопки DVD Menu и OK пока подсветка не погаснет (около 2 секунд).
  3. Нажимать на кнопку, которую хотим запрограммировать, при этом подсветка моргнет.
  4. Зажать на пульте-источники кнопку, команду с которой хотим скопировать.
  5. Если RC6 записал команду, то подсветка мигнет 2 раза. Если команду распознать не удалось, то подсветка моргнет 4 раза.
  6. Повторить пункты с 1 по 4 для остальных кнопок.

Чтобы сбросить все запрограммированные кнопки необходимо:

  1. Зажать DVD Menu и Lef пока подсветка не погаснет.
  2. Нажать OK.

Пульт должен мигнуть 2 раза, подтверждая возврат к заводским установкам.

29 ноября   windows

Сторожевой таймер для 4G-модема.

Это небольшое дополнение к моей статье на Habrahabr.


  • переписал скрип, добавив возможность читать параметры из конфигурационного файла,
  • добавил возможность записи в лог событий, о перезагрузке модема,
  • добавил сервис и таймер для systemd.

Создадим скрипт


vi /usr/local/bin/lte_watchdog.sh

#!/bin/bash
#
export PATH="$PATH:/usr/sbin:/usr/bin"
SN="$(basename "$0")"
#
function print_help() {
    printf "\n"
    printf "Использование: %s options...\n" "$SN"
    printf "Параметры:\n"
    printf "  -c        Конфигурационный файл.\n"
    printf "  -l        Лог файл.\n"
    printf "  -h        Справка.\n"
    printf "\n"
}

# Если скрипт запущен без аргументов, открываем справку.
if [[ $# = 0 ]]; then
    print_help && exit 1
fi
while getopts ":c:l:h" opt ;
do
    case $opt in
        c) CONF=$OPTARG;
            ;;
        l) LOG=$OPTARG;
            ;;
        h) print_help
            exit 1
            ;;
        *) printf "Неправильный параметр\n";
           printf "Для вызова справки запустите %s -h\n" "$SN";
            exit 1
            ;;
        esac
done

if [[ "$CONF" == "" ]] || [[ "$LOG" == "" ]] ;  then
 printf "\n"
 printf "Одна или несколько опций не указаны.\n"
 printf "Для справки наберите: %s -h\n" "$SN"
 printf "\n"
 exit 1
fi

source "$CONF"

M="$(lsusb | grep -w "$MM")"  #строка модема из lsusb

if [[ "$M" != "" ]]; then   #если модем выбран, можно проверять пинги

  if grep -w -q "$IF" /proc/net/dev; then #проверяем наличие сетевого интерфейса
   printf "\n"
   printf "Проверка доступности %s через интерфейс %s\n" "$SITE" "$IF"
   printf "\n"
    if [[ "$EP" -ge 6 ]]; then
     printf "Число ошибочных пингов должно быть меньше или равно 5\n"
     exit 1
    else
     printf "Делаем пинги...\n"
     flag="0"
     for i in {1..5}; do #делаем 5 пингов до сервера
     timeout -k 2 -s TERM 16 ping -w 14 -s 8 -c 1 -I "$IF" "$SITE" || flag=$((flag+1)) && printf "пинг:%s/5 (ошибок:%s)\n" "$i" "$flag" #пинг не прошел - инкрементируем счетчик
      if (("$flag" >= "$EP")); then
       break
      else
       read -r -t 1 > /dev/null
      fi
     done
     printf "потерь пакетов: %s из %s\n" "$flag" "$i"
     printf "\n"

     if (("$flag" >= "$EP")); then #если потерь пакетов больше 2х
      M="$(lsusb | grep "$MM")"   #на всякий случай снова глянем - вдруг модем выдернули
      printf "Будет сброшен модем:\n"
      printf "%s\n" "$M" | cut -c 34-
      printf "%s %s: потерь пакетов: %s из %s, модем %s %s будет перезагружен.\n" "$(date +"%b %d %T")" "$SN" "$flag" "$i" "$MM" "$(printf "$M" | cut -c -32)" >> "$LOG"
      if ! [[ -d /sys/bus/usb/drivers/usb/"$DEV" ]]; then
       printf "Неверно указаны Bus и Port модема.\n" 
       exit 1
      else
      ifdown "$IF" #деактивируем интерфейс
      printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/unbind" && #деактивируем модем
	  read -r -t 1 > /dev/null #ждем секунду
	  printf "%s" "$DEV" > "/sys/bus/usb/drivers/usb/bind" #активируем модем
      ifup "$IF" #активируем интерфейс
      fi
     fi
    fi
  else
   printf "\n"
   printf "Интерфейс %s не существует\n" "$IF"
   printf "\n"
   exit 1
  fi
else
  printf "Модем %s не найден.\n" "$MM"
fi

chmod +x /usr/local/bin/lte_watchdog.sh

Создадим конфигурационный файл


vi /etc/lte_watchdog.conf

# Ресурс, в сети интернет, доступность которого будем проверять. 
SITE=ya.ru
# Интерфейс модема.
IF=wwp6s0u2i1
# Шина и порт, на котором определился USB модем (lsusb -t).
DEV=1-1
# Количество неудачных попыток, после которых перезагружаем модем.
EP=3
# Уникальный идентификатор модема.
MM=Huawei

Создадим systemd сервис и таймер для скрипта.


vi /etc/systemd/system/lte_watchdog.service

[Unit]
Description=LTE USB modem watchdog service
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lte_watchdog.sh -c /etc/lte_watchdog.conf -l /var/log/lte_watchdog.log

vi /etc/systemd/system/lte_watchdog.timer

[Unit]
Description=LTE USB modem watchdog timer

[Timer]
OnCalendar=*-*-* *:05:00
Persistent=true

[Install]
WantedBy=timers.target

Активируем таймер


systemctl enable lte_watchdog.timer
systemctl enable lte_watchdog.timer

25 ноября   linux

Прозрачное проксирование в I2P и TOR.

Заметка написана по мотивам статьи «Прозрачное проксирование в I2P и TOR».

_LANNET_ — локальная подсеть
_WANETH_ — внешний интерфейс
_LANETH_  — внутренний интерфейс

DNSMasq

vi /etc/dnsmasq.conf

log-queries
log-facility=/var/log/dnsmasq.log
listen-address= 0.0.0.0
interface=_LANETH_
except-interface=_WANETH_
domain-needed 
bogus-priv  
strict-order 
no-resolv
server=77.88.8.88
server=8.8.8.8
address=/.onion/10.10.99.99
address=/.i2p/10.10.99.99

systemctl enable dnsmasq.service
systemctl start dnsmasq.service

Tor

vi /etc/tor/torrc

SocksPort 9050
SocksListenAddress 127.0.0.1
ExcludeNodes {ru}, {ua}, {by}
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1

systemctl enable tor.service
systemctl start tor.service

i2pd

vi /etc/i2pd/subscriptions.txt

http://inr.i2p/export/alive-hosts.txt
http://stats.i2p/cgi-bin/newhosts.txt
http://i2p-projekt.i2p/hosts.txt
http://i2host.i2p/cgi-bin/i2hostetag
http://no.i2p/export/alive-hosts.txt
http://rus.i2p/hosts.txt
http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.tx

vi /etc/i2pd/

[IRC]
type = client
address = 127.0.0.1
port = 6668
destination = irc.postman.i2p
destinationport = 6667
keys = irc-keys.dat

systemctl enable i2pd.service
systemctl start i2pd.service

TinyProxy

vim /etc/tinyproxy.conf

User nobody
Group nogroup
Port 8888
Listen _LANNET_
Timeout 200
ErrorFile 404 "/usr/share/tinyproxy/404.html"
ErrorFile 400 "/usr/share/tinyproxy/400.html"
ErrorFile 503 "/usr/share/tinyproxy/503.html"
ErrorFile 403 "/usr/share/tinyproxy/403.html"
ErrorFile 408 "/usr/share/tinyproxy/408.html"
DefaultErrorFile "/usr/share/tinyproxy/default.html"
StatFile "/usr/share/tinyproxy/stats.html"
Logfile "/var/log/tinyproxy/tinyproxy.log"
LogLevel Info
PidFile "/var/run/tinyproxy/tinyproxy.pid"
upstream 127.0.0.1:8123
upstream 127.0.0.1:4444 ".i2p"
upstream 127.0.0.1:8124 ".onion"
MaxClients 100
MinSpareServers 5
MaxSpareServers 20
StartServers 10
MaxRequestsPerChild 0
Allow 127.0.0.1
Allow 192.168.0.0/16
ViaProxyName "tinyproxy"
ConnectPort 443
ConnectPort 563

systemctl enable tinyproxy.service
systemctl start tinyproxy.service

Polipo

vim /etc/polipo/wan.conf

##################
# https://www.irif.fr/~jch/software/polipo/polipo.html#
##################

displayName = WAN
proxyPort = 8123
allowedClients = 127.0.0.1, _LANNET_
dnsQueryIPv6 = false
pidFile = /var/run/polipo/polipo_wan.pid
#######
censoredHeaders = from, accept-language
censorReferer = maybe
disableVia = true
####### Cache #######
diskCacheRoot = "/var/cache/polipo/wan_cache/"
maxDiskCacheEntrySize = 524288
diskCacheDirectoryPermissions = 0700
diskCacheFilePermissions = 0600
relaxTransparency = maybe
dontCacheCookies = true
dontCacheRedirects = true
diskCacheUnlinkTime = 7d
diskCacheTruncateTime = 3d
diskCacheTruncateSize = 1MB
######## Memory ########
chunkHighMark = 50331648
objectHighMark = 16384
######## WEB Interface ########
disableLocalInterface = true
#disableConfiguration = false
#disableIndexing = false
#disableServersList = false
######## Log ########
logSyslog = true
logFile = "/var/log/polipo/wan.log"

vim /etc/polipo/tor.conf

##################
# https://www.irif.fr/~jch/software/polipo/polipo.html#
##################

displayName = TOR
proxyPort = 8124
allowedClients = 127.0.0.1, _LANNET_
dnsQueryIPv6 = false
pidFile = /var/run/polipo/polipo_tor.pid
####### SOCKS #######
socksParentProxy = "127.0.0.1:9050"
socksProxyType=socks5
#######
censoredHeaders = from, accept-language
censorReferer = maybe
disableVia = true
####### Cache #######
diskCacheRoot = "/var/cache/polipo/tor_cache/"
diskCacheDirectoryPermissions = 0700
diskCacheFilePermissions = 0600
relaxTransparency = maybe
dontCacheCookies = true
dontCacheRedirects = true
diskCacheUnlinkTime = 7d
diskCacheTruncateTime = 3d
diskCacheTruncateSize = 1MB
######## Memory ########
chunkHighMark = 50331648
objectHighMark = 16384
######## WEB Interface ########
disableLocalInterface = true
#disableConfiguration = false
#disableIndexing = false
#disableServersList = false
######## Log ########
logSyslog = true
logFile = "/var/log/polipo/tor.log"

vi /etc/systemd/system/polipo@.service

[Unit]
Description=Polipo Proxy Server
After=network.target

[Service]
User=proxy
Group=proxy
Type=simple
Restart=always
PIDFile=/var/run/polipo/polipo_%i.pid
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /var/cache/polipo/%i_cache
ExecStartPre=/bin/chown proxy:proxy /var/cache/polipo/%i_cache -R
ExecStartPre=/bin/chmod 700 /var/cache/polipo/%i_cache -R
ExecStart=/usr/bin/polipo -c /etc/polipo/%i.conf
ExecReload=/bin/kill -USR1 $MAINPID


[Install]
WantedBy=multi-user.target

vi /etc/tmpfiles.d/polipo.conf

d /run/polipo 0755 proxy proxy -

Скрипт для очистки кеша

vi /usr/local/polipo/polipo_trimcache.sh

#!/bin/bash

export PATH="$PATH:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
SN="$(basename "$0")"

function print_help() {
    printf "\n"
    printf "Использование: %s options...\n" "$SN"
    printf "Параметры:\n"
    printf "  -n         Имя копии Polipo.\n"
    printf "  -h         Справка.\n"
    printf "\n"
}

# Если скрипт запущен без аргументов, открываем справку.
if [[ $# = 0 ]]; then
    print_help && exit 1
fi
while getopts ":n:h" opt ;
do
    case $opt in
        n) NAME=$OPTARG;
            ;;
        h) print_help
            exit 1
            ;;
        *) printf "Неправильный параметр\n";
           printf "Для вызова справки запустите %s -h\n" "$SN";
            exit 1
            ;;
        esac
done

if [[ "$NAME" == "" ]] ;  then
 printf "\n"
 printf "Параметры запуска не указаны.\n"
 printf "Для справки наберите: %s -h\n" "$SN"
 printf "\n"
 exit 1
fi

CONFIG_FILE=/etc/polipo/$NAME.conf
FORBIDDEN_FILE=/etc/polipo/forbidden
PIDFILE=/var/run/polipo/polipo_$NAME.pid
RUNAS=proxy

if [ ! -x /usr/bin/polipo ]; then
  exit 0
fi

if [ ! -f "$FORBIDDEN_FILE" ]; then
  FORBIDDEN_FILE=/dev/null
fi

if [ -f "$PIDFILE" ]; then
  # Instruct polipo to to flush its in-memory cache to disk (signal USR1)
  kill -USR1 "$(cat "$PIDFILE")"
  # Allow some time for polipo to perform the requested flush
  sleep 2
  # Since f17, the following su command prints "...killed." to stdout ???
  runuser -s /bin/sh -c \
    "nice polipo -x -c $CONFIG_FILE forbiddenFile=$FORBIDDEN_FILE > /dev/null" \
    $RUNAS 2> /dev/null
  # Instruct polipo to to discard its in-memory cache (signal USR2)
  kill -USR2 "$(cat "$PIDFILE")"
fi

exit 0

vi /etc/systemd/system/polipo_trimcache@.service

Создаем сервис для очистки кеша


[Unit]
Description=Polipo trim cache on %I
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/lib/polipo/polipo_trimcache.sh -n %i

Создаем таймер


vi /etc/systemd/system/polipo_trimcache@.timer
[Unit]
Description=Polipo trim cache timer on %I

[Timer]
OnCalendar=*-*-* 00:00:00
Persistent=true

[Install]
WantedBy=timers.target

Активируем и запускаем сервисы

systemctl enable polipo@wan
systemctl enable polipo_trimcache@wan.timer
systemctl start polipo@wan
systemctl sart polipo_trimcache@wan.timer
systemctl enable polipo@tor
systemctl enable polipo_trimcache@tor.timer
systemctl start polipo@tor
systemctl sart polipo_trimcache@tor.timer
24 ноября   centos   debian   linux   tor

MiniDLNA CentOS7

Оформил пакет MiniDLNA 1.1.5 для CentOS7.
За основу использована официальная, статическая сборка с SourceForge.
Установка производится по стандартным путям, в пакет включен юнит для systemd и пресет для firewalld.

minidlna-1.1.5-1.el7.centos.x86_64.rpm

23 ноября   centos
Ctrl + ↓ Ранее