Witam o to kod glownego programu:
program pppoe_ng;
uses
mysql4,mysqloi,crt,sysutils,strings,Variants,Classes,strutils;
const
dbhost : PChar='localhost';
dbuser : PChar='user';
dbpass : PChar='pass';
var
query_main,query_radcheck,query_radreply,modify : tsqlz;
t,y,x:integer;
name_lms,ip_lms,passwd_lms : string;
name_radius, passwd_radius, ip_radius : string;
// row : TMYSQL_ROW;
conn1 : PMYSQL;
conn2 : PMYSQL;
begin
clrscr;
conn1:=mysql_connect(dbhost,dbuser,dbpass);
mysql_query(conn1, 'set NAMES utf8');
query_main.sql:= 'Select id, LCASE(name), INET_NTOA(ipaddr), passwd from
lms.nodes where ownerid!=0';
query_main.sqlexec(conn1);
Writeln ('Przeładowanie modułu PPPoE:');
Writeln (' Zatwierdzanie zmian w ustawieniach PPPoE:');
x:=0;
for t:=1 to mysql_num_rows (query_main.dataset) do
begin
query_main.row := mysql_fetch_row(query_main.dataset);
name_lms:=string(query_main.row[1]);
ip_lms:=string(query_main.row[2]);
passwd_lms:=string(query_main.row[3]);
query_radcheck.sql:='select username, value from radius.radcheck where username=:username;';
query_radcheck.parasstring(':username', name_lms+'@flynet.com.pl
');
query_radcheck.sqlexec(conn1);
query_radcheck.row:=mysql_fetch_row(query_radcheck.dataset);
if (mysql_num_rows(query_radcheck.dataset) <> 0) then
begin
query_radreply.sql:='select value from
radius.radreply where attribute=:attribute AND username=:username;';
query_radreply.parasstring(':attribute', 'Framed-IP-Address');
query_radreply.parasstring(':username',
name_lms+'@flynet.com.pl');
query_radreply.sqlexec(conn1);
query_radreply.row:=mysql_fetch_row(query_radreply.dataset);
ip_radius:=string(query_radreply.row[0]);
name_radius:=string(query_radcheck.row[0]);
passwd_radius:=string(query_radcheck.row[1]);
// writeln('haslo1 '+passwd_lms+' haslo2 '+passwd_radius+' ip_radius: '+ip_radius);
if (passwd_lms = '') then
begin
x:=x+1;
modify.sql:='DELETE radius.radcheck, radius.5radreply FROM radius.radcheck, radius.radreply WHERE radius.radcheck.username=radius.radreply.username
AND radius.radcheck.username=:username;';
modify.parasstring(':username', name_lms+'@flynet.com.pl');
modify.sqlexec(conn1);
writeln(' *Wyłączam PPPoE dla urządzenia: '+name_lms);
end
else
begin
if (passwd_radius <> passwd_lms) then
begin
x:=x+1;
modify.sql:='UPDATE radius.radcheck SET value=:value WHERE attribute=:attribute AND username=:username;';
modify.parasstring(':value', passwd_lms);
modify.parasstring
(':attribute', 'Password');
modify.parasstring(':username', name_lms+'@flynet.com.pl');
modify.sqlexec(conn1);
writeln(' *Aktualizuję hasło dla urządzenia: '+name_lms);
end;
if (ip_lms <> ip_radius) then
begin
x:=x+1;
modify.sql:='UPDATE radius.radreply SET value=:value WHERE attribute=:attribute AND username=:username;';
modify.parasstring(':value', ip_lms);
modify.parasstring(':attribute', 'Framed-IP-Address');
modify.parasstring(':username', name_lms+'@flynet.com.pl');
modify.sqlexec(conn1);
writeln(' *Aktualizuję adres ip dla urządzenia: '+name_lms);
end;
end;
end
else if (passwd_lms <> '') then
begin
modify.sql:='INSERT INTO radius.radcheck (username, attribute, value) VALUES (:username, :attribute, :value);';
modify.parasstring(':username', name_lms+'@flynet.com.pl');
modify.parasstring(':attribute','Password');
modify.parasstring(':value', passwd_lms);
modify.sqlexec(conn1);
modify.sql:='INSERT INTO radius.radreply (username, attribute, value) VALUES (:username, :attribute, :value);';
modify.parasstring(':username', name_lms+'@flynet.com.pl');
modify.parasstring(':attribute','Framed-IP-Address');
modify.parasstring(':value', ip_lms);
modify.sqlexec(conn1);
writeln(' *Włączam PPPoE dla urządzenia: '+name_lms);
x:=x+1
end;
end;
if (x = 0) then writeln(' Nie było żadnych zmian do zatwierdzenia!')
else
begin
write('Dokonano ');
write(x);
writeln(' zmian(y) w ustawieniach PPPoE');
end;
query_main.free;
query_radcheck.free;
query_radreply.free;
query_main.sql:='select username from radius.radcheck;';
query_main.sqlexec(conn1);
writeln(' Czyszczę PPPoE ze starych nazw:');
x:=0;
for t:=1 to mysql_num_rows(query_main.dataset) do
begin
query_main.row:=mysql_fetch_row(query_main.dataset);
name_radius:=string(query_main.row[0]);
delete(name_radius,length(name_radius)-13,14);
query_radcheck.sql:='select name from lms.nodes where name=:username;';
query_radcheck.parasstring(':username', name_radius);
query_radcheck.sqlexec(conn1);
if (mysql_num_rows(query_radcheck.dataset) = 0) then
begin
modify.sql:='DELETE radius.radcheck, radius.radreply FROM radius.radcheck, radius.radreply WHERE radius.radcheck.username=radius.radreply.username AND radius.radcheck.username=:username;';
modify.parasstring(':username', name_radius+'@flynet.com.pl');
modify.sqlexec(conn1);
writeln(' *'+name_radius+'@
flynet.com.pl');
x:=x+1;
end;
end;
if (x = 0) then writeln(' Nie było nic do czyszczenia!')
else
begin
write('Wyczyszczono ');
write(x);
writeln(' rekord(ów)');
end;
mysql_close(conn1);
writeln ('Przeładowanie modułu PPPoE zakończone sukcesem!');
halt(0);
end.
-----------------------------------------------------------------------------------------------------------------
o to kod unitu mysqloi:
UNIT MYSQLOI;
INTERFACE
USES
MYSQL4,CRT,SYSUTILS,STRINGS,VARIANTS,CLASSES,STRUTILS;
TYPE
TSQLZ = OBJECT
SQL:ANSISTRING;
PSQL:PCHAR;
ROW:TMYSQL_ROW;
DATASET : PMYSQL_RES;
PROCEDURE PARASSTRING(PAR:STRING;VALUE:VARIANT);
PROCEDURE PARASNUMERIC(PAR:STRING;VALUE:VARIANT);
PROCEDURE PARASDATE(PAR:STRING;VALUE:VARIANT);
PROCEDURE SQLEXEC(CONN:PMYSQL);
PROCEDURE UPDATE;
PROCEDURE FREE;
END;
FUNCTION MYSQL_CONNECT(HOST:PCHAR;USER:PCHAR;PASS:PCHAR):PMYSQL;
VAR
// SOCK : PMYSQL;
// ROW : TMYSQL_ROW;
// Y : INTEGER;
QMYSQL : TMYSQL;
IMPLEMENTATION
PROCEDURE TSQLZ.FREE;
BEGIN
MYSQL_FREE_RESULT(DATASET);
END;
PROCEDURE
TSQLZ.SQLEXEC(CONN:PMYSQL);
BEGIN
UPDATE;
IF (MYSQL_QUERY(CONN,PSQL) < 0) THEN
BEGIN
WRITELN (STDERR,'QUERY FAILED ');
WRITELN (STDERR,MYSQL_ERROR(CONN));
HALT(1);
END;
DATASET := MYSQL_STORE_RESULT(CONN);
// IF (DATASET = NIL) THEN
// BEGIN
// WRITELN (STDERR,'QUERY FAILED ');
// WRITELN (STDERR,MYSQL_ERROR(CONN));
// MYSQL_CLOSE(CONN);
// HALT (1);
// END;
//IF (SWITCH = 1) THEN
//BEGIN
// DATASET:=MYSQL_STORE_RESULT(BAZA);
//END;
//IF (SWITCH = 2) THEN
//BEGIN
// DATASET:=MYSQL_STORE_RESULT(BAZA);
// IF (MYSQL_NUM_ROWS(DATASET) > 0) THEN
// BEGIN
// FOR Y:=1 TO MYSQL_NUM_ROWS(DATASET) DO
// BEGIN
// ROW:=MYSQL_FETCH_ROW(DATASET);
// WRITELN(ROW[1]);
// END;
// END;
//END;
//MYSQL_QUERY(BAZA,PSQL);
END;
PROCEDURE TSQLZ.UPDATE;
BEGIN
psql:=stralloc(length(sql)+1);
psql:=strpcopy(psql,sql);
end;
procedure tsqlz.parasstring(par:string;value:variant);
begin
sql:=ansireplacetext(sql,par,#39+value+#39);
update;
end;
procedure tsqlz.parasnumeric(par:string;value:variant);
begin
sql:=ansireplacetext(sql,par,value);
update;
end;
procedure tsqlz.parasdate(par:string;value:variant);
begin
sql:=ansireplacetext(sql,par,value);
update;
end;
function mysql_connect(host:PChar;user:PChar;pass:PChar):PMYSQL;
var
sock, sock_back : PMYSQL;
back_host, back_user, back_pass : PChar;
// qmysql : TMYSQL;
begin
back_host:='localhost';
back_user:='root';
back_pass:='abimbu6';
mysql_init(PMySQL(@qmysql));
sock:=mysql_real_connect(PMysql(@qmysql),host,user,pass,nil,0,nil,0);
if (sock = Nil) then
begin
Writeln (stderr,'Couldn''t connect to MySQL.');
Writeln (stderr,mysql_error(@qmysql));
// sock_back:=mysql_real_connect(PMysql(@qmysql),back_host,back_user,back_pass,nil,0,nil,0);
end;
mysql_connect:=sock;
end;
end.
Pamiętaj o z linkowaniu libmysqlclient. Wiem ze program moze troche przerazac ale ja nie pisze w pascalu zawodowo musialem przepisac po prostu skrypt do jakioegos normalnego jezyka co sie bedzie normalnie wykonywal,bo to samo w bashu hmmm wykonywalo sie jakies 4 sekundy... Mam gotowe binarki ale jak widac haslo i user do bazy sa zapisane w kodzie zrodlowym wiec lepiej abys sam opanowal kompilacje :). sorry za caloksztalt ale nie pisalem tego z mysla zeby to komu kolwiek udostępnić.
Pozdrawiam
Dnia 5 grudnia 2007 9:47 Rafał Suliga <r.suliga@fast-net.pl> napisał(a):
> OK, to jak możesz to podeślij będę bardzo wdzięczny :).
>
> Pozdrawiam, i dzięki za pomoc.
>
sql.conf nic Ci nie da, bo nie jest zmieniony. Ja u siebie realizuję to przez funkcję plpsql (mam bazę postgresa)
Generalnie nie daje gotowych rozwiązań, bo to już wdrożenie (czytaj usługa płatna).
Pozdrawiam
_______________________________________________
lms mailing list
lms@lists.lms.org.pl
http://lists.lms.org.pl/mailman/listinfo/lms