Re: [lms] MT+Radius+PPPoE+2 sektory
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.radcheckwhere 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
05-12-07, malpi malpi@o2.pl napisał(a):
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
_______________________________________________ lms mailing list lms@lists.lms.org.pl http://lists.lms.org.pl/mailman/listinfo/lms
uczestnicy (1)
-
Michał Gacek