Klien VPN membutuhkan bantuan berhak istimewa untuk mengonfigurasi ulang jaringan, dan fakta itu diterapkan terlalu luas pada segala hal di sekitarnya. Skrip yang memasang berbagi pakai berkas tidak memerlukan root, karena berbagi pakai itu milik sesi pengguna yang masuk dan kredensial pengguna tersebut. Memindahkan pemasangan keluar dari jalur berhak istimewa menghilangkan kebutuhan akan aturan sudo, kait root, dan penyuntingan aplikasi bawaan. Yang tersisa adalah applet kecil yang tetap terbuka, memantau satu profil, dan melakukan satu percobaan.

Mengapa ini termasuk dalam sesi pengguna

Volume yang dipasang adalah properti sesi yang memasangnya. Sesi pengguna lain tidak melihatnya, dan pemasangan milik root berperilaku berbeda dari yang dibuat Finder. Menjaga pemasangan di sesi pengguna mempertahankan semantik itu.

Pembantu berhak istimewa ada untuk bagian yang benar-benar membutuhkannya: membuat antarmuka terowongan, mengubah rute, memperbarui resolver. Memasang berbagi pakai SMB bukan salah satu bagian itu. Memperlakukannya seolah-olah demikian memaksa pilihan antara sudo tanpa kata sandi dan skrip root yang berjalan tanpa ada orang di tempat. Keduanya risiko yang lebih besar daripada yang dibenarkan masalahnya, dan pendekatan sesi pengguna menghindari pilihan itu sepenuhnya.

Kait koneksi Tunnelblick sendiri bukan pengganti di sini, karena berjalan di luar sesi desktop dan urutannya terhadap skrip klien tidak ditentukan. Menanyakan status dari applet pengguna adalah mekanisme yang lebih kecil dengan lebih sedikit asumsi.

Buktikan dulu secara manual bahwa berbagi pakai berfungsi

Otomasi tidak dapat menyediakan rute, izin, atau akun yang tidak ada. Hubungkan VPN secara manual dan buka berbagi pakai di Finder sebelum menulis skrip apa pun. Jika itu gagal, skrip akan gagal dengan cara yang lebih membingungkan.

Catat tiga nilai yang akan digunakan skrip: nama profil persis seperti yang didaftarkan Tunnelblick, URL berbagi pakai, dan nama volume yang ditampilkan Finder setelah pemasangan. Nama volume penting karena pemeriksaan pemasangan yang ada menggunakannya, dan pemeriksaan hanya berdasarkan nama adalah penjaga kenyamanan, bukan bukti identitas server. Gunakan nama yang unik di mesin tersebut. Lalu pastikan server menjawab sama sekali.

smbutil view //files.corp.example
osascript -e 'tell application "Tunnelblick" to get state of first configuration whose name is "Office"'
mount | grep -i smbfs

Perintah pertama membuktikan server menjawab, yang kedua membuktikan nama profil terurai, dan yang ketiga menunjukkan seperti apa pemasangan yang berhasil. Catat ketiganya sebelum mengotomatiskan apa pun.

Baca status profil dari Tunnelblick

Tunnelblick memaparkan konfigurasi dan statusnya melalui AppleScript, dan itulah satu-satunya kait yang dibutuhkan rancangan ini. Status yang penting adalah string yang dilaporkan untuk profil itu, bukan keberadaan aplikasi.

Penanyaan memiliki konsekuensi yang perlu disebut. Penyambungan ulang yang lebih pendek dari interval dapat berlalu tanpa terlihat, dan applet tidak melihat peralihannya sama sekali. Itu dapat diterima untuk penjaga pemasangan dan tidak dapat diterima untuk apa pun yang harus bereaksi terhadap setiap peristiwa. Jika Anda memerlukan kesetiaan peristiwa, ini mekanisme yang salah, bukan mekanisme yang membutuhkan pengatur waktu lebih pendek. Pilih interval dengan pertukaran itu dalam pikiran.

property attempted : false

on idle
    set profileName to "Office"
    set shareURL to "smb://files.corp.example/OfficeTeam"
    set volName to "OfficeTeam"
    tell application "Tunnelblick" to set vpnState to state of first configuration whose name is profileName
    if vpnState is not "CONNECTED" then
        set attempted to false
        return 20
    end if
    tell application "Finder" to set mounted to (exists disk volName)
    if (not mounted) and (not attempted) then
        set attempted to true
        try
            mount volume shareURL
        end try
    end if
    return 20
end idle

Ekspor sebagai aplikasi dengan opsi tetap terbuka, lalu jalankan di sesi yang masuk, bukan melalui sudo.

Pasang sekali, lalu berhenti mencoba

Bendera sudah dicoba adalah yang mencegah ini menjadi perulangan yang menebak kredensial. Setelah applet mencoba, ia menunggu status koneksi berubah sebelum mencoba lagi.

Perilaku itu disengaja. Berbagi pakai yang menolak pemasangan biasanya menolaknya karena alasan yang tidak dapat diperbaiki oleh percobaan ulang, dan percobaan berulang mengubah satu permintaan menjadi aliran permintaan. Bendera disetel ulang ketika profil meninggalkan status tersambung, jadi penyambungan ulang yang nyata menghasilkan tepat satu percobaan baru. Keluar dan menjalankan ulang applet juga menyetel ulangnya, dan itulah pengesampingan manual. Tidak ada jalur yang menyembunyikan kegagalan; keduanya membiarkannya terlihat di Finder.

Skrip tidak membawa kata sandi, dan seharusnya tetap begitu. Biarkan operasi pemasangan meminta, dan biarkan gantungan kunci melakukan apa yang didukung organisasi. Menanamkan kredensial dalam URL mengubah skrip kenyamanan menjadi rahasia yang harus dirotasi.

Apa yang tidak dapat dilakukan pembantu

Tiga batas perlu ditulis di samping applet. Ia tidak dapat mengeluarkan volume yang sibuk setelah kegagalan jaringan, ia tidak dapat menjamin DNS dan server siap ketika status mengatakan tersambung, dan ia tidak bereaksi terhadap setiap penyambungan ulang.

Batas pertama paling penting dalam praktik. Berbagi pakai yang servernya hilang meninggalkan volume yang tampak terpasang dan memblokir saat diakses, dan perbaikan yang sopan adalah menyelesaikan operasi berkas lalu mengeluarkannya sebelum pemutusan terencana. Yang kedua menjelaskan sebagian besar percobaan pertama yang gagal: terowongan sudah naik sementara resolver belum menyusul, jadi tunggu lalu pasang secara manual sekali untuk memastikan. Yang ketiga adalah pertukaran penanyaan tadi, bukan bug yang harus ditambal.

Untuk mesin tanpa pengawasan atau armada terkelola, rancangan ini bentuk yang salah. Gunakan kebijakan pemasangan milik administrator alih-alih memperluas applet desktop menjadi layanan berhak istimewa.

Artikel terkait