SOGo – tipy z provozu – zálohování, náprava špatně nastavených práv na kalendáře

Delší dobu používáme jako kalendářový server a webmail SOGo. Uživatelé přistupují ke kalendářům převážně z tlustého klienta – buď Thunderbird/Lightning na Linuxu a Windows nebo iCal/Callendar na Mac OS X. Během provozu SOGo jsem narazil na pár problémů znepříjemňujících život, ale postupně je autoři opravili. Nejvíc mi dal zabrat problém co jsem si způsobil sám – nefungovala práva sdílení na nově vytvořené kalendáře.


Zálohování

Provozujeme SOGo na CentOSu, instalaci SOGo provádím z repozitáře RPM balíčků http://inverse.ca/downloads/SOGo/RHEL6/. Zálohujeme pravidelně všechny emaily, databázi kterou SOGo používá i souborový systém kde je SOGo nainstalované, ale přesto mi připadlo vhodné zálohovat ještě zvlášť nastavení uživatelských profilů v SOGu a kalendářů jednotlivých uživatelů, hlavně kvůli snadnosti obnovy. Obnovovat celou databázi SOGa kvůli jednomu smazanému kalendáři uživatele je opruz.

Součástí SOGo je nástroj sogo-tool (/usr/sbin/sogo-tool), který umožňuje provést zálohu, ale také obnovu. SOGo nám běží pod uživatelem „sogo“ pod kterým je také třeba sogo-tool spouštět.

Záloha všeho: sogo-tool backup /adresar/kam/zalohovat ALL

Záloha konkrétních uživatelů: sogo-tool backup /adresar/kam/zalohovat uzivatel@domain.tld

[sogo@neon ~]$ sogo-tool backup /home/sogo/a/ zdenek.burda@bcvsolutions.eu
Oct 25 21:18:12 sogo-tool [26563]: <0x0x2352cb8[SOGoCache]> Cache cleanup interval set every 5.000000 seconds
Oct 25 21:18:12 sogo-tool [26563]: <0x0x2352cb8[SOGoCache]> Using host(s) 'localhost' as server(s)

Program vytvoří textový soubor /home/sogo/a/uzivatel@domain.tld ve kterém je nastavení uživatele, kalendář, kontakty, nastavení sdílení apod.

Výpis položek k obnově pro uživatele: sogo-tool restore -l /adresar/kam/zalohovat uzivatel@domain.tld

[sogo@neon ~]$ sogo-tool restore -l /home/sogo/a/ zdenek.burda@bcvsolutions.eu
Oct 25 21:16:44 sogo-tool [26523]: <0x0x2878778[SOGoCache]> Cache cleanup interval set every 5.000000 seconds
Oct 25 21:16:44 sogo-tool [26523]: <0x0x2878778[SOGoCache]> Using host(s) 'localhost' as server(s)
2012-10-25 21:16:44.480 sogo-tool[26523] Restorable folders:
2012-10-25 21:16:44.481 sogo-tool[26523]   'tsunami': Calendar/personal
2012-10-25 21:16:44.481 sogo-tool[26523]   'Osobní kontakty': Contacts/personal

Obnova dat: sogo-tool restore -f folderid /home/sogo/a/ uzivatel@domain.tld

sogo-tool restore má přepínač -f, -F a -p. Přepínač -f obnoví data nedestruktivně, tj. doplní pouze to co bylo od provedení zálohy smazáno. Pokud místo folderid uvedete klíčové slovo ALL, provede se obnova všech dat uživatele.Přepínač -F provede obnovu kompletní do stavu zálohy. Při obnově jsou také obnovena práva sdílení. Přepínač -p obnovuje pouze uživatelské předvolby.

Ukázka úplné obnovy kontaktů (mám v adresáři pouze dva):

[sogo@neon ~]$ sogo-tool restore -F Contacts/personal /home/sogo/a/ zdenek.burda@bcvsolutions.eu
Oct 25 21:28:28 sogo-tool [27966]: <0x0xfea8f8[SOGoCache]> Cache cleanup interval set every 5.000000 seconds
Oct 25 21:28:28 sogo-tool [27966]: <0x0xfea8f8[SOGoCache]> Using host(s) 'localhost' as server(s)
2012-10-25 21:28:28.677 sogo-tool[27966] <0x0x14aa378[PostgreSQL72Channel]: connection=<0x0x14b4e68[PGConnection]:  connection=0x0x14b62a0>>: message: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "sogozdenekbu00174f1b878_pkey" for table "sogozdenekbu00174f1b878"

2012-10-25 21:28:28.719 sogo-tool[27966] <0x0x14aa378[PostgreSQL72Channel]: connection=<0x0x14b4e68[PGConnection]:  connection=0x0x14b62a0>>: message: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "sogozdenekbu00174f1b878_quick_pkey" for table "sogozdenekbu00174f1b878_quick"

2012-10-25 21:28:28.783 sogo-tool[27966] restoring record '4CDD-4F3D7480-1-3D4FB0C0.vcf'
2012-10-25 21:28:28.804 sogo-tool[27966] restoring record '4CDD-4F3D7480-3-3D4FB0C0.vcf'

Zálohování pomocí sogo-tool si můžete buď naskriptovat sami nebo stačí použít skript sogo-backup.sh. Skript je po nainstalování dostupný v adresáři /usr/share/doc/sogo-verze/ (tj např. /usr/share/doc/sogo-2.0.1/sogo-backup.sh). Skript nakopírujte do /usr/local/sbin/sogo-backup.sh. Na začátku skriptu si nastavte proměnou BACKUP_DIR dle potřeby, já používám 

BACKUP_DIR=/home/sogo/backups

Spouštění skriptu zajistí cron, konfigurace pro sogo je v /etc/cron.d/sogo. Stačí odkomentovat případně drobně poupravit.

# Daily backups
#   - writes to /home/sogo/backups/ by default
#   - will keep 31 days worth of backups by default
#   - runs once a day by default, but can run more frequently
#   - make sure to set the path to sogo-backup.sh correctly
30 0 * * *     sogo   /usr/local/sbin/sogo-backup.sh

Chyba v právech a její oprava

Od určité doby se nám SOGo začalo chovat divně – u nově vytvořených kalendářů jsme naklikali sdílení, ale přesto obsah kalendářů uživatelé neviděli. Sdílení bylo naklikáno správně, tam se moc chyb nedalo udělat.

Jak chyba vznikla

Po delším bádání jsem zjistil, že jsem chybu způsobil sám. Do konfigurace SOGo (~sogo/GNUstep/Defaults/.GNUstepDefaults) jsem nacpal výchozí nastavení práv pro kalendář.

        <key>SOGoCalendarDefaultRoles
        <array>
            <string>ConfidentialDandTViewer</string>
            <string>PrivateDandTViewer</string>
            <string>PublicDandTViewer</string>
        </array>

V tomto nastavení jsem udělal chybu – uprostřed je malé „and“, má být „And“- SOGo při založení kalendáře a jeho nasdílení nakopírovalo tato výchozí práva, uložilo je do profilu uživatele a vše další co jsme naklikali přes web se už ignorovalo.

Náprava

Náprava byla relativně snadná.

1. jsem opravil konfigurační soubor ~sogo/GNUstep/Defaults/.GNUstepDefaults a SOGo restartoval

2. jsem u všech uživatelů provedl zálohu dat, která jsem v textovém editoru opravil a následně obnovil pomocí sogo-tool -F (nechtěl jsem řešit co se přepíše a co ne při použití -f/-p, tak jsem to přeplácl celé)

Oprava probíhala ručně, v každém souboru zálohy jsem nalezl část podobnou této a promazal duplicity, vyházel špatné řetězce s „and“ a nahradil je „And“ (stačil reg. výraz ve vimu):

	…
    tables = {
        "/Users/zdenek.burda@bcvsolutions.eu/Calendar/personal" = {
            acl = {
                "<default>" = (
                    PublicDAndTViewer,
                    ConfidentialDAndTViewer,
                    PrivateDAndTViewer
                );
                "lukas.cirkva@bcvsolutions.eu" = (
                    PublicViewer,
                    ConfidentialDAndTViewer,
                    PrivateDAndTViewer
                );
	…