Znalazłem na sieci śliczny skrypcik do archiwizowania repozytorium svn:
#!/usr/bin/python
# script to backup SVN repos at a given time from the last revision number
# Greg Loscombe
import os
import sys
debug = 0
# build a list of projects and what the last revision backup
basedir = "/home/subversion/basedir"
basebackup = "/var/log/svnbackup"
revlogfile = "/var/log/svnbackup/last_rev"
projects = {}
something_dumped = 0
def get_youngest(proj):
youngest_cmd = "/usr/bin/svnlook youngest " + basedir + proj
if ( debug == 1):
print "command:", youngest_cmd
cmdout = os.popen( youngest_cmd )
rev_youngest = cmdout.read()
rev_youngest = int( rev_youngest.strip() )
cmdout.close()
return rev_youngest
def dump_incremental(base, proj, rev_from, rev_youngest):
location = base + proj + ".dump." + str( rev_from ) + "-" + str(rev_youngest )
if ( debug == 1):
print "Location dumped too", location
incremental = "/usr/bin/svnadmin dump --incremental " + basedir + this_proj + " -r " + str( rev_from ) + ":" + str( rev_youngest ) + " > "+ location
cmdout = os.popen( incremental )
cmdout.close()
if ( debug == 1):
print "Command incremental dump:-", incremental
def update_log():
revfile = file( revlogfile, "w")
for this_proj in projects.iterkeys():
revfile.write( this_proj + " = " + str(projects[this_proj]) + "\n")
if ( debug == 1):
print "New log:-", this_proj + " = " + str(projects[this_proj]) + "\n"
print this_proj + " = " + str( projects[this_proj] )
revfile.close()
def update_error_log(message):
errorfile = file( "/var/log/svnbackup/error_log", "a")
errorfile.write( message )
#errorfile.write( proj + ":" + str( updated_rev ) + ":" + message )
#add more stuff here soon
errorfile.close()
#def update_access_log(message):
#this will print things like last run etc
# main part now, lets get all the old revision numbers we backed up
revfile = open( revlogfile )
while 1:
line = revfile.readline()
if line == "":
break
if ( ( line.startswith("[") or line.startswith("#") ) is False ):
proj, last_rev = line.split(' = ')
last_rev = last_rev.strip()
projects[proj] = int(last_rev)
revfile.close()
# lets get the new youngest and compair, if its newer, then do a incremental dump
# if its older than the last log, we have a problem, log it
# if its the same nothing happens
# if its never been dumped, time for a full dump
for this_proj in projects.iterkeys():
rev_youngest = int( get_youngest(this_proj) )
rev_old = int( projects[this_proj] )
if ( debug == 1 ):
print "this project", this_proj, "old revision", rev_old, "youngest", rev_youngest
if ( rev_old > rev_youngest ):
errmessage = "logged backed up revision " + str(rev_old) + " > youngest current revision " + str(rev_youngest) + "\n"
#update_error_log(this_proj, rev_youngest, errmessage)
update_error_log(errmessage)
elif ( rev_old == 0 ):
print "First time dump, do it all for", this_proj, "upto", rev_youngest
dump_incremental(basebackup, this_proj, 0, rev_youngest)
something_dumped = something_dumped + 1
projects[this_proj] = int(rev_youngest)
elif ( rev_old < rev_youngest ):
print "Update for project", this_proj, "upto", rev_youngest
rev_from = rev_old + 1
dump_incremental(basebackup, this_proj, rev_from, rev_youngest)
something_dumped = something_dumped + 1
projects[this_proj] = int(rev_youngest)
elif ( rev_old == rev_youngest ):
print "Revisions have not changed for project", this_proj
# if something changed then its time to update the last logged file
if ( something_dumped > 0 ):
print something_dumped, "repos have changed since last dump"
update_log()
else:
print "Nothing has changed, nothing done"
# the end
W pliku /var/log/svnbackup/last_rev należy umieścić nazwę repozytorium i numer ostatniej zarchiwizowanej wersji, np.:
/jaxmpp = 0
/proplan = 0
Całość dodać można sobie do crona, i już mamy eleganckie, przyrostowe backupy repozytorium.
Dwa dni walczyłem z konfiguracją Springa chcąc włączyć kontrolę dostępu do beanów w kontenerze. Dziś zdenerwowałem się, podłączyłem debugger do JBossa i zacząłem wszystko wykonywać krokowo. Po kilku próbach powiązanych z przecieraniem oczu ze zdumienia, dostrzegłem to! Jeden z niepasujących do siebie łańcuchów wyglądał tak: "ROLE_SUPERVISOR", a drugi tak: "ROLE_SUPERVISOR ".
Dwa dni z życiorysu przez jedną spację, która znalazła się w pliku konfiguracyjnym!
Jak widać, nowoczesne technologie i inne wynalazki nie ochronią nas przed najstarszymi błędami programistycznymi.
Ostatnio, przy wylogowaniu z systemu transakcyjnego, mój bank poprosił mnie o wypełnienie ankiety. Czemu nie? Wypełniam. W pewnym momencie patrzę na ekran i co widzę? Widzę pytanie o system operacyjny jakiego używam przy załatwianiu spraw bankowych, Oprócz wszystkich wersji windows znajdowała się tam również pozycja "Linuks".
Nie byłoby w tym nic dziwnego, gdyby nie to, że jakiś czas wcześniej dostałem od banku odpowiedź tej treści:
Witam serdecznie, system Pl@net został stworzony i testowany do współpracy z systemem Windows i tylko w zakresie tego systemu bank świadczy pomoc techniczną. Jeżeli chodzi o system Linux, ze względu na jego liczne odmiany , jak również na to że sieć banku działa na platformie Microsoft nie jesteśmy w stanie zagwarantować poprawnej współpracy systemu Pl@net z tym system opreracyjnym, jak również technicznej asysty. Z poważaniem , [imię] [nazwisko]
Problemy dotyczące pracy na Linuksie dotyczą głównie spieprzonych appletów. Jak widać, nawet w Javie da się napisać applety, działające tylko pod windą.
Muszę szybko zmienić bank. Tylko na jaki? W tym można było wypłacać gotówkę bez prowizji we wszystkich bankomatach.
Mam trochę gotówki. Ale nie kupię sobie notebooka. Całą posiadaną gotówkę wydam na kilka pieczątek i podpisów u notariusza.
A za 3¼KPLN mógłbym mieć HP nx 9020.
Fuck!
Czemu to takie drogie?
Robię się popularny wśród jellonków. To fragment z chatroomu linux@chat.chrome.pl:
[13:05:06] *** szukammiłegochłopaka zmaterializował się. [13:05:20] <badmad> lawnmower: nie przesadzaj [13:05:23] <szukammiłegochłopaka> czesc wszystkim [13:05:34] <lawnmower> CZEŚĆ szukammiłegochłopaka SKĄD KLIKASG [13:05:39] <lawnmower> KLIKASH [13:06:48] <koorek> czesc szukammiłegochłopaka [13:06:59] <szukammiłegochłopaka> czesc [13:07:00] <koorek> ale tu sa sami mili, tylko zaden przystojny :P [13:07:12] <szukammiłegochłopaka> haha [13:07:48] <koorek> Aniu, nie obraz sie, ale z tego pewnie nic by nie wyszlo ;-) [13:08:00] <bmalkow> JeStHeM wysOkjMm pshysthojnym fFłOpcem i shukAM mEEłeY dzjeffTshYnyYYyy! [13:08:13] <maniel> :P [13:08:24] <maniel> wyroxił:P [13:08:34] <koorek> na maxa :P [13:08:40] <szukammiłegochłopaka> bmalkow jak masz an imie [13:08:41] <koorek> lol [13:08:47] <koorek> o nie, to nie oze byc prawda
Stwierdziłem, że mając zewntrzne IP warto pokusić się o jakiś firewallik. Jak pomyślałem, tak usiłowałem zrobić. Sięgnąłem zatem do tutoriala do iptables. Zapodałem tamtejszy przykładzik:
## Załaduj moduły śledzenia połączeñ (niepotrzebne jeśli wbudowane w kernel)
# insmod ip_conntrack
# insmod ip_conntrack_ftp
## Stwórz łañcuch blokujący nowe połączenia, z wyjątkiem tych od środka
# iptables -N block
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A block -m state --state NEW -i ! eth0 -j ACCEPT
# iptables -A block -j DROP
## Do łañcuchów INPUT i FORWARD dodaj skok do tego nowego łañcucha
# iptables -A INPUT -j block
# iptables -A FORWARD -j block
I co? I dupa: ping: sendmsg: Operation not permitted.Cholernie skuteczny ten firewall :-/
Próbowałem się też bawić Firewall Builderem ale efekt podobny. Co ja spieprzyłem?
Migracja na Linuksa chyba akońzy się powodzeniem. Żona, po pewnych oporach, chyba zaczyna akceptować Linuksa z Gnomem. PSI nawet przypadł Jej do gustu, a Evolution stał się nowym, ślicznym, uruchamianym codziennie klientem pocztowym.
Jeszcze tylko jakiś ładny klient do czytania newsów by się przydał.
Sprawiłem sobie nowy szablon. Jeszcze wszystko nie jest skończone, ale i tak go zostawię!
Drugim krokiem będzie zrobienie szablonów w FMPP, trzecim zaś zrobienie z tego wszystkiego strony domowej z albumem i innymi bajerami.
...prima aprilisa.
Mimo moich manii prześladowczych (objawia się to stosowaniem kryptografii gdzie się da) i stosowania zasady ograniczonego zaufania (objawia się to dziewięćdziesięcio dziewięcio procentową nieufnością), boli mnie, że dzisiaj muszę przestać ufać całkowicie wszystkiemu co czytam lub słyszę.