Linux’ta kullanıcıların açtıkları/kapattıkları openoffice dosyalarının takibi
Diyelim ki çok kullanıcılı bir linux makinada kullanıcıların openoffice ile açtıkları “readonly” olmayan dosyaların ne zaman, kim tarafından açıldığını ve ne zaman kapatıldığını loglamak istiyorsunuz.
Bu iÅŸ için normalde, linux kernel’inde bulunan audit modülünün aktive edilmesi, dolayısıyla çoÄŸu linux dağıtımı için kernel update yapmak gerekiyor. Bu modülle birlikte çalışan Snare isminde bir uygulama var. Bu uygulama ile ilgili bilgilere ÅŸu adresten eriÅŸebilirsiniz.
Ben Snare’i Debian ve Ubuntu’ya kurmayı denedim, belirtilen kernel patchlerini uygulayarak güncel Debian ve Ubuntu sistemler üzerinde kernel derledim. Ancak derlemeyi baÅŸardığım kernel’ları yüklediÄŸimde “kernel panic” aldım. Verilen kernel patchleri eski kernel versiyonlarına ait genelde, keÅŸke daha güncel kernel versiyonları için de patch hazırlanmış olsaydı. Neyse Snare kurulumunda baÅŸarısız olduktan sonra baÅŸka çözümler aramaya koyuldum.
Öncelikle sevgili dostum bash ile neler yapabilirim diye düşünmeye baÅŸladım. “ps fax” yapar sonra belli aralıklarla diff alırım diye düşündüm baÅŸta. Ancak gördüm ki, openoffice bir dosya açıldıktan sonra ikinci açılan dosyayı ayrı bir process ile deÄŸil de varolan process ile çalıştırıyor. Dolayısıyla ikinci açılan dosyayı genelde göremiyorsunuz “ps fax” ile genelde.
Sonrasında, openofffice’i binary’sini açan bir sh scripti (/usr/lib/openoffice/program/soffice) olduÄŸunu farkettim. Open office her açıldığında bu sh scripti üzerinden geçtiÄŸini gördüm. Eh dedim, elime düştün ÅŸimdi:) Hemen o scripte dosya açıldığında bir yere log yazan ve program EXIT signali ile bitirildiÄŸinde, EXIT signalini yakalayarak “dosya kapandı” logunu ekleyebilen bir script ekledim dosyaya. Bu hangi dosyaların açıldığını yakalama konusunda sorunsuz çalıştı. Ancak dosyaların kapanması konusunda, sadece gene ilk dosya için doÄŸru çalışıyordu. Çünkü 2. bir dosya açıldığında açılan ikinci soffice scripti görevini binary’e devredip hemen kapanıyordu.
Gene olmadı istediÄŸim gibi. Nasıl yapsam diye yanıp yakılırken, acaba dedim OpenOffice’in kendisine bir plugin yazarak olayı çözebilir miyim? Developer dökümanlarını indirdim, okudum vs ve vazgeçtim. Yapılamayacağından deÄŸil ancak, plugin yazma konusunda kısa sürede olaya hakim olmanın çok mümkün olmadığını anladığım için.
Bu arada Åžefik Altınyurt, lsof komutunu önerdi saÄŸolsun. “Bu iÅŸine yarayabilir” deyince hakkaten iÅŸime yarayan ÅŸeyin bu olduÄŸunu anladım. Çok uzun ve yapmaya çalıştığım ÅŸey için gereksiz büyüklükte bir output üretiyordu ancak tüm açılan dosyaları (readonly olmayan) buradan görebiliyordum.
Dolayısıyla yapılması gereken, lsof çıktısını çeşitli filtrelerden geçirdikten sonra belirli uzantılara sahip dosyalara bakmak, daha sonra da bu satırları bir yere kaydetmek ve sonra tekrar çalıştırıp varolan dosya ile yeni oluşturulan dosyayı diff lemek gerekiyordu.
Bunu şöyle yaptım :
#!/bin/bash # file_tracking.sh # Ugur Aslan / July 2007 # configuration logfile=/var/log/custom_application.log; fileDescriptionPattern="\.doc\|\.odt\|\.pdf\|\.xls\|\.ods\|\.rtf\|\.odp\|\.ppt\|\.pps$"; date=$(date); # controlling processlist file existance if [ ! -f processlist ] ; then echo "ERROR: $(date) processlist file cannot be found! exiting.." >> $logfile; exit; fi # moving processlist as old process list mv processlist processlist.old # getting new process list with configured regex pattern lsof -nP | grep --regexp=$fileDescriptionPattern > processlist # find out pozitive difference [added processes] and write log cat processlist processlist.old processlist.old | sort | uniq -c | sort -n | grep ' 1' | cut -c 9- > /tmp/added.tmp; # find out negative difference [removed processes] and write log cat processlist.old processlist processlist | sort | uniq -c | sort -n | grep ' 1' | cut -c 9- > /tmp/removed.tmp; # write removed processes cat /tmp/removed.tmp | while read line do echo "Closed: " $date $line >> $logfile; done # write added processes cat /tmp/added.tmp | while read line do echo "Opened: " $date $line >> $logfile; done # remove temporary files rm /tmp/added.tmp && rm /tmp/removed.tmp; # remove processlist.old rm processlist.old exit;
Daha sonra da tahmin edeceğiniz üzere, bir screen içinde watch ile scripti tekrar tekrar çalışmasını sağladım. (cron da olabilirdi tabii) (tamam, tamam while /bin/true ve sleep de iş görürdü, ukala şeyler sizi..:))
$ watch -n 60 ./file_tracking.sh
60 saniyede bir çalıştırdım ben, çünkü “bi bakıp çıkacam” tarzında açılan dosyaları çok umursamıyordum. İsterseniz bunu birkaç saniyeye düşürebilirsiniz. Ancak script için bir optimizasyon düşünmeden yazdığım için, 1-2 sn. gibi deÄŸerler problem çıkarabilir, eÄŸer makinanızda yavaÅŸ çalışırsa bu script. O yüzden çok kasmayın, çünkü makinanız yavaÅŸsa sadece open office’in açılması birkaç saniye alacaktır zaten. Zaten amacımız, dosyaya eriÅŸimi deÄŸil, dosyaların openoffice ile açılmasını takip etmek.
Bundan sonraki bölümde, readonly olan dosyaların açılmasını nasıl takip edebileceğimiz ile ilgili başka bir yaklaşım aktaracağım. Ancak o da başka bir güne kalsın..























