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?
Niedawno Zgoda wyraził opinię o bibliotece Smack. Niestety, nie powiedział co go tam tak wkurza.
Dlatego Was pytam, drodzy czytelnicy mych wypocin, co taka biblioteka mieć powinna. Czego oczekujecie od biblioteki implementującej XMPP?
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ę.