witam. do tej pory zmiany prędkości wiązały się z ręczną edycją pliku z prędkościami. plik ten ma postać: IP:DOWNMIN:DOWNMAX:UPMIN:UPMAX spłodziłem zapytanie pobierające prędkości z bazy i zapisujące je do pliku. SELECT lower(nn.name) as Nazwa,inet_ntoa(nn.ipaddr) as adres, z.downrate AS downloadmin, z.downceil AS downloadmax, z.uprate AS uploadmin, z.upceil AS uploadmax FROM nodes nn LEFT JOIN ( SELECT n.id, MIN(n.name) AS name,SUM(t.downrate) AS downrate, SUM(t.downceil) AS downceil, SUM(t.uprate) AS uprate, SUM(t.upceil) AS upceil FROM nodeassignments na JOIN assignments a ON (na.assignmentid = a.id) JOIN tariffs t ON (a.tariffid = t.id) JOIN nodes n ON (na.nodeid = n.id) JOIN ( SELECT assignmentid, COUNT(*) AS cnt FROM nodeassignments GROUP BY assignmentid ) o ON (o.assignmentid = na.assignmentid) WHERE (a.datefrom <= unix_timestamp() OR a.datefrom = 0) AND (a.dateto > unix_timestamp() OR a.dateto = 0) AND a.suspended = 0 GROUP BY n.id ) z ON z.name = nn.name WHERE (nn.ipaddr BETWEEN inet_aton('x.x.x.x) and inet_aton('x.x.x.y') ORDER BY ipaddr
prędkości ładnie mi lądują do pliku. z tym, że mam pewien problem. jeden z klientów, firma ma przydzielone 5 adresów x/29. jak to pisałem ręcznie to poprostu w pliku miałem wpis: x.x.x.112/29 gdzie skrypt tc rozpoznawał mi adres z maską, robił jedną klasę dla tej sieci i adresy z tej sieci wrzucał do tej klasy. w sumie ta sieć miała jedną, współdzieloną prędkość. w tej chwili pobierając w ten sposób prędkości z bazy nie wyszczególniam tej sieci i klient ma na każdy host prędkość gdzie w sumie jest to 5xpredkość.
jak rozwiązać ten problem, że jeśli klient ma x komputerów należących do "jednej" sieci to w wyniku było /29? z góry dzięki za sugestie.
W dniu 18 czerwca 2012 20:49 użytkownik Marcin marcin@nicram.net napisał:
witam. do tej pory zmiany prędkości wiązały się z ręczną edycją pliku z prędkościami. plik ten ma postać: IP:DOWNMIN:DOWNMAX:UPMIN:UPMAX spłodziłem zapytanie pobierające prędkości z bazy i zapisujące je do pliku. SELECT lower(nn.name) as Nazwa,inet_ntoa(nn.ipaddr) as adres, z.downrate AS downloadmin, z.downceil AS downloadmax, z.uprate AS uploadmin, z.upceil AS uploadmax FROM nodes nn LEFT JOIN ( SELECT n.id, MIN(n.name) AS name,SUM(t.downrate) AS downrate, SUM(t.downceil) AS downceil, SUM(t.uprate) AS uprate, SUM(t.upceil) AS upceil FROM nodeassignments na JOIN assignments a ON (na.assignmentid = a.id) JOIN tariffs t ON (a.tariffid = t.id) JOIN nodes n ON (na.nodeid = n.id) JOIN ( SELECT assignmentid, COUNT(*) AS cnt FROM nodeassignments GROUP BY assignmentid ) o ON (o.assignmentid = na.assignmentid) WHERE (a.datefrom <= unix_timestamp() OR a.datefrom = 0) AND (a.dateto > unix_timestamp() OR a.dateto = 0) AND a.suspended = 0 GROUP BY n.id ) z ON z.name = nn.name WHERE (nn.ipaddr BETWEEN inet_aton('x.x.x.x) and inet_aton('x.x.x.y') ORDER BY ipaddr
prędkości ładnie mi lądują do pliku. z tym, że mam pewien problem. jeden z klientów, firma ma przydzielone 5 adresów x/29. jak to pisałem ręcznie to poprostu w pliku miałem wpis: x.x.x.112/29 gdzie skrypt tc rozpoznawał mi adres z maską, robił jedną klasę dla tej sieci i adresy z tej sieci wrzucał do tej klasy. w sumie ta sieć miała jedną, współdzieloną prędkość. w tej chwili pobierając w ten sposób prędkości z bazy nie wyszczególniam tej sieci i klient ma na każdy host prędkość gdzie w sumie jest to 5xpredkość.
jak rozwiązać ten problem, że jeśli klient ma x komputerów należących do "jednej" sieci to w wyniku było /29? z góry dzięki za sugestie.
Dorzuć na końcu linii pole assignments.id danego klienta (lub nodeassignments.assignmentid danego komputera jeśli istnieje) i ustawiaj taki numer klasy w skrypcie generującym reguły tc. W przypadku kiedy klient ma jedno zobowiązanie wystarczy assignments.id, w przypadku kiedy ma wiele taryf i kilka komputerów przypisanych do różnych taryf będziesz mógł sobie to wyłuskać z pomocą nodeassignments. Ponadto ip komputerów danego klienta nie będą musiały być obok siebie, żeby łapać się do jednej kolejki. A po trzecie jak zaczniesz używać tablic haszujących to i tak będą Ci potrzebne pojedyncze adresy a nie adresy sieci.
Mi to działa w ten sposób i jestem zadowolony. Jakbyś miał jeszcze jakieś pytania to pisz.
ps. jeśli numer zobowiązania pokrywa Ci się z jakąś istniejącą ważną klasą, musisz albo ją przenieść, albo dodać np 100 do assignments.id.
Pozdro.
W dniu 19 czerwca 2012 09:49 użytkownik Łukasz Bujek booyas@gmail.comnapisał:
Dorzuć na końcu linii pole assignments.id danego klienta (lub nodeassignments.assignmentid danego komputera jeśli istnieje) i ustawiaj taki numer klasy w skrypcie generującym reguły tc.
qrde, wielkie dzięki. to jest pomysł i to bardzo dobry :) biore się za przeróbkę.
W dniu 19 czerwca 2012 09:49 użytkownik Łukasz Bujek booyas@gmail.comnapisał:
nodeassignments.assignmentid danego komputera
ogólnie jak wspominałem pomysł super. jest tylko pewien mankament. zrobienie jakiegokolwiek zobowiązania skutkuje kolejnym numerkiem nodeassignments.assignmentid. jest to pole auto_increment z assignments, więc nie powiem, robią się "dziury'. tc w wartości flowid, classid może przyjąć 4 znaki, czyli maksymalne id 9999. oczywiście w skrypcie można tą wartość przeliczyć na hex i będzie można wstawić w formacie 0xffff czyli nasze maxid zwiększy się do 65535 :) co prawda mamy spory zapas ;) bo na chwilę obecną moje assignmentsid to niewiele ponad 7000 mimo nie dużej ilości klientów (swego czasu zbyt dużo kombinowałem z zobowiązaniami). robiąc jakieś promocje, typu przez kilka miesięcy taniej, itp., dosyć szybko skończą się nam możliwości :(
dało by się jakoś by assignments.id było unikalne ale nie robiło incramentacji a "wybierało" wolne id?
uczestnicy (2)
-
Marcin
-
Łukasz Bujek