4 Januari 2016, 23:17

“We leave something of ourselves behind, only leave a place, we stay there even though we go away. And there are things in us that we can find again only by going back there. We travel to ourselves when we go to a place though we have covered a stretch of our life, no matter how brief it may have been. But by traveling to ourselves we must confront our own loneliness. And isn’t it so everything we do is done out of fear of loneliness? Isn’t that why we renounce all the things we will regret at the end of our lives?”

(Amadeu Del Almeida Prado, Night Train To Lisbon, 2013)

2016

Tidak terasa sudah tanggal 1 Januari lagi. Setiap kali memulai tahun baru, banyak sekali rencana di kepala yang bermunculan dan kemudian setelah berbulan-bulan, ternyata yang tersulit adalah bagian eksekusi. Ada beberapa hal yang menjadi penghambat pewujudan keinginan, tapi yangt terbesar adalah hambatan dari diri sendiri. Jadi resolusi tahun ini saya pikir tidak perlu muluk-muluk yang berisi sekian baris item. Kali ini cukup satu hal saja yang menjadi tantangan tahun ini: mengalahkan diri sendiri.

Mengalahkan di sini adalah pengikisan ego dan rasa nyaman yang berlebihan terhadap diri sendiri, yang sampai sekarang harus saya akui masih belum dapat celahnya juga. Mungkin benar saya terlalu malas. Tapi semoga tahun ini kita (saya, khususnya) bisa melakukan hal ini.

Script BASH Untuk Mendapatkan IP Address Interface

Dalam pekerjaan sehari-hari, saya mengakses jaringan/server di kantor melalui SSL VPN. Tapi, setiap kali tersambung ke VPN tersebut, default gw saya selalu diarahkan ke tunnel VPN dan semua akses internet dibelokkan ke jaringan kantor juga. Untuk mengatasi hal ini, saya perlu menambahkan baris:

/sbin/route del -net 0.0.0.0 gw $GWVPN netmask 128.0.0.0 dev tun0

ke dalam startup script VPN. Sekarang bagaimana caranya agar variabel $GWVPN bisa berisi ip address gateway vpn?

Karena interface VPN saya hanya satu dan selalu tun0, maka untuk mendapatkan ip address gateway vpn, saya menggunakan baris script:

GWVPN=`/sbin/route -n | grep tun0 | grep ‘UG[ \t]’ | awk ‘{print $2}’ |sed ‘1!d’`

Dengan demikian variabel GWVPN akan selalu berisi ip address gateway VPN. Jika ada cara yang jauh lebih cantik, mohon masukannya dan bisa ditulis di kolom comment.

XMPP Client Kaiwa (instalasi & requirement)

Berhubung akhir-akhir ini berkutat dengan XMPP server MongooseIM dan XEP-0313, jadinya membutuhkan klien yang support MAM (Message Archive Management) tersebut. Pilihan saya ada 2, yaitu Kaiwa dan Gajim.

Untuk Kaiwa, ada requirement yang dibutuhkan ketika setup. Cuma requirement tersebut tidak dicantumkan dalam petunjuk instalasinya. Jadi saya tulis di sini supaya saya sendiri juga tidak lupa kebutuhannya apa saja. Cara setup Kaiwa adalah sebagai berikut (di Ubuntu):

  1. git clone https://github.com/digicoop/kaiwa.git
  2. cd kaiwa
  3. Jika belum memiliki package npm, install dengan: apt-get install npm
  4. npm install
  5. npm install express helmet moonboots-express getconfig templatizer ldapjs body-parser compression serve-static
  6. npm install jade backbone underscore async stanza.io notify.js sound-effect-manager human-model
  7. npm install getusermedia crypto
  8. setelah itu jalankan : node server

 

Mengganti Windows 10 Default Browser

Lagi-lagi nemu masalah ketika selesai mengupgrade Windows 7 ke Windows 10. Kali ini browser tidak mau diset default selain bawaan dari Windows (Microsoft Edge), walaupun dari browser pilihan sudah dijadikan/disetting sebagai default browser. Ternyata perlu mengubah satu setting lagi seperti berikut:

  1. Klik tombol start lalu pilih icon setting: default browser 00
  2. Pilih System:default browser 01
  3. Pilih Defailt apps -> Web browser. Jika muncul daftar browser yang sudah diinstall di Windows 10, pilih browser yang dimaksud untuk dijadikan default browser (dalam contoh ini saya memilih Google Chrome).default browser 02

Sekarang default browser sudah berubah sesuai dengan pilihan kita.

Problem Setting Brightness di Windows 10

Jika kita mengupdate ke Windows 10 dari versi sebelumnya (misal Windows 7), ada kemungkinan akan mengalami permasalahan setting brightness. Layar akan tiba-tiba terang sekali dan kita tidak bisa menurunkan brightness setting. Untuk mengatasi problem (sepele tapi nyebahi) ini, lakukan langkah berikut:

  1. Masuk ke Device Manager -> Display adapters. Klik kanan pada device driver lalu pilih Update Driver Software..windows 10 brightness 00a
  2. Pilih Search automatically for updated driver software  dan tunggu beberapa saat, Windows 10 akan secara otomatis mencarikan update software display adapter terbaru.windows 10 brightness 00bwindows 10 brightness 01
  3. Setelah selesai (harusnya) kita bisa mengubah setting brightness.windows 10 brightness 02

Mengetahui Nomer Telp PSTN di Elastix

Salah satu kebiasaan saya dalam setup Elastix adalah memasukkan konfigurasi DAHDI Chanel DIDs seusai dengan nomer telepon analog yang tersambung ke FXO. Walaupun jika semua line disetup sebagai hunting, masing-masing line pasti memiliki nomer PSTN yang berbeda dari Telkom. Selain untuk kemudahan routing inbound/outbound, juga untuk kemudahan dokumentasi jika kelak terjadi masalah di salah satu line.

Caranya?

Yang dibutuhkan adalah extension yang aktif dan sebuah handphone untuk mengetahui nomer PSTN yang muncul. Lalu jalankan langkah berikut:

  • Aktifkan extension di SIP phone/Softphone (misal extension yang akan digunakan adalah 2015).
  • Masuk ke box Elastix melalui SSH. Lalu ketikkan perintah: asterisk -vr untuk masuk ke console Asterisk.
  • Jalankan perintah:  originate DAHDI/1/0811223344 extension 2015 (artinya, sambungkan extension 2015 ke nomer handphone 0811223344 melalui channel DAHDI/1). Periksa nomer telepon PSTN yang muncul di layar handphone, dan catat di DAHDI Channel DIDs sesuai dengan channelnya (dalam contoh ini Channel 1).
  • Jika channel DAHDI lebih dari satu, ganti angka channel dengan angka/urutan lainnya (misal originate DAHDI/2/0811223344 extension 2015, originate DAHDI/3/0811223344 extension 2015originate DAHDI/4/0811223344 extension 2015, dst).
  • Jumlah channel DAHDI yang ada bisa dilihat dengan perintah dahdi show channels dari console Asterisk. Contoh output seperti berikut:

dahdi channels

 

Replika Master-Slave MySQL

Latar Belakang

Pokoke ada database penting yang perlu dibackup di secondary server. Period.

Asumsi

  • Server MySQL master dan slave menggunakan OS Ubuntu (walaupun sebenarnya tidak harus Ubuntu, tetapi semua contoh setup di sini berjalan di atas OS tersebut).
  • Di bakal server slave sudah terinstall MySQL-server.
  • Sebagai perumpamaan, ip address MySQL master (untuk selanjutnya akan disingkat master saja) adalah : 1.2.3.4.
  • Sebagai perumpamaan, ip address MySQL slave (untuk selanjutnya akan disingkat slave saja) adalah: 4.3.2.1.
  • Masing-masing server tersambung dan dapat melakukan ping satu sama lain melalui LAN/WAN/VPN. Pastikan firewall melewatkan paket di antara ke-2 server tersebut (jika ada firewall).
  • Semua perintah shell dijalankan dengan privilege root. Sebenarnya yang paling aman adalah dengan menggunakan sudo. Tapi kali ini biar saya jadi ignorant sebentar.
  • Database yang akan direplicate bernama : TheDataBase.

Setup Server Master

  • Edit file /etc/mysql/my.cnf dengan parameter sebagai berikut:
    bind-address   	    = 1.2.3.4
    server-id           = 1 
    log_bin             = /var/log/mysql/mysql-bin.log
    binlog_do_db  	    = TheDataBase

    note: server-id sebenarnya bisa diisi bebas, yang penting berbeda dengan server-id slave nantinya.

  • Restart MySQL dengan perintah: service mysql restart .
  • Masuk ke MySQL shell dengan perintah : mysql -u root -pR4h4514  (ganti dengan password root MySQL server yang sedang disetup). Lalu jalankan perintah:
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY 'P455w0rd';
    mysql> FLUSH PRIVILEGES;

    ganti password P455w0rd dengan yang lebih aman.

  • masih di dalam shell MySQL, jalankan langkah berikut:
    mysql> USE TheDataBase;
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;

    perintah MySQL terakhir akan memunculkan table seperti berikut:

    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000235 |  7991253 | TheDatabase  |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)

    simpan output tersebut untuk keperluan nanti pada saat setup slave server.

  • Dengan kondisi terakhir database masih dilock, buka window/console shell linux baru untuk menjalankan langkah selanjutnya. Hal ini dilakukan agar database tetap dalam kondisi locked. Jika kita menjalankan perintah di windows/console MySQL yang sama, maka database akan otomatis unlocked. Setelah membuka windows/shell baru, jalankan langkah berikut:
    root@master:~# mysqldump -u root -p --opt TheDataBase > /usr/local/src/TheDataBase.sql

    Lokasi penyimpanan file hasil dump bebas bisa di mana saja. Ini hanya kebiasaan saya dalam menyimpan file dump di /usr/local/src.

  • Kembali ke window/shell MySQL sebelumnya lalu unlock database dengan cara:
    mysql> UNLOCK TABLES;
    mysql> QUIT;
  • Salin file hasil dump tersebut ke bakal server slave:
    root@master:~# scp /usr/local/src/TheDataBase.sql root@4.3.2.1:/usr/local/src/

Setup Server Slave

  • Login ke server slave dan masuk ke shell MySQL sebagai root. Jalankan langkah berikut ini:
    mysql> CREATE DATABASE TheDataBase;
    mysql> EXIT;
  • Import database yang sudah disalin sebelumnya:
    root@slave:~# mysql -u root -p TheDataBase < /usr/ocal/src/TheDataBase.sql
  • Edit file /etc/mysql/my.cnf seperti berikut:
    bind-address 	 = 4.3.2.1
    server-id	 = 2 
    relay-log 	 = /var/log/mysql/mysql-relay-bin.log
    log_bin          = /var/log/mysql/mysql-bin.log
    binlog_do_db 	 = TheDataBase
  • Restart MySQL dengan perintah: service mysql restart
  • Masuk ke shell MySQl sebagai root lalu jalankan perintah:
    mysql> CHANGE MASTER TO MASTER_HOST='1.2.3.4',MASTER_USER='backup', MASTER_PASSWORD='P455w0rd', MASTER_LOG_FILE='mysql-bin.000235', MASTER_LOG_POS=  7991253;
    mysql> START SLAVE;

    catatan:

    MASTER_HOST diisi dengan ip address MySQL master yaitu 1.2.3.4.

    MASTER_LOG_FILE dan MASTER_LOG_POS diisi dengan nama file log dan position sesuai di table output perintah SHOW MASTER STATUS pada saat setup master di atas.

    MASTER_USER dan MASTER_PASSWORD diisi dengan user dan password yang sudah ditambahkan pada saat setup master sebelumnya.

  • Jika kita menjalankan perintah shell MySQL di slave server dengan perintah:
    mysql> SHOW SLAVE STATUS\G

    maka akan muncul output:

    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 202.52.146.51
                      Master_User: backup
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000235
              Read_Master_Log_Pos: 7991253
                   Relay_Log_File: mysqld-relay-bin.000002
                    Relay_Log_Pos: 3282325
            Relay_Master_Log_File: mysql-bin.000235
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB:
              Replicate_Ignore_DB:
               Replicate_Do_Table:
           Replicate_Ignore_Table:
          Replicate_Wild_Do_Table:
      Replicate_Wild_Ignore_Table:
                       Last_Errno: 0
                       Last_Error:
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 7991253
                  Relay_Log_Space: 3282482
                  Until_Condition: None
                   Until_Log_File:
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File:
               Master_SSL_CA_Path:
                  Master_SSL_Cert:
                Master_SSL_Cipher:
                   Master_SSL_Key:
            Seconds_Behind_Master: 0
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 0
                    Last_IO_Error:
                   Last_SQL_Errno: 0
                   Last_SQL_Error:
      Replicate_Ignore_Server_Ids:
                 Master_Server_Id: 1
    1 row in set (0.00 sec)

    Perhatikan Read_Master_Log_Pos dan Exec_Master_Log_Pos memiliki nilai yang sama dengan output table SHOW MASTER STATUS sebelumnya. Begitu juga dengan Master_Log_File dan Relay_Master_Log_File.

Setting IPTABLES

Untuk membatasi akses MySQL maka dibuat aturan sebagai berikut:

  • Akses MySQL di master server hanya boleh dari ip address slave server, dan localhost.
  • Akses selain dari source di atas, akan diblok.

Rule dasar iptables-nya adalah sebagai berikut:

iptables -A INPUT -p tcp -s 4.3.2.1 --sport 1024:65535 -d 1.2.3.4 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -s 1.2.3.4 --sport 3306 -d 4.3.2.1 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -p tcp --dport mysql -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport mysql -s 4.3.2.1 -j ACCEPT
iptables -A INPUT -p tcp --dport mysql -j DROP

Supaya rule iptables tersebut persistent walauapun server direstart, install package iptables-persistent:

root@master:~# apt-get install -y iptables-persistent
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libgsasl7 libgnutls-openssl27 libntlm0
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
iptables-persistent
0 upgraded, 1 newly installed, 0 to remove and 153 not upgraded.
Need to get 8,960 B of archives.
After this operation, 58.4 kB of additional disk space will be used.
Get:1 http://kambing.ui.ac.id/ubuntu/ precise/universe iptables-persistent all 0.5.3ubuntu2 [8,960 B]
Fetched 8,960 B in 0s (63.1 kB/s)
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend requires a screen at least 13 lines tall and 31 columns wide.)
debconf: falling back to frontend: Readline
Preconfiguring packages ...
Configuring iptables-persistent
-------------------------------
Current iptables rules can be saved to the configuration file /etc/iptables/rules.v4. These rules will then be loaded automatically
during system startup.
Rules are only saved automatically during package installation. See the manual page of iptables-save(8) for instructions on keeping
the rules file up-to-date.
Save current IPv4 rules? y <---- jawab Y

Current iptables rules can be saved to the configuration file /etc/iptables/rules.v6. These rules will then be loaded automatically
during system startup.
Rules are only saved automatically during package installation. See the manual page of ip6tables-save(8) for instructions on
keeping the rules file up-to-date.
Save current IPv6 rules? n <---- jawab N

Selecting previously unselected package iptables-persistent.
(Reading database ... 42575 files and directories currently installed.)
Unpacking iptables-persistent (from .../iptables-persistent_0.5.3ubuntu2_all.deb) ...
Processing triggers for ureadahead ...
ureadahead will be reprofiled on next reboot
Setting up iptables-persistent (0.5.3ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (Dialog frontend requires a screen at least 13 lines tall and 31 columns wide.)
debconf: falling back to frontend: Readline
* Loading iptables rules... * IPv4... * skipping IPv6 (no rules to load)...

Secara otomatis, rule iptables akan di save di lokasi /etc/iptables/rules.v4.

 

Setting Log File di Elastix untuk troubleshoot

Salah satu file yang membantu saya dalam melakukan troubleshoot IP PBX Elastix adalah /var/log/asterisk/full. Output file ini tergantung dari setting yang ada di dalam file logger_logfiles_custom.conf . Setelah upgrade dari Elastix 2.4 ke 2.5, saya menemukan setup default file logger menjadi:

full => notice,warning,error,debug,verbose

Setting ini tidak terlalu membantu dalam troubleshoot, sehingga harus diubah menjadi:

full => notice,warning,error,debug,verbose(3),dtmf,fax

[stextbox id=”alert”]Untuk mengedit file ini tidak bisa dilakukan dari console shell. Editing harus dilakukan dari webGUI Elastix yang dapat diakses melalui menu PBX -> Tools -> Asterisk File Editor. Jika tidak, maka setiap kali reload config, Elastix akan meng-override semua perubahan yang sudah kita buat.[/stextbox]

Jika ingin menampilkan isi dari SIP packet ke dalam log /var/log/asterisk/full, masuk ke CLI Asterisk (asterisk -vvvr), lalu ketik:

*CLI> sip set debug on

Keluar dari CLI dengan mengetik quit, lalu periksa file log dengan tail -f /var/log/asterisk/full. Kali ini SIP packet akan dimunculkan juga. Untuk mematikan, masuk ke CLI lagi seperti di atas, lalu jalankan perintah:

*CLI> sip set debug off

[Elastix] Akses CDR dan Call Recording Untuk User Tertentu

Untuk keperluan monitoring penggunaan telepon dan rekaman panggilan, sebuah perusahaan memerlukan menambah user tertentu untuk login di WebGUI Elastix. Tapi karena user ini tidak masuk ke group administrator, maka CDR (Call Detail Record) dan call recording yang bisa diakses adalah untuk nomer ekstensi yang terkait dengan user tersebut. Agar supaya user tersebut tetap bisa melihat seluruh CDR dan call recording, yang perlu dilakukan adalah mengedit file /var/www/html/libs/paloSantoACL.class.php, terutama di blok:

[stextbox id=”grey” shadow=”false” image=”null”]function isUserAdministratorGroup($username)
{
$is=false;
$idUser = $this->getIdUser($username);
if($idUser){
$arrGroup = $this->getMembership($idUser);
//$is = array_key_exists(‘administrator’,$arrGroup);
$is = array_search(‘1’, $arrGroup);
}
return $is;
}[/stextbox]

Misalkan user yang kita tambahkan adalah user HRD, maka, tambahkan pada blok tersebut menjadi seperti:

[stextbox id=”grey” shadow=”false” image=”null”]function isUserAdministratorGroup($username)
{
$is=false;
$idUser = $this->getIdUser($username);
if($idUser){
$arrGroup = $this->getMembership($idUser);
//$is = array_key_exists(‘administrator’,$arrGroup);
$is = array_search(‘1’, $arrGroup);

     if(isset($arrGroup[‘HRD’]))
     $is=true;

}
return $is;
}[/stextbox]

Save file dan restart HTTPD untuk memastikan perubahan. Setelah itu login sebagai HRD (dengan asumsi, user HRD sudah disetup memiliki akses ke halaman CDR dan call recording – untuk cara setup tidak akan dibahas di sini), dan seluruh CDR dan call recording sudah bisa dilihat dari user tersebut.