VPN Mac semasa but: launchd menyelia kerja, bukan terowong
Plist yang lulus lint tidak membuktikan apa-apa tentang kelayakan atau kesediaan. Padankan kerja dengan sesinya, kekalkan klien di hadapan dan uji dalam konteks itu.
Kerja berjalan semasa log masuk, log menunjukkan klien bermula, tetapi terowong tidak pernah naik. Atau ia naik dan hilang beberapa saat kemudian. Dalam kedua-dua kes, senarai sifat itu mungkin betul. launchd membuat dua janji apabila menerima kerja itu: ia akan menyelia proses, dan proses itu akan terus berjalan. VPN memerlukan kedua-duanya, dan fail XML yang betul tidak menyediakan satu pun.
Senarai sifat yang sah bukan perkhidmatan yang berfungsi
plutil -lint memeriksa struktur. Ia tidak dapat memberitahu sama ada binari wujud, sama ada argumen disokong oleh versi klien ini, atau sama ada kerja bermula dalam konteks yang kelayakannya tersedia. Itu soalan semantik, dan ia menjelaskan kebanyakan kegagalan yang kelihatan seperti masalah launchd.
plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn
Baca output arahan kedua dan jangan anggap kerja telah dimuatkan. Ia melaporkan status keluar terakhir dan sama ada perkhidmatan berjalan, yang membezakan "tidak pernah bermula" daripada "bermula dan mati" sebelum anda menyentuh profil.
Ejen mewarisi sesi pengguna, daemon tidak
Dokumentasi launchd Apple memisahkan ejen setiap pengguna daripada daemon sistem. Ejen berjalan dalam konteks pengguna yang log masuk, dengan rantai kunci dan persekitaran pengguna itu. Daemon berjalan tanpa sesi itu, dan memindahkan kerja ke direktori sistem tidak mencipta semula kelayakan interaktif pengguna.
Perbezaan inilah yang menentukan reka bentuk. Jika sambungan memerlukan seseorang log masuk atau meluluskan gesaan MFA, susunan yang disokong ialah kerja sesi pengguna yang berjalan selepas log masuk. Jika ia mesti berfungsi tanpa sesiapa log masuk, klien memerlukan identiti tanpa penyeliaan yang diluluskan dengan proses pembaharuan dan pembatalannya sendiri. Memilih baris yang salah menghasilkan kerja yang bermula bersih dan gagal pada langkah pengesahan pertama.
Jangan tutup perbezaan itu dengan kata laluan dalam tatasusunan argumen atau dengan mematikan pemeriksaan sijil. Kedua-duanya menjadikan keperluan pengesahan sebagai rahsia kekal dalam fail yang boleh dibaca, dan yang kedua bermaksud terowong mengesahkan apa sahaja yang menjawab.
Penyeliaan hanya berfungsi jika proses kekal di hadapan
Klien yang menjadikan dirinya daemon memulangkan kawalan kepada launchd serta-merta, dan penyelia kemudian memerhati proses yang sudah tamat. Terowong mungkin naik, tetapi launchd menganggap kerja itu gagal, dan dasar permulaan semulanya akan melakukan sesuatu yang anda tidak niatkan.
Gunakan mod hadapan atau perkhidmatan yang didokumenkan oleh klien. Jika produk mempunyai ciri permulaan tersendiri yang disokong, ciri itu sudah tahu cara kekal di hadapan dan cara menyerahkan kepada tindanan rangkaian; kerja tersuai ialah reka bentuk berasingan, bukan penambahbaikan kepadanya.
Berikan kerja itu label unik, pelaksana yang dimaksudkan dan tatasusunan argumen yang disengajakan. Tatasusunan bukan baris arahan shell, jadi paip dan ubah hala tidak berfungsi di sana, dan tingkah laku petikan berbeza. Arahan yang berjaya dalam terminal pentadbir hanyalah pemeriksaan awal.
Kelayakan mesti berfungsi tanpa gesaan
Operasi tanpa penyeliaan memindahkan masalah kelayakan dan bukan menghapuskannya. Seseorang mesti memiliki identiti itu, memutuskan berapa lama ia hidup, dan mendokumenkan cara ia diganti. Sijil tanpa pemantauan tamat tempoh menjadi gangguan dengan tarikh pada kalendar.
Jauhkan rahsia daripada argumen dan daripada output standard kerja. Jika klien menyokong pembacaan kelayakan daripada stor terlindung, gunakan laluan itu, dan periksa sama ada konteks pelaksanaan kerja boleh mencapai stor itu. Daemon yang berjalan sebagai root biasanya tidak boleh membaca item rantai kunci log masuk, dan ini jenis perincian yang hanya muncul dalam konteks sistem.
Takrifkan maksud sedia, kemudian uji di situ
Pelancaran yang berjaya membuktikan proses bermula. Ia tidak membuktikan rangkaian naik, gerbang menerima identiti, atau aplikasi peribadi boleh dicapai. Jika sesuatu yang lain bergantung pada terowong, ia memerlukan isyarat kesediaan yang mencerminkan sambungan, bukan masa mula kerja.
Percubaan semula harus terhad dan harus membezakan rangkaian yang tiada daripada kelayakan yang ditolak. Melancarkan semula pada setiap kegagalan tidak dapat membaiki sijil yang tamat tempoh dan menghasilkan log penuh percubaan serupa yang menyembunyikan yang sebenar.
Terima kerja itu dalam konteks ia benar-benar akan berjalan: tiada rangkaian semasa but, log masuk biasa, bangun daripada tidur, dan hentian terkawal. Kemudian catat label kerja, versi klien dan semakan profil bersama-sama, supaya orang seterusnya mewarisi perkhidmatan yang boleh diatribusikan dan bukan fail yang pernah berfungsi.