Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Luis Colorado
�۾��� �Ұ�:

Luis Colorado���� �����ο� �ִ� Telefonica Sistemas S.A.���� ���н��ý��۰� ���ͳ������� �����ϰ� ���ִ� �����ڷ� ���ϰ� ��ʴϴ�. �۾��̴� Universidad Complutense of Madrid���� �������� �����Ͽ����� ��� ���н� ��ƿ��Ƽ�� ���¼ҽ��� ���·� �����ؿ��� ��ʴϴ�.

�۾��̿��� ��������

�� ��:
���� ��
���ߵ���
M4
�۵�����
����ڰ� CGI�� ���������ϱ�
�ٿ�ε�

PG2CGI�� �̿��� ������ �����ͺ��̽� ����

[Ilustration]

���:

�� �ۿ����� HTML���������� �����ͺ��̽��� ������ �� �ְ� ���ִ� ���ο� ���α׷��� ���� �̾߱��ϰ��� �մϴ�. �� ���α׷��� ����� ������ ������������ �����ϰ�, ȯ�漳������ �������� ȹ���ϸ�, ���̾ƿ� ���Ŀ� ���������� ������ִ� �͟�ϴ�. �� ���α׷��� �ֱ� 1�⵿�� Linux Journal�� LinuxFocus (www.linuxfocus.org) ���� ���� �����ϴ� M4�� ���� ��� ��縦 �дٰ� ������ �������� ��Ƽ� ������ ���Դϴ�.


���� ��

�� ���� ���� ���� �����в� ���� ���Ͽ� �����ͺ��̽��� �̿��� �� �ְ��ϴ� ��Ű���� �����ϰ� �� ���̵��� �ٺ������� ���� �̾߱��ϰ��� �Ѵ�. �� PG2CGI��Ű���� ���� ��뼳������ ���� ���Ͽ� ���� ���� �ƴ϶� ������ �Ұ��� ����Ʈ��� ����� ���� ���ڵ��� �򰡸� �غ� ���� �������� �ǵ���� �����ֱ⸦ ����ϸ鼭 �� ���� ���´�. (�̹� �����Ҹ��� ���̵尡 ���α׷��� �����ǿ� ��� �ִ�. �� �������� �ִ� URL�� �� �� �ڿ� �ִ�.)

���ߵ���

���� ���������ΰ� ��������Ŀ������ HTML�ҽ��� �����ϱ� ���Ͽ� M4�� ����ϴ� �Ϳ� ���� �������� ������� �� ���α׷��� �����Ͽ���. ����� �۵��� ���������� �����ϴ� ���������� �����μ�, �������� ������ �����ϴ� �����μ��� M4�� ���缺�� ���뼺�� �����־���.

�ݸ� �ſ� �پ��� �� ������ �����ͺ��̽��� �̿��ϴ� ���� ���� ȯ����̸� �������ִ� ��ƿ��Ƽ�� ������ �����Դ�.(��κ��� �̷� �ٸ� ������ �ϴ� �������α׷����� ������̰ų� �ٷ� �� �ִ� Ư�� ���Ŀ� ����� �ϴ� �ɰ��� �������� ������ �ִ�.)

�̷��� ����Ʈ���� ��Ű������ �����ͺ��̽��� �� ȯ���� �ϳ��� �������ش�. �׷��� ���ؼ� ������ ���� �䱸������ �����Ͽ��� �Ѵ�.:

�� �� ��ƿ��Ƽ�� �䱸���ǵ��� ������Ű�� ���Ͽ� ȿ�����鿡�� �ణ�� ���׸��� �������� �����Ѵ�.(��ƿ��Ƽ�� ����Ǵ� ���� M4�� ������ ȣ���ϰ� �ȴ�.) �׷��� �� ����� ��κ��� ��� ����������.(��κ��� ��츦 �����غ��� HTML������ �������� �����ϱ� ���Ͽ� �����ͺ��̽��� ���Ǵ� �̹� ������ ����Ǿ� �ִ�.)

M4

M4�� �������� ���ߵ� ��ũ�� ó�� �����̴�. �츮�� ���� ����Ʈ����� �� ��ũ��ó���⸦ �ſ� �����ϰ� ����Ѵ�.:

�̷��� ��ũ��ó������ �ݺ������ GNU�� M4��ƿ��Ƽ�� �˻��ϴ� ���� �� �������������� �ᱹ ȿ�����鿡�� �ս��� �����´�.

�ùٸ� ǥ����(���� ǥ����):

�� ��ƿ��Ƽ�� �־��� ������Ģ�� ������ �׸����� Ȯ���ϱ� ���Ͽ� ����ǥ������ ������ ����Ѵ�. ����ǥ������ �츮���� �ſ� ������ ����� �����ϱ� ������ ������ �񱳺��� �� ��ȣ�ǰ� �ִ�. ����ǥ������ ������ ���� ������ ������ �ִ�.:

PG2CGI�� ���� ������Ģ�� ������ �� ����ǥ������ �̿��Ѵ�.

�ϳ��� ����ǥ���Ŀ��� ������ ����ü�ε�� �׷�ȭ�� �� �ֱ⶧���� ǥ������ ������ ����ǥ���Ŀ��� ����̹��� �����ϱ� ���� �������� �Ľ��� ���� �̷������.

�� ���� ���캸��: Ŭ���̾�Ʈ�� ���ǹ��� � ������ �����Ϸ� �Ѵٸ� �� �����͵��� ���� ������ �˸°� �ٲ������ �Ѵ�.:

�׸�=��
    

���ǹ��� �� ������ �����ؾ� �ϱ� ������ ���忡 �ΰ��� ������ ���� �� ����.

���ñ�Ģ���� ���� ������ �� �� �� ������ �ݵ�� ����ϴ� ���� ���� ���̴�.:

  QUERY_STRING: "^FIELD=[^&]*$";
	  

�� ���� ���ǹ��� ������ ������ ������ ��쿡�� ��Ģ���� ȣ��Ǵ� ���� �����Ѵ�. ���� ������ �׸��� ���� ��ȣ�� ���� ��� ���α׷��� ��ġ�ϴ� ���� �Ľ��� �� �ְ� ���ش�.:

  QUERY_STRING: "^FIELD=([^&]*)$";
    

�� �������� ���α׷��� �׺������Ϳ� ���� ��������� %xx�������� ���޵Ǵ� ���� ������ ������ ��ȯ�����ش�.

�۵�����

���� ��� �۵��ϴ��� �̾߱� �غ���. ó������ ����Ǹ� ���α׷��� �������κ��� ȯ�溯������ ���� �޾Ƽ� �� ������ �̿��Ͽ� ������ ������ ȯ�漳���� ���ش�. ȯ�溯���� ���α׷��� Ȯ���غ��� ��� �͵��̴�.:Ŭ���̾�Ʈ�� �����ΰ�? � ��û�� �̷�����°�? ��û�� ������ �����ΰ�? Ŭ���̾�Ʈ�� �����ϴ� ������ ����(MIME����)�� �����ΰ�?���.... PG2CGI�� �� ���� ��Ģ�� ���ʿ� ���Ǵ� ��Ģ�� �����Ѵ�. ����� ������������ ��Ģ�� �����ȴ�.:

�̷��� ������� ��Ģ�� ����� �ִ�. �������� �츮�� ��Ģ���� ��ȿ�� �����׸��� ���ϱ� ���Ͽ� ���� ���ǵ��� ���´�. ���ǵ��� �߰�ȣ "{}"���̿� ��ġ�Ѵ�.

��Ģ�� �����ʰ� ������ �߰�ȣ"{}"�� ������ �����ν� ��踦 ��Ÿ����. �׸��� ���ʰ� �������� '->'��ȣ�� �̿��Ͽ� ���еȴ�.

������ �׸���� ������ ������ ���� ���ǵ��� ����ִ�.: ������ �̸�,':'����, ���ڿ��� ������ �ǹ��ϴ� ';'����. �����ʿ� �ִ� ��� ������ M4�� ���� ����Ǿ��� �־��� ���� ������ �Ҵ��ϴ� ���̴�.:

�ٸ� ������ ���ø������̳� ������ ����̹��� ���� ���Ǿ��� ���� �ִ�.

������ ��� ����ڷκ��� CGI�� ���޵dz�?

�ſ� �����ϴ�. ������ ��Ģ���� ���ʿ� �ִ� ����ǥ�������κ��� �׷���� ����� ���µ� �� �׷���� ���� ������ ��ȯ�Ǿ�����.(�� ���ο� �������� �̸��� `term_<i>_match_<j>'�� ���� �����̴�. �̶� <i>�� ��Ģ�� ���� ������ȣ�̴�.(�ᱹ ù ������ 1��, �ι�° ������ 2�� ������ ���°� �ȴ�.) ���� Ŭ���̾�Ʈ�� ���� ������ ���� ���ǹ��� ���޵Ǿ��ٰ� ����.:

`NAME=JOSE&FAMNAME1=DE+LA+FUENTE&FAMNAME2=LOPEZ'

������Ʈ�� ����� ��Ģ�� ������ ����.:

     QUERY_STRING: "NAME=([^&]*)";
     QUERY_STRING: "FAMNAME1=([^&]*)";
     QUERY_STRING: "FAMNAME2=([^&]*)";
����� ������ ���� �� ���̴�.::
     term_0_match_0  <- "NAME=JOSE";
     term_0_match_1  <- "JOSE";
     term_1_match_0  <- "FAMNAME1=DE LA FUENTE";  
           (������ +���ڷ� �ٲ������ �� �� �ִ�.)
     term_1_match_1  <- "DE LA FUENTE";
     term_2_match_0  <- "FAMNAME2=LOPEZ";
     term_2_match_1  <- "LOPEZ";
����̹�:

�� �ۿ��� ��ü������ ����̹��� ���� �̾߱�� ���� �ʾҴ�. �׷��� �̹� PG2CGI�����ǿ� ��� �ִ� �����ڷḦ ���� ����̹��� ������� �����ߴ�. ������ �ִ� ���ڶ�� �� ������������ ���ԵǾ� �ִ� ���� �о�� �ٶ���.

POSTGRESQL�� ��Ǵ� �����ͺ��̽��� �����ϴ� ��쿡�� �� �ϳ��� ����̹��� ���ȴ� �׷��� �̹� �����ڴ� LDAP������ �����ͺ��̽��� ���� �ٸ� ����̹��� ������ ��ȹ�� ������ �ִ�.

����:

��ü���� ���� �ҽ��� ���캸��

slug.ctv.es�� �ִ� �������װ� ���õ� �����ͺ��̽����� �������� ���̺��� ������. �̴� ���̺����� ������ ���ڵ带 ã�ƺ��ų� ��ü ����� ����� ���Ͽ� �ΰ��� ���ø��� ����ϴ� ���� �ܼ��� ���̴�.

/etc/html2sql.cfg
{
  PATH_INFO: "^/avisos/?$"; # PATH_INFO������ ���� ���õȴ�.
  [SERVER_ADMIN: ".*"];     # SERVER_ADMIN���κ��� ������ ��´�. ���û���
} -> {
  DRIVER:   "POSTGRESQL";
  PGTTY:    "/dev/console";  # �ַܼ� �α��ϵ��� �Ѵ�.
  PGDATABASE:     "postgres";
# �츮�� �׻� ���Ǹ� �Ѵ�.(�� ���������� ���ø����Ͽ��� �������� ���ڵ����
# �����ϱ� ���Ͽ� ���ǹ��� ����Ѵ�.)
  PGQUERY:  "select oid,ct,titulo,texto,mt"
      " from avisos"
      " where (dt is NULL or dt > 'now')"
      " order by mt desc";
# ������ ���ø��� ������ �ִ�.
  M4FILE:    "/usr/local/etc/httpd/plantillas_m4/avisos.m4";
  WEBMASTER: "term_1_match_0";
  #TESTMODE: "TRUE";
}

# ���� ���ñ�Ģ�� �˷��� �켱Ű���� OID�� ������ ��������(aviso)�� ������ ��
# �ֵ��� ���ش�. �� ������CGI�� PATH_INFO������ ���ԵǾ� �ִ�.

{
  PATH_INFO: "^/avisos/([0-9]+)/?$";
  SERVER_ADMIN: ".*";
} -> {
  DRIVER:   "POSTGRESQL";
  PGTTY:    "/dev/console";  # �տ��� ó�� �ַܼ� �α��Ѵ�.
  PGDATABASE:     "postgres";
  OID:      "term_0_match_1"; # OID�� �ο��Ѵ�.

# �ѹ��� ������ �߿��ϴ�. �츮�� �ʵ��� ���ۺκп� OID�� ���Խ�Ű��
# �̰�� �츮�� �� ���ڵ带 ����� ���� �����۸�ũ�� ���� �ϰ� �ʹ�.

  PGQUERY:  "select oid,ct,titulo,texto,mt,dt,autor"
            " from avisos"
            " where (dt is NULL or dt > 'now') and oid=OID";
# ���� ���ø��� ���� �ٸ���.
  M4FILE:    "/usr/local/etc/httpd/plantillas_m4/avisos_oid.m4";
  WEBMASTER: "term_1_match_0";
  #TESTMODE: "TRUE";
}

/usr/local/etc/httpd/plantillas_m4/avisos.m4
define(<<<for>>>, <<<dnl
ifelse(eval((<<<$2>>>) <= (<<<$3>>>)), 1,
<<<define(<<<$1>>>,<<<$2>>>)$4<<<>>>dnl
for(<<<$1>>>,eval(<<<$2>>>+1),<<<$3>>>, <<<$4>>>)dnl
>>>)dnl
>>>)dnl
divert(0)dnl
Mime-Version: 1.0
Content-type: text/html

<HTML>
  <BODY BGCOLOR="#ffffff">
    <CENTER>
      <H1>AVISOS A LOS NAVEGANTES QUE PASAN POR SLUG</h1>
    </center>
    <B>Nota:</b> Esta secci&oacute;n ha sido creada para dar a conocer
    cualquier noticia de inter&eacute;s relacionada con
    <A HREF="http://slug.ctv.es/">SLUG</a>,
    <A HREF="http://LuCAS.ctv.es/">LuCAS</a>,
    <A HREF="http://www.HispaLinux.ctv.es/">HispaLinux</a>
    y en general, cualquier servicio prestado por <B>slug.ctv.es</b>.<p>
    <CENTER><HR WIDTH=100></center>
ifelse(PGRES_RESULTSTATUS, <<<PGRES_TUPLES_OK>>>,<<<dnl
ifelse(PGRES_NTUPLES, 0,<<<dnl

      <!-- la tabla est\xe1 vac\xeda -->
      No hay avisos.<p>

>>>,<<<dnl /* PGRES_NTUPLES != 0 )( */
      <CENTER>
        <!-- contenido de la tabla -->
        <TABLE>
          <TR>
            <TH></th>
            <TH ALIGN="LEFT">Fecha-Hora&nbsp;</th>
            <TH ALIGN="LEFT">Asunto&nbsp;</th>
          </tr>

for(<<<i>>>,0,eval(PGRES_NTUPLES-1),<<<dnl
          <TR>
            <TD>
              <A HREF="/cgi-bin/pg2cgi/avisos/cell(i,0)">
                <IMG SRC="/icons/burst.gif">
              </a>
            </td>
            <TD><B>cell(i,1)&nbsp;</b></td>
            <TD>cell(i,2)&nbsp;</td>
          </tr>
>>>)dnl /* for */

        </table>
      </center>

>>>)dnl /* PGRES_NTUPLES */

>>>,<<<dnl /* ifelse PGRES_RESULTSTATUS )(*/

      Error en el resultado: <B>PGRES_RESULTSTATUS</b><BR>
      Mensaje del servidor: PGRES_ERRORMSG<P>

>>>)dnl

      <CENTER><HR WIDTH=100></center>
      <FONT SIZE=-2>
        <A HREF="mailto:WEBMASTER?subject=TABLON DE ANUNCIOS"><CODE>WEBMASTER</code></a>
      </font>
  </body>
</html>


/usr/local/etc/httpd/plantillas_m4/avisos_oid.m4
divert(-1)
$Id: generic_list.m4,v 1.1 1998/07/06 17:13:33 luis Exp $
define(<<<cell>>>, <<<PGRES_CELL_$1_$2>>>)
define(<<<field>>>, <<<PGRES_FNAME_$1>>>)
define(<<<for>>>, <<<dnl
ifelse(eval((<<<$2>>>) <= (<<<$3>>>)), 1,
<<<define(<<<$1>>>,<<<$2>>>)$4<<<>>>dnl
for(<<<$1>>>,eval(<<<$2>>>+1),<<<$3>>>, <<<$4>>>)dnl
>>>)dnl
>>>)dnl
divert(0)dnl
Mime-Version: 1.0
Content-type: text/html

<HTML>
  <BODY BGCOLOR="#ffffff">
    <CENTER>
      <H1>AVISO OID</h1>
    </center>
    <CENTER><HR WIDTH=100></center>

ifelse(PGRES_RESULTSTATUS, <<<PGRES_TUPLES_OK>>>,<<<dnl
ifelse(PGRES_NTUPLES, 0,<<<dnl

      <!-- la tabla est\xe1 vac\xeda -->
      No existe el aviso OID, o ha caducado.<p>

>>>,<<<dnl /* PGRES_NTUPLES != 0 )( */
      <CENTER>
        <!-- contenido de la tabla -->
        <TABLE>
          <TR VALIGN="BASELINE">
            <TD ALIGN="RIGHT" NOWRAP><font color="#808000"><B>Fecha de entrada:</b></font> </td>
            <TD width="80%">cell(0,1)</td>
          </tr><TR VALIGN="BASELINE">
            <TD ALIGN="RIGHT" NOWRAP><font color="#808000"><B>Fecha &uacute;ltima modif:</b></font> </td>
            <TD>cell(0,4)</td>
          </tr><TR VALIGN="BASELINE">
            <TD ALIGN="RIGHT" NOWRAP><font color="#808000"><B>Fecha eliminaci&oacute;n:</b></font> </td>
            <TD WIDTH=*>cell(0,5)</td>
          </tr><TR VALIGN="BASELINE">
            <TD ALIGN="RIGHT" NOWRAP><font color="#808000"><B>Autor:</b></font> </td>
            <TD><font size=+1><a href="mailto:cell(0,6)?subject=[TABLON-SLUG] cell(0,2)">cell(0,6)</a></font></td>
          </tr><TR VALIGN="BASELINE">
            <TD ALIGN="RIGHT" NOWRAP><font color="#808000"><B>Asunto:</b></font> </td>
            <TD><font size=+1><B>cell(0,2)<B></font></td>
          </tr><TR>
            <TD COLSPAN=2 BGCOLOR="#c0ffff"><font color="#404040">cell(0,3)</font></td>
          </tr>
        </table>
      </center>

>>>)dnl /* PGRES_NTUPLES */

>>>,<<<dnl /* ifelse PGRES_RESULTSTATUS )(*/

      Error en el resultado: <B>PGRES_RESULTSTATUS</b><BR>
      Mensaje del servidor: PGRES_ERRORMSG<P>

>>>)dnl

      <CENTER><HR WIDTH=100></center>
      <FONT SIZE=-2>
        <A HREF="mailto:WEBMASTER?subject=TABLON DE ANUNCIOS"><CODE>WEBMASTER</code></a>
      </font>
  </body>
</html>

����� �� URL���� �� �� �ִ�.:
http://slug.ctv.es/cgi-bin/pg2cgi/avisos/
http://slug.ctv.es/cgi-bin/pg2cgi/avisos/20384

�ٿ�ε�

PG2CGI���α׷��� ���� URL�鿡�� �ٿ�ε� ���� �� �ִ�.:

http://slug.ctv.es/~luis/utils/pg2cgi.tar.gz
http://slug.ctv.es/~luis/utils/pg2cgi.README
ftp://slug.ctv.es/pub/slug/luis/pg2cgi.tar.gz
ftp://slug.ctv.es/pub/slug/luis/pg2cgi.README

���� : ����ȣ


�� ������Ʈ�� Miguel �ngel Sep?veda�Կ� ���� �����ǰ� �ֽ��ϴ�.
© Luis Colorado 1998
LinuxFocus 1999