install-compat32.sh

Щось я заїбався кожного разу вигадувати один і той самий велосипед, тому залишу це тут.
Брудне рішення для встановлення відповідних compat32-пакунків до вже наявних у системі.

Приклад використання:

sh install-compat32.sh ~/14.1/

! Увага !
Скрипт не встановлює multilib-пакунки так як це можна елементарно зробити руцями.

#!/bin/bash

MULTILIBDIR=${1%/}

if [ "$(whoami)" != 'root' ]; then
    echo "Sorry, but this script must be run as root." 1>&2
    exit 1
fi

if [ "$(uname -m)" != 'x86_64' ]; then
    echo "Whoa! Easy there! This CPU architecture is not supported!" 1>&2
    exit 1
fi

if [ -z "${MULTILIBDIR}/slackware64-compat32" ] \
|| [ ! -x "${MULTILIBDIR}/slackware64-compat32" ]; then
    echo "Wrong multilib directory." 1>&2
    echo "Check specified path to multilib root" 1>&2
    exit 1
fi

PKGSSYS=$(cat /var/log/packages/*-x86_64-*   \
       | grep -vP '(PACKAGE .*(NAME|SIZE|LOCATION|DESCRIPTION)|FILE LIST|\-compat32|/)' \
       | awk -F':' '{print $1}'  \
       | sort \
       | uniq)

echo "We're about to begin installation. Following procedure may damage your OS."
echo "Do you wish to continue? [y/n]"
read yn

case "${yn}" in
    [Yy])
        for PKGNAME in ${PKGSSYS[*]}; do
            installpkg ${MULTILIBDIR}/slackware64-compat32/*-compat32/${PKGNAME}-compat32*.t?z
        done
    ;;
    [Nn])
        echo "Got it! Terminating."
    ;;
    *)
        echo "Hmmm... I'm too dumb to understand what that means."
        echo "Try answering 'y' or 'n'."
    ;;
esac

exit 0

slapt-get upgrade notification

Ось така фігня лежить у /etc/cron.daily/pkgsupgrade:

#!/bin/bash

export LANG=en_US.UTF-8

HOSTNAME=$(hostname -f)
PKGLST=''
SLACKVER="$(cat /etc/slackware-version)"
LOCKFILE='/var/lock/packages_for_update'

trap "rm -f ${LOCKFILE}" EXIT SIGINT SIGTERM

if [ -f ${LOCKFILE} ]; then
    echo 'Update checker is locked by another instance!' 1>&2
    exit 1
fi

if slapt-get --update &> /dev/null; then
    PKGLST="$(slapt-get --upgrade --simulate | \
                grep 'to be upgraded\|is to be installed' | \
                sed -e 's/is to be upgraded to version/==>/g' \
                    -e 's/is to be installed/++> install/g' | \
                column -t )"

    [[ ! -z "${PKGLST}" ]] && \
        echo "${PKGLST}" | mail -s "${HOSTNAME} (${SLACKVER}): updates pending" root
fi

exit ${?}

MyIP-сервіс власними руками

Для виконання завдання нам не знадобиться ніяких скриптів, тільки улюблений веб-сервер та підтримка SSI.
Приклад працюючої реалізації можна знайти тут.

index.html

Власне, це і є весь вміст файлу.

<!--#echo var="REMOTE_ADDR" -->
Apache 2

Додаємо до конфігу віртуального хосту чи .htaccess:

...
Options +Includes 
DirectoryIndex index.html
...
NGINX

Додаємо до контексту server/location

server {
  ...
  location / {
    ...
    ssi on;
    index index.html;
    ...
  }
  ...
}
BASH

Аліас для .bashrc

alias myip="curl http://myip.example.com/ 2> /dev/null || echo 'Unable to determine IP address' 1>&2"

Приклад роботи:

sev@meep ~ $ myip                                
192.168.0.124

POODLE

Гав, блін.

Apache 2

/etc/httpd/extra/httpd-ssl.conf:

...
Listen 443
...
SSLProtocol all -SSLv3 -SSLv2
...
NGINX

/etc/nginx/nginx.conf:
Додаємо до контексту http

http {
  ...
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ...
}

Або контексту server

server {
  listen 443;
  ...
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ...
}
Exim

/etc/exim/exim.conf:
Якщо залінкований на OpenSSL:

openssl_options = +no_sslv2 +no_sslv3

Залінкований на GnuTLS:

tls_require_ciphers = NORMAL:!VERS-SSL3.0
Dovecot

/etc/dovecot/dovecot.conf:

ssl_protocols = !SSLv3 !SSLv2

»Читати усьо

Отакої…

SSL errorПісля оновлення до Mozilla Firefox 31 ESR бразузер почав плюватися sec_error_ca_cert_invalid і відмовлятися приймати самопідписний сертифікат.

Всі інші субдомени, які використовують цей же самопідписний вайлдкард, додалися нормально. Лише з cloud’ом виникла біда. Ну не хоче лисиця жерти його, хоч ти лусни.

»Читати усьо

Встановлення Windows 7 з флешки USB 3.0

Стенд: Fujitsu Lifebook NH532
Завдання: Допогти калікам Windows 7 x64 встановитися з флешки під’єднаної до USB 3.0.
Інструменти:

  • Windows 7 USB/DVD Download tool;
  • PowerShell/cmd;
  • dism;
  • мізки, руці.

»Читати усьо

ownCloud filesystem rescan

Для оwnCloud 4
Відкриваємо консоль javascript:

scanFiles();

Функціонал з’явився у ownCloud >= 5.0.10
Щоб перебудувати індекси файлів для одного користувача:

$ cd /var/www/.../owncloud
$ php console.php files:scan vpupkin

Для усіх користувачів:

$ cd /var/www/.../owncloud
$ php console.php files:scan --all

Обмеження MAIL FROM для аутентифікованих користувачів

Обмежуємо спуфінг MAIL FROM аутентифікованим користувачам іменем їх скриньки та іменами аліасів прибитих до неї.

# Головна секція
<...>
AUTH_MAILFROM = SELECT DISTINCT username \
                            FROM users \
                                WHERE (\
                                        username='${quote_mysql:$authenticated_id}' \
                                        AND \
                                        type='mailbox'\
                                      ) OR (\
                                        destination='${quote_mysql:$authenticated_id}' \
                                        AND \
                                        type='alias'\
                                      )
<...>
# Секція ACL
begin acl
deny message       = "Please use your real e-mail address or one of it's aliases as sender's address."
     log_message   = "REJECTED: MAIL FROM restriction violation. User: $authenticated_id; From: $sender_address."
     authenticated = *
     condition     = ${if inlisti{$sender_address}{${sg{${lookup mysql{AUTH_MAILFROM}}}{\\n}{:}}} {no}{yes}}

Exim, spam trap, RBL швидкого реагування

Якщо хост надіслав лист на ханіпот – додати до локального RBL, після того, як він з’явився у публічному DNSBL – видалити з локальної бази нафіг.

# Шлях до БД локального RBL
RBL_DB = /var/db/exim/spam-source.db

# Список публічних поштових сервісів
hostlist public_services = net-iplsearch;/etc/exim/public-services
# Список негідників, які не дотримуються основних положень RFC5321
hostlist rfc_ignorants = net-iplsearch;/etc/exim/rfc-ignorants
# Список спамерів
hostlist spam_source = net-iplsearch;/etc/exim/spam-source : \
                       ${lookup sqlite{RBL_DB \
                           SELECT ip_address \
                               FROM banned_hosts \
                               WHERE ip_address='$sender_host_address';}}
<...>
warn
    set acl_m_dnsbl    = 0
    set acl_m_localrbl = 0
 
 
# Перевіряємо нявність хосту у публічних DNSBL-ах
warn dnslists    = dnsbl.foobar.net : \
                   dul.foobar.net
    !hosts       = +relay_from_hosts : \
                   +public_services
    !recipients  = : soft_recipients
    set acl_m_dnsbl       = 1
 
 
# Перевіряємо нявність хосту у локальному RBL
warn hosts       =  +spam_source
    !hosts       =  +relay_from_hosts : \
                    +public_services
    !recipients  = : soft_recipients
     set acl_m_localrbl = 1
 
 
# Видаляємо з локального RBL, якщо хост знайдено у публічних DNSBL
warn log_message     = "IP address found in public DNSBL: $dnslist_domain. Removing from local RBL."
       condition     = ${if and { \
                                    {eq {$acl_m_dnsbl}{1}} \
                                    {eq {$acl_m_localrbl}{1}} \
                                } {yes}{no}}
       set acl_m_junk = ${lookup sqlite{RBL_DB \
                                    DELETE FROM banned_hosts \
                                    WHERE ip_address='$sender_host_address';}{$value}}
       set acl_m_localrbl = 0
 
 
# Деферимо, якщо "пасажир" у публічному DNSBL
defer message    = "Your IP address is listed in the DNSBL $dnslist_domain: dnslist_text ($dnslist_value)."
 log_message     = DEFERRED: Listed in $dnslist_domain.
 condition       = ${if eq{$acl_m_dnsbl}{1} {yes}{no}}
 delay           = 30s
 
 
# Локальний RBL
defer message    = "Your IP address is listed in the local RBL as the spam source."
 log_message     = DEFERRED: Listed in local RBL
 condition       = ${if eq{$acl_m_localrbl}{1} {yes}{no}}
 set acl_m_junk  = ${lookup sqlite{RBL_DB \
                                    UPDATE banned_hosts SET hit_count=hit_count+1, \
                                                            last_hit=datetime('now','localtime') \
                                                      WHERE ip_address='$sender_host_address';}{$value}}
 delay           = 30s
 
 
# Додаємо до локального RBL
 warn log_message = "Gotcha! Spam trap: $local_part@$domain."
      domains    = myspamtrap.com : \
                   myspamtrap.net : \
                   myspamtrap.org
      !hosts     = +relay_from_hosts : +public_services
      set acl_m_junk = ${lookup sqlite{RBL_DB \
                                       INSERT INTO banned_hosts(ip_address, ptr, added) \
                                           VALUES ('$sender_host_address', '$sender_host_name', datetime('now','localtime'));}{$value}}
<...>

База даних:

CREATE TABLE banned_hosts(
      ip_address varchar(64),
      ptr varchar(64),
      added datetime,
      last_hit datetime,
      hit_count int default 0
);

The file /boot/grub/stage1 not read correctly.

root@pxe:~# chroot /mnt /bin/bash
root@pxe:~# grub-install --no-floppy --recheck /dev/sda
Probing devices to guess BIOS drives. This may take a long time.
The file /boot/grub/stage1 not read correctly.

 
Окей, хуй з тобою. Спробуємо через консоль GRUB-у:

root@pxe:~# grub
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no

Error 2: Bad file or directory type
grub>

»Читати усьо