বুটে Mac VPN: launchd কাজটি তত্ত্বাবধান করে, টানেল নয়
পরিচ্ছন্ন plist শংসাপত্র বা প্রস্তুতি সম্পর্কে কিছুই প্রমাণ করে না। কাজটিকে তার সেশনের সাথে মিলিয়ে নিন, ক্লায়েন্টকে সামনে রাখুন এবং সেই প্রেক্ষাপটেই পরীক্ষা করুন।
লগইনে কাজটি চলে, লগ দেখায় ক্লায়েন্ট শুরু হচ্ছে, আর টানেল কখনোই ওঠে না। অথবা ওঠে এবং কয়েক সেকেন্ড পরে হারিয়ে যায়। দুই ক্ষেত্রেই প্রপার্টি লিস্ট সম্ভবত ঠিকই ছিল। launchd কাজটি গ্রহণ করার সময় দুটি প্রতিশ্রুতি দিয়েছিল: এটি একটি প্রসেসের তত্ত্বাবধান করবে, এবং সেই প্রসেস চলতে থাকবে। VPN-এর দুটিই দরকার, আর একটি সঠিক XML ফাইল কোনোটিই দেয় না।
বৈধ প্রপার্টি লিস্ট মানেই সক্রিয় সেবা নয়
plutil -lint কাঠামো যাচাই করে। এটি বলতে পারে না বাইনারি ফাইলটি আছে কি না, আর্গুমেন্টগুলো এই ক্লায়েন্ট সংস্করণে সমর্থিত কি না, বা কাজটি এমন প্রেক্ষাপটে শুরু হয় কি না যেখানে শংসাপত্র পাওয়া যায়। এগুলো অর্থগত প্রশ্ন, এবং launchd সমস্যার মতো দেখানো বেশিরভাগ ব্যর্থতার ব্যাখ্যা এখানেই।
plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn
কাজটি লোড হয়েছে ধরে নেওয়ার বদলে দ্বিতীয় কমান্ডের আউটপুট পড়ুন। এটি শেষ এক্সিট স্ট্যাটাস এবং সেবাটি চলছে কি না জানায়, যা প্রোফাইল স্পর্শ করার আগেই “কখনো শুরু হয়নি” এবং “শুরু হয়ে মরে গেছে”-র পার্থক্য করে।
এজেন্টরা ব্যবহারকারী সেশন উত্তরাধিকার পায়, ডেমনরা নয়
Apple-এর launchd ডকুমেন্টেশন প্রতি-ব্যবহারকারী এজেন্টদের সিস্টেম ডেমন থেকে আলাদা করে। একটি এজেন্ট লগইন করা ব্যবহারকারীর প্রেক্ষাপটে, তার কীচেইন ও পরিবেশ নিয়ে চলে। একটি ডেমন সেই সেশন ছাড়া চলে, এবং কাজটি কোনো সিস্টেম ডিরেক্টরিতে সরিয়ে নিলে ব্যবহারকারীর ইন্টারঅ্যাকটিভ শংসাপত্র পুনরায় তৈরি হয় না।
এই পার্থক্যই নকশা নির্ধারণ করে। যদি সংযোগের জন্য কোনো ব্যক্তির লগইন করা বা MFA অনুরোধ অনুমোদন করা দরকার হয়, তবে সমর্থিত ব্যবস্থা হলো লগইনের পরে চলা একটি ব্যবহারকারী-সেশন কাজ। যদি কেউ লগইন না করেও কাজ করতে হয়, ক্লায়েন্টের দরকার একটি অনুমোদিত মানববিহীন পরিচয়, যার নিজস্ব নবায়ন ও বাতিল প্রক্রিয়া আছে। ভুল সারি বেছে নিলে এমন কাজ তৈরি হয় যা পরিষ্কারভাবে শুরু হয় এবং প্রথম প্রমাণীকরণ ধাপেই ব্যর্থ হয়।
আর্গুমেন্ট অ্যারেতে পাসওয়ার্ড দিয়ে বা সার্টিফিকেট যাচাই বন্ধ করে পার্থক্যটি ঢেকে ফেলবেন না। দুটিই প্রমাণীকরণের প্রয়োজনীয়তাকে একটি পাঠযোগ্য ফাইলে স্থায়ী গোপন তথ্যে পরিণত করে, আর দ্বিতীয়টির অর্থ হলো টানেল যে-কেউ উত্তর দেয় তাকেই প্রমাণীকরণ করে।
তত্ত্বাবধান কেবল তখনই কাজ করে যখন প্রসেসটি সামনে থাকে
যে ক্লায়েন্ট নিজেই ডেমন হয়ে যায় সে নিয়ন্ত্রণ সঙ্গে সঙ্গে launchd-কে ফিরিয়ে দেয়, আর তত্ত্বাবধায়ক তখন এমন প্রসেস দেখে যা ইতিমধ্যে বেরিয়ে গেছে। টানেল হয়তো উঠে আছে, কিন্তু launchd ভাবে কাজটি ব্যর্থ হয়েছে, আর তার রিস্টার্ট নীতিটি এমন কিছু করবে যা আপনি চাননি।
ক্লায়েন্টের নথিভুক্ত ফোরগ্রাউন্ড বা সেবা মোড ব্যবহার করুন। পণ্যটির নিজের সমর্থিত স্টার্টআপ বৈশিষ্ট্য থাকলে সেটি ইতিমধ্যেই জানে কীভাবে সামনে থাকতে হয় এবং কীভাবে নেটওয়ার্ক স্ট্যাকে হস্তান্তর করতে হয়; কাস্টম কাজ একটি আলাদা নকশা, তার উন্নতি নয়।
কাজটিকে একটি অনন্য লেবেল, অভীষ্ট এক্সিকিউটেবল এবং সুচিন্তিত আর্গুমেন্ট অ্যারে দিন। অ্যারে কোনো shell কমান্ড লাইন নয়, তাই পাইপ ও রিডাইরেকশন সেখানে কাজ করে না, আর কোটিং ভিন্নভাবে আচরণ করে। প্রশাসকের টার্মিনালে সফল একটি কমান্ড সবচেয়ে ভালো ক্ষেত্রে প্রাথমিক যাচাই।
শংসাপত্রকে কোনো প্রম্পট ছাড়াই কাজ করতে হবে
মানববিহীন পরিচালনা শংসাপত্রের সমস্যা সরিয়ে না দিয়ে স্থানান্তর করে। কারও পরিচয়টির মালিক হতে হবে, এটি কত দিন বাঁচবে তা ঠিক করতে হবে এবং কীভাবে প্রতিস্থাপিত হয় তা নথিভুক্ত করতে হবে। মেয়াদ পর্যবেক্ষণহীন একটি সার্টিফিকেট ক্যালেন্ডারের তারিখসহ একটি বিভ্রাটে পরিণত হয়।
গোপন তথ্য আর্গুমেন্টের বাইরে এবং কাজটির স্ট্যান্ডার্ড আউটপুটের বাইরে রাখুন। ক্লায়েন্ট যদি সুরক্ষিত স্টোর থেকে শংসাপত্র পড়া সমর্থন করে, সেই পথ ব্যবহার করুন, এবং যাচাই করুন যে কাজটির সম্পাদন প্রেক্ষাপট স্টোরটিতে পৌঁছাতে পারে। root হিসেবে চলা ডেমন সাধারণত লগইন কীচেইনের আইটেম পড়তে পারে না, আর এটিই এমন বিবরণ যা কেবল সিস্টেম প্রেক্ষাপটেই দেখা যায়।
প্রস্তুত মানে কী তা সংজ্ঞায়িত করুন, তারপর সেখানেই পরীক্ষা করুন
সফল লঞ্চ প্রমাণ করে প্রসেসটি শুরু হয়েছে। এটি প্রমাণ করে না যে নেটওয়ার্ক চালু আছে, গেটওয়ে পরিচয়টি গ্রহণ করেছে, বা ব্যক্তিগত অ্যাপ্লিকেশনটি পৌঁছানোর মতো। যদি অন্য কিছু টানেলের উপর নির্ভর করে, তার দরকার সংযোগ প্রতিফলিত করে এমন একটি প্রস্তুতি সংকেত, কাজটির শুরুর সময় নয়।
পুনঃপ্রচেষ্টা সীমিত হওয়া উচিত এবং অনুপস্থিত নেটওয়ার্ককে প্রত্যাখ্যাত শংসাপত্র থেকে আলাদা করা উচিত। প্রতিটি ব্যর্থতায় পুনরায় চালু করা মেয়াদোত্তীর্ণ সার্টিফিকেট সারাতে পারে না এবং একই রকম প্রচেষ্টায় ভরা একটি লগ তৈরি করে যা আসলটিকে লুকিয়ে ফেলে।
কাজটিকে যে প্রেক্ষাপটে সত্যিই চলবে সেখানেই গ্রহণ করুন: বুটে নেটওয়ার্ক নেই, সাধারণ লগইন, ঘুম থেকে জাগা এবং নিয়ন্ত্রিত থামা। তারপর কাজের লেবেল, ক্লায়েন্ট সংস্করণ এবং প্রোফাইল সংশোধন একসাথে লিখে রাখুন, যাতে পরের ব্যক্তি একবার কাজ করা একটি ফাইলের বদলে দায়ারোপযোগ্য একটি সেবা উত্তরাধিকার পান।