mcedit і mc кольори

Стандартна убунтівська кольорова схема для mcedit просто виїдає мозок. Є кусок роботи, де потрібно правити код в mcedit таки. Вставляємо наступний сніпєтц в .bashrc

автоматизація підключення WebDAV-шари

Є багато машин, на кожну потрібно підключити відповідну webdav-шару. Формат http://davhost/pc_0xx і 192.168.0.xx клієнт, відповідно.
#!/bin/bash

IP=`ifconfig | grep -v '127.0.0.1' | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p'`
IP_ARRAY=(${IP//./ })

FSTAB=/etc/fstab
USER_HOME=/home/user
CLIENT_DIR=$USER_HOME/client
DAVFS_DIR=.davfs2
CLIENT_SECRET=secrets

if [ ! -d $CLIENT_DIR ]; then
    echo "create $CLIENT_DIR"
    mkdir $CLIENT_DIR
    chown user:user $CLIENT_DIR
else
    echo "exist $CLIENT_DIR"
fi

if [ ! -d $USER_HOME/$DAVFS_DIR ]; then
    echo "create $USER_HOME/$DAVFS_DIR"
    mkdir $USER_HOME/$DAVFS_DIR
    chown user:user $USER_HOME/$DAVFS_DIR
else
    echo "exist $USER_HOME/$DAVFS_DIR"
fi

if [ ! -f $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET ]; then
    echo "create $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET"
    touch $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    chown user:user $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    chmod 0600 $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
    echo "http://davhost/pc_0${IP_ARRAY[3]} user user" >> $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET
else
    echo "exist $USER_HOME/$DAVFS_DIR/$CLIENT_SECRET"
fi

if grep "http://davhost/pc_0${IP_ARRAY[3]}" $FSTAB
then
    echo "exist mount access in $FSTAB"
else
    echo "create mount access in $FSTAB"
    echo "http://davhost/pc_0${IP_ARRAY[3]} /home/user/client davfs user,rw,auto,_netdev 0 0" >> $FSTAB
fi

chmod u+s /sbin/mount.davfs
usermod -a -G davfs2 user

files list file for package 'xxx' is missing final newline

Сьогодні при оновленні Ubuntu отримав САБЖ помилку. Наступний вигуглений скрипт вирішує проблему.
#!/usr/bin/python


# 8th November, 2009
# update manager failed, giving me the error:
#       'files list file for package 'xxx' is missing final newline' for every package.
# some Googling revealed that this problem was due to corrupt files(s) in /var/lib/dpkg/info/
# looping though those files revealed that some did not have a final new line
# this script will resolve that problem by appending a newline to all files that are missing it
# NOTE: you will need to run this script as root, e.g. sudo python newline_fixer.py

import os

dpkg_path = '/var/lib/dpkg/info/'
paths = os.listdir(dpkg_path)
for path in paths:
    path = dpkg_path + path
    f = open(path, 'a+')
    data = f.read()
    if len(data) > 1 and data[-1:] != '\n':
        f.write('\n')
        print 'added newline character to:', path
    f.close() 

Підбираємо опримальний об'єм пам'яті для zoneminder

#!/bin/sh
# Copyright (C) 2010 Chris "Pada" Kistner
# Modified by PacoLM to check only shared memory settings
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# if you find errors, check that coreutils are installed, if not, run the command below
# apt-get -y install coreutils bc
echo "--- Checking memory setting..."
page_size=$(getconf PAGE_SIZE)
mem_bytes=$(awk '/MemTotal:/ { printf "%0.f",$2 * 1024}' /proc/meminfo)
mb=1048576
mem_bytes_mb=$(expr $mem_bytes / $mb)
shmmax=$(echo "$mem_bytes * 0.90" | bc | cut -f 1 -d '.')
shmmax_mb=$(expr $shmmax / $mb)
shmall=$(expr $mem_bytes / $page_size)
shmmax_cur=$(sysctl -n kernel.shmmax)
shmmax_cur_mb=$(expr $shmmax_cur / $mb)
shmall_cur=$(sysctl -n kernel.shmall)
echo "-- Total memory = $mem_bytes B = $mem_bytes_mb MB"
echo "-- Page size = $page_size B"
echo "-- Current kernel.shmmax = $shmmax_cur B = $shmmax_cur_mb MB"
echo "-- Current kernel.shmall = $shmall_cur pages"
if [ "$shmmax" -eq "$shmmax_cur" ] && [ "$shmall" -eq "$shmall_cur" ]; then
    echo "-- Recommended shm values already set"
else
    echo "-- Recommended: kernel.shmmax = $shmmax B = $shmmax_mb MB"
    echo "-- Recommended: kernel.shmall = $shmall pages"
fi
# Done
echo "--- Done."

додатковий трафік з Google Images

В свій час писав автоматизацію для наповнення інтернет-магазину, яка використовувала пошук в "Google Images". І час від часу натрапляв на сайти, де знаходився потрібний мені малюнок, але я не встигав на нього клікнути чи то скопіювати шлях, як відбувався повний перехід на вищезгаданий сайт з фреймів "Google Images". І перехід не на потрібну мені сторінку, де є малюнок, а в корінь сайту. Велика незручність для кінцевого користувача і додатковий трафік для власнику сайту. Про корисність цього трафіку можна довго сперечатись, але і немає страху втратити цього випадкового відвідувача :)
Технічний момент. В head'і прописуємо:
<script type='text/javascript'>
    if (parent.frames.length > 0) {.
        //parent.location.href = location.href;
        parent.location.href = 'http://t-v.te.ua';
    }
</script>

Закоментований варіант - перехід на сторінку де є малюнок, розкоментований - в корінь сайту.

split на bash'і

snat=(
    55410:192.168.10.99:80
    55415:192.168.10.199:80
    55411:192.168.20.99:80
    55412:192.168.30.199:80
    55413:192.168.24.99:80
    55414:192.168.20.199:80
)

for i in ${snat[@]}; do
    set -- "$i"
    IFS=":"; declare -a Array=($*)

    iptables -A FORWARD -p tcp -s ${Array[1]} --sport ${Array[2]} -j ACCEPT
    iptables -A FORWARD -p tcp -d ${Array[1]} --dport ${Array[2]} -j ACCEPT
    iptables -t nat -A PREROUTING -p tcp -i eth0 --dport ${Array[0]} -j DNAT --to-destination ${Array[1]}\:${Array[2]}

    echo "${Array[@]}"
done
п.с. збоченська мова

Багатопотокова проксі-чекалка на Python

#!/usr/bin/python

import Queue
import threading
import MySQLdb
import urllib2
import time

class DB:
    conn = None
    def connect(self):
        self.conn = MySQLdb.connect(host = "x.y.z.q", user = "user", passwd = "password", db = "database")
    def query(self, sql):
        try:
            cursor = self.conn.cursor()
            cursor.execute(sql)
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            cursor = self.conn.cursor()
            cursor.execute(sql)
        return cursor

proxyList = []

global db
db = DB()
curr = db.query("SELECT url FROM proxy")
result_set = curr.fetchall ()
for row in result_set:
    proxyList.append(row[0])

queue = Queue.Queue()

class ThreadUrl(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            host = self.queue.get()
            try:
                proxy_handler = urllib2.ProxyHandler({'http':host})
                opener = urllib2.build_opener(proxy_handler)
                opener.addheaders = [('User-agent','Mozilla/5.0')]
                urllib2.install_opener(opener)
                req = urllib2.Request("http://www.proxylists.net/proxyjudge.php")
                sock=urllib2.urlopen(req, timeout= 7)
                rs = sock.read(5000)
                if 'ProxyLists.Net - Proxy judge' in rs:
                    print "ok %s" % host
                    db.query("UPDATE proxy SET checked=NOW() WHERE url = '%s' " % host)

            except:
                print "err %s" % host
                db.query("DELETE FROM proxy WHERE url LIKE '%s' " % host)

            self.queue.task_done()

def main():
    for i in range(20):
        t = ThreadUrl(queue)
        t.setDaemon(True)
        t.start()

    for host in proxyList:
        queue.put(host)

    queue.join()

main()