2008年2月20日 星期三

LEAF Bering-uClibc packages 3.x 使用 ULOG + MySQL

LEAF部份
1.安裝以下 LRP
ulogdsql.lrp
libmysql.lrp
libm.lrp
libz.lrp

2.設定Ulogd
/etc/ulogd.conf
#output plugins.
plugin="/usr/lib/ulogd/ulogd_MYSQL.so"

[MYSQL]部份
table="ulog"
pass="changeme"
user="laforge"
db="ulogd"
host="192.168.1.2"

3.修改 shorewall 規則,讓 fw 可以存取 Log MySQL Server

4.重新啟動 ulogd
/etc/init.d/ulogd startstoprestart



Log MySQL Server 部份
1.安裝好 MySQL
2.根據 /etc/ulogd.conf MySQL相關設定中建立資料庫叫及帳號
3.下載 ulogd 原始碼,解開後將 /ulogd-1.24/doc/mysql.table 匯入至 ulogd 資料庫

MySQL保留字

以下為MySQL保留字,不能使用下列名稱作為表格名稱或欄位名稱,其中大多數和ANSI SQL92相同,一些保留原因是因為MySQL中使用yacc的語法分析器,若使用函式名稱作為表格/欄位名稱,則函式後接著的"("中間不可空白。

ADD

ALL

ALTER

ANALYZE

AND

AS

ASC

AUTO_INCREMENT

BDB

BEFORE

BERKELEYDB

BETWEEN

BIGINT

BINARY

BLOB

BOTH

BTREE

BY

CASCADE

CASE

CHANGE

CHAR

CHARACTER

CHECK

COLLATE

COLUMN

COLUMNS

CONSTRAINT

CREATE

CROSS

CURRENT_DATE

CURRENT_TIME

CURRENT_TIMESTAMP

DATABASE

DATABASES

DAY_HOUR

DAY_MINUTE

DAY_SECOND

DEC

DECIMAL

DEFAULT

DELAYED

DELETE

DESC

DESCRIBE

DISTINCT

DISTINCTROW

DIV

DOUBLE

DROP

ELSE

ENCLOSED

ERRORS

ESCAPED

EXISTS

EXPLAIN

FALSE

FIELDS

FLOAT

FOR

FORCE

FOREIGN

FROM

FULLTEXT

FUNCTION

GRANT

GROUP

HASH

HAVING

HIGH_PRIORITY

HOUR_MINUTE

HOUR_SECOND

IF

IGNORE

IN

INDEX

INFILE

INNER

INNODB

INSERT

INT

INTEGER

INTERVAL

INTO

IS

JOIN

KEY

KEYS

KILL

LEADING

LEFT

LIKE

LIMIT

LINES

LOAD

LOCALTIME

LOCALTIMESTAMP

LOCK

LONG

LONGBLOB

LONGTEXT

LOW_PRIORITY

MASTER_SERVER_ID

MATCH

MEDIUMBLOB

MEDIUMINT

MEDIUMTEXT

MIDDLEINT

MINUTE_SECOND

MOD

MRG_MYISAM

NATURAL

NOT

NULL

NUMERIC

ON

OPTIMIZE

OPTION OPTIONALLY

OR

ORDER

OUTER

OUTFILE

PRECISION

PRIMARY

PRIVILEGES

PROCEDURE

PURGE

READ

REAL

REFERENCES

REGEXP

RENAME

REPLACE

REQUIRE

RESTRICT

RETURNS

REVOKE

RIGHT

RLIKE

RTREE

SELECT

SET

SHOW

SMALLINT

SOME

SONAME

SPATIAL

SQL_BIG_RESULT

SQL_CALC_FOUND_ROWS

SQL_SMALL_RESULT

SSL

STARTING

STRAIGHT_JOIN

STRIPED

TABLE

TABLES

TERMINATED

THEN

TINYBLOB

TINYINT

TINYTEXT

TO

TRAILING

TRUE

TYPES

UNION

UNIQUE

UNLOCK

UNSIGNED

UPDATE

USAGE

USE

USER_RESOURCES

USING

VALUES

VARBINARY

VARCHAR

VARCHARACTER

VARYING

WARNINGS

WHEN

WHERE

WITH

WRITE

XOR

YEAR_MONTH

ZEROFILL

以下的符號(來自上表)是被 ANSI SQL 禁止的,但是可以被 MySQL 用於列/表名

ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP

2007年12月3日 星期一

haserl:Html And Shell Embedded Report Language

haserl:Html And Shell Embedded Report Language,一個小型的 CGI wrapper,可以直接在 HTML 文件中嵌入 shell script 語法,使用用 POST 或 GET 傳入的變數會自動轉換成環境變數,在標記內( <? ?> )的語法則視為 shell script 來執行。

haserl 網址:http://haserl.sourceforge.net/



範例程式
#!/usr/bin/haserl
<?
temp='Html And Shell Embedded Report Language '

echo $temp

echo $FORM_foo

?>
<html>
<body>
<form action=1.cgi method=post>
<input type=text name=foo></input>
<input type=submit>
</form>
</body>
</html>

2007年10月26日 星期五

NetBIOS over TCP/IP 名稱解析 IP 位址方法

NetBIOS over TCP/IP 名稱解析 IP 位址方法
1.在LMHOSTS檔案中尋找。
2.區域網路中廣播。
3.透過WINS伺服器。

MS Windows系統使用下列四種方法解析:
B Mode(Broadcast、ox1)
不適合大型網路,查詢順序如下
1.LMHOSTS CACHE
2.Broadcast
3.LMHOSTS

P Mode(per-to-per、0x2)
僅使用WINS伺服器查詢。

M Mode(mixed、0x4)
聯合使用B Mode及P Mode,預設使用B Mode,如果不能使用Broadcast,則使用P Mode的WINS伺服器。

H Mode(hybrid、0x8)
聯合使用B Mode及P Mode,預設使用P Mode。

2007年10月23日 星期二

計算中文 big5 在編碼中的順序

//計算中文 big5 在編碼中的順序
//高位元區段 81-8D 8E-A0 A1-FE ---->126個
//低位元區段 40-7E A1-FE ---> 157 個
//先計算高位元的距離 公式:(高位元 - 0x81) * 157
//再計算低位元距離 分為兩組 40-7E A1-FE
//0x40=64 0x7E=126 63個
//0xA1=161 0xFE=254 94個
//落在 0x40-0x7E 直接加上 (低位元的值 - 0x40 + 1)
//落在 0xA1-0xFE 63 + (低位元的值 - 0xA1 + 1)

// PHP

<?php
function big5order($big5){
$big5_h = $big5[0] . $big5[1];
$big5_l = $big5[2] . $big5[3];int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
lo = big5 &0x00FF;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

?>

// C/C++

int big5order(unsigned short big5){
unsigned short big5order;
unsigned char hi, lo;

hi = (big5 & 0xFF00) >> 0x08;
if(!(hi>=0x81 && hi<=0xFE)) return -1;

lo = big5 &0x00FF;
if(!((lo>=0x40 && lo<=0x7E) (lo>=0xA1 && lo<=0xFE))) return -2;

big5order = (hi - 0x81) * 157;

if(lo>=0x40 && lo<=0x7E)
big5order = big5order + lo - 0x40 + 1;
else if(lo>=0xA1 && lo<=0xFE)
big5order = big5order + 63 + lo - 0xA1 + 1;

return big5order;
}

2007年10月18日 星期四

將字串型態表示的16位元數字轉為整數資料型態

將字串型態表示的16位元數字轉為整數資料型態

傳入的參數可為 " ffbc","FFbC","0xFFFC", "12F4"


//字元 HEX 轉 OCT
int chex2oct(char ch[]){
unsigned int i, j[10], leng, leng_s=0, chex=0;
unsigned int hex16[] = {1, 16, 256, 4096, 65536, 1048576, 16777216,268435456};
leng = strlen(ch);

for(i=0; i<leng; i++) {
if(ch[i]>47 && ch[i]<58) j[leng_s++] = ch[i] - 48;
else {
switch (ch[i]){
case 'a': case 'A': j[leng_s++] = 10; break;
case 'b': case 'B': j[leng_s++] = 11; break;
case 'c': case 'C': j[leng_s++] = 12; break;
case 'd': case 'D': j[leng_s++] = 13; break;
case 'e': case 'E': j[leng_s++] = 14; break;
case 'f': case 'F': j[leng_s++] = 15; break;
}
}
}

for(i=0; i<leng_s; i++) chex += j[i] * hex16[leng_s - i - 1];
return chex;
}

2007年9月7日 星期五

Linux syslog 程式設計筆記

LINUX下執行的程式除了自己輸出系統日誌到特定檔案外,還可以透過 syslogd來達成這個功能,免除了自行開檔關檔的工作。

程式要使用系統日誌功能,只需要在程式啟動時使用openlog函數來連接syslogd程式,後面隨時用syslog函數傳人系統日誌就行了。

相關的函式有 openlog,syslog,closelog。

#include <syslog.h>

void openlog(const char *ident, int option, int facility)

開啟一個到系統日誌記錄程式的連接,開啟後就可使用用syslog或vsyslog函數在系統日誌中添加資訊

ident 是一個標記,ident所表示的字串將固定地加在每行日誌的前面以標識這個日誌,通常就寫成當前程式的名稱以作標記。

option 是下列值取與運算的結果:

LOG_CONS
Write directly to system console if there is an error while sending to system logger.

LOG_NDELAY
Open the connection immediately (normally, the connection is opened when the first message is logged).

LOG_NOWAIT
Don’t wait for child processes that may have been created while logging the message. (The GNU C library does not create a
child process, so this option has no effect on Linux.)

LOG_ODELAY
The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called. (This is the default, and need
not be specified.)

LOG_PERROR
(Not in SUSv3.) Print to stderr as well.

LOG_PID
Include PID with each message.


facility 指明記錄日誌的程式的類型。facility is the default facility code for this connection. A syslog on this connection that specifies default facility causes this facility to be associated with the message. See syslog for possible values. A value of zero means the default default, which is LOG_USER.

#include <syslog.h>

void syslog(int priority, const char *format, ...)

把日誌消息發給系統程式輸出至syslogd記錄

priority 日誌消息的緊急級別

LOG_USER

A miscellaneous user process
LOG_MAIL

Mail
LOG_DAEMON

A miscellaneous system daemon
LOG_AUTH

Security (authorization)
LOG_SYSLOG

Syslog
LOG_LPR

Central printer
LOG_NEWS

Network news (e.g. Usenet)
LOG_UUCP

UUCP
LOG_CRON

Cron and At
LOG_AUTHPRIV

Private security (authorization)
LOG_FTP

Ftp server
LOG_LOCAL0

Locally defined
LOG_LOCAL1

Locally defined
LOG_LOCAL2

Locally defined
LOG_LOCAL3

Locally defined
LOG_LOCAL4

Locally defined
LOG_LOCAL5

Locally defined
LOG_LOCAL6

Locally defined
LOG_LOCAL7

Locally defined

format 日誌消息的格式,之後是格式對應的參數類似printf函數。

#include <syslog.h>

void closelog(void)

關閉 開啟的 openlog 連接

#include <stdarg.h>

void vsyslog(int priority, const char *format, va_list ap);

把日誌消息發給系統程式輸出至syslogd記錄


簡單範例

#include <syslog.h>

int main(int argc, char **argv)
{
openlog("test", LOG_CONS | LOG_PID, 0);
syslog(LOG_INFO, "This is a syslog test message generated by program '%s'n", argv[0]);
closelog();

return 0;
}

結果輸出一般是 /var/log/messages 或是 /var/log/syslog

視 /etc/syslog.conf 中的設定,下面的設定是輸出至 /var/log/messages

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages

# The authpriv file has restricted access.
authpriv.* /var/log/secure

# Log all the mail messages in one place.
mail.* -/var/log/maillog


# Log cron stuff
cron.* /var/log/cron

# Everybody gets emergency messages
*.emerg *

# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler

# Save boot messages also to boot.log
local7.* /var/log/boot.log

補充

Linux有關syslog的函式沒有提供syslog寫到遠端syslogd的功能,如果在程式中想要將syslog寫到遠端的syslog 伺服器,可以使用socket udp(514)的函式,將訊息送出。

參考資料

http://insecure.org/sploits/aix.generic.syslogd.problem.html

http://zhoulifa.bokee.com/6104993.html

http://www.dusek.ch/manual/glibc/libc_18.html

http://www.balabit.com/network-security/syslog-ng/