항상 avr만을 하다 2440임베디드 리눅스 프로젝트에 참여하게 되었습니다.
제가 맡은 분야는 웹서버 및 OLED 디바이스 드라이버 부분 입니다.
여기서는 웹서버 포팅 후 사용자 인증 시스템 제작에 관한 부분 입니다.
펌웨어만을 하다가 cgi 라는 서버사이드프로그램은 처음 만져보아 막막하였습니다.;;
html 이야 기본은 알고 있었지만 cgi 라 하여 생소하였습니다.
임베디드 리눅스 상에 perl 이나 php asp 와 같은 서버사이드프로그램들은 대부분 포팅되어 있지 않아
어쩔수 없이 apache 기반에 cgi를 사용하게 되었습니다.
몇몇의 사이트 검색 결과 boa webserver 에 php를 붙여 사용하신다는 분도 kelp 에서 본 기억이 있긴 합니다만 열악한 환경상의 임베디드 기반 시스템에 db 및 php 스크립트와 같은 덩치큰(?) 프로그램을 사용하기엔 힘이 듭니다;;
리눅스 상의 cgi 는 c를 기반으로 프로그래밍 하게 됩니다.
컴파일 역시 arm linux gcc를 이용하여 하게 됩니다.
================
2009년 2월 9일 추가
================
웹서버로 apache 를 선택하였습니다.
그 이유는 쉬운 포팅과 cgi의 기본 지원을 들 수 있습니다. 물론 gohead webserver 와 자주 사용되는 boa webserver 도 있지만 대중적으로 사용되는 apache webserver에 한표를 두었습니다.
webserver porting을 마친 후 바로 cgi 프로그래밍에 들어갔습니다.
우선 apache의 환경 설정 부분에서 cgi- script를 사용 가능하도록 수정 후 index.html 을 제작하여
로그인 부분 ui를 꾸몄습니다.
그 후 폼으로부터 입력된 id와 password 를 파싱하는 login.cgi 를 제작하였습니다.
로그인 될 아이디와 패스워드는 임베디드보드 안에 따로 디비를 두기에 공간이 충분치 않아 account.dat 파일을
제작하여 보관하도록 하였습니다. 다음 부분은 로그인 부분의 소스 입니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1000 //login retry
#define RNUM 30 //retry number
#define TRUE 1
#define FALSE 0
int main(int argc, char *argv[])
{
FILE *fp;
int fd; //file description
int i;
int index = 0;
int len1, len2, len;
char std[10][16];
char *tmp;
char *id;
char *password;
char *buf;
char *str1, *str2;
printf("Content-type:text/html\n\n");
len = atoi(getenv("CONTENT_LENGTH"));
str1 = (char*)malloc(20);
str2 = (char*)malloc(20);
buf = (char*)malloc(len);
int tryNum =RNUM;
int lFlag=0;
fread(buf, 1, len, stdin);
int ab = 0;
//printf("len=%d<br>", len);
//printf("buf=%s<br>", buf);
tmp = (char*)strtok(buf, "&=");
str1 = (char*)strtok(NULL, "&=");
tmp = (char*)strtok(NULL, "&=");
str2 = (char*)strtok(NULL, "&=");
printf("ID : %s<br>", str1);
printf("PW : %s<br>", str2);
printf("<html><head>PLANETINT LOGIN SYSTEM</head>");
printf("<body>");
fp = fopen("../account.dat", "rt");
if(fp == NULL) {
printf("<h2>DB ERROR</h2>\n");
return;
}
while(feof(fp) == 0)
{
fscanf(fp,"%s", &std[index][0]);
// printf("<h2>account info %s</h2>", std[index]);
index++;
}
index=0;
while(tryNum > 0)
{
if(!strcmp(str1,std[index]) && !strcmp(str2,std[index+1]))
{
printf("<h2> login success </h2>");
lFlag = TRUE;
printf("<h2>account id info %s</h2>", std[index]);
printf("<script language=\"javascript\">\n");
printf("location.href=\"../index.html\"\n");
printf("</script>\n");
break;
}
else
{
printf("<h2>tryNum: %d</h2>", tryNum);
tryNum--;
lFlag = FALSE;
index++;
printf("<h2>account pw info %s</h2>", std[index]);
}
}
if(!lFlag)
{
printf("<h2> login false </h2>");
}
printf("</body></html>");
fclose(fp);
}
소스를 보면 아시겠지만 폼으로부터 전달되는 아이디와 패스워드를 파싱하여 str1 / str2 에 저장한 후
어카운트 파일을 모두 읽어와 저장한 부분과 매치되는지 반복문을 이용하여 전체 탐색하도록 한 부분 입니다.
중간 중간 디버깅을 위한 printf문이 들어가 있네요 ㅎㅎ 로그인 완료시 자바스크립을 이용하여 다른창으로 이동하도록 location 을 넣었습니다.
로그인 소스를 살펴보시면 아시다시피 버그가 눈에 뛸 것 입니다 ㅎㅎㅎ
이부분은 차 후 어드민 로그인 단 한계정만을 사용할 것이기에 귀찮아서 수정하지 않을꺼랍니다 ㅡㅡ;;;
'ARM > Software' 카테고리의 다른 글
LN2440SBC 메모리 맵 (0) | 2009.11.10 |
---|---|
리눅스 시리얼 프로그래밍 예제 (0) | 2009.11.10 |
RTC 없이 보드 시간 동기화 (0) | 2009.11.10 |
패킷 교환 네트워크에서의 지연과 손실 (0) | 2009.11.10 |
임베디드 보드 Web을 이용한 네트워크 설정 기능 구현하기 (0) | 2009.09.10 |