From 8b874c6e6a4cb7ecce7e3274cb2d5f779105460c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Chac=C3=B3n?= Date: Wed, 22 Mar 2023 15:45:40 -0600 Subject: [PATCH] Delete old/v0.7 directory --- old/v0.7/LICENSE | 339 ------------------------------------------ old/v0.7/LibreQoS.py | 264 -------------------------------- old/v0.7/Shaper.csv | 6 - old/v0.7/ispConfig.py | 22 --- old/v0.7/scheduled.py | 11 -- old/v0.7/stats.py | 176 ---------------------- 6 files changed, 818 deletions(-) delete mode 100644 old/v0.7/LICENSE delete mode 100644 old/v0.7/LibreQoS.py delete mode 100644 old/v0.7/Shaper.csv delete mode 100644 old/v0.7/ispConfig.py delete mode 100644 old/v0.7/scheduled.py delete mode 100644 old/v0.7/stats.py diff --git a/old/v0.7/LICENSE b/old/v0.7/LICENSE deleted file mode 100644 index d159169d..00000000 --- a/old/v0.7/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/old/v0.7/LibreQoS.py b/old/v0.7/LibreQoS.py deleted file mode 100644 index d14eb22e..00000000 --- a/old/v0.7/LibreQoS.py +++ /dev/null @@ -1,264 +0,0 @@ -# Copyright (C) 2020 Robert Chacón -# This file is part of LibreQoS. -# -# LibreQoS is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# LibreQoS is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with LibreQoS. If not, see . -# -# _ _ _ ___ ____ -# | | (_) |__ _ __ ___ / _ \ ___/ ___| -# | | | | '_ \| '__/ _ \ | | |/ _ \___ \ -# | |___| | |_) | | | __/ |_| | (_) |__) | -# |_____|_|_.__/|_| \___|\__\_\\___/____/ -# v.0.78-beta -# -import random -import logging -import os -import io -import json -import csv -import subprocess -from subprocess import PIPE -import ipaddress -from ipaddress import IPv4Address, IPv6Address -import time -from datetime import date, datetime -from ispConfig import fqOrCAKE, pipeBandwidthCapacityMbps, defaultClassCapacityMbps,interfaceA, interfaceB, enableActualShellCommands, runShellCommandsAsSudo - -def shell(command): - if enableActualShellCommands: - if runShellCommandsAsSudo: - command = 'sudo ' + command - commands = command.split(' ') - print(command) - proc = subprocess.Popen(commands, stdout=subprocess.PIPE) - for line in io.TextIOWrapper(proc.stdout, encoding="utf-8"): # or another encoding - print(line) - else: - print(command) - -def clearMemoryCache(): - command = "sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'" - commands = command.split(' ') - proc = subprocess.Popen(commands, stdout=subprocess.PIPE) - for line in io.TextIOWrapper(proc.stdout, encoding="utf-8"): - print(line) - -def clearPriorSettings(interfaceA, interfaceB): - shell('tc filter delete dev ' + interfaceA) - shell('tc filter delete dev ' + interfaceA + ' root') - shell('tc qdisc delete dev ' + interfaceA + ' root') - shell('tc qdisc delete dev ' + interfaceA) - shell('tc filter delete dev ' + interfaceB) - shell('tc filter delete dev ' + interfaceB + ' root') - shell('tc qdisc delete dev ' + interfaceB + ' root') - shell('tc qdisc delete dev ' + interfaceB) - if runShellCommandsAsSudo: - clearMemoryCache() - -def refreshShapers(): - devices = [] - filterHandleCounter = 101 - #Load Devices - with open('Shaper.csv') as csv_file: - csv_reader = csv.reader(csv_file, delimiter=',') - next(csv_reader) - for row in csv_reader: - deviceID, AP, mac, hostname,ipv4, ipv6, download, upload = row - ipv4 = ipv4.strip() - ipv6 = ipv6.strip() - thisDevice = { - "id": deviceID, - "mac": mac, - "AP": AP, - "hostname": hostname, - "ipv4": ipv4, - "ipv6": ipv6, - "download": int(download), - "upload": int(upload), - "qdiscSrc": '', - "qdiscDst": '', - } - devices.append(thisDevice) - - #Clear Prior Configs - clearPriorSettings(interfaceA, interfaceB) - - shell('tc filter delete dev ' + interfaceA + ' parent 1: u32') - shell('tc filter delete dev ' + interfaceB + ' parent 2: u32') - - ipv4FiltersSrc = [] - ipv4FiltersDst = [] - ipv6FiltersSrc = [] - ipv6FiltersDst = [] - - #InterfaceA - parentIDFirstPart = 1 - srcOrDst = 'dst' - thisInterface = interfaceA - classIDCounter = 101 - hashIDCounter = parentIDFirstPart + 1 - shell('tc qdisc replace dev ' + thisInterface + ' root handle 1: htb default 15 r2q 1514') - shell('tc class add dev ' + thisInterface + ' parent 1: classid 1:1 htb rate '+ str(pipeBandwidthCapacityMbps) + 'mbit ceil ' + str(pipeBandwidthCapacityMbps) + 'mbit') - shell('tc qdisc add dev ' + thisInterface + ' parent 1:1 ' + fqOrCAKE) - #Default class - traffic gets passed through this limiter if not otherwise classified by the Shaper.csv - shell('tc class add dev ' + thisInterface + ' parent 1:1 classid 1:15 htb rate ' + str(defaultClassCapacityMbps) + 'mbit ceil ' + str(defaultClassCapacityMbps) + 'mbit prio 5') - shell('tc qdisc add dev ' + thisInterface + ' parent 1:15 ' + fqOrCAKE) - handleIDSecond = 1 - for device in devices: - speedcap = 0 - if srcOrDst == 'dst': - speedcap = device['download'] - elif srcOrDst == 'src': - speedcap = device['upload'] - #Create Hash Table - shell('tc class add dev ' + thisInterface + ' parent 1:1 classid 1:' + str(classIDCounter) + ' htb rate '+ str(speedcap) + 'mbit ceil '+ str(round(speedcap*1.05)) + 'mbit prio 3') - shell('tc qdisc add dev ' + thisInterface + ' parent 1:' + str(classIDCounter) + ' ' + fqOrCAKE) - if device['ipv4']: - parentString = '1:' - flowIDstring = str(parentIDFirstPart) + ':' + str(classIDCounter) - ipv4FiltersDst.append((device['ipv4'], parentString, flowIDstring)) - if device['ipv6']: - parentString = '1:' - flowIDstring = str(parentIDFirstPart) + ':' + str(classIDCounter) - ipv6FiltersDst.append((device['ipv6'], parentString, flowIDstring)) - deviceQDiscID = '1:' + str(classIDCounter) - device['qdiscDst'] = deviceQDiscID - if srcOrDst == 'src': - device['qdiscSrc'] = deviceQDiscID - elif srcOrDst == 'dst': - device['qdiscDst'] = deviceQDiscID - classIDCounter += 1 - hashIDCounter += 1 - - #InterfaceB - parentIDFirstPart = 2 - srcOrDst = 'src' - thisInterface = interfaceB - classIDCounter = 101 - hashIDCounter = parentIDFirstPart + 1 - shell('tc qdisc replace dev ' + thisInterface + ' root handle 2: htb default 15 r2q 1514') - shell('tc class add dev ' + thisInterface + ' parent 2: classid 2:1 htb rate '+ str(pipeBandwidthCapacityMbps) + 'mbit ceil ' + str(pipeBandwidthCapacityMbps) + 'mbit') - shell('tc qdisc add dev ' + thisInterface + ' parent 2:1 ' + fqOrCAKE) - #Default class - traffic gets passed through this limiter if not otherwise classified by the Shaper.csv - shell('tc class add dev ' + thisInterface + ' parent 2:1 classid 2:15 htb rate ' + str(defaultClassCapacityMbps) + 'mbit ceil ' + str(defaultClassCapacityMbps) + 'mbit prio 5') - shell('tc qdisc add dev ' + thisInterface + ' parent 2:15 ' + fqOrCAKE) - handleIDSecond = 1 - for device in devices: - speedcap = 0 - if srcOrDst == 'dst': - speedcap = device['download'] - elif srcOrDst == 'src': - speedcap = device['upload'] - #Create Hash Table - shell('tc class add dev ' + thisInterface + ' parent 2:1 classid 2:' + str(classIDCounter) + ' htb rate '+ str(speedcap) + 'mbit ceil '+ str(round(speedcap*1.05)) + 'mbit prio 3') - shell('tc qdisc add dev ' + thisInterface + ' parent 2:' + str(classIDCounter) + ' ' + fqOrCAKE) - if device['ipv4']: - parentString = '2:' - flowIDstring = str(parentIDFirstPart) + ':' + str(classIDCounter) - ipv4FiltersSrc.append((device['ipv4'], parentString, flowIDstring)) - if device['ipv6']: - parentString = '2:' - flowIDstring = str(parentIDFirstPart) + ':' + str(classIDCounter) - ipv6FiltersSrc.append((device['ipv6'], parentString, flowIDstring)) - deviceQDiscID = '2:' + str(classIDCounter) - device['qdiscSrc'] = deviceQDiscID - if srcOrDst == 'src': - device['qdiscSrc'] = deviceQDiscID - elif srcOrDst == 'dst': - device['qdiscDst'] = deviceQDiscID - classIDCounter += 1 - hashIDCounter += 1 - - shell('tc filter add dev ' + interfaceA + ' parent 1: protocol all u32') - shell('tc filter add dev ' + interfaceB + ' parent 2: protocol all u32') - - #IPv4 Hash Filters - #Dst - interface = interfaceA - shell('tc filter add dev ' + interface + ' parent 1: protocol ip handle 3: u32 divisor 256') - - for i in range (256): - hexID = str(hex(i)).replace('0x','') - for ipv4Filter in ipv4FiltersDst: - ipv4, parent, classid = ipv4Filter - if '/' in ipv4: - ipv4 = ipv4.split('/')[0] - if (ipv4.split('.', 3)[3]) == str(i): - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' handle ' + filterHandle + ' protocol ip parent 1: u32 ht 3:' + hexID + ': match ip dst ' + ipv4 + ' flowid ' + classid) - filterHandleCounter += 1 - shell('tc filter add dev ' + interface + ' protocol ip parent 1: u32 ht 800: match ip dst 0.0.0.0/0 hashkey mask 0x000000ff at 16 link 3:') - - #Src - interface = interfaceB - shell('tc filter add dev ' + interface + ' parent 2: protocol ip handle 4: u32 divisor 256') - - for i in range (256): - hexID = str(hex(i)).replace('0x','') - for ipv4Filter in ipv4FiltersSrc: - ipv4, parent, classid = ipv4Filter - if '/' in ipv4: - ipv4 = ipv4.split('/')[0] - if (ipv4.split('.', 3)[3]) == str(i): - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' handle ' + filterHandle + ' protocol ip parent 2: u32 ht 4:' + hexID + ': match ip src ' + ipv4 + ' flowid ' + classid) - filterHandleCounter += 1 - shell('tc filter add dev ' + interface + ' protocol ip parent 2: u32 ht 800: match ip src 0.0.0.0/0 hashkey mask 0x000000ff at 12 link 4:') - - #IPv6 Hash Filters - #Dst - interface = interfaceA - shell('tc filter add dev ' + interface + ' parent 1: handle 5: protocol ipv6 u32 divisor 256') - - for ipv6Filter in ipv6FiltersDst: - ipv6, parent, classid = ipv6Filter - withoutCIDR = ipv6.split('/')[0] - third = str(IPv6Address(withoutCIDR).exploded).split(':',5)[3] - usefulPart = third[:2] - hexID = usefulPart - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' handle ' + filterHandle + ' protocol ipv6 parent 1: u32 ht 5:' + hexID + ': match ip6 dst ' + ipv6 + ' flowid ' + classid) - filterHandleCounter += 1 - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' protocol ipv6 parent 1: u32 ht 800:: match ip6 dst ::/0 hashkey mask 0x0000ff00 at 28 link 5:') - filterHandleCounter += 1 - - #Src - interface = interfaceB - shell('tc filter add dev ' + interface + ' parent 2: handle 6: protocol ipv6 u32 divisor 256') - - for ipv6Filter in ipv6FiltersSrc: - ipv6, parent, classid = ipv6Filter - withoutCIDR = ipv6.split('/')[0] - third = str(IPv6Address(withoutCIDR).exploded).split(':',5)[3] - usefulPart = third[:2] - hexID = usefulPart - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' handle ' + filterHandle + ' protocol ipv6 parent 2: u32 ht 6:' + hexID + ': match ip6 src ' + ipv6 + ' flowid ' + classid) - filterHandleCounter += 1 - filterHandle = hex(filterHandleCounter) - shell('tc filter add dev ' + interface + ' protocol ipv6 parent 2: u32 ht 800:: match ip6 src ::/0 hashkey mask 0x0000ff00 at 12 link 6:') - filterHandleCounter += 1 - - #Save devices to file to allow for statistics runs - with open('devices.json', 'w') as outfile: - json.dump(devices, outfile) - - #Done - currentTimeString = datetime.now().strftime("%d/%m/%Y %H:%M:%S") - print("Successful run completed on " + currentTimeString) - -if __name__ == '__main__': - refreshShapers() - print("Program complete") diff --git a/old/v0.7/Shaper.csv b/old/v0.7/Shaper.csv deleted file mode 100644 index 04ce08fe..00000000 --- a/old/v0.7/Shaper.csv +++ /dev/null @@ -1,6 +0,0 @@ -ID,AP,MAC,Hostname,IPv4,IPv6,Download,Upload -3001,A,32:3B:FE:B0:92:C1,CPE-Customer1,100.126.0.77,2001:495:1f0f:58a::4/64,25,5 -3002,C,AE:EC:D3:70:DD:36,CPE-Customer2,100.126.0.78,2001:495:1f0f:58a::8/64,50,10 -3003,F,1C:1E:60:69:88:9A,CPE-Customer3,100.126.0.79,2001:495:1f0f:58a::12/64,100,15 -3004,R,11:B1:63:C4:DA:4C,CPE-Customer4,100.126.0.80,2001:495:1f0f:58a::16/64,200,30 -3005,X,46:2F:B5:C2:0B:15,CPE-Customer5,100.126.0.81,2001:495:1f0f:58a::20/64,300,45 diff --git a/old/v0.7/ispConfig.py b/old/v0.7/ispConfig.py deleted file mode 100644 index e7f644f5..00000000 --- a/old/v0.7/ispConfig.py +++ /dev/null @@ -1,22 +0,0 @@ -#'fq_codel' or 'cake' -# Cake requires many specific packages and kernel changes: -# https://www.bufferbloat.net/projects/codel/wiki/Cake/ -# https://github.com/dtaht/tc-adv -fqOrCAKE = 'fq_codel' - -# How many symmetrical Mbps are available to the edge of this network -pipeBandwidthCapacityMbps = 1000 - -defaultClassCapacityMbps = 750 - -# Interface connected to core router -interfaceA = 'eth1' - -# Interface connected to edge router -interfaceB = 'eth2' - -# Allow shell commands. False causes commands print to console only without being executed. MUST BE ENABLED FOR PROGRAM TO FUNCTION -enableActualShellCommands = True - -# Add 'sudo' before execution of any shell commands. May be required depending on distribution and environment. -runShellCommandsAsSudo = False diff --git a/old/v0.7/scheduled.py b/old/v0.7/scheduled.py deleted file mode 100644 index 99dfb6a1..00000000 --- a/old/v0.7/scheduled.py +++ /dev/null @@ -1,11 +0,0 @@ -import time -import schedule -from datetime import date -from LibreQoS import refreshShapers - -if __name__ == '__main__': - refreshShapers() - schedule.every().day.at("04:00").do(refreshShapers) - while True: - schedule.run_pending() - time.sleep(60) # wait one minute diff --git a/old/v0.7/stats.py b/old/v0.7/stats.py deleted file mode 100644 index a02f2150..00000000 --- a/old/v0.7/stats.py +++ /dev/null @@ -1,176 +0,0 @@ -import os -import subprocess -from subprocess import PIPE -import io -import decimal -import json -from operator import itemgetter -from prettytable import PrettyTable -from ispConfig import fqOrCAKE - -def getStatistics(): - tcShowResults = [] - command = 'tc -s qdisc show' - commands = command.split(' ') - proc = subprocess.Popen(commands, stdout=subprocess.PIPE) - for line in io.TextIOWrapper(proc.stdout, encoding="utf-8"): # or another encoding - tcShowResults.append(line) - allQDiscStats = [] - thisFlow = {} - thisFlowStats = {} - withinCorrectChunk = False - for line in tcShowResults: - expecting = "qdisc " + fqOrCAKE - if expecting in line: - thisFlow['qDiscID'] = line.split(' ')[6] - withinCorrectChunk = True - elif ("Sent " in line) and withinCorrectChunk: - items = line.split(' ') - thisFlowStats['GigabytesSent'] = str(round((int(items[2]) * 0.000000001), 1)) - thisFlowStats['PacketsSent'] = int(items[4]) - thisFlowStats['droppedPackets'] = int(items[7].replace(',','')) - thisFlowStats['overlimitsPackets'] = int(items[9]) - thisFlowStats['requeuedPackets'] = int(items[11].replace(')','')) - if thisFlowStats['PacketsSent'] > 0: - overlimitsFreq = (thisFlowStats['overlimitsPackets']/thisFlowStats['PacketsSent']) - else: - overlimitsFreq = -1 - elif ('backlog' in line) and withinCorrectChunk: - items = line.split(' ') - thisFlowStats['backlogBytes'] = int(items[2].replace('b','')) - thisFlowStats['backlogPackets'] = int(items[3].replace('p','')) - thisFlowStats['requeues'] = int(items[5]) - elif ('maxpacket' in line) and withinCorrectChunk: - items = line.split(' ') - thisFlowStats['maxPacket'] = int(items[3]) - thisFlowStats['dropOverlimit'] = int(items[5]) - thisFlowStats['newFlowCount'] = int(items[7]) - thisFlowStats['ecnMark'] = int(items[9]) - elif ("new_flows_len" in line) and withinCorrectChunk: - items = line.split(' ') - thisFlowStats['newFlowsLen'] = int(items[3]) - thisFlowStats['oldFlowsLen'] = int(items[5]) - if thisFlowStats['PacketsSent'] == 0: - thisFlowStats['percentageDropped'] = 0 - else: - thisFlowStats['percentageDropped'] = thisFlowStats['droppedPackets']/thisFlowStats['PacketsSent'] - withinCorrectChunk = False - thisFlow['stats'] = thisFlowStats - allQDiscStats.append(thisFlow) - thisFlowStats = {} - thisFlow = {} - #Load shapableDevices - updatedFlowStats = [] - with open('devices.json', 'r') as infile: - devices = json.load(infile) - for shapableDevice in devices: - shapableDeviceqdiscSrc = shapableDevice['qdiscSrc'] - shapableDeviceqdiscDst = shapableDevice['qdiscDst'] - for device in allQDiscStats: - deviceFlowID = device['qDiscID'] - if shapableDeviceqdiscSrc == deviceFlowID: - name = shapableDevice['hostname'] - AP = shapableDevice['AP'] - ipv4 = shapableDevice['ipv4'] - ipv6 = shapableDevice['ipv6'] - srcOrDst = 'src' - tempDict = {'name': name, 'AP': AP, 'ipv4': ipv4, 'ipv6': ipv6, 'srcOrDst': srcOrDst} - device['identification'] = tempDict - updatedFlowStats.append(device) - if shapableDeviceqdiscDst == deviceFlowID: - name = shapableDevice['hostname'] - AP = shapableDevice['AP'] - ipv4 = shapableDevice['ipv4'] - ipv6 = shapableDevice['ipv6'] - srcOrDst = 'dst' - tempDict = {'name': name, 'AP': AP, 'ipv4': ipv4, 'ipv6': ipv6, 'srcOrDst': srcOrDst} - device['identification'] = tempDict - updatedFlowStats.append(device) - mergedStats = [] - for item in updatedFlowStats: - if item['identification']['srcOrDst'] == 'src': - newStat = { - 'identification': { - 'name': item['identification']['name'], - 'AP': item['identification']['AP'], - 'ipv4': item['identification']['ipv4'], - 'ipv6': item['identification']['ipv6'] - }, - 'src': { - 'GigabytesSent': item['stats']['GigabytesSent'], - 'PacketsSent': item['stats']['PacketsSent'], - 'droppedPackets': item['stats']['droppedPackets'], - 'overlimitsPackets': item['stats']['overlimitsPackets'], - 'requeuedPackets': item['stats']['requeuedPackets'], - 'backlogBytes': item['stats']['backlogBytes'], - 'backlogPackets': item['stats']['backlogPackets'], - 'requeues': item['stats']['requeues'], - 'maxPacket': item['stats']['maxPacket'], - 'dropOverlimit': item['stats']['dropOverlimit'], - 'newFlowCount': item['stats']['newFlowCount'], - 'ecnMark': item['stats']['ecnMark'], - 'newFlowsLen': item['stats']['newFlowsLen'], - 'oldFlowsLen': item['stats']['oldFlowsLen'], - 'percentageDropped': item['stats']['percentageDropped'], - } - } - mergedStats.append(newStat) - for item in updatedFlowStats: - if item['identification']['srcOrDst'] == 'dst': - ipv4 = item['identification']['ipv4'] - ipv6 = item['identification']['ipv6'] - newStat = { - 'dst': { - 'GigabytesSent': item['stats']['GigabytesSent'], - 'PacketsSent': item['stats']['PacketsSent'], - 'droppedPackets': item['stats']['droppedPackets'], - 'overlimitsPackets': item['stats']['overlimitsPackets'], - 'requeuedPackets': item['stats']['requeuedPackets'] , - 'backlogBytes': item['stats']['backlogBytes'], - 'backlogPackets': item['stats']['backlogPackets'], - 'requeues': item['stats']['requeues'], - 'maxPacket': item['stats']['maxPacket'], - 'dropOverlimit': item['stats']['dropOverlimit'], - 'newFlowCount': item['stats']['newFlowCount'], - 'ecnMark': item['stats']['ecnMark'], - 'newFlowsLen': item['stats']['newFlowsLen'], - 'oldFlowsLen': item['stats']['oldFlowsLen'], - 'percentageDropped': item['stats']['percentageDropped'] - } - } - for item2 in mergedStats: - if ipv4 in item2['identification']['ipv4']: - item2 = item2.update(newStat) - elif ipv6 in item2['identification']['ipv6']: - item2 = item2.update(newStat) - return mergedStats - -if __name__ == '__main__': - mergedStats = getStatistics() - - # Display table of Customer CPEs with most packets dropped - x = PrettyTable() - x.field_names = ["Device", "AP", "IPv4", "IPv6", "UL Dropped", "DL Dropped", "GB Down/Up"] - sortableList = [] - pickTop = 30 - for stat in mergedStats: - name = stat['identification']['name'] - AP = stat['identification']['AP'] - ipv4 = stat['identification']['ipv4'] - ipv6 = stat['identification']['ipv6'] - srcDropped = stat['src']['percentageDropped'] - dstDropped = stat['dst']['percentageDropped'] - GBuploadedString = stat['src']['GigabytesSent'] - GBdownloadedString = stat['dst']['GigabytesSent'] - GBstring = GBuploadedString + '/' + GBdownloadedString - avgDropped = (srcDropped + dstDropped)/2 - sortableList.append((name, AP, ipv4, ipv6, srcDropped, dstDropped, avgDropped, GBstring)) - res = sorted(sortableList, key = itemgetter(4), reverse = True)[:pickTop] - for stat in res: - name, AP, ipv4, ipv6, srcDropped, dstDropped, avgDropped, GBstring = stat - if not name: - name = ipv4 - srcDroppedString = "{0:.4%}".format(srcDropped) - dstDroppedString = "{0:.4%}".format(dstDropped) - x.add_row([name, AP, ipv4, ipv6, srcDroppedString, dstDroppedString, GBstring]) - print(x)