ردیابی API سی پنل: راهنمای جامع نصب، فیلترینگ و تحلیل لاگ‌ها پرینت


نصب و راه‌اندازی API Tracer

در دنیای مدیریت هاستینگ و به ویژه برای توسعه‌دهگانی که با cPanel کار می‌کنند، درک نحوه عملکرد APIهای داخلی این پنل مدیریتی از اهمیت بالایی برخوردار است. از آنجایی که مستندات این APIها ممکن است به طور کامل در دسترس نباشد، ابزاری مانند API Tracer می‌تواند بینش ارزشمندی را در مورد فراخوانی‌های داخلی cPanel فراهم کند. این ابزار با ثبت تمامی درخواست‌های API، به توسعه‌دهگان کمک می‌کند تا داده‌های ورودی و خروجی توابع مختلف را تحلیل کرده و در توسعه ماژول‌های سفارشی یا عیب‌یابی عمیق‌تر از آن بهره ببرند.

مراحل نصب و فعال‌سازی Tracer

راه‌اندازی API Tracer فرآیند ساده‌ای است که مستلزم دانلود و قراردادن دو فایل در مسیرهای مشخصی روی سرور cPanel می‌باشد. برای شروع، شما نیاز به دانلود دو فایل Perl با نام‌های Dumper.pm و CustomEventHandler.pm دارید.

  1. فایل Dumper.pm باید در مسیر /usr/local/cpanel/perl/Dumper قرار داده شود.
  2. فایل CustomEventHandler.pm نیز باید در مسیر /usr/local/cpanel/Cpanel کپی شود.

پس از انجام این مراحل، cPanel به طور خودکار شروع به ثبت تمامی فراخوانی‌های API در فایل error_log خود که در آدرس /usr/local/cpanel/logs/error_log قرار دارد، می‌کند. برای مشاهده بلادرنگ این لاگ‌ها، می‌توانید از دستور tail -f /usr/local/cpanel/logs/error_log در خط فرمان سرور استفاده کنید و همزمان با لاگین به رابط cPanel، داده‌های ثبت شده را مشاهده نمایید.

فیلتر کردن اطلاعات برای کارایی بهتر

از آنجایی که این ابزار حجم بسیار زیادی از اطلاعات را ثبت می‌کند، حدود ۹۰ درصد آن ممکن است غیرمرتبط باشد. برای متمرکز شدن بر روی فراخوانی‌های خاص، باید از قابلیت فیلتر کردن استفاده کرد. handler سفارشی که نصب کرده‌اید، پارامترهای مختلفی را دریافت می‌کند که مهمترین آن‌ها برای فیلتر کردن عبارتند از:

  • $apiv: نشان‌دهنده نسخه API (مانند API1 یا API2)
  • $module: ماژولی که تابع در آن فراخوانی می‌شود (مانند Email یا MySQL)
  • $event: نام خود تابع فراخوانی شده (مانند addpop یا adduserdb)

همچنین توجه داشته باشید که این handler دو بار برای هر فراخوانی اجرا می‌شود: یک بار قبل از اجرای تابع (مقدار $type برابر pre) و یک بار پس از اتمام آن (مقدار $type برابر post). نکته ایمنی بسیار مهم این است که در حالت pre، اگر handler مقدار false برگرداند، اجرای تابع اصلی متوقف می‌شود؛ بنابراین همیشه باید مقدار ۱ را بازگردانید. مثلاً برای فیلتر کردن و ثبت تنها توابع مربوط به ماژول ایمیل، کدی شبیه به return 1 if $module ne 'email'; در ابتدای تابع رویداد اضافه می‌شود. برای فیلتر دقیق‌تر روی یک تابع خاص، می‌توان از شرطی مانند return 1 if $module ne 'email' || $event ne 'addpop'; استفاده کرد.

تفسیر داده‌های خروجی Tracer

خروجی تولید شده توسط این ابزار در error_log، ساختار مشخصی دارد. هر بلوک با یک خط جداکننده شروع شده و سپس اطلاعات زیر نمایش داده می‌شود:

  • نام ماژول و تابع (مثلاً mysql:adduserdb)
  • نسخه API ($apiv = 1 یا 2)
  • نوع فراخوانی (Pre یا Post)
  • داده‌های $cfgref (ورودی‌های تابع)
  • داده‌های $dataref (خروجی تابع، فقط در حالت Post)

درک ساختار $cfgref حیاتی است. در API1 که از پارامترهای ترتیبی استفاده می‌کند، داده‌ها به صورت param0, param1 و ... نمایش داده می‌شوند. اما در API2 که از پارامترهای نام‌گذاری شده بهره می‌برد، داده‌ها به صورت جفت‌های کلید-مقدار (مانند 'domain' = 'somedomain.com') نشان داده می‌شوند. در این حالت، پارامترهای عمومی مانند پارامترهای پیشونددار api2_ یا cache_fix معمولاً قابل چشم‌پوشی هستند. داده‌های $dataref نیز که خروجی تابع هستند، در API1 معمولاً ساده و به صورت رشته هستند، اما در API2 می‌توانند ساختارهای داده پیچیده‌ای باشند که نیاز به مراجعه به مستندات دارد.

ملاحظات امنیتی و محدودیت‌های مهم

استفاده از API Tracer با وجود مفید بودن، همراه با ملاحظات مهمی است که نباید نادیده گرفته شوند. این ابزار اطلاعات حساسی مانند نام‌کاربری و رمزهای عبور که از طریق رابط cPanel ایجاد یا تغییر می‌کنند را به طور کامل در error_log ثبت می‌کند. این یک ریسک امنیتی بزرگ محسوب می‌شود. بنابراین، استفاده از آن روی یک سرور هاستینگ تولیدی (Production) به شدت غیرمستحب است. اگر به طور موقت از آن استفاده می‌کنید، حتماً پس از اتمام کار، فایل error_log را پاک کنید. همچنین این نسخه از Tracer نیاز دارد که مسیر /dev/shm روی سرور قابل نوشتن باشد. این مسیر برای عملکرد سریع انتخاب شده اما در صورت نیاز می‌توان آن را در اسکریپت تغییر داد. رعایت این نکات برای حفظ امنیت سرور cPanel شما ضروری است.

فیلتر کردن داده‌های خروجی

ضرورت فیلتر کردن داده‌ها در tracer API سی پنل

همان‌طور که در متن مرجع اشاره شده، حدود ۹۰ درصد از اطلاعاتی که توسط API Tracer در فایل error_log سی پنل ثبت می‌شود، احتمالاً اطلاعاتی نیست که توسعه‌دهنده یا مدیر سرور به دنبال آن باشد. فعال‌سازی این ابزار بدون اعمال فیلتر مناسب، منجر به تولید حجم عظیمی از داده‌های لاگ می‌شود که یافتن اطلاعات مرتبط را در میان آن‌ها بسیار دشوار و زمان‌بر می‌کند. هدف اصلی از فیلتر کردن، تمرکز روی ماژول‌ها و توابع خاصی است که برای رفع مشکل یا دیباگ یک بخش ویژه از هاستینگ مورد نیاز است. این کار نه‌تنها کارایی را افزایش می‌دهد، بلکه از پر شدن فضای دیسک با لاگ‌های غیرضروری نیز جلوگیری می‌کند.

متغیرهای کلیدی برای فیلتراسیون

هنگامی که یک رویداد در سی پنل رخ می‌دهد، اطلاعاتی به هندلر سفارشی (CustomEventHandler) ارسال می‌شود. برای فیلتر کردن مؤثر، باید بر روی سه متغیر کلیدی از میان این اطلاعات تمرکز کرد:

  • $apiv: این متغیر نسخه API فراخوانی شده (مانند API1 یا API2) را مشخص می‌کند.
  • $module: نام ماژولی را که تابع مورد نظر در آن قرار دارد، نشان می‌دهد (مانند Email، MySQL، FileManager).
  • $event: نام خود تابع یا عملیاتی که قرار است اجرا شود را مشخص می‌کند (مانند addpop، adduserdb).

ذکر این نکته حیاتی است که نام ماژول‌ها و رویدادها همیشه با حروف کوچک به هندلر ارسال می‌شوند. همچنین، متغیر $type مشخص می‌کند که هندلر قبل از اجرای رویداد (pre) یا پس از آن (post) فراخوانی شده است. توجه داشته باشید که در فراخوانی‌های از نوع pre، اگر هندلر مقدار false برگرداند، اجرای آن رویداد متوقف می‌شود؛ بنابراین برای جلوگیری از ایجاد اختلال در عملکرد عالی هاستینگ سی پنل، همیشه باید مقدار 1 را بازگردانید.

پیاده‌سازی فیلترها در عمل: نمونه‌های کد

پیاده‌سازی فیلتر بر اساس متغیرهای فوق بسیار ساده است. کد زیر نمونه‌ای است که تنها رویدادهای مربوط به ماژول Email را در خروجی tracer نمایش می‌دهد و از ثبت رویدادهای سایر ماژول‌ها جلوگیری می‌کند:

return 1 if $module ne 'email';

برای دقیق‌تر شدن فیلتر و رهگیری یک تماس بسیار خاص، می‌توانید هر دو شرط ماژول و رویداد را با هم ترکیب کنید. برای مثال، اگر فقط می‌خواهید فراخوانی تابع اضافه کردن ایمیل (addpop) در ماژول ایمیل را رهگیری کنید، کد به صورت زیر خواهد بود:

return 1 if $module ne 'email' || $event ne 'addpop';

این کد به این معناست: «اگر ماژول، 'email' نبود یا رویداد، 'addpop' نبود، از تابع خارج شو و مقدار 1 را برگردان (یعنی این فراخوانی را لاگ نکن)». در نتیجه، تنها زمانی اطلاعات ثبت می‌شود که هر دو شرط برقرار باشند. این سطح از دقت برای عیب‌یابی دقیق یک عملکرد خاص در محیط هاستینگ بسیار ارزشمند است.

ملاحظات امنیتی و بهترین روش‌ها

استفاده از API Tracer با وجود полез بودن، خطرات امنیتی قابل توجهی به همراه دارد. همان‌طور که در سند مرجع هشدار داده شده، اطلاعات حساسی مانند نام‌کاربری و رمزهای عبور که از طریق رابط سی پنل ایجاد یا تغییر می‌کنند، در فایل error_log نوشته می‌شوند. رعایت نکات زیر برای مدیریت این خطرات در سرور ضروری است:

  • هرگز این ابزار را بر روی یک سرور تولیدی (Production) فعال نکنید مگر در موارد ضروری و برای مدت زمان بسیار کوتاه.
  • پس از فعال‌سازی tracer، فایل error_log را به صورت دستی پاک کنید تا اطلاعات حساس قبلی در آن نباشد.
  • پس از اتمام کار عیب‌یابی، بلافاصله فایل‌های مربوط به CustomEventHandler (مانند Dumper.pm) را از سرور حذف کنید.
  • دسترسی به فایل error_log را محدود کنید تا تنها کاربران دارای مجوز سطح بالا بتوانند آن را مشاهده کنند.

با اعمال فیلترهای دقیق و رعایت این ملاحظات امنیتی، می‌توانید از API Tracer به عنوان یک ابزار قدرتمند برای توسعه و دیباگ ماژول‌های سفارشی در محیط سی پنل، بدون به خطر انداختن امنیت هاستینگ خود، استفاده نمایید.

درک داده‌های ورودی ($cfgref)

$cfgref چیست و چه نقشی دارد؟

یکی از متغیرهای کلیدی که توسط API Tracer در cPanel گزارش می‌شود، $cfgref است. این متغیر حاوی تمام داده‌های ورودی است که به یک تابع خاص در API cPanel ارسال می‌شوند. نقش اصلی $cfgref ثبت و نمایش پارامترهایی است که شما یا یک اسکریپت برای انجام یک عملیات، مانند ایجاد یک پایگاه داده جدید یا اضافه کردن یک ایمیل، به سامانه وارد می‌کنید. درک ساختار این داده‌ها برای توسعه دهندگان و مدیران سروری که قصد خودکارسازی فرآیندها یا عیب‌یابی تماس‌های API را دارند، حیاتی است. این داده‌ها به شکل قالب‌بندی شده توسط ماژول Data::Dumper در پرونده error_log سی پنل ثبت می‌شوند و تصویری شفاف از آنچه در پشت صحنه یک درخواست اتفاق می‌افتد ارائه می‌دهند.

تفاوت ساختار $cfgref در API1 و API2

از آنجایی که cPanel از دو نسخه اصلی API (API1 و API2) پشتیبانی می‌کند، ساختار $cfgref بسته به نوع API مورد استفاده، کاملاً متفاوت خواهد بود. این تفاوت به دلیل روش متفاوت ارسال پارامترها در این دو نسخه است. نسخه API1 از پارامترهای ترتیبی استفاده می‌کند، در حالی که API2 از پارامترهای نام‌گذاری شده بهره می‌برد. این تمایز برای کسی که با هاستینگ cPanel کار می‌کند بسیار مهم است، زیرا نحوه تفسیر داده‌های ورودی را تعیین می‌نماید. تشخیص این موضوع نیز ساده است؛ مقدار متغیر $apiv که در کنار $cfgref در لاگ نمایش داده می‌شود، نسخه API را مشخص می‌کند.

نمونه‌ای از $cfgref در API1

زمانی که یک فراخوانی از نوع API1 ردیابی می‌شود، داده‌های $cfgref به صورت پارامترهای عددی و ترتیبی نمایش داده می‌شوند. برای مثال، در یک عملیات مربوط به ماژول mysql مانند adduserdb، خروجی لاگ ممکن است به شکل زیر باشد:

$VAR1 = { 'param0' => 'cptest_dbname', 'param1' => 'cptest_username', 'param2' => 'ALTER CREATEROUTINE TEMPORARY CREATE DELETE DROP SELECT INSERT UPDATE REFERENCES INDEX LOCK ' };

در اینجا، param0، param1 و param2 به ترتیب نشان‌دهنده آرگومان‌های اول، دوم و سوم ارسال شده به تابع هستند. برای فهمیدن معنای واقعی هر پارامتر، باید مستندات آن تابع خاص در API1 را بررسی کنید یا پارامترهای وارد شده در رابط گرافیکی cPanel را با این مقادیر مقایسه نمایید. این روش به ویژه برای اشکال‌زدایی اسکریپت‌های قدیمی که از API1 استفاده می‌کنند، مفید است.

نمونه‌ای از $cfgref در API2

ساختار داده‌هایی که برای API2 در $cfgref مشاهده می‌کنید، بسیار مستقیم‌تر و خوانایی بیشتری دارد، زیرا از جفت‌های کلید-مقدار استفاده می‌کند. یک مثال رایج در مدیریت ایمیل و هاستینگ می‌تواند ایجاد یک ایمیل جدید باشد که داده‌های آن به این شکل در لاگ ثبت می‌شود:

$VAR1 = { 'quota' => 250, 'password' => 'somepassword', 'domain' => 'somedomain.com', 'email' => 'someuser' };

همانطور که می‌بینید، هر پارامتر نام مشخصی دارد (مانند domain، password، quota) که مستقیماً با نام پارامتر در مستندات API2 مطابقت دارد. این امر تحلیل داده‌های ورودی را بسیار ساده می‌کند. با این حال، باید به پارامترهای عمومی که با پیشوند api2_ شروع می‌شوند (مانند پارامترهای مرتب‌سازی یا صفحه‌بندی) و همچنین پارامتر cache_fix که برای مدیریت کش مرورگر استفاده می‌شود و باید نادیده گرفته شود، توجه داشت. این پارامترها معمولاً اطلاعات مفیدی برای تحلیل ارائه نمی‌دهند.

نکات ایمنی و امنیتی در کار با $cfgref

هنگام استفاده از API Tracer و تحلیل داده‌های $cfgref، باید نکات امنیتی مهمی را رعایت کنید. از آنجایی که این ابزار تمام داده‌های ورودی را در پرونده error_log ثبت می‌کند، اطلاعات حساسی مانند رمزهای عبور، نام کاربری‌ها و سایر جزئیات محرمانه به صورت متن ساده در این پرونده ذخیره می‌شوند. این یک ریسک امنیتی بزرگ برای هاستینگ شما محسوب می‌شود. بنابراین، هرگز این ابزار را بر روی یک سرور تولیدی (Production) فعال نکنید. در صورت استفاده بر روی یک سرور آزمایشی، پس از اتمام کار، حتماً محتوای پرونده error_log را پاک کنید. درک این داده‌ها اگرچه برای توسعه و عیب‌یابی بسیار ارزشمند است، اما مسئولیت‌پذیری در قبال امنیت اطلاعات را می‌طلبد.

جمع‌بندی تحلیل داده‌های ورودی

به طور خلاصه، $cfgref پنجره‌ای است به سوی درک دقیق تعاملات با API cPanel. با تشخیص صحیح نوع API (۱ یا ۲) و تفسیر ساختار مناسب (ترتیبی یا نام‌گذاری شده)، می‌توانید پارامترهای ارسالی به هر تابع را به دقت بررسی کنید. این توانایی برای توسعه اسکریپت‌های سفارشی، یکپارچه‌سازی سامانه‌ها و عیب‌یابی مشکلات پیچیده در محیط هاستینگ سی پنل ضروری است. با رعایت نکات امنیتی و تمرکز بر روی پارامترهای کاربردی، می‌توانید از این ابزار قدرتمند برای بهینه‌سازی و مدیریت کارآمدتر سرور خود بهره ببرید.

درک داده‌های خروجی ($dataref)

$dataref چیست و چه زمانی تولید می‌شود؟

متغیر $dataref بخش حیاتی از اطلاعاتی است که توسط API Tracer در سی پنل ثبت می‌شود. این متغیر حاوی خروجی یا نتیجه‌ای است که پس از اجرای کامل یک فراخوانی API توسط ماژول مربوطه تولید می‌شود. برخلاف $cfgref که داده‌های ورودی را نشان می‌دهد، $dataref منحصراً در فراخوان‌های «post» نمایان می‌شود؛ یعنی پس از آن که عملیات درخواستی به پایان رسید. این داده‌ها مستقیماً به سمت فایل error_log هاستینگ (/usr/local/cpanel/logs/error_log) ارسال می‌شوند و اطلاعات ارزشمندی را درباره موفقیت‌آمیز بودن یا نبودن عملیات، مقادیر بازگشتی و ساختار داده‌های تولید شده در اختیار توسعه‌دهندگان قرار می‌دهند.

تشخیص تفاوت خروجی API1 و API2 در $dataref

همانند داده‌های ورودی، فرمت خروجی ذخیره شده در $dataref نیز به شدت به نسخه API مورد استفاده بستگی دارد و این تفاوت، نکته‌ای کلیدی در عیب‌یابی و توسعه است.

API1: خروجی در این نسخه معمولاً ساده و به صورت یک مقدار ساده یا رشته متنی است. برای نمونه، زمانی که یک فراخوانی برای ایجاد یک ایمیل (مانند Email::addpop) با موفقیت انجام شود، $dataref ممکن است فقط شامل آدرس ایمیل ایجاد شده، مانند email@domain.com باشد. در صورت بروز خطا، این مقدار با یک پیغام خطا جایگزین می‌شود. این سادگی، درک و تفسیر خروجی را برای عملیات پایه آسان‌تر می‌کند.

API2: این نسخه مدرن‌تر و پیچیده‌تر از API1 عمل می‌کند. $dataref در API2 شامل یک ساختار داده غنی و مبتنی بر هش (Hash) است که اطلاعات جامعی را در خود جای می‌دهد. برای مثال، پس از ایجاد یک اکانت ایمیل، خروجی ممکن است شامل جزئیاتی مانند سهمیه دیسک (به صورت عددی و قابل درک برای انسان)، نام کاربری، دامنه، میزان فضای استفاده شده و درصد آن باشد. این ساختار داده‌ای به فرمت Perl Da ta::Dumper در لاگ چاپ می‌شود و نمایش XML معادل آن نیز از طریق XML-API قابل دسترسی است. درک این ساختارها برای توسعه برنامه‌های یکپارچه با سی پنل ضروری است.

نمونه‌ای عملی از تحلیل داده‌های $dataref

برای درک بهتر، فرض کنید یک عملیات مدیریت پایگاه داده در سی پنل انجام شده است. API Tracer در فایل error_log شما یک ورودی «post» برای ماژول مربوطه ثبت می‌کند. در این بخش، شما می‌توانید $dataref را بررسی کنید. اگر عملیات موفقیت‌آمیز بوده باشد، ممکن است یک شناسه تأیید یا یک پیغام موفقیت ساده ببینید. اما اگر خطایی رخ داده باشد، $dataref حاوی پیغام مفصلی درباره ماهیت خطا خواهد بود که به شما در رفع سریع مشکل کمک می‌کند. این قابلیت، ابزار قدرتمندی برای مدیریت سرور و عیب‌یابی دقیق مسائل در محیط هاستینگ فراهم می‌آورد.

ملاحظات امنیتی و بهترین روش‌ها

فعال کردن API Tracer یک اقدام قدرتمند اما همراه با مسئولیت است. از آنجایی که $dataref ممکن است حاوی اطلاعات حساسی مانند نام‌های کاربری، آدرس‌های ایمیل و دیگر داده‌های محرمانه باشد، رعایت نکات امنیتی حیاتی است:

  • استفاده فقط در محیط توسعه: هیچ‌گاه این ابزار را روی یک سرور هاستینگ تولیدی (Production) فعال نکنید، مگر در موارد ضروری و برای دوره‌های بسیار کوتاه.
  • پاک‌سازی لاگ‌ها: پس از اتمام کار عیب‌یابی، حتماً فایل error_log را پاک کنید تا اطلاعات حساس در سرور باقی نمانند.
  • کنترل دسترسی: مطمئن شوید که تنها کاربران بسیار معتمد و ضروری به فایل‌های لاگ دسترسی دارند.

با درک صحیح از نحوه عملکرد $dataref و رعایت این اصول، توسعه‌دهندگان و مدیران سیستم می‌توانند از این ابزار برای دیباگ و بهینه‌سازی محیط سی پنل خود به صورت ایمن و مؤثر استفاده کنند.

محدودیت‌ها و ملاحظات امنیتی

نیاز به دسترسی root و محیط writable

این نسخه از API Tracer نیازمند دسترسی root برای نصب فایل‌های Perl در مسیرهای سیستم‌عامل است. همچنین نیاز دارد که مسیر /dev/shm قابل نوشتن باشد. اگرچه می‌توان مسیر فایل موقت را در اسکریپت تغییر داد، اما /dev/shm به عنوان سریع‌ترین مکان شناخته می‌شود. این نیازمندی‌ها باعث می‌شود که استفاده از این ابزار仅限于 سرورهای توسعه و تست باشد و برای کاربران عادی سی پنل قابل اجرا نباشد.

خطرات جدی امنیتی در محیط عملیاتی

بزرگترین نگرانی امنیتی این ابزار، ثبت اطلاعات حساس مانند نام‌های کاربری و رمزهای عبور در فایل error_log است. هرگونه اطلاعاتی که از طریق رابط سی پنل ایجاد یا تغییر کند، در این لاگ ثبت می‌شود. به همین دلیل، باید بلافاصله پس از فعال‌سازی این قابلیت، فایل error_log پاک شود و هرگز روی سرور تولیدی فعال نماند. اجرای طولانی‌مدت این tracer می‌تواند فایل لاگ را بسیار حجیم کند و اطلاعات محرمانه متعددی را در معرض خطر قرار دهد.

محدودیت‌های فنی و مستندات ناقص

همانطور که در ابتدا اشاره شد، APIهای سی پنل هنوز به طور کامل مستندسازی نشده‌اند. این ابزار نیز به عنوان یک راه حل موقت توسعه داده شده است. یکی از محدودیت‌های فنی، تفاوت در نمایش داده‌ها بین API1 و API2 است که نیاز به دانش تخصصی برای تفسیر صحیح دارد. همچنین، حجم بسیار زیاد اطلاعات تولید شده (که 90% آن ممکن است غیرمرتبط باشد) نیاز به فیلترینگ دقیق دارد تا داده‌های مفید استخراج شوند.

جمع‌بندی و توصیه‌های نهایی

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


آیا این پاسخ به شما کمک کرد؟

  • 0
« برگشت