Obrolan Unix Sederhana
(the-dam.org)sucadalah Simple Unix Chat yang mengimplementasikan sebagian fitur inti ala Slack·Mattermost dengan kombinasi blok dasar UNIX dan Bash; loop intinya terdiri dari 5 baris, tetapi skrip sebenarnya lebih panjang- Pesan dibaca satu baris demi satu dari standar input, lalu diberi tanggal dan nama pengguna sebelum ditambahkan ke file kanal di
/var/lib/suc/, sementara autentikasi dan kontrol akses diserahkan ke SSH dan model izin UNIX - Berbeda dengan server Mattermost yang memiliki sekitar 500 ribu baris kode Go saja,
sucmenekankan bahwa perilaku inti serupa dapat dibuat dengan kode yang jauh lebih kecil usucmenggabungkantail -f,rlwrap,pygmentize, dan awalan perintah:untuk menangani pembacaan kanal, keluaran bergaya Markdown, dan berbagi hasil perintah- Karena kanal hanyalah file teks sederhana, ia mudah dirangkai dengan alat UNIX seperti
grep,tail,bat,lnav, hook Git, dan skrip bot
Kompleksitas yang ingin dikurangi oleh suc
sucadalah singkatan dari Simple Unix Chat; fiturnya lebih sedikit daripada Slack, Mattermost, dan IRC, dan jumlah baris totalnya memang lebih dari 5, tetapi loop inti untuk menulis pesan disusun dalam 5 baris Bash- Fitur yang dituju adalah obrolan rich text waktu nyata, berbagi file, kontrol akses yang rinci, otomatisasi dan integrasi alat eksternal, enkripsi saat transmisi, enkripsi opsional saat penyimpanan, serta autentikasi pengguna
- Implementasi yang kecil dimungkinkan karena memanfaatkan blok dasar yang konsisten dan dapat dikombinasikan yang disediakan implementasi UNIX modern
- Sebagai perbandingan, server Mattermost memiliki sekitar 500 ribu baris kode Go, dan
sucmenilai dirinya dapat mengimplementasikan fitur inti Mattermost dengan 0,005% dari jumlah kode tersebut
Loop penulisan pesan 5 baris
- Loop Bash inti
sucmembaca satu baris dari standar input, menambahkan tanggal dan nama pengguna sebenarnya, lalu menambahkannya ke file/var/lib/suc/"$1" - Skrip sebenarnya lebih panjang karena prapemrosesan keamanan dan perhitungan warna nama pengguna, tetapi perilaku inti untuk menulis riwayat obrolan dapat diringkas menjadi tiga hal
- membaca satu baris dari standar input
- menambahkan tanggal dan nama pengguna sebenarnya
- menambahkan ke file kanal di bawah
/var/lib/suc/
- Autentikasi, kontrol akses, enkripsi, dan rich text ditangani bukan oleh kode internal
suc, melainkan oleh SSH, API kontrol akses UNIX, dan modularitas berbasis teks
SSH menangani autentikasi
- Proses
sucdijalankan oleh pengguna yang sudah diautentikasi, jadisucsendiri tidak memiliki kode autentikasi - Autentikasi jarak jauh ditangani oleh
sshseperti pada server UNIX pada umumnya- rahasia bersama seperti kata sandi
- tantangan kriptografis
- perangkat pembuat kata sandi sekali pakai (OTP)
- MFA yang menggabungkan beberapa metode
sshjuga mengautentikasi server kepada klien untuk mencegah serangan man-in-the-middle, dan mengenkripsi semua data antara klien dan server- Instalasi
sucbergantung pada host UNIX dan konfigurasi serverssh- pengguna harus ada di sistem
- server
sshharus mengizinkan login jarak jauh untuk pengguna tersebut
- Di GNU Guix, pengguna dan kunci SSH dapat ditambahkan dalam satu baris dengan konfigurasi deklaratif, dan jika baris konfigurasi itu dihapus maka pengguna akan dihapus saat proses rekonfigurasi
Kontrol akses ditangani model izin UNIX
suctidak hanya tidak menyertakan kode autentikasi, tetapi juga tidak menyertakan kode kontrol akses; pendekatan ini disebut security agnosticism- Kernel UNIX mengetahui pengguna, grup, proses, dan file, lalu menentukan izin baca-tulis file berdasarkan pemilik efektif (effective owner) dari proses
- File kanal di
/var/lib/sucdimiliki oleh penggunasuc, dan diatur agar pengguna bisa membaca kanal tertentu melalui izin baca per grup - Pengguna biasa tidak menulis langsung ke file, melainkan menjalankan
suc, dan pencocokan serta pemblokiran izin ditangani oleh kernel - Dalam komunitas yang lebih ketat, biner
setuidper grup bisa disediakan- misalnya,
suc_bluedimiliki oleh penggunabluedan hanya bisa dijalankan oleh grupblue - pengguna dalam grup
bluedapat menulis ke kanalbluemelaluisuc_blue - pengguna grup
redtidak dapat membaca atau menulis kanalblue
- misalnya,
- Skrip pembantu pembuatan kanal
suc_channel.shpanjangnya sekitar 80 baris, dan pengguna GNU Guix dapat membuat biner setuid, pengguna, grup, dan file kanal yang diperlukan hanya dengan satu baris(suc-private-channel "red" "red") - Pembaruan transaksional GNU Guix menjamin perubahan konfigurasi diterapkan sepenuhnya atau tidak sama sekali, dan dapat di-rollback ke keadaan kerja sebelumnya
Rich text dan usuc
- Banyak aplikasi chat merender teks dengan mesin HTML, dan klien desktop Mattermost menggunakan Electron
sucmenggunakan satu file teks per kanal, dan pengguna dapat melihatnya dengan alat baris perintah sepertitailataucat- Dengan memanfaatkan kode escape ANSI terminal dan dukungan UTF-8, pengalaman warna, emoji, dan rich text dasar dapat dibuat
suchanya menulis ke file kanal, sedangkan pembacaan ditangani olehusucsucadalah biner berizin khusus, jadi logika dan dependensi eksternalnya harus diminimalkanusucdijalankan dengan izin pengguna pemanggil, sehingga fitur bisa ditambahkan dengan lebih bebas
usucmerangkai beberapa alat kecil untuk berperan sebagai klien chat- menyediakan riwayat dan pengeditan baris dengan
rlwrap - memilih biner
sucsetuid yang sesuai berdasarkan pemilik file kanal - menampilkan 20 baris terakhir dan baris yang ditambahkan setelahnya dengan
tail -f -n 20 - memeriksa apakah baris input diawali
: - memproses teks yang dimasukkan pengguna dengan
pygmentize
- menyediakan riwayat dan pengeditan baris dengan
pygmentizemembaca standar input sebagai Markdown lalu mengeluarkan teks berwarna ANSI, sehingga markup seperti**bold**dapat didukung hanya dengan satu baris kode
Perintah chat dan integrasi shell
- Jika pesan diawali
:,usuctidak mengirimkannya sebagai pesan biasa, melainkan menjalankan perintah tersebut lalu mengirim hasil keluarannya melaluisuc - Misalnya, menjalankan
gum style --border=rounded --bold --foreground=#F00 "Hello World !"akan membuat teks dengan bingkai dan gaya muncul di kanal - Perintah dijalankan dalam namespace pengguna yang memanggil
usuc, sehingga pengguna dapat memiliki makro chat sendiri tanpa memengaruhi pengguna lain - Di the dam, ini digunakan saat RPG meja untuk melempar dadu dengan perintah seperti
roll 2d6
Integrasi pipa teks dan alat eksternal
- Alih-alih memakai fitur eksekusi perintah
usuc, pengguna juga bisa langsung mengalirkan keluaran perintah dari shell kesuc - Jika keluaran berwarna dari
batdikirim kesuc, potongan kode dapat dibagikan ke kanal dengan sintaks yang sudah diberi highlight make test > testlog || (suc devops < testlog ; exit 1)adalah contoh one-liner Bash yang mengirim log ke kanaldevopssaat pengujian gagal- One-liner ini dapat dimasukkan ke hook
updatepada repositori Git untuk menjalankan tes saat push, menolak pembaruan jika gagal, lalu memberi tahu tim DevOps - Pekerjaan yang setara dengan fitur integrasi di Slack atau Mattermost dapat disusun dengan pipa teks UNIX dan skrip
Membaca kanal, notifikasi, dan bot
- Kanal
sucadalah file teks yang terus diperbarui, sehingga baris baru dapat dibaca dan diproses dengantail -f - Saat pesan baru masuk, pipeline dapat dibuat untuk mengirim notifikasi dengan
notify-send, dangrepbisa dipakai untuk memfilter hanya nama tertentu atau kata kunci seperti “build failure” - Untuk menggabungkan beberapa kanal menjadi satu feed,
tail -f /var/lib/suc/*dapat digunakan - Dengan lnav, pengguna dapat memanfaatkan pengingatan posisi baca, bookmark, warna per kanal, parsing tanggal/nama pengguna/field khusus, filtering, dan kueri SQL
- Bot dapat dibuat selama ia bisa membaca dan menulis ke kanal sekaligus
- contohnya mencari ekspresi panjang seperti
33000 ftdi kanal - mengubahnya ke meter dengan perintah
units - lalu menulis balasan seperti
[metric_bot] 33000 ft is 10058.4 meters.ke kanal yang sama
- contohnya mencari ekspresi panjang seperti
Perbandingan dan kesimpulan
- Perbandingan yang dipakai mencakup sistem besar seperti Slack, Mattermost, dan Discord, tetapi menurut penulis pembanding yang lebih adil juga mencakup IRC,
talk, danwrite - IRC dinilai memiliki fitur lebih sedikit daripada
suckarena memerlukan bouncer untuk membaca riwayat chat lama - Disebutkan bahwa
talk,ytalk, danwalltidak berhasil dibuat berjalan di distribusi Linux modern sucmenyerahkan autentikasi ke SSH, kontrol akses dan komposabilitas ke UNIX, serta mempertahankan kanal sebagai file teks- Alat-alatnya bisa ditulis dalam bahasa apa pun selama dapat membaca dan menulis teks
1 komentar
Komentar Hacker News
Langsung teringat pada “Master Foo and the Ten Thousand Lines”: http://catb.org/~esr/writings/unix-koans/ten-thousand.html
Ini kisah ketika Master Foo berkata kepada programmer yang berkunjung, “satu baris shell script mengandung lebih banyak hakikat Unix daripada 10 ribu baris C”
Jika fungsi inti baku dari sesuatu bisa direplikasi dengan terlalu mudah dan sepele, mungkin fungsi itu bukan inti atau sumber nilai yang sebenarnya
Jadi penasaran berapa banyak bagian dari pengembangan UI sejak 1980-an yang sudah diserap dan diotomatisasi oleh rekayasa perangkat lunak, atau apakah itu masih wilayah seni manusia murni
Bahkan sebelum Slack muncul dan menyingkirkan yang lain, sudah ada puluhan aplikasi—baik komersial maupun open source—yang melakukan hal itu
Nilai utama Slack ada di langkah berikutnya. Slack menyediakan UI/UX yang enak dilihat dan sangat intuitif, sehingga hampir siapa pun bisa langsung duduk dan memakainya tanpa belajar, konfigurasi, manual, atau pelatihan. Tidak perlu pengetahuan teknis, dan tanpa perlu memahami apa pun selain “masukkan nama pengguna dan kata sandi”, sisanya terasa jelas dengan sendirinya
Tapi lalu muncul pertanyaan yang lebih sulit. Dibandingkan alternatif untuk melatih pengguna lebih jauh agar bisa melakukan pemanggilan command line yang sangat dasar, apakah harga Slack memang sepadan? Bagaimana jika juga mempertimbangkan bahwa Slack menahan data dan tidak mengembalikannya? Seberapa mahal biaya untuk keluar dari Slack?
Memang suc tidak nyaman, tetapi rasanya bisa saja mengerucut ke sesuatu yang kurang bengkak dan kurang tertutup dibanding Slack
Saya suka hasil akhirnya. Menarik melihat apa yang bisa dibuat dengan komposabilitas
Hanya saja, membandingkannya dengan Slack dan sejenisnya terasa kurang kena. Tidak ada engineer yang ingin bertanggung jawab di production untuk sesuatu yang dirangkai begini dari sana-sini. Bagaimana rekrut talent-nya, bagaimana testing dan debugging-nya, bagaimana logging dan analytics-nya?
Tulisan ini memang menyalin sebagian fungsi chat dari aplikasi ala Slack, tetapi fitur chat bukan 100% dari aplikasi seperti itu. Keduanya dibuat dalam lingkungan yang sepenuhnya berbeda, jadi menyerang keadaan saat ini sebagai sesuatu yang bengkak terasa seperti tafsiran yang dipelintir ala Stockton Rush. Memang ada kebengkakan dalam software, tetapi “Lihat, Bu, saya bikin kapal selam dari barang rongsokan. Jadi kapal selam mahal itu bodoh” tidak terdengar seperti bantahan yang sebenarnya dimaksud penulis
Utilitas individual biasanya lebih mudah dipahami, diuji, dan di-debug sebagai unit terpisah, logging juga sudah ada di sistem. Bukankah ada syslog? Dan kenapa analytics dibutuhkan?
Meski begitu, saya benar-benar penasaran seperti apa jadinya jika alat seperti Slack secara agresif memprioritaskan kesederhanaan ketimbang fitur baru. Rasanya kapitalisme secara keseluruhan tidak mendorong pengembangan seperti ini, jadi tidak banyak contoh software enterprise yang sesederhana mungkin secara masuk akal. Tetap saja ini eksperimen pemikiran yang menarik
Mirip dengan itu, ada juga ii yang berjalan langsung di atas IRC: https://tools.suckless.org/ii/
Ia memakai satu file standar untuk semua percakapan, autentikasi dan kontrol akses langsung ditangani jaringan IRC, dan UI-nya sudah banyak. Seperti pada tulisan ini, plugin bisa berupa apa saja yang membaca suatu file dan menulis ke file lain
Seperti diagram craigslist, akan seru kalau ada diagram spawn of unix yang mengumpulkan startup-startup yang memotong celah di antara fungsi-fungsi Unix
https://thegongshow.tumblr.com/post/345941486/the-spawn-of-craigslist-like-most-vcs-that-focus
ftp/rsync => Dropbox
suc => Slack
...
Jika judulnya terlihat seperti clickbait sehingga Anda ingin melewatinya, memang ada sedikit unsur clickbait, tetapi sebenarnya ini tulisan yang cukup bagus
Tulisan ini membahas utilitas
suc(Simple Unix Chat), yang mengimplementasikan fungsi server seperti Slack atau Discord dengan basis kode yang sangat kecilHal yang baru adalah ia memanfaatkan alat dan metodologi Unix yang sudah ada, alih-alih menciptakannya ulang. Autentikasi ditangani oleh SSH, channel hanyalah file biasa, dan kontrol admin/moderator ditangani dengan grup pengguna serta izin file. Hal seperti teks berformat atau unggah file juga bisa dilakukan dengan menulis data yang diinginkan ke channel lalu membiarkan klien menafsirkannya. Bot juga sangat mudah, cukup hubungkan pipe ke file channel
Anda memang tidak bisa membuat klon Slack yang sempurna hanya dengan 5 baris untuk menulis pesan ke channel seperti di artikel itu, tetapi tetap sangat mengesankan seberapa jauh Anda bisa melangkah hanya dengan alat Unix yang benar-benar sederhana
Ada alasan mengapa hampir tidak ada sistem produksi besar yang ditulis dengan paradigma “everything is a file” dan shell script. Untuk sistem yang tidak sepele dan benar-benar akan dipakai di dunia nyata, pendekatan itu tidak bisa diterima
Di dalamnya ada UI admin, UI manajemen pengguna, skalabilitas, webhook, dan sebagainya. “Semua orang login ke kotak itu lalu bisa chat dengan pengguna lain di Linux” tidak menangani satu pun dari hal-hal ini. Semua fitur itu sudah ada di semua *nix jauh sebelum kebanyakan pembaca di sini lahir
Sayangnya, fitur Plan 9 ini masih belum dipindahkan ke Linux. Ini semacam bit izin seperti “read” atau “write”, tetapi jauh lebih spesifik
Bukan menyalahkan penulisnya, dan artikelnya sendiri juga sangat jujur tentang hal ini
Slack dan Discord punya berbagi layar dan chat suara. Ini bukan fitur tambahan, melainkan fitur yang cukup menentukan dalam dominasi pasar
Tulisan blog ini memang tentang suc dan sejak awal juga jujur mengakui bahwa judulnya bisa sedikit menyesatkan, tetapi pada akhirnya ada pesan penting yang tidak berhubungan langsung dengan suc
Hampir semua perangkat lunak modern sangat bengkak. Gagasan bahwa server chat kaya fitur membutuhkan 1,7 juta baris terasa tidak masuk akal. Meminjam gaya Bill Gates, rasanya saya pun tidak akan bisa “menghabiskan” sebanyak itu baris kode hanya untuk server chat, sekeras apa pun saya berusaha
Saya mengapresiasi bahwa tulisan ini bukan sekadar menyoroti masalah atau menawarkan alternatif, tetapi juga mengingatkan bahwa kita tidak perlu menciptakan ulang roda. Mengimplementasikan sesuatu dengan cerdik menggunakan sifat dari sistem dan subsistem yang ada, misalnya memakai SSH untuk autentikasi dan enkripsi, meskipun bukan untuk tujuan persis seperti yang mula-mula dibayangkan tetapi tetap sejalan dengan maksud dari sifat-sifat itu, adalah contoh bagus dari semangat hacker
Saya berharap dunia perangkat lunak bisa banyak belajar dari konsep ini. Biaya yang lebih rendah, waktu pengembangan yang lebih singkat, dan berkurangnya waktu engineering yang terbuang untuk menulis ulang kode yang secara fungsional sama akan baik bagi developer, perusahaan, pengguna akhir, dan pada akhirnya umat manusia. Saya ingin melihat lebih banyak lagi penghancuran kreatif seperti ini ke depan, dan saya juga ingin mencoba menerapkan teknik cerdas seperti ini di proyek-proyek saya berikutnya
Jadi sebenarnya lebih tepat menghitung hanya baris kode Go
[0] https://github.com/mattermost/mattermost/tree/master/e2e-tests
[1] https://github.com/mattermost/mattermost/tree/master/webapp
Ini biasanya ide yang bagus karena mempercepat peluncuran dan mengurangi ukuran organisasi. Namun ada trade-off besar berupa kompleksitas dan abstraksi. Makin tinggi tingkat abstraksi, sering kali makin buruk hasilnya. Jadi bukan berarti tanpa alasan sama sekali
Saat ini, sebagian besar distribusi memblokir pembuatan skrip bash setuid demi alasan keamanan
Namun, efek yang hampir sama bisa diperoleh dengan entri sudoers tertentu
https://perldoc.perl.org/perlsec#Taint-mode
Di beberapa sistem mungkin ada race condition yang mendasar:
https://perldoc.perl.org/perlsec#Shebang-Race-Condition
Penggunaan
sudo -Tjuga layak dilihat:https://perldoc.perl.org/perlsec#Using-Sudo
Cukup disayangkan taint mode baru-baru ini dihapus dari Ruby. Pelacakan taint adalah mekanisme kuat yang bisa melampaui sekadar skrip. Misalnya, jika
#html_safedi Rack/Rails ditangani dengan pelacakan taint, perilakunya bisa jauh lebih ketat: saat string pengguna yang terkontaminasi digabungkan/diinterpolasi/diformat ke dalam fragmen SQL, eksekusi bisa langsung gagal, sehingga satu kelas SQL injection dapat dicegah sejak level desainDulu juga ada orang-orang yang menggunakan pelacakan taint dengan sangat efektif di CGI/mod_perl. Ini jelas bukan solusi ajaib untuk semuanya, tetapi tetap alat yang cukup efektif
https://gitlab.com/edouardklein/suc/-/blob/master/suc_wrapper.c
Sebelum melihat file wrapper di repositori GitLab, saya membacanya sambil berharap memang ada caranya
Ini topik lain, tapi agak mengejutkan talk(1) tidak disebut: https://man.netbsd.org/talk.1
Nilai plusnya adalah penerimaan bisa dibatasi hanya secara lokal, sehingga akun pengguna di mesin tersebut menjadi syarat. Karena itu, ini cocok untuk tempat seperti SDF atau klaster yang lebih besar. Autentikasi tidak perlu ditangani sendiri, cukup serahkan ke PAM atau BSD_Auth. Socket maupun enkripsi juga tidak perlu ditangani sendiri, cukup serahkan ke TLS. Anda juga bisa masuk ke shell aman lewat SSH lalu memakai tmux dan (n)talk
Tentu saja, karena (n)talk ditulis dalam C, ini bukan 5 baris bash
[1] https://man7.org/linux/man-pages/man2/write.2.html