Sebagai seorang email administrator, Anda pasti ingin akun-akun yang Anda kelola senantiasa aman dengan menerapkan fitur password policy dan juga password expiry. Zimbra sudah mendukung kedua fitur tersebut; namun, sayangnya, hingga versi Zimbra saat ini, yaitu v10.1.8, fitur Password Expiry Reminder jika password user akan expired belum tersedia secara resmi. Oleh karena itu, administrator harus mencari cara untuk menghadirkan fitur tersebut di Zimbra mereka.
Salah satu shell script yang banyak digunakan oleh administrator Zimbra untuk mengirim pesan reminder secara otomatis adalah Zimbra_passpoll buatan Wuxmedia. Sayangnya, script ini sudah tidak lagi di-maintain. Walaupun begitu script buatannya masih dapat berjalan dengan “baik” hingga di versi Zimbra saat ini.
Personal Opinion
Bagi saya script yang hanya dapat berjalan dengan “baik” itu tidaklah cukup. Mengingat script ini akan kita atur untuk berjalan secara otomatis setiap harinya. Satu hal yang cukup mengganggu saya dari script tersebut adalah proses eksekusinya memakan waktu yang lama.
Berikut adalah durasi yang dibutuhkan script tersebut untuk menjalankan tugasnya dengan total user sebanyak 16 akun (termasuk akun sistem).

Memakan waktu sekitar 5 menit 31 detik. Bayangkan jika jumlah user Zimbra kalian ribuan. Jika kita hitung kasar, untuk memproses 1 akun membutuhkan waktu sekitar 20 detik. Dalam 1 hari ada 86400 detik; 86400 : 20 = 4320. Kesimpulannya, dalam sehari script tersebut hanya mampu memproses sebanyak 4320 akun.
Improving
Seperti yang terlihat, script tersebut sangat bergantung dengan utilitas zmprov untuk mendapatkan data user, yang mana utilitas tersebut memang dikenal lambat.

Lantas apakah ada cara lain yang lebih efektif untuk mendapatkan data user? Jawabannya, Ada. Kita gunakan utilitas ldapsearch. Karena sebetulnya Zimbra menyimpan informasi akun (termasuk konfigurasi) di LDAP.
Sebagai bukti ldapsearch dapat berjalan lebih efektif dibandingkan dengan zmprov untuk mendapatkan list semua akun, kita coba lakukan pengukuran waktu eksekusi untuk keduanya.

Berikut hasilnya jika menggunakan utilitas measurement yang proper seperti hyperfine.

Terlihat cukup jauh perbedaanya bukan? Eeits.. tapi kita tidak bisa serta-merta mengganti baris code zmprov dengan ldapsearch begitu saja. Karena tentu saja algoritmanya pasti juga perlu dirubah.
Satu hal yang jelas perlu kita waspadai adalah ldapsearch menghasilkan bentuk output yang berbeda dari zmprov. Belum lagi untuk bisa menjalankan ldapsearch kita perlu supply LDAP_URL, LDAP_USER_DN, dan juga LDAP_PASSWORD. Perlu ada langkah-langkah tambahan untuk membuat ldapsearch bisa menghasilkan output yang sama dengan zmprov.
Masalah lain yang cukup mengganggu saya dari script tersebut adalah dari list semua akun yang didapat, tidak ada proses filtrasi untuk mengecualikan akun-akun sistem dari list akun yang akan diproses. Misalkan saja Zimbra kalian meng-hosting banyak domain, tentu masing-masing domain akan memiliki akun-akun sistemnya masing-masing (ham, spam, virus-quarantine, galsync). Hal ini mungkin terlihat sepele, namun bisa mencegah proses berjalan dengan sia-sia.
Untungnya kita dapat achive hal tersebut dengan menggunakan filter ini ‘(&(objectClass=zimbraAccount)(!(zimbraIsSystemResource=TRUE)))‘ pada ldapsearch.

Conclusion
Dengan hanya merubah utilitas yang digunakan script tersebut, kita sudah dapat membuat programnya berjalan berkali-kali lipat lebih cepat dibandingkan sebelumnya. Tetapi tentu memang tidak semudah itu untuk meraciknya. Oleh karena itu saya sudah membuat versi yang lebih “baik” dari script tersebut, yang dapat berjalan lebih cepat dan lebih optimal.
Jika kalian tertarik untuk mencobanya, silahkan kalian lihat di repository saya.
https://github.com/arfanamd/zscripts/blob/master/zexppass-alert.sh
Berikut hasil perhitungan waktu eksekusi dari versi script yang saya buat.

