پروفایلی که پیش‌تر راه می‌افتاد اکنون با خطای گزینه‌ها شکست می‌خورد، و خطی که تجزیه‌گر نقل می‌کند روی صفحه کاملاً معقول به نظر می‌رسد. این همان تله است: فایل پیکربندی فهرستی از خطوط فیزیکی است، هر خط یک واژهٔ کلیدی گزینه و آرگومان‌هایش را دارد، و خط بلندی که ویرایشگر آن را می‌شکند تا وقتی بایت‌ها را نبینید با دو خط یکسان به نظر می‌رسد. هیچ‌چیز از شبکه، گواهی یا تونل در این دسته از خطاها دخیل نیست. دو خطی که روی صفحه یکسان به نظر می‌رسند می‌توانند در یک بایت تفاوت داشته باشند.

بررسی‌های زیر را به ترتیب انجام دهید و در اولین بررسی ناموفق توقف کنید. هر کدام از بعدی ارزان‌تر است، و هر کدام توضیح متفاوتی را کنار می‌گذارد.

یک خط، یک دستور

تجزیه‌گر یک خط را می‌خواند، واژهٔ نخست را به‌عنوان گزینه برمی‌دارد و بقیه را آرگومان‌های همان گزینه می‌داند. پس خطی مانند cert server.crt port 1194 دو دستور پشت سر هم نیست. یک گزینهٔ cert با سه آرگومان است، و سومی نام فایلی نیست که گزینه بپذیرد. خواندن خطا به‌عنوان شکست خط ازدست‌رفته درست است؛ خواندنش به‌عنوان دستور ازدست‌رفته درست نیست.

# malformed: one option, three arguments
cert server.crt port 1194

# intended: two options, one argument each
cert server.crt
port 1194

آن دو خط اصلاح‌شده قطعه‌ای هستند، نه پیکربندی. وجود دارند تا نشان دهند مرز کجاست. هر دستور عادی در پروفایل از همان قاعده پیروی می‌کند، و خطی که دو تا از آن‌ها را به هم می‌چسباند یا خطای آرگومان می‌دهد یا مقداری که گزینه انتظارش را نداشت.

ثابت کنید شکست خط واقعی است

ویرایشگرها برای نمایش می‌شکنند. برخی هنگام چسباندن شکست‌های سخت هم درج می‌کنند و برخی نه، بنابراین نتیجهٔ بصری یکسان می‌تواند از دو فایل بسیار متفاوت بیاید. پایان خطوط را نشان دهید و پیش از تغییر هر چیزی خطوط را بشمارید. اندازه‌گیری یک فرمان هزینه دارد؛ حدس زدن یک شب.

cat -A /etc/openvpn/server/lab.conf | sed -n '10,20p'
awk 'NR>=10 && NR<=20 {printf "%d:%s\n", NR, $0}' /etc/openvpn/server/lab.conf

در خروجی نخست هر شکست خط واقعی به‌صورت نشانگر $ دیده می‌شود، پس خطی که شکسته اما تقسیم نشده در جایی که صفحه‌تان می‌شکند هیچ نشانگری نشان نمی‌دهد. فرمان دوم خطوط شماره‌دار را چاپ می‌کند، که سریع‌ترین راه مقایسهٔ چیزی است که تجزیه‌گر گزارش می‌کند با چیزی که فایل دارد.

فاصله‌های اضافی هم دستور نمی‌سازند. تورفتگی ظاهری است، و خطی که با فاصله شروع می‌شود همان گزینهٔ یکتاست. اگر پیام خطا به شمارهٔ خط اشاره دارد، دقیقاً همان خط را بخوانید نه پاراگرافی که به آن تعلق دارد.

مسیر را نقل کنید، نه فهرست دستورها

گیومه‌ها برای آرگومان‌های دارای فاصله‌اند، نه برای گروه‌بندی گزینه‌ها. مسیر گواهی با فاصله به گیومه‌های خودش نیاز دارد؛ دو دستور که یک جفت گیومه را شریک‌اند هنوز یک خط خراب‌اند.

cert "/etc/openvpn/pki/lab certs/server.crt"
key "/etc/openvpn/pki/lab certs/server.key"

نام گزینه‌ها را هم‌زمان با چیدمان بررسی کنید، چون خط به‌هم‌چسبیده می‌تواند نشانه‌ای باورپذیر بسازد که هرگز وجود نداشته است. دستور درگاه port است؛ پروفایلی که برای همان ایده چیز دیگری به کار می‌برد حتی پس از اصلاح مرزهای خط هم شکست می‌خورد. وقتی نامی ناآشنا به نظر می‌رسد، آن را با فهرست گزینه‌های نسخه‌ای که اجرا می‌کنید مقایسه کنید نه با نمونه‌ای از انجمن.

بلوک‌های درون‌خطی را بلوک نگه دارید

پروفایل‌ها می‌توانند گواهی‌ها و کلیدها را درون‌خطی حمل کنند، و آن بلوک‌ها داده‌اند نه پیکربندی. خطوط PEM درون بلوک گزینه‌هایی نیستند که باید تخت شوند، دوباره تورفته یا به هم بپیوندند، و نشانگرهای بلوک باید در خطوط خودشان بمانند.

با بلوک درون‌خطی مانند ناحیه‌ای مات رفتار کنید: خطوط گزینه را پیرامونش اصلاح کنید، محتوایش را بایت‌به‌بایت دست‌نخورده بگذارید و هرگز آن را در رشتهٔ پشتیبانی عمومی نچسبانید. اگر ابزار قالب‌بندی بلوک را بازنویسی کرد، آن را از PKI خود بازیابی کنید نه اینکه دستی تعمیرش کنید.

کوچک‌ترین بخش را تعمیر کنید، نه قالب را

تعمیر وسوسه‌انگیز جایگزینی کل فایل با پیکربندی از آموزشی است که «کار می‌کند». این یک خط خراب را با مجموعه‌ای از تغییرات سیاست عوض می‌کند که هیچ‌کس بازبینی نکرده است: پارامترهای DH متفاوت، تنظیمات فشرده‌سازی، انتخاب رمز، شنونده‌های تکراری. مشکل اصلی کوچک و محلی است، و جایگزین هیچ‌کدام نیست.

پروفایل را در فایلی کاری محافظت‌شده کپی کنید، مرزهای خط را در آن رونوشت اصلاح کنید و بگذارید صاحب معمول سرویس آن را بارگذاری کند. سپس نمونه را راه‌اندازی کنید و نخستین خطا را، اگر هست، از ابتدا بخوانید.

openvpn --config /etc/openvpn/server/lab.conf --verb 3 --log /tmp/parse.log
grep -n 'Options error' /tmp/parse.log

وقتی مرحلهٔ تجزیه بگذرد، شکست بعدی دربارهٔ فایل، گواهی یا رمز خواهد بود نه واژگان، و این پیشرفت واقعی است. رونوشت کار و یادداشتی یک‌خطی دربارهٔ آنچه به هم پیوند خورد نگه دارید؛ همان چسباندن دوباره برای کس دیگری در همان تیم رخ خواهد داد.

مقالات مرتبط