RRDCGI(1) rrdtool RRDCGI(1)

rrdcgi - ساخت صفحات وب حاوی نمودارهای RRD بر اساس قالب‌ها

"#!/path/to/"rrdcgi [--filter|-f]

برنامه rrdcgi به نوعی یک مفسر اسکریپت بسیار محدود است. هدف آن اجرا به عنوان یک برنامه cgi و تجزیه قالب یک صفحه وب شامل برچسب‌های ویژه <RRD:: است. rrdcgi این برچسب‌ها را تفسیر کرده و بر اساس آن‌ها عمل می‌کند. در پایان، یک صفحه وب شامل سرآیندهای CGI لازم را چاپ می‌کند.

برنامه rrdcgi محتوای قالب را در ۳ مرحله تجزیه می‌کند. در هر مرحله تنها به دنبال زیرمجموعه‌ای از برچسب‌ها می‌گردد. این کار امکان تو در تو قرار دادن برچسب‌ها را فراهم می‌سازد.

تجزیه‌کننده آرگومان از همان معناشناسی آشنا در C-shell شما استفاده می‌کند.

فرض می‌کند که rrdcgi به عنوان یک فیلتر اجرا می‌شود، نه به عنوان یک cgi.

متغیر CGI با نام مشخص‌شده را درج می‌کند.
متغیر CGI با نام مشخص‌شده را درج می‌کند، اما آن را نقل‌قول‌گذاری (quote) می‌کند تا برای استفاده به عنوان آرگومان در برچسب دیگر RRD:: آماده باشد. به این ترتیب حتی اگر در مقدار متغیر CGI فاصله وجود داشته باشد، همچنان به عنوان یک آرگومان در نظر گرفته می‌شود.
متغیر CGI با نام مشخص‌شده را درج کرده، آن را کوت می‌کند و اطمینان حاصل می‌کند که نه با '/' شروع شود و نه شامل '..' باشد. این کار برای اطمینان از این است که هیچ نام مسیر مشکل‌سازی نتواند از طریق رابط CGI وارد شود.
مقدار یک متغیر محیطی را دریافت می‌کند.
<RRD::GETENV REMOTE_USER>

در صورتی که از نوعی کنترل دسترسی روی دایرکتوری استفاده کنید، ممکن است نام کاربر دوردست (remote user) را به شما بازگرداند.

تعداد ثانیه‌هایی که این صفحه باید معتبر بماند را مشخص می‌کند. این کار باعث می‌شود rrdcgi سرآیندهای Last-Modified و Expire و در صورتی که تعداد ثانیه‌ها منفی باشد، یک سرآیند Refresh در خروجی تولید کند.
محتوای فایل مشخص‌شده را درون صفحه بازگردانده‌شده از cgi می‌گنجاند.
اگر می‌خواهید نمودارهای خود را در منطقه‌ی زمانی متفاوتی از منطقه‌ی خود نمایش دهید، می‌توانید از
<RRD::SETENV TZ UTC>

استفاده کنید تا اطمینان حاصل شود که همه‌چیز در زمان جهانی (Universal Time) نمایش داده می‌شود. توجه داشته باشید که مقادیر مجاز برای TZ به سیستم‌عامل شما بستگی دارد.

مشابه SETENV، اما برای متغیرهای محلی.
مشابه GETENV، اما برای متغیرهای محلی.
این برچسب با زمان آخرین تغییر RRD انتخاب‌شده جایگزین می‌شود. زمان با رشته مشخص‌شده در آرگومان دوم و با قالب strftime قالب‌بندی می‌شود.
این برچسب با زمان کنونی روز جایگزین می‌شود. زمان با رشته مشخص‌شده در آرگومان و با قالب strftime قالب‌بندی می‌شود.

توجه داشته باشید که اگر از قالب strftime خود دو نقطه (:) بازمی‌گردانید، چنانچه قرار است زمان به عنوان آرگومانی برای یک دستور GRAPH استفاده شود، ممکن است لازم باشد با استفاده از \ از آن‌ها گریز (escape) بگیرید.

این برچسب با زمان قالب‌بندی‌شده توسط strftime با استفاده از قالب strftime-format روی start-spec یا end-spec (بسته به این که START یا END مشخص شده باشد) جایگزین می‌شود. هر دو مقدار start-spec و end-spec باید ارائه شوند زیرا هر کدام می‌توانند نسبت به دیگری تعریف شده باشند. هدف از این کار، فراهم آوردن عناوین زیبا روی نمودارها با زمان‌هایی است که درک آن‌ها برای افراد ناآشنا با RRDtool بسیار ساده‌تر از «-2weeks» باشد.

مجدداً توجه داشته باشید که اگر از قالب strftime خود دو نقطه (:) بازمی‌گردانید، چنانچه قرار است زمان به عنوان آرگومانی برای یک دستور GRAPH استفاده شود، ممکن است لازم باشد با استفاده از \ از آن گریز بگیرید.

این برچسب نمودار RRD تعریف‌شده با آرگومان‌هایش را ایجاد کرده و سپس با یک برچسب مناسب <IMG ... > که به نمودار ارجاع می‌دهد جایگزین می‌شود. گزینه --lazy در rrdgraph می‌تواند برای اطمینان از این که نمودارها تنها در صورت منقضی شدن دوباره تولید شوند، استفاده شود. آرگومان‌های برچسب RRD::GRAPH مطابق با توضیحات موجود در صفحه راهنمای rrdgraph کار می‌کنند.

برای کاهش بار روی سرور خود، از گزینه --lazy در برچسب‌های RRD::GRAPH استفاده کنید. این گزینه تضمین می‌کند که نمودارها فقط هنگامی که نسخه‌های قدیمی منقضی شده باشند، دوباره تولید شوند.

اگر قالب --imginfo اختصاصی خود را مشخص نکنید، مورد زیر استفاده خواهد شد:

<IMG SRC="%s" WIDTH="%lu" HEIGHT="%lu">

توجه داشته باشید که %s بیانگر بخش نام فایل نمودار ایجاد شده است؛ تمامی دایرکتوری‌های مشخص‌شده در آرگومان فایل PNG نادیده گرفته خواهند شد.

اگر برچسب RRD::GRAPH قبلی شامل هرگونه آرگومان PRINT بوده باشد، می‌توانید با این برچسب به خروجی آن‌ها دسترسی پیدا کنید. آرگومان number به شماره آرگومان PRINT اشاره دارد. نخستین PRINT دارای شماره 0 است.
این برچسب با یک متغیر داخلی جایگزین می‌شود. در حال حاضر این متغیرها شناخته شده‌اند: VERSION و COMPILETIME. این متغیرها مقادیر کامپایل‌شده در برنامه را نشان می‌دهند.

مثال زیر یک صفحه وب با یک نمودار RRD منفرد ایجاد می‌کند.

#!/usr/local/bin/rrdcgi
<HTML>
<HEAD><TITLE>RRDCGI Demo</TITLE></HEAD>
<BODY>
<H1>RRDCGI Example Page</H1>
<P>
<RRD::GRAPH demo.png --lazy --title="Temperatures"
         DEF:cel=demo.rrd:exhaust:AVERAGE
         LINE2:cel#00a000:"D. Celsius">
</P>
</BODY>
</HTML>

این اسکریپت کمی پیشرفته‌تر است؛ به شما اجازه می‌دهد تا آن را از طریق فرمی که متغیر RRD_NAME را تنظیم می‌کند اجرا کنید. سپس از RRD_NAME برای انتخاب RRD مورد نظر به عنوان منبع نمودار استفاده می‌شود.

#!/usr/local/bin/rrdcgi
<HTML>
<HEAD><TITLE>RRDCGI Demo</TITLE></HEAD>
<BODY>
<H1>RRDCGI Example Page for <RRD::CV RRD_NAME></H1>
<H2>Selection</H2>
<FORM><INPUT NAME=RRD_NAME TYPE=RADIO VALUE=roomA> Room A,
      <INPUT NAME=RRD_NAME TYPE=RADIO VALUE=roomB> Room B.
      <INPUT TYPE=SUBMIT></FORM>
<H2>Graph</H2>
<P>
<RRD::GRAPH <RRD::CV::PATH RRD_NAME>.png --lazy
         --title "Temperatures for "<RRD::CV::QUOTE RRD_NAME>
         DEF:cel=<RRD::CV::PATH RRD_NAME>.rrd:exhaust:AVERAGE
         LINE2:cel#00a000:"D. Celsius">
</P>
</BODY>
</HTML>

این مثال نحوه مدیریت وضعیتی را نشان می‌دهد که در آن فایل‌های RRD، نمودارها و cgi-binها در دایرکتوری‌های جداگانه‌ای قرار دارند.

#!/.../bin/rrdcgi
<HTML>
<HEAD><TITLE>RRDCGI Demo</TITLE></HEAD>
<BODY>
<H1>RRDCGI test Page</H1>
<RRD::GRAPH
 /.../web/pngs/testhvt.png
 --imginfo '<IMG SRC=/.../pngs/%s WIDTH=%lu HEIGHT=%lu >'
 --lazy --start -1d --end now
 DEF:http_src=/.../rrds/test.rrd:http_src:AVERAGE
 AREA:http_src#00ff00:http_src
>
</BODY>
</HTML>

نکته ۱: بخش /.../ را با دایرکتوری‌های مربوطه جایگزین کنید.

نکته ۲: مقدار SRC=/.../pngs باید از دیدگاه وب‌سرور/مرورگر یک مسیر معتبر باشد.

Tobias Oetiker <tobi@oetiker.ch>

2026-08-08 1.11.0