C jak configure

Październik 12, 2009

natd + amd64 + slow apache

Zaszufladkowany do: konfiguracja — erendil @ 10:38 pm

sysctl net.inet.tcp.tso=0

or write in rc.conf

ifconfig interface_name inet address_ipv4 netmask net_mask -tso

Maj 6, 2009

apache + ap_palloc = error

Zaszufladkowany do: konfiguracja, programowanie — erendil @ 10:34 am
Tags: , ,

zalatwiamy to za pomoca:

cd src/Makefile odszperac

LDFLAGS_SHLIB_EXPORT=

i zamienic na

LDFLAGS_SHLIB_EXPORT=-Wl,-E

Marzec 19, 2009

django – djangobook offline

Zaszufladkowany do: django, programowanie — erendil @ 4:08 pm
Tags: , ,

Króciutki skrypt w pythonie do zrobienia lokalnej kopii djangobook’a (http://djangobook.com/):

from BeautifulSoup import BeautifulSoup as Soup
from urllib import urlopen

Soup.QUOTE_TAGS['pre'] = None

plik=file('djangobook.html', 'w')                                                                                         

link = 'http://www.djangobook.com/en/2.0/' + 'chapter%02d/'    

for i in range(1, 21):
#] + ['appendix%s/' % chr(i) for i in range(ord('A'), ord('I'))]:
        print i
        soup = Soup(urlopen(link % i))
        content = soup.find('div', attrs={'class': 'yui-b'})
        plik.write(content.renderContents())

link = 'http://www.djangobook.com/en/2.0/appendix%s/'

for i in 'ABCDEFGH':
#] + ['appendix%s/' % chr(i) for i in range(ord('A'), ord('I'))]:
        print i
        soup = Soup(urlopen(link % i))
        content = soup.find('div', attrs={'class': 'yui-b'})
        plik.write(content.renderContents())
plik.close()

Marzec 16, 2009

DJANGO – własne logi

Zaszufladkowany do: django, konfiguracja, programowanie — erendil @ 1:55 pm
Tags: ,

Mały middleware zapisujący do pliku wszystkie żadania HTTP i zapytania SQL wraz z czasem ich wykonania.

W głównym katalogu naszego programu(tam gdzie mamy url.py, settings.py itd) tworzymy plik logowaczka.py o poniższej treści:

# logowaczka.py
from django.db import connection
from django.conf import settings
from datetime import datetime

class Logowaczka(object):

def process_response(self, request, response):
file = open(‘logowaczka.txt’,'a’)
if not request.path_info.startswith(‘/media/’):
# Http
text = ‘-’ * 120
text += ‘nPrzetwarzany URL %s (for %s at %s)’ % (request.path, request.META.get(‘REMOTE_ADDR’), datetime.now())
text += ‘n ID sesji: %s’ % request.COOKIES.get(’sessionid’)
text += ‘n Parametry: [%s] %s %s’ % (request.method, request.raw_post_data, request.META.get(‘QUERY_STRING’))

# SQL
for q in connection.queries:
sql, time = q['sql'], q['time']
text += ‘ > %sn Czas zapytania SQL: %sn’ % (sql, time)

print >> file, text
file.close()
return response

W settings.py dodajemy do middleware naszą klasę:

MIDDLEWARE_CLASSES = (
‘django.middleware.common.CommonMiddleware’,
‘django.contrib.sessions.middleware.SessionMiddleware’,
‘django.contrib.auth.middleware.AuthenticationMiddleware’,
‘logowaczka.Logowaczka’,

)

Tworzymy plik logowaczka.txt:

touch logowaczka.txt

Odpalamy django.

Listopad 24, 2008

mysql – wyszukiwarka (FULLTEXT search)

Zaszufladkowany do: konfiguracja — erendil @ 4:11 pm
Tags: , , ,

Kiedyś stanąłem wobec problemu zrobienia prostej wyszukiwarki. Jako że z natury rzeczy jestem bardzo leniwym stworzeniem, nie miałem wyjścia – użyłem google :) Mister google powiedział tak:

Dodaj indeks FULLTEXT polom w których chcesz szukać:

ALTER TABLE news ADD FULLTEXT(news_tytul, news_tresc);

Zadaj pytanie używając poniższej składni:

SELECT * FROM news WHERE MATCH(news_tytul, news_tresc) AGAINST (‘szukane_slowo’);

Proste, szybkie i łatwe – prawda? Cóż więcej trzeba leniwcom :)

Po szczegóły odsyłam tutaj: http://devzone.zend.com/article/1304-Using-MySQL-Full-text-Searching

mysql – ściąga, typowe operacje na bazach/tabelach i danych

Zaszufladkowany do: konfiguracja — erendil @ 1:49 pm
Tags: , ,

# Utworzenie użytkownika

CREATE USER user [IDENTIFIED BY [PASSWORD] ‘password’];

# Utworzenie bazy

$ mysqladmin -u <username> -p create <nazwa_bazy>

# Skazowanie bazy

$ mysqladmin -u <username> -p drop <nazwa_bazy>

# Wyświetlenie listy procesów

$ mysqladmin -u root -p proc

# Pokazanie statusu bazy co 5 sekund

$ mysqladmin -u root -p -i 5 status

# Zrzucenie bazy/baz

$ mysqldump –opt -u <user> -h <host> <nazwa bazy> -p > /sciezka/do_pliku/baza.sql

$ mysqldump –opt -u <user> -h <host> –all-databases -p > /sciezka/do_pliku/bazy.sql

# Import bazy

$ mysql -h <host> -u <user> <nazwa_bazy> -p < /sciezka/do_pliku/baza.sql

# Nadanie praw

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON <dbname>.* TO <dbuser@localhost> [IDENTIFIED BY '<password>'];

# Zdjęcie praw

REVOKE ALL ON <dbname> FROM <dbuser@localhost>;

# Dodawanie/usuwanie bazy/tabel

CREATE DATABASE <dbname>;

DROP DATABASE <dbname>;

DROP TABLE <tablename1[, table2, table3...]>;

# Przeładowanie uprawnień

FLUSH PRIVILEGES;

# Użycie bazy

USE <nazwa_bazy>;

# Pokazanie baz

SHOW DATABASES;

# Pokazanie tabel z prefix’em

SHOW TABLES LIKE ‘prefix%’;

# Różne takie

SELECT * FROM <nazwa_tabeli>;

DESCRIBE <nazwa_tabeli>;

INSERT INTO <tabela> <user, password, name1, name2, …> VALUES (‘user’, password(‘pass’), ‘wartosc1′, ‘wartosc2′ …);

CREATE TABLE <nowa_tabela> AS SELECT DISTINCT <pole> FROM <stara_tabela>;

INSERT INTO <nazwa_bazy.tabela> SELECT * FROM <nazwa_bazy.tabela> WHERE <pole> = <wartosc>;

ALTER TABLE <stara_nazwa_tabeli> RENAME <nowa_nazwa_tabeli>;

UPDATE <nazwa_tabeli> SET <pole> = <nowa_wartosc> [WHERE <pole2> = <wartosc>];

# Sprawdzenie indeksów:

mysql> SHOW INDEX FROM <nazwa_tabeli> [FROM <nazwa_bazy>]

# Dodanie indeksów:

mysql> ALTER TABLE `<naza_tabeli>` ADD INDEX (`<pole>`);

# Usunięcie indeksów:

mysql> ALTER TABLE `<nazwa_tabeli>` DROP INDEX `<pole>`;

# Zmiana zmiennych serwera mysql podczas pracy
# Ustawienie zmiennych globalnych

mysql> SET @@global.<zmienna>=<wartosc>;

# Ustawienie zmiennych sesji

mysql> SET @@session.<zmienna>=<wartosc>;

# Pokazanie zmiennych:

mysql> SELECT @@[global|session].<zmienna>

# Dodatkowy user z prawami root’a

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘<user>’@'localhost’ IDENTIFIED BY PASSWORD ‘<password>’ WITH GRANT OPTION;

# Pokazanie praw danego usera

mysql> show grants for ‘user’@'localhost’;

# Usunięcie wszystkich praw danemu userowi

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM ‘user’@'localhost’;

# Usunięcie anonimowych userów

mysql> DROP USER ''@'localhost';

# Optymalizacja tabel mysql

OPTIMIZE TABLE nazwa_tabeli1[,kolejna_nazwa_tabeli]…

mysqlcheck -o -u root -p –all-databases

$ myisamchk –quick –check-only-changed –sort-index –analyze *.MYI

# Naprawa tabel mysql

CHECK TABLE <nazwa_tabeli>
REPAIR TABLE <nazwa_tabeli>
myisamchk -e *.MYI
myisamchk -r -q <nazwa_tabeli> (-r -q means `quick recovery mode’)

Listopad 20, 2008

Django – dodawanie pól do modelu bez utraty danych

Zaszufladkowany do: django, programowanie — erendil @ 11:40 am
Tags: , , ,

Komenda python manage.py syncdb tworzy nowe tabele bez modyfikowania istniejących. Co zrobić jeśli chcemy rozbudować nasz model, a nie chcemy stracić danych już wprowadzonych? Proste rozwiązanie poniżej.

1) Robimy zrzut bazy danych:

python manage.py dumpdata nazwa_aplikacji > backup.sql

2) Dodajemy nowe atrybuty do modelu określając domyślne atrybuty, uzupełniając już istniejące o domyślne wartości

3) Resetujemy aplikację by wykreować zmodyfikowane tabele

python manage.py reset nazwa_aplikacji

4) Wczytujemy dane zrzucone w pkt 1.

python manage.py loaddata backup.sql

Alternatywną metodą jest użycie django-evolution, ale powyższa metoda pozwala na zmiany bez grzebania się w kodzie.

Listopad 4, 2008

clamav + clamsmtpd + postfix

Zaszufladkowany do: konfiguracja — erendil @ 12:34 pm
Tags: , , ,

Dodajemy usera i grupę clamav:

pw group add clamav -g 106
pw user add clamav -c “ClamAVUser” -d “/nonexistent” -s “/sbin/nologin” -u 106 -g 106

Sciagamy źrodła, rozpakowujemy, configure+opcje (np. –prefix=/usr/local, generalnie polecam odpalic z –help), make, make install

Tworzymy katalog na sygnatury i ustawiamy prawa:

mkdir -p /var/lib/clamav
chown clamav:clamav /var/lib/clamav

Dostosowujemy zawartość plików /usr/local/etc/clamd.conf i /usr/local/etc/freshclam.conf, odpalamy z reki + dopisujemy do skryptów startowych.

Uruchamiam calość:

/usr/local/bin/freshclam –config-file=/usr/local/etc/freshclam.conf -d

/usr/local/sbin/clamd -c /usr/local/etc/clamd.conf

Ściągamy clamsmtpd,

http://memberwebs.com/stef/software/clamsmtp/clamsmtp-1.10.tar.gz

./configure –prefix=/usr/local
make
make install

Edytujemy /usr/local/etc/clamsmtpd.conf

/usr/local/sbin/clamsmtpd -f /usr/local/etc/clamsmtpd.conf -p /var/run/clamav/clamsmtpd.pid

Zmieniamy main.conf i master.cf, restartujemy postfix’a


Pliki konfiguracyjne
postfix’a, clamd, clamsmtpd i freshclam’a:

W main.cf na końcu dodajemy linijkę:

content_filter = scan:[127.0.0.1]:10025

Zawartość master.cf:

smtp inet n – n – – smtpd
scan unix – – n – 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no
127.0.0.1:10026 inet n – n – 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

pickup fifo n – n 60 1 pickup
cleanup unix n – n – 0 cleanup
qmgr fifo n – n 300 1 qmgr
tlsmgr unix – – n 1000? 1 tlsmgr
rewrite unix – – n – – trivial-rewrite
bounce unix – – n – 0 bounce
defer unix – – n – 0 bounce
trace unix – – n – 0 bounce
verify unix – – n – 1 verify
flush unix n – n 1000? 0 flush
proxymap unix – – n – – proxymap
proxywrite unix – – n – 1 proxymap
smtp unix – – n – – smtp
relay unix – – n – – smtp
-o smtp_fallback_relay=
showq unix n – n – – showq
error unix – – n – – error
retry unix – – n – – error
discard unix – – n – – discard
local unix – n n – – local
virtual unix – n n – – virtual
lmtp unix – – n – – lmtp
anvil unix – – n – 1 anvil
scache unix – – n – 1 scache

Zawartość clamd.conf:

LogSyslog yes
LogFacility LOG_MAIL
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /var/db/clamav
LocalSocket /tmp/clamd.socket
FixStaleSocket yes
User clamav
ScanMail yes

Zawartość clamsmtpd.conf:

OutAddress: 10026
MaxConnections: 64
ClamAddress: /tmp/clamd.socket
Header: X-Virus-Scanned: AV Scaner 0.9
TempDirectory: /var/db/clamav/viruses
Action: drop
Quarantine: on
User: clamav

Zawartość freshclam.conf:

DatabaseDirectory /var/db/clamav
LogVerbose yes
LogSyslog yes
LogFacility LOG_MAIL
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror database.clamav.net
MaxAttempts 5
ScriptedUpdates yes
Checks 24
NotifyClamd /usr/local/etc/clamd.conf

Październik 29, 2008

PgBouncer – PostgreSQL connection pooler

Zaszufladkowany do: konfiguracja — erendil @ 4:32 pm
Tags: , , ,

PgBouncer to niezła alternatywa dla pgpool’a. Jego głównym zadaniem jest odciążyć nieco naszego PostgreSQL’a zabijanego kolejnymi connect’ami. PgBouncer tworzy pulę połączeń do serwera bazy danych i wydajnie z niej korzysta. Dostępne są następujące tryby:

Session pooling -gdy klient się łączy, połączenie z serwerem zostanie przypisane do niego przez cały czas, po rozłączeniu wraca z powrotem do puli.

Transaction pooling – połączenie aktywne tylko podczas transakcji, po jej zakończeniu wraca.

Statement pooling – najbardziej agresywna metoda, połącznie wraca do puli natychmiast po wykonaniu kwerendy(generalnie nie polecana ;) )

Administracja PgBouncer‘em jest bardzo prosta i sprowadza się do kilku poleceń kiedy jesteśmy podłączeni do wirtualnej bazy PgBouncer‘a, ale o tym później.

Na początek zainstalujemy PgBouncer‘a, ściągamy źródła stąd: http://pgfoundry.org/projects/pgbouncer

Do prawidłowego zainstalowania w systemie potrzebujemy również libevent.

cd /usr/ports/devel/libevent
make
make install

Ok libevent siedzi na miejscu, teraz zróbmy sobie PgBouncer‘a:

Rozpakowujemy źródła i piszemy:

cd pgbouncer-1.2.3
./configure –with-libevent=/usr/local
gmake
gmake install

Teraz pora na przygotowanie plików konfiguracyjnych dla programu, potrzebne są 2, jeden plik dla PgBouncer‘a, drugi plik z userami i hasłami.

Prosta zawartość pierwszego z nich (/usr/local/etc/pgbouncer.ini):

[databases]
naszabaza = host=127.0.0.1 port=5432 dbname=naszabaza

[pgbouncer]
listen_port = 6543
listen_addr = 127.0.0.1
auth_type = plain
auth_file = /usr/local/etc/users.txt
logfile = /var/log/pgbouncer.log
pidfile = /tmp/pgbouncer.pid
admin_users = uzytkownik
max_client_conn = 300
default_pool_size = 200
pool_mode = session
server_connect_timeout = 300
client_login_timeout = 300

Oraz drugiego (/usr/local/etc/users.txt):

“uzytkownik” “haslo_uzytkownika”

Uwierzytelnianie użytkowników:

md5 – domyślnie stosowane
crypt – czyli crypt
plain – czysty tekst, czyli niezakodowane
trust – zaufany – brak autentykacji, ale plik users.txt musi zawierać nazwę użytkownika
any – j.w. plus nazwa użytkownika jest ignorowana, wymaga aby wszystkie bazy danych zostały skonfigurowane do logowania się jako konkretny użytkownik.
Do kodowania haseł można wykorzystać np. Apache’owy htpasswd.
OK, mamy zainstalowanego PgBouncer‘a, czas go uruchomić, robimy to za pomocą następującej komendy (jako user, a nie root ;) :
/usr/local/bin/pgbouncer -d /usr/local/etc/pgbouncer.ini
Konsola administracyjna:
psql -h 127.0.0.1 -p 6543 -U user pgbouncer

Po zalogowaniu poleceniem show help; zobaczymy liste dostępnych komend.

pgbouncer=# show help;
NOTICE:  Console usage
DETAIL:
SHOW [HELP|CONFIG|DATABASES|FDS|POOLS|CLIENTS|SERVERS|SOCKETS|LISTS|VERSION]
SET key = arg
RELOAD
PAUSE
SUSPEND
RESUME
SHUTDOWN

Maj 15, 2008

fuse user filesystem ssh i freebsd

Zaszufladkowany do: konfiguracja — erendil @ 5:00 pm
Tags: , , ,

Zaczynamy od zainstalowania:

cd /usr/ports/sysutils/fusefs-sshfs; make install clean

By nasz fs wstawał przy starcie systemu do /etc/rc.conf dodajemy linijkę:

fusefs_enable=”YES”

Jeśli chcemy pozwolić userom na montowanie to klepiemy z konsoli:

sysctl vfs.usermount=1

Odpalamy z ręki nasz fs:

/usr/local/etc/rc.d/fusefs start

Aby sprawdzić czy moduł jest załadowany piszemy:

kldstat

Powinien pojawić się gdzieś tam napis

fuse.ko

Montowanie zdalnych udziałów jest banalne, robimy to za pomocą komendy:

sshfs login@host.domena.pl: /mnt/gdzie_zamontowac

Odmontowanie zasobu:

umonut /mnt/gdzie_zamontowac

Do czego można to wykorzystać? A na to pytanie trzeba sobie odpowiedzieć samemu :) Ja mam kilka zastosowań ;)

Następna strona »

Blog na WordPress.com.