07 Haziran 2013

DİRENİŞÇİLER! NE YAPTINIZ LAN SİZ?

Tamda bencilleşmenin tadına varmaya başlamıştım. Ne güzeldi lan bencilleşmek. Yükleri üstünden atıvermek, empatiyi şööle kenara koyuvermek... Bahanemde vardı oysa; sıramı savmıştım, bi bok olmazdı lan bizden, zaten 40'ımı da devirmiştim. Ne yaptınız lan siz, nasıl da aldınız bencilliğimi elimden. Ne rahatmış oysa sorumsuzluk. Hıncımı da alıyordum ne güzel şu %50'den.

Çekirdek çitletip kabuğunu hoyratça yere atmanın hafifliğini sen bilir misin ey direnişçi! Kuyruklara kaynak yapmanın, öne geçmenin tadını sen bilir misin? Yayalar salak gibi kırmızıda beklerken, yaya kaldırımından umarsızca karşıya geçmenin egosunu sen bilir misin? Konuların üzerinde derinleşmeden "o senin sorunun", "canım böyle istedi, yaptım" gibi cümleler kurabilir misin sen lan direnişci? Ne yaptınız siz? Düşüncesizliğimle ne güzel barışmıştım ben.

Ömrü hayatımda bu kadar düşüncesiz, bu kadar empati yoksunu, bu kadar sorumsuz, bu kadar .... her ne haltsa işte, bencilliğin tadına varmışken, feragat ettiklerimi getirdiniz önüme koydunuz. Lan direnişçiler, ne yaptınız.... ne yaptınız siz?

06 Ekim 2011

Sanal Makinede Saat Değişikliği

Proxmox 'da kurulu Debian 6.0.2'nin saatini değiştirmek istediğimde şöyle birşey oldu:
# date 100616362011
date: cannot set date: Operation not permitted
Thu Oct 6 16:36:00 UTC 2011

OpenVZ ile sanallaştırılan Debian'ın saatini şu şekilde değiştirmek gerekiyor:
# dpkg-reconfigure tzdata

Current default time zone: 'Europe/Istanbul'
Local time is now: Thu Oct 6 16:56:21 EEST 2011.
Universal Time is now: Thu Oct 6 13:56:21 UTC 2011.

Çıktıdan da anlaşıldığı gibi, aslında temel sorun Time Zone'un doğru olmaması. Komutu yazdıktan sonra gelen pencerede önce Europe sonra Istanbul'u seçiyoruz, hepsi bu.

Kaynak : http://wiki.openvz.org/Timezone

12 Temmuz 2010

Komut Satırından XMPP Mesajı Göndermek

Kurum içinde anında mesajlaşma altyapısında Jabber protokolünü kullanan Openfire Server'ı kullanıyorum. Hazır altyapı varken serverların sistem bildirimlerini anında mesajlaşma yazılımı üzerinden almak güzel olur diye düşünerek çıktım yola. Zincirin eksik halkası, komut satırından bu işi yapacak program. Aramalarımda bulduğum güzel ise: sendxmmp

Önce kuralım (Ubuntu Server'a kurulum anlatılmıştır):
# apt-get install sendxmpp


Kullanıcı adı, server, port bilgilerini gireceğimiz .sendxmpprc dosyasını kullanıcı dizinine oluşturuyoruz. Kullanılabilecek formatlar şöyleymiş:

CONFIGURATION FILE

You may define a ’~/.sendxmpprc’ file with the necessary data for your
xmpp-account, with a line of the format:

user@server password componentname

e.g.:

# my account
alice@jabber.org secret

(’#’ and newlines are allowed like in shellscripts). You can add a host
(or IP address) if it is different from the server part of your JID:

# account with specific connection host
alice@myjabberserver.com;foo.com secret

You can also add a port if it is not the standard XMPP port:

# account with weird port number
alice@myjabberserver.com:1234 secret

Of course, you may also mix the two:

# account with a specific host and port
alice@myjabberserver.com;foo.com:1234 secret

NOTE: for your security, sendxmpp demands that the configuration file
is owned by you and readable only to you (permissions 600).



Ben şu formatı kullandım:
Kullanıcı@server.com:Port Şifre

Aslında bu dosyayı oluşturmadan da bilgileri parametrelerle girerek mesaj göndermek mümkün. Fakat bu durumda kullanıcı ve şifre deşifre olacağından ben güvenlik adına bu şekilde kullanmayı tercih etmiyorum. Zaten program da güvenliği önemsediğini .sendxmpprc dosyasının izinlerini 600 yapmadan çalışmayarak bize gösteriyor. Konfigürasyon dosyasına gerekli bilgileri girdikten sonra hemen dosya izinlerini düzenliyoruz:
chmod 600 ~/.sendxmpprc

Bu ayarlar normalde yeterli fakat Openfire Server kullanıyorsanız şu hata mesajı geliyor.
# echo "Bu bir komut satırı mesajıdır" | sendxmpp -s  Konsol mesajı test@abc.local
Error 'AuthSend': error: not-authorized[?]



Ye
tklendirmede yaşanan bu sorunu çözmek için, /usr/share/perl5/Net/XMPP/Protocol.pm dosyasını açıyoruz:
nano /usr/share/perl5/Net/XMPP/Protocol.pm


Aşağıdaki satırı buluyoruz:
  • return $self->AuthSASL(%args);

Başına # (diyez) koyuyoruz ve dosyayı kayıt ediyoruz:
  • #return $self->AuthSASL(%args);

Şimdi bir mesaj denemesi yapabiliriz:

echo "Bu bir komut satırı mesajıdır" | sendxmpp -s Konsol mesajı kullanıcı@abc.loca

Hepsi bu kadar.

Şimdi swatch ile log dosyalarını dinlemeye alıp, istediğim durumlara göre swatch'ın aksiyon alarak bana anında mesaj göndermesi için kolları sıvayalım.

Kaynaklar :
[1] http://www.kilrathy.net/sites/xmpp-meldungen-via-script-senden.html
[2] http://manpages.ubuntu.com/manpages/intrepid/man1/sendxmpp.1.html
[3] http://www.djcbsoftware.nl/code/sendxmpp/

14 Eylül 2009

LAMP Server Kurulumu (Debian, Ubuntu)

Linux, Apache, MySql, PHP dörtlüsü ve saz arkadaşları PhpMyAdmin kurulumları için konsol komutu:

# apt-get install apache2 php5 libapache2-mod-php5 php5-gd mysql-server mysql-client php5-mysql phpmyadmin


MySql root şifresi oluşturmak için;

# mysql -u root
mysql> USE mysql;
mysql> UPDATE user SET Password=PASSWORD('new-password') WHERE user='root';
mysql> FLUSH PRIVILEGES;

19 Ağustos 2009

Ubuntu'da Turkcell ile VINN

VINN'ı USB girişine taktığımda Ubuntu 3G modemi hemen tanıdı, bağlantı
sihirbazı çıktı. Adımları ilerleyerek Ubuntu gerekli ayarları yaptı.
Fakat bağlanamadım. İnternetten okuduğum bilgilere göre PIN ve APN
değerlerine baktım. APN'nin "internet" olması gerektiğini biliyordum ve
Ubuntu zaten bu değeri girmişti. Başka bir yerde sorun olacağını
düşündüm ama bulamayınca Windows kurulu bir PC'den bağlanıp ayarlarına
bakınca APN değerinin "mgb" olduğunu gördüm. Ubuntu'da APN değerini
"mgb" olarak değiştirince Ubuntu VINN'lamaya başladı.

13 Temmuz 2009

SME Server konsol yönetim

Lokal ağda e-posta sunucusu olarak SME Server'ı kullanıyorum. Bugüne kadar işini gayet iyi yapan SME server'ımın IP adresini değiştirmem gerekiyordu. Daha önce konsoldan girdiğim bir yönetim aracı vardı ama komutu bir türlü hatırlayamadım. Google'da biraz gezindikten sonra komutu buldum:

# console

İleride tekrar lazım olur diye de buraya not düşeyim dedim.

26 Haziran 2009

Ubuntu 9.04'e ince ayar (Cilalanmış Ubuntu)

Ubuntu 9.04'ün default kurulumundan sonra ihtiyaç hissedilebilecek uygulamalar ve eklentiler:

Önce deb http://packages.medibuntu.org/ jaunty free non-free deposunu ekleyelim.

sudo nano /etc/apt/sources.list


Medibuntu deposunun anahtarını kuralım.

sudo apt-get install medibuntu-keyring


Depo listesini güncelleyelim.

sudo apt-get update



Şu paketleri kuralım.

sudo apt-get install ubuntu-restricted-extras sun-java6-bin liferea mplayer non-free-codecs bluefish gparted xine-ui xine-plugin vlc thunderbird filezilla glipper

20 Mayıs 2009

Sistem sıcaklık bildirimi

Sistemlerin belli bir sıcaklığı geçtiğinde e-posta ile bildirim yapabilmesi için mbmon'dan yararlandım. Önce mbmon'un çeşitli kullanım parametrelerini görelim:

Default 5 saniyede bir çıktı verir. (Sistem 28 derece. Fan hızı 3000)
# mbmon -A

Temp.= 254.0, 28.0, 201.0; Rot.= 3000,    0,    0
Vcore = 1.18, 1.82; Volt. = 3.41, 6.85, 11.67,  -0.00, -1.69

Temp.= 254.0, 28.0, 201.0; Rot.= 3000,    0,    0
Vcore = 1.18, 1.82; Volt. = 3.41, 6.85, 11.67,  -0.00, -1.69
...
...

30 saniyede bir çıktı verir.
# mbmon 30 -A

Temp.= 254.0, 28.0, 201.0; Rot.= 3013,    0,    0
Vcore = 1.18, 1.82; Volt. = 3.41, 6.85, 11.67,  -0.00, -1.69
...
...

Sadece tek bir çıktı verir.
# mbmon -A  -c 1

Temp.= 254.0, 28.0, 201.0; Rot.= 2986,    0,    0
Vcore = 1.18, 1.82; Volt. = 3.41, 6.85, 11.67,  -0.00, -1.69

Çıktının formatı aşağıdaki gibi farklı olması için -r parametresi kullanılır.
# mbmon -A -r
TEMP0 : 254.0
TEMP1 : 28.0
TEMP2 : 201.0
FAN0  : 3000
FAN1  :    0
FAN2  :    0
VC0   :  +1.18
VC1   :  +1.82
V33   :  +3.41
V50P  :  +6.85
V12P  : +11.67
V12N  :  -0.00
V50N  :  -1.69

Sadece TEMP1 değerini almak için -T parametresi kullanılır:
# mbmon -A -c 1 -T 2
28.0

Sadece FAN0 değerini almak için -F parametresi kullanılır:
# mbmon -A -c 1 -F 1
3000

Diğer kullanım parametreleri ve ayrıntı için tabi ki:
# mbmon -h
MotherBoard Monitor, ver. 2.05 by YRS.
Usage: mbmon [options...] <seconds for sleep> (default 5 sec)
 options:
  -V|S|I: access method (using "VIA686 HWM directly"|"SMBus"|"ISA I/O port")
  -A: for probing all methods, all chips, and setting an extra sensor.
  -d/D: debug mode (any other options except (V|S|I) will be ignored)
  -e [0-2]: set extra temperature sensor to temp.[0|1|2] (need -A).
  -p chip: chip=winbond|wl784|via686|it87|gl52|lm85|lm80|lm90|lm75
            for probing chips
  -Y: for Tyan Tiger MP/MPX motherboard
  -h: print help message(this) and exit
  -f: temperature in Fahrenheit
  -c count: repeat <count> times and exit
  -P port: run in daemon mode, using given port for clients
  -T|F [1-7]: print Temperature|Fanspeed according to following styles
    style1: data1\n
    style2: data2\n
    style3: data3\n
    style4: data1\ndata2\n
    style5: data1\ndata3\n
    style6: data2\ndata3\n
    style7: data1\ndata2\ndata3\n
  -r: print TAG and Value format
  -u: print system uptime
  -t: print present time
  -n|N: print hostname(long|short style)
  -i: print integers in the summary(with -T option)

Şimdi bu bilgiler ışığında yazdığım aşağıdaki gibi bir script belirli zaman aralıklarında çalıştırılırsa, sistem ısındığında e-posta ile bize bildirim yapacaktır.

#!/bin/bash

# mbmon -c 1 : 1 kere cikti almak icin
#       -T 2 : sicakligin sadece 2. degeri almak icin
# Cikti tamsayi olmadigi icin awk ile noktadan
# onceki deger alinir.

#Sicaklik derecesine gore bildirim.
#DEGER=`mbmon -A -c 1 -T 2|awk -F. '{print $1}'`

# Fan hizina gore bildirim
DEGER=`mbmon -A -c 1 -F 1`

if [ $DEGER -gt 3850 ]
then
        echo "Sistem odasinda sicaklik artisi tespit edildi" | mail -s "Sicaklik YUKSEK" bilgiislem@abckurumu.com.tr
fi

exit

12 Mayıs 2009

Debian'a MRTG kurulumu

# apt-get install snmpd mrtg apache2

# nano /etc/snmp/snmpd.conf

----------
# sec.name source community
com2sec paranoid default public
#com2sec readonly default public

şöyle değişecek:

# sec.name source community
#com2sec paranoid default public
com2sec readonly default public
--------------

#/etc/init.d/snmpd restart


# mkdir /var/www/mrtg

# cp /etc/mrtg.cfg /etc/mrtg.cfg.yedek
# nano /etc/mrtg.cfg

içini sil ve şunu yapıştır:

WorkDir: /var/www/mrtg
Options[_]: bits,growright


# cfgmaker public@localhost >> /etc/mrtg.cfg
# indexmaker /etc/mrtg.cfg > /var/www/mrtg/index.html

5 dk. bir çalışacak komut şurada:

# cat /etc/cron.d/mrtg
*/5 * * * * root if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ]; then env LANG=C /usr/bin/mrtg /etc/mrtg.cfg >> /var/log/mrtg/mrtg.log 2>&1; fi

Grafikleri 5 dk. beklemeden hemen görmek için :

# env LANG=C /usr/bin/mrtg /etc/mrtg.cfg >> /var/log/mrtg/mrtg.log 2>&1

Sayfayı görmek için:
http://mrtg_server/mrtg

10 Mart 2009

Konsolda bash scriptlerini düzenlerken renkleri kullanmak

Konsolda editör olarak nano kullanıyorum. Bash scripler ile boğuşurken komutların, açıklama satırlarının, değişkenlerin, vs. farklı renklerde olması için /etc/nanorc dosyasına şu satırları ekliyorum:

syntax "c-file" ".*\.c$" ".*\.h$"
color red "\<[A-Z_]{2,}\>"
color green "\" "\" "\" "\"
color green "\" "\" "\"
color brightyellow "\" "\" "\" "\" "\" "\"
color brightcyan "#define" "#include" "#ifn*def" "#endif"
color brightcyan "#elif" "#else" "#if"

syntax "sh" ".*\.sh$"
color red "\<[A-Z_]{2,}\>"
color green "\" "\" "\" "\"
color green "\" "\" "\"
color brightyellow "\" "\" "\" "\" "\" "\"
color brightcyan "#define" "#include" "#ifn*def" "#endif"
color brightcyan "#elif" "#else" "#if"
color white "^#.*$"


syntax "nanorc" "[\.]*nanorc$"
color white "^ *(set|unset).*$"
color cyan "^ *(set|unset) (autoindent|backup|const|cut|fill|keypad|multibuffer|noconvert|nofollow|nohelp|nowrap|operatingdir|preserve|quotestr|regexp|smooth|speth|speller|suspend|tabsize|tempfile|historylog|view)"
color brightwhite "^ *syntax [^ ]*"
color brightblue "^ *set\>" "^ *unset\>" "^ *syntax\>"
color white "^ *color\>.*"
color yellow "^ *color (bright)?(white|black|red|blue|green|yellow|magenta|cyan)\>"
color magenta "^ *color\>"
color green "^#.*$"

26 Şubat 2009

Nagios e-posta bildirimleri

Kurduğum ve yönettiğim linux proxy&firewall'ı kullanan kurumdan telefon geldi. İnternet susmuş ama MSN'de sorun yokmuş. Daha önce de başıma geldiğinden disklerin dolduğunu tahmin ettim ve temizlemek için sisteme her zamanki gibi ssh ile bağlandım. Evet, tahmin ettiğim gibi disk bölümlerinin biri %100 görünüyordu. Aslında kurduğum sistemlere Nagios'u mutlaka kurarım ve disklerin %90 sınırını aştığında linux sistemimin e-posta ile bildirim yapmasını sağlarım. Bir taraftan diskleri temizlerken nagios loglarına ve e-postalarıma baktım. Nagios aksatmadan (her zamanki gibi) işini yapmış ve 5 gün önce e-posta ile beni uyarmış. E-posta kalabalığında bu bildirimi kaçırmışım. Bunu kaçırmamın sebebini biliyorum; benzer e-postalar farklı sistenlerden de geliyor ve bildirim e-postalarının içeriğinde hangi sistemden geldiğini belirten bir ifade olmadığı için karışıklığa sebep olabiliyor. Bunu nagios ayarlarını fazla kurcalamadan her kurulum yaptığım kurum/şirket için yeni bir gmail hesabı açarak hallediyordum aslında. E-postalar bu hesaplardan geldiği için hangi sistemde sorun var kolay anlaşılabiliyordu. Son zamanlarda 1-2 sistemi tek e-posta hesabına göre ayarlayınca karışıklık oldu böyle. Bende nagios ayarlarına bir bakayım dedim. E-posta içeriğine, hangi sistemden geldiğinin bilgisini koyarsam karışıklık çözülür böylece. Farklı yolu vardır mutlaka ama ben en kolay şu şekilde çözdüm:

/etc/nagios2/commands.cfg

dosyası, e-posta bildirimlerinin komutları olan dosya. İçeriğindeki ilgili bölüm şöyle:

--------------------------------------------------------------------
# 'host-notify-by-email' command definition
define command{                           
        command_name    host-notify-by-email
        command_line    /usr/bin/printf "%b" "***** Nagios*****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTALIAS$\nState: $HOSTSTATE$ for $HOSTDURATION$\nAddress: $HOSTADDRESS$\nInfo:\n\n$HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $HOSTACKAUTHOR$\nComment: $HOSTACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$ host is $HOSTSTATE$ **" $CONTACTEMAIL$                                                    
        }                                                                                                                                                        


# 'host-notify-by-epager' command definition
define command{                            
        command_name    host-notify-by-epager
        command_line    /usr/bin/printf "%b" "Host '$HOSTALIAS$' is $HOSTSTATE$\nInfo: $HOSTOUTPUT$\nTime: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$" $CONTACTPAGER$                                                                                            
        }                                                                                                                                                        

# 'notify-by-email' command definition
define command{                      
        command_name    notify-by-email
        command_line    /usr/bin/printf "%b" "***** Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nState: $SERVICESTATE$ for $SERVICEDURATION$\nAddress: $HOSTADDRESS$\n\nInfo:\n\n$SERVICEOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $SERVICEACKAUTHOR$\nComment: $SERVICEACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$                                                                                                                                                              
        }                                                                                                                                                        


# 'notify-by-epager' command definition
define command{
        command_name    notify-by-epager
        command_line    /usr/bin/printf "%b" "Service: $SERVICEDESC$\nHost: $HOSTNAME$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nInfo: $SERVICEOUTPUT$\nDate: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
        }
---------------------------------------------------

Ben de aşağıdaki gibi ekleme yaptım. (Koyu renk olan bölümler)

---------------------------------------------------
# 'host-notify-by-email' command definition
define command{                           
        command_name    host-notify-by-email
        command_line    /usr/bin/printf "%b" "***** ABC KURUMU - Nagios*****\n\nNotification Type: $NOTIFICATIONTYPE$\nHost: $HOSTALIAS$\nState: $HOSTSTATE$ for $HOSTDURATION$\nAddress: $HOSTADDRESS$\nInfo:\n\n$HOSTOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $HOSTACKAUTHOR$\nComment: $HOSTACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$ host is $HOSTSTATE$ **" $CONTACTEMAIL$                                                    
        }                                                                                                                                                        


# 'host-notify-by-epager' command definition
define command{                            
        command_name    host-notify-by-epager
        command_line    /usr/bin/printf "%b" "
ABC KURUMU - Host '$HOSTALIAS$' is $HOSTSTATE$\nInfo: $HOSTOUTPUT$\nTime: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$ alert - Host $HOSTNAME$ is $HOSTSTATE$" $CONTACTPAGER$                                                                                            
        }                                                                                                                                                        

# 'notify-by-email' command definition
define command{                      
        command_name    notify-by-email
        command_line    /usr/bin/printf "%b" "*****
ABC KURUMU - Nagios *****\n\nNotification Type: $NOTIFICATIONTYPE$\n\nService: $SERVICEDESC$\nHost: $HOSTALIAS$\nState: $SERVICESTATE$ for $SERVICEDURATION$\nAddress: $HOSTADDRESS$\n\nInfo:\n\n$SERVICEOUTPUT$\n\nDate/Time: $LONGDATETIME$\n\nACK by: $SERVICEACKAUTHOR$\nComment: $SERVICEACKCOMMENT$\n" | /usr/bin/mail -s "** $NOTIFICATIONTYPE$ alert $NOTIFICATIONNUMBER$ - $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$ **" $CONTACTEMAIL$                                                                                                                                                              
        }                                                                                                                                                        


# 'notify-by-epager' command definition
define command{
        command_name    notify-by-epager
        command_line    /usr/bin/printf "%b" "
ABC KURUMU - Service: $SERVICEDESC$\nHost: $HOSTNAME$\nAddress: $HOSTADDRESS$\nState: $SERVICESTATE$\nInfo: $SERVICEOUTPUT$\nDate: $LONGDATETIME$" | /usr/bin/mail -s "$NOTIFICATIONTYPE$: $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
        }
-----------------------------------------------------

E-posta programımda (Thunderbird) da gerekli filtreleme işlemlerini yaparsam bu tip bildirim e-postalarını kaçırmam artık diye düşünüyorum.

25 Kasım 2008

Bir siteden resimleri topluca indirmek

Bir resim galerisinden resimleri topluca indirmek için Firefox eklentisi BatchDownload gerçekten güzel bir araç. wget ile dosya/dizin izinlerine takılmıştım. Çözüm ararken bu eklentiyi buldum. El altında olması gereken bir Firefox eklentisi.

08 Mayıs 2008

Online yer imleri

Firefox'un yer imlerini tuttuğu bookmark.html dosyasını her gün yedekleyip, ssh ile her yerden erişebildiğim bir yere kopyalama çabam uzun bir süre önce sona ermişti. Uzun süredir yer imlerime eklediğim linkleri online olarak tutuyorum. Bu işi yapan Firefox eklentisi Delicious Bookmarkshttp://del.icio.us/ sitesine gidip bir kullanıcı hesabı oluşturuyorsunuz. Daha sonra bu  Delicious Bookmarks  eklentisini Firefox'a  kullanıcı hesabınız ile kuruyorsunuz. Bundan sonra eklediğiniz her yer imi sitede kullanıcı hesbınızda tutuluyor. Siteye bir tarayıcı ile girip kullanıcı hesabınızdaki yer imlerini görebileceğiniz gibi farklı bilgisayarlarda Firefox'a kurduğunuz bu eklenti ile yer imleriniz son hali ile bilgisayarınıza geliyor.

Thunderbird ve sistem çekmecesi

Thunderbir'ü Linux'da sistem çekmecesinde kullanmak için mozTrayBiff eklentisini kullanmaya başladım. Görev çubuğunda gereksiz yer işgal etmesinden kurtuldum.

HTML sayfaları RSS gibi takip etmek

Sürekli izlemek istediğim html sayfaları var. Özellikle önemli duyuruların olduğu devlet siteleri. Hala RSS'i keşfedememiş bu siteler güncellendiğinde nasıl haberdar olabilirim diye bir araştırma yaptım. Firefox eklentilerinde Update Scanner'ı buldum. Güncellenen HTML sayfalarınından sizi haberdar ediyor. Firefox'un sağ alt köşesinde küçük bir ok simgesi oluşuyor. Bu simge renklendiği zaman anlıyorsunuz ki takip ettiğiniz bir sitede güncelleme yapılmış. Siteye girdiğinizde güncellenen metinleri sarı rekte işaretlenmiş olarak görüyorsunuz. Böylece sürekli takip ettiğiniz siteye girip yeni bir duyuru var mı diye bakmaktan kurtulmuş oluyorsunuz. Şimdilik benim takip ettiğim siteler şunlar:

Genel Sağlık Sigortası Duyuruları
Genel Sağlık Sigortası Medula duyuruları

Önemli duyuruların yapıldığı bu sitelerin RSS'i keşfetmesi dileğiyle...

31 Mart 2008

Debian'dan Oracle servera nasıl bağlanılır?

Bu işi en kolay nasıl yaparım, ayar dosyaları ile fazla boğuşmadan nasıl hallederim diye biraz araştırma yaptım. Burada anlatılanlar 'dan daha kolay bir yöntem bulamadım. Gerçekten de benim için en kolay yöntem diyebilirim. Yapılacak iş şöyle:

Önce gerekli depoyu sources.list'e ekliyoruz.

/etc/apt/sources.list
deb http://oss.oracle.com/debian unstable main non-free

Sonra kurulumu yapıyoruz:

# apt-get install update
# apt-get install oracle-xe-client


/etc/tnsnames.ora dosyasını oluşturup, içine gerekli kodları yazıyoruz. Bu dosyayı networkde oracle servera bağlantı yapan XP bir PC'den de alabilirsiniz.

Örnek tnsnames.ora dosyası:

AYTEKIN =
   (DESCRIPTION =
      (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.1)(PORT = 1521))
      )
      (CONNECT_DATA =
         (SERVICE_NAME = AYTEKIN)
      )
   )


Artık, /usr/lib/oracle/xe/app/oracle/product/10.2.0/client/scripts/sqlplus.sh dosyası ile bağlantı yapılıp, SQL sorgular yapılabilir.

19 Mart 2008

Çift Adsl ve Linux Trafik Yönetimi

Başlıkta "çift adsl" ifadesini kullandım ama aslında bir adsl ve bir frame relay hattı olan ağda Linux ile yaptığım trafik yönlendirmesini anlatacağım. Yaptıklarım temelde aynı olduğu için frame relay yerine adsl hattı da olsa sonuç değişmez.

Bir kurumda yaşanan sorun şuydu: normal internet hareketleri için adsl'i kullanırken aynı zamanda bağlı bulundukları bakanlığın frame relay hattını kullanarak bakanlığın sayfalarında veri girişleri yapamıyorlardı. Her iki hat farklı IP gruplarında olduğundan PC'lerin IP ayarlarını sürekli değiştirerek işi çözüyorlardı. Bu durum da bilgi işleme ayrı bir yük getiriyordu tabi. Ayrıca PC'lerin IP'leri sürekli değiştirildiğinden odalardaki yazıcıların paylaşımı ve kullanımında sorunlar oluyordu. Aynı şekilde dosya paylaşımları da...

Çözüm olarak bu trafiğin ortasına bir Linux koyarak tüm ağı aynı IP grubuna aldım. Çıkışları da hedef adrese yada IP'ye göre yönlendirdim. Linux'a, şu şu şu adreslere iletişim frame relay hattından, geri kalan iletişim de adsl hattından yapılacak, dedim. Kullanıcıların sadece tarayıcılarına site adreslerini yada IP'lerini yazması yetti. Gerisini Linux halletti... Ha, tabi bu trafiği de web filtreleme, güvenlik duvarı, dhcp sunucu, trafik sınırlama (bandwith yönetimi) ile de cilalamayı unutmadım.

Teknik olarak bu işi şöyle yaptım:
Önce linux'a 3 adet ethernet kartı takıldı. Lokal, adsl ve frame relay bağlantıları için. Topoloji şekildeki gibi:



/etc/network/interfaces dosyası şu şekilde:
auto lo eth0 eth1 eth2
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 10.0.0.10
netmask 255.255.255.0
gateway 10.0.0.2

allow-hotplug eth1
iface eth1 inet static
dns-nameservers 10.0.0.2
address 192.168.1.254
netmask 255.255.255.0

allow-hotplug eth2
iface eth2 inet static
address 10.67.1.10
netmask 255.255.255.0


interfaces dosyasında da göründüğü gibi sadece eth0 için gateway tanımı ve eth1 için dns tanımı yaptım.

Bakanlıkta bağlanılan sistemin IP adresleri 10.6.8.0/24 ağındaydı. Bu IP grubu için ağ geçidi olarak router'ın IP adresini atadım.

# route add -net 10.6.8.0 netmask 255.255.255.0 gw 10.67.1.1

10.67.1.0/24 ağı için de aynı şeyi yaptım.

# route add -net 10.67.1.0 netmask 255.255.255.0 gw 10.67.1.1


route -n çıktısı şöyle:

Destination Gateway Genmask Flags Metric Ref Use Iface
10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.6.8.0 10.67.1.1 255.255.255.0 UG 0 0 0 eth2
10.67.1.0 10.67.1.1 255.255.255.0 UG 0 0 0 eth2
10.67.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
0.0.0.0 10.0.0.2 0.0.0.0 UG 0 0 0 eth0


firewall olarak kullandığım script'de iptables ile trafiği yönlendirdim. Aşağıdaki komutlarda göründüğü gibi 10.6.8.0/24 hedefine gitmek isteyen trafik eth2'ye yönlendiriliyor. Diğer trafik eth1'den çıkıyor.

iptables -t nat -A POSTROUTING -d 10.6.8.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

Bu şekilde istediğim trafiği istediğim ağ arayüzüne yönlendirebilirim. Bu yapı benim işimi gayet iyi gördü.

14 Mart 2008

squid ve virüs

Debian Linux proxy server nedensiz bir şekilde internet hareketini durdurmaya başladı. /var/log/syslog'a baktım ve:
"WARNING! Your cache is running out of filedescriptors" hata mesajını gördüm. Yaptığım araştırmada /etc/defaults/squid dosyasındaki SQUID_MAXFD değerinin 1024'den 4096'ya çıkarılarak sorunun çözülebileceğini okudum. Yaptım ama olmadı! Bir bug olabileceği düşüncesiyle sistemi kernel dahil güncelledim ama nafile. Log'lara bakarken bir IP'nin www.rusawm.com'a anlamsız bir şekilde trafik yaptığını gördüm. Blok şeklinde satırlarca bu siteye erişim logları access.log dosyasına düşüyordu. Kullanıcının dışında habersiz bir iletişim yapıldığı ortada olduğundan, IP'nin sahibi PC'nin kablosunu çektik. Sorun düzeldi... Ne menem bir virüs ise yaptığı trafik ile squid'in cachelerine zarar veriyormuş. Hani Linux ile masaüstünde virüssüz bir dünya kurmuş durumdayız ama windows PC'lere hizmet veren, onlara efendilik yapan bir Linux'da yer yer virüslerden nasibini alıyor maalesef...

29 Şubat 2008

OOXML'e hayır...

Fazla söze gerek yok... Bu linkteki imza kampanyası için yazılan metinde konu ayrıntılı şekilde anlatılmış. Konu açılmışken belirtmek isterim ki; özgür yazılımlar, sadece kullanan bizlerin değil dolaylı yoldan diğer sistemleri kullanan kişilerinde işine yarayan, ve hatta yerli yersiz bizlerle tartışmadan duramayan zat-ı muhteremlerin de hayatını kolaylaştıran nadide eserler. Bunu bir de onlar bilseler...

28 Şubat 2008

ssh bağlantısını garantiye almak

ssh çoğu Linux kullanıcısı için vazgeçilmez araçlardan biri.
Bağlanacağımız PC/server yan taraftaki sistem odasında da olsa, Güney
Afrika'da da olsa açıyoruz ssh ile bir oturum, işimizi yapıp çıkıyoruz.
Uzaktaki makinalara Linux'un 10 kaplan gücündeki konsolu ile
yaptıramayacağımız iş yok "gibi". "Gibi" diyorum çünkü ender de olsa
bazen fiziksel olarak makinanın başında olmamız gerekiyor. Özellikle ağ
ayarları ile uğraşıyorsak. Yanlış bir komut her şeyi mahvedebilir. Dün
akşam böyle hassas bir konu ile uğraşırken ağ ayarlarımı kaybetme
korkusuyla komutları elim titreyerek girdim. Uzak bilgisayardaki
/etc/network/interfaces dosyasını mıncıklarken, route komutu ile
boğuşurken hattı kopartmamak için ayrı bir dikkat harcadım.
Firewall+proxy olarak çalışan makinaya ayrı bir frame relay bağlantısı
yapmak zaten yeterince boğucuydu. Sonra özgürlüğümü geri almak için
şöyle yaptım: Çalışan ve uzaktan bağlanılabilen ayarları geri yükleyecek
bir script yaptım. Bunu da yer yer saat başı, duruma göre aklıma
geldikçe 30-40 dk. ileriye alarak crontab'a attım. Böylece eğer bir
yanlışlık olursa en fazla 40-45dk. içinde tekrar bağlanabilmeyi
garantiye almış oldum. Hem arada bir çay molası vermek için de bahanem
olurdu. Hakikaten işe yaradığını da söylemeliyim çünkü aldığım gazla bir
sefer bağlantıyı kopardım. Panik yapmadan saatime baktım, bekledim ve
zamanı geldiğinde bağlanıp işe devam ettim. İşi garantiye almak güzel de
script'in arada fark etmeden cron'dan çalışması ve yaptığım ayarları
bozması ve benim bunu geç anlamam işin cilvesi ne yazık ki... ;)

01 Şubat 2008

stix.to : Faydalı bir eser

stix.to sitesini az önce keşfettim. İnternette gezdiğiniz sayfalara not bırakmaya yarayan faydalı bir eser... Sadece not değil sesli mesaj da bırakılabiliyor. Bu notlar, mesajlar fazla incelemedim ama sanırım grup mantığında listenizdeki diğer kişilerece de görünebiliyor -ki öyle olmalı zaten-. Şu anda pek kulmayı düşünmüyorum ama işe yarayabilir, kenara not etmekte fayda var.


03 Aralık 2007

swatch logrotate'den sonra log dosyasını izlemezse...

Bir süredir log dosyalarını izlemek için  swatch kullanıyorum. swatch'ın bir sonraki gün log dosyalarını izlemediğini fark ettim. Sebebini araştırdığımda logrotate'den sonra eski log dosyasını izlediğini ve yeni dosyayı izlemediğini gördüm. Yani syslog dosyası gece syslog.0 oluyor ve swatch syslog.0'ı izlemeye devam ediyor. Bu sorunu çözmek için logrotate'den sonra swatch'ı restart etmek yetecekti ama nasıl?

swatch'ın start, restart, stop edilebilmesi için bir script yazmak gerekiyordu. Kolları sıvayıp önce şöyle bir script yazdım (/etc/init.d/swatchd dosyasına) :

#!/bin/sh

#               Debian Gnu/Linux Shell Script
#
# swatchd  : swatch'in baslatilmasi, durdurulmasi veya tekrar baslatilmasi
#                  icin script.
#
# Aciklama: logrotate'den sonra swatch log dosyalarini dinlemediginden,
#                  logrotate'den sonra swatch'in restart edilmesi gerekiyor.
#                  /etc/cron.daily/sysklogd, /etc/cron.weekly/sysklogd dosyalarinin sonuna
#                  /etc/init.d/swatch restart > /dev/null satiri eklenirse, sysklogd restart olduktan hemen sonra
#                  swatch da restart olacaktir.
#
# Version:    1.0  03-12-2007  aytekinaygun@gmail.com


ps ax | grep swatch > /tmp/swatch.pid
PID=`cat /tmp/swatch.pid | grep swatchrc | awk '{print $1;}'`


 case "$1" in

  start|"")
        if [ "$PID" = "" ]; then
                swatch --daemon -c /etc/swatchrc --tail-file="/var/log/syslog /var/log/auth.log"
                echo "swatch baslatildi..."
        else
                echo "swatch zaten calisiyor..."
        fi
        ;;


   stop)
        if [ "$PID" = "" ]; then
                echo "swatch zaten calismiyor..."
        else
                kill -9 $PID
                echo "swatch durduruldu..."
        fi
        ;;


restart)
        if [ "$PID" = "" ]; then
                swatch --daemon -c /etc/swatchrc --tail-file="/var/log/syslog /var/log/auth.log"
                echo "swatch calismiyordu ve baslatildi..."
        else
                kill -9 $PID
                swatch --daemon -c /etc/swatchrc --tail-file="/var/log/syslog /var/log/auth.log"
                echo "swatch tekrar baslatildi..."
        fi
        ;;


      *)
        echo "Kullanim parametreleri : /etc/init.d/swatchd {start|stop|restart}"
        ;;

esac

exit 0

Sonra da /etc/cron.daily/sysklogd, /etc/cron.weekly/sysklogd dosyalarinin sonuna;

  /etc/init.d/swatch restart > /dev/null

satırını ekledim. Böylece gece sysklogd restart olduktan hemen sonra swatch'da restart oluyor ve istediğim log dosyalarının izlenmesine devam ediliyor.

15 Kasım 2007

Thunderbird konu başlığına göre dizilim yapmasın

Bir süredir sıkıntısını çektiğim bir konu... Thunderbird'de e-postaları dizilim (thread) şeklinde gösterip, okuyorum. Özellikle linux listelerindeki iletileri birbirine karıştırmadan, konularına göre takip edebilmek için iyi oluyor. Fakat localde kullandığımız e-posta trafiğinde bu özellik başımın belası oldu. Kullanıcıların konu başlığı seçme kısırlığının da etkisi ile her postaya "yardım", "sorun", vs. gibi standart başlıklıklar vermeleri veya konusuz bırakmaları -ki o zaman konu başlığı "(konusuz)" şeklinde oluyor- ile postalar birbirine girmeye başladı. Thunderbird message-ID dışında aynı konu başlıklarını da aynı dizilimlerde tutuyor. Önceleri önemsemedim ama zamanla posta trafiği ve aynı konu başlıklarının kullanımı arttıkça bu işe bir dur demenin zamanı geldi. Biraz araştırma yaptıktan sonra şu linki buldum. Profil dizinimin altına user.js adında bir dosya oluşturup içine de şunları ekledim:

# Only thread by reference headers, ignore subject
user_pref("mail.strict_threading", true);

ve kayıt ettim... Thunderbird'ü tekrar çalıştırdığımda kabuslarım sona erdi.

16 Ekim 2007

Disklerin dolduğunu haber veren script

Bu aralar, kurduğum linux proxy-firwall sistemleri izlemeyi daha kolay hale getirmeye çalışıyorum. Log analiz programları ile haşır-neşirim son zamanlarda. swatch programı ilgimi çekmeye başladı. Program, log dosyalarında belirlediğiniz herhangi bir ifade geçerse isterseniz size e-posta atıyor, isterseniz komut/komutlar çalıştırıp bir iş yaptırılabiliyor. Yani mesela auth.log dosyasında herhangi bir satırda "illegal user" ifadesi geçerse bana e-posta gönder diyorsunuz; swatch, log dosyasını dinlemeye başlıyor ve sisteminize yapılan ssh bağlantı denemesi(saldırısı) olduğunda size e-posta atıyor. Durumdan anında haberdar oluyorsunuz. Senaryolar çoğaltılabilir tabi.... Şu günlükte de uygulama konusunda güzel bilgiler var. Yazanın eline sağlık.

Henüz denemeler yapıp yazılımı test ediyorum. Bu denemelerimde disk dolduğu zaman bana e-posta atmasını sağlayamadım. Fazla da uğraşmadım ve kendi işimi kendim görmeye karar verdim. Hemen şöyle bir script yazdım:


#!/bin/sh

if
    df -h | egrep "90%|91%|92%|93%|94%|95%|96%|97%|98%|99%|100%"

then

    df -h > disk.txt
    echo " " >> disk.txt
    echo " " >> disk.txt
    du -sh /var/* >> disk.txt
    mail -s "[Proxy-Hastane] Disk Doluyor!" tirtil@zabazingo.com < disk.txt
    rm disk.txt

fi


Görüldüğü gibi basit bir 'eğer' kalıbı ile işimi hallettim.

Önce disk bölümlerinin doluluk oranına bakıp bu çıktıda %90 ve üzeri bir ifade var mı ona bakıyoruz. Eğer bu ifade var ise disk bölümlerinin doluluk oranlarının bilgisi ile /var dizininde bulunan dosya ve dizinlerin boyutlarını disk.txt dosyasına yazıp, bu dosyayı e-posta ile gönderiyoruz. Hepsi bu...

Bu scripti crontab'a ekleyip günde bir kez çalıştırmak yeter sanırım.

15 Ekim 2007

Konsoldan e-posta göndermek

Kurduğumuz sistemlerde neler olup bittiğini izlemek için yada belirli aralıklarla yaptırdığımız bir işin (örneğin yedekleme) sağlıklı bir şekilde yapıldığından emin olmak için birtakım çıktıları e-posta ile takip ederiz. Konsoldan e-posta atmak için;

# mail kullanıcı@alanadı.com -s "Konu Başlığı" < /var/log/dosya.log

komutunu kullanmak yeterlidir. Bu komut ile dosya.log dosyası kullanıcı@alanadı.com'a gönderilir. Fakat bu komutu kullanmak için önce bir MTA ayarı yapmak gerekir. Ben Debian'da ön tanımlı olarak gelen exim4'ü kullanıyorum. Eğer kurulu değil ise:

 # apt-get install exim4

ile kurulumu yapıyoruz. Kullandığım gmail hesabım için ayarları şöyle yapıyorum:

 # dpkg-reconfigure exim4-config


Yapılandırmayı küçük dosyalara bölmek ister misiniz? hayır
Posta yapılandırma türü? Posta gönderme akıllı-makine ile; posta alma SMTP/fetchmail ile
Sistemin posta adı?  localhost.localdomain
Kendisinden gelen SMTP bağlantılarının dinleneceği IP adresleri: 127.0.0.1
Kendisinden posta kabul edilecek diğer adresler: localhost.localdomain
Postaları anahtarlanacak makineler: (boş)
Akıllı-makinenin (smarthost) IP adresi veya makine adı: smtp.gmail.com::587
Dışarı giden postada yerel posta adı gizlensin mi? Hayır
DNS sorgulamaları asgari düzeyde tutulsun mu (İsteğe-bağlı-Bağlantı)? Hayır
Yerel epostalar için dağıtım yöntemi:  /var/mail/ "mbox" biçemi

Ayarları kayıt ediyoruz. Yapılan bu ayarlar /etc/exim4/update-exim4.conf.conf dosyasına yazılır. Bu dosyanın içeriği şöyle birşey oluyor.

 # nano /etc/exim4/update-exim4.conf.conf

dc_eximconfig_configtype='smarthost'
dc_other_hostnames='localhost.localdomain'
dc_local_interfaces='127.0.0.1'
dc_readhost='debian'
dc_relay_domains=''
dc_minimaldns='false'
dc_relay_nets=''
dc_smarthost='smtp.gmail.com::587'
CFILEMODE='644'
dc_use_split_config='false'
dc_hide_mailname='false'
dc_mailname_in_oh='true'
dc_localdelivery='mail_spool'


aytekin kullanıcısının gönderdiği postalarda zabazingo@gmail.com adresinin görünmesini istiyorum. Bunun için /etc/email-addresses dosyası şöyle düzenliyoruz.
 # nano /etc/email-addresses

 aytekin: zabazingo@gmail.com

Son olarak kullanıdğımız e-posta adresinin kullanıcı ve şifre bilgilerini girmemiz gerekiyor.
 # nano /etc/exim4/passwd.client

 *:zabazingo:şifre

Ayarlar tamamlandı. Şimdi de exim4'ü yeniden başlatıyoruz.
 # /etc/init.d/exim4 restart

08 Ekim 2007

Dinamik IP'ye hostname atama (dyndns.org güzelliği)

dyndns.org sitesinin çok güzel bir hizmeti var. Dinamik IP'lere hostname tanımlayabiliyorsunuz. 5 tane hostname tanımı ücretsiz yapılabiliyor. Böylece statik IP gerektiren durumlarda gerçekten ilaç gibi geliyor. Evdeki bilgisayarıma ssh ile bağlanmak istediğimde ssh evdeki_bilgisayar.dyndns.org komutu ile direk bağlanıyorum. Kullandığım modemde dyndns.org özelliği var ve gerekli ayarları yaptıktan sonra her IP değiştiğinde modem dyndns.org'da oluşturduğum host bilgisini değiştiriyor. Eğer modemde böyle bir özellik yok ise o zaman bu görevi Linux'a bırakacağız.

Belli aralıklarla IP'yi güncellemek için ubunturehberi.com'da anlatılanları uyguladım. Komut satırından komutu verdiğimde herşey normal ama cron'dan komut çalışmıyor. Betik path'de olmadığı için sorun oluyor. Bende şöyle yaptım. dyndns_update.sh betiğini /usr/sbin/'in altına taşıdım. Betik içinde de değişiklik yapmak gerekiyor. ipcheck komutu olan satırlarda da /usr/sbin/ipcheck .... şeklinde yol tanımladım. Sonuç olarak betiğin son hali şöyle:

#!/bin/sh

USERNAME=kullanıcı
PASSWORD=şifre
HOSTNAME=xxxxxx.dyndns.org

cd /root/
if [ -f /root/ipcheck.dat ]; then
/usr/sbin/ipcheck -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME
else
/usr/sbin/ipcheck --makedat -r checkip.dyndns.org:8245 $USERNAME $PASSWORD $HOSTNAME
fi

crontab'a da şöyle ekliyoruz:

# crontab -e
her saat başı çalışması için eklenecek satır:

00 * * * * /usr/sbin/dyndns_update.sh

05 Ekim 2007

/home'u ayrı bölüme/diskte taşımak

Bu aralar SME Server ile yerel bir e-posta sunucusu kurmaya niyetlendim. Fakat gel gör ki sistemde 2 disk olmasına rağmen hiç bana bişi sormadan tek diske tüm kurulumları yapıp işini bitiriyor. Bu kurulumun ayrıntılarını yazarım sonra. Kurduktan sonra /home'u 2.diske taşıdım.

Şöyleki:

Önce dizin oluşturup 2.diski buraya bağlıyoruz.

# mkdir /yenihome
# mount -t ext3 /dev/sdb1 /yenihome

/home 'da bulunan tüm dosyaları /yenihome 'a taşıyoruz.

# cd /home
# find . -depth -print0 | cpio --null --sparse -pvd /yenihome/

/home'un yerini değiştiriyoruz.

# umount /yenihome
# mv /home /eskihome
# mv /yenihome /home

...ve bağlıyoruz.

# mount -t ext3 /dev/sdb1 /home

Tabi bu bağlama işini fstab'a da ekliyoruz:

/dev/sdb1 /home ext3 usrquota,grpquota 1 1

Kaynak : http://eventualis.org/home-dizinini-tasimak/

Artık yazmam lazım gelir...

Bu günlüğü açalı uzun zaman oldu. Bir heyecanla açmıştım ama tek tük
yazılardan sonra kaldı öyle. Sildim o yazılarıda zaten. Şimdi tekrar
bişiler karalayım dedim Linux hakkında. Tırmalayıp duruyorum akşama
kadar şu ekranın önünde. Deneyimlerimi paylaşayım dedim bende işte. Öle
işte be ...