forked from loweel/zabov
				
			
			master #1
			
				
			
		
		
		
	
							
								
								
									
										27
									
								
								01.conf.go
								
								
								
								
							
							
						
						
									
										27
									
								
								01.conf.go
								
								
								
								
							|  | @ -13,10 +13,13 @@ import ( | ||||||
| 	"github.com/miekg/dns" | 	"github.com/miekg/dns" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | var localresponderConfigName string | ||||||
|  | 
 | ||||||
| type stringarray []string | type stringarray []string | ||||||
| type urlsMap map[string]stringarray | type urlsMap map[string]stringarray | ||||||
| 
 | 
 | ||||||
| func init() { | func init() { | ||||||
|  | 	localresponderConfigName = "__localresponder__" | ||||||
| 	var MyConfRaw interface{} | 	var MyConfRaw interface{} | ||||||
| 
 | 
 | ||||||
| 	file, err := ioutil.ReadFile("config.json") | 	file, err := ioutil.ReadFile("config.json") | ||||||
|  | @ -107,9 +110,14 @@ func init() { | ||||||
| 		conf.ZabovUpDNS = confRaw["upstream"].(string) | 		conf.ZabovUpDNS = confRaw["upstream"].(string) | ||||||
| 		conf.ZabovSingleBL = confRaw["singlefilters"].(string) | 		conf.ZabovSingleBL = confRaw["singlefilters"].(string) | ||||||
| 		conf.ZabovDoubleBL = confRaw["doublefilters"].(string) | 		conf.ZabovDoubleBL = confRaw["doublefilters"].(string) | ||||||
| 		conf.ZabovAddBL = confRaw["blackholeip"].(string) | 		conf.ZabovAddBL = net.ParseIP(confRaw["blackholeip"].(string)) | ||||||
| 		conf.ZabovHostsFile = confRaw["hostsfile"].(string) | 		conf.ZabovHostsFile = confRaw["hostsfile"].(string) | ||||||
| 
 | 
 | ||||||
|  | 		if confRaw["cache"] != nil { | ||||||
|  | 			conf.ZabovCache = confRaw["cache"].(bool) | ||||||
|  | 		} else { | ||||||
|  | 			conf.ZabovCache = true | ||||||
|  | 		} | ||||||
| 		conf.ZabovDNSArray = fileByLines(conf.ZabovUpDNS) | 		conf.ZabovDNSArray = fileByLines(conf.ZabovUpDNS) | ||||||
| 		ZabovConfigs[name] = &conf | 		ZabovConfigs[name] = &conf | ||||||
| 
 | 
 | ||||||
|  | @ -216,8 +224,16 @@ func init() { | ||||||
| 				} | 				} | ||||||
| 				groupStruct.ips = append(groupStruct.ips, ip) | 				groupStruct.ips = append(groupStruct.ips, ip) | ||||||
| 			} | 			} | ||||||
|  | 			if groupMap["cfg"] != nil { | ||||||
| 				groupStruct.cfg = groupMap["cfg"].(string) | 				groupStruct.cfg = groupMap["cfg"].(string) | ||||||
|  | 			} | ||||||
|  | 			if groupMap["timetable"] != nil { | ||||||
| 				groupStruct.timetable = groupMap["timetable"].(string) | 				groupStruct.timetable = groupMap["timetable"].(string) | ||||||
|  | 			} | ||||||
|  | 			if len(groupStruct.cfg) == 0 && len(groupStruct.timetable) == 0 { | ||||||
|  | 				log.Println("ip group error: specify cfg or timetable") | ||||||
|  | 				os.Exit(1) | ||||||
|  | 			} | ||||||
| 			if len(groupStruct.cfg) > 0 { | 			if len(groupStruct.cfg) > 0 { | ||||||
| 				refConfig, ok := ZabovConfigs[groupStruct.cfg] | 				refConfig, ok := ZabovConfigs[groupStruct.cfg] | ||||||
| 				if !ok { | 				if !ok { | ||||||
|  | @ -226,14 +242,17 @@ func init() { | ||||||
| 				} else { | 				} else { | ||||||
| 					refConfig.references++ | 					refConfig.references++ | ||||||
| 				} | 				} | ||||||
| 			} |  | ||||||
| 				fmt.Println("cfg:", groupStruct.cfg) | 				fmt.Println("cfg:", groupStruct.cfg) | ||||||
|  | 			} | ||||||
|  | 			if len(groupStruct.timetable) > 0 { | ||||||
| 				fmt.Println("timetable:", groupStruct.timetable) | 				fmt.Println("timetable:", groupStruct.timetable) | ||||||
| 				_, ok := ZabovTimetables[groupStruct.timetable] | 				_, ok := ZabovTimetables[groupStruct.timetable] | ||||||
| 				if !ok { | 				if !ok { | ||||||
| 					log.Println("inexistent timetable:", groupStruct.timetable) | 					log.Println("inexistent timetable:", groupStruct.timetable) | ||||||
| 					os.Exit(1) | 					os.Exit(1) | ||||||
| 				} | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			ZabovIPGroups = append(ZabovIPGroups, groupStruct) | 			ZabovIPGroups = append(ZabovIPGroups, groupStruct) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -248,7 +267,7 @@ func init() { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	//************************
 | 	//************************
 | ||||||
| 	// Local responser section
 | 	// Local responder section
 | ||||||
| 	//************************
 | 	//************************
 | ||||||
| 	if MyConf["localresponder"] != nil { | 	if MyConf["localresponder"] != nil { | ||||||
| 		localresponder := MyConf["localresponder"].(map[string]interface{}) | 		localresponder := MyConf["localresponder"].(map[string]interface{}) | ||||||
|  | @ -258,7 +277,7 @@ func init() { | ||||||
| 				ZabovLocalResponder = localresponder["responder"].(string) | 				ZabovLocalResponder = localresponder["responder"].(string) | ||||||
| 				if len(ZabovLocalResponder) > 0 { | 				if len(ZabovLocalResponder) > 0 { | ||||||
| 					local := ZabovConfig{ZabovDNSArray: []string{ZabovLocalResponder}, references: 1} | 					local := ZabovConfig{ZabovDNSArray: []string{ZabovLocalResponder}, references: 1} | ||||||
| 					ZabovConfigs["__localresponder__"] = &local | 					ZabovConfigs[localresponderConfigName] = &local | ||||||
| 					fmt.Println("ZabovLocalResponder:", ZabovLocalResponder) | 					fmt.Println("ZabovLocalResponder:", ZabovLocalResponder) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
							
								
								
									
										295
									
								
								LICENSE
								
								
								
								
							
							
						
						
									
										295
									
								
								LICENSE
								
								
								
								
							|  | @ -1,14 +1,289 @@ | ||||||
| Copyright (C) 2020  loweel@keinpfusch.net | Copyright (C) 2020  loweel@keinpfusch.net | ||||||
| 
 | 
 | ||||||
|     This program is free software: you can redistribute it and/or modify |                           EUROPEAN UNION PUBLIC LICENCE v. 1.2 | ||||||
|     it under the terms of the GNU General Public License as published by |                       EUPL © the European Union 2007, 2016 | ||||||
|     the Free Software Foundation, either version 3 of the License, or |  | ||||||
|     (at your option) any later version. |  | ||||||
| 
 | 
 | ||||||
|     This program is distributed in the hope that it will be useful, | This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined | ||||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | below) which is provided under the terms of this Licence. Any use of the Work, | ||||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | other than as authorised under this Licence is prohibited (to the extent such | ||||||
|     GNU General Public License for more details. | use is covered by a right of the copyright holder of the Work). | ||||||
| 
 | 
 | ||||||
|     You should have received a copy of the GNU General Public License | The Work is provided under the terms of this Licence when the Licensor (as | ||||||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. | defined below) has placed the following notice immediately following the | ||||||
|  | copyright notice for the Work: | ||||||
|  | 
 | ||||||
|  |         Licensed under the EUPL | ||||||
|  | 
 | ||||||
|  | or has expressed by any other means his willingness to license under the EUPL. | ||||||
|  | 
 | ||||||
|  | 1. Definitions | ||||||
|  | 
 | ||||||
|  | In this Licence, the following terms have the following meaning: | ||||||
|  | 
 | ||||||
|  | - ‘The Licence’: this Licence. | ||||||
|  | 
 | ||||||
|  | - ‘The Original Work’: the work or software distributed or communicated by the | ||||||
|  |   Licensor under this Licence, available as Source Code and also as Executable | ||||||
|  |   Code as the case may be. | ||||||
|  | 
 | ||||||
|  | - ‘Derivative Works’: the works or software that could be created by the | ||||||
|  |   Licensee, based upon the Original Work or modifications thereof. This Licence | ||||||
|  |   does not define the extent of modification or dependence on the Original Work | ||||||
|  |   required in order to classify a work as a Derivative Work; this extent is | ||||||
|  |   determined by copyright law applicable in the country mentioned in Article 15. | ||||||
|  | 
 | ||||||
|  | - ‘The Work’: the Original Work or its Derivative Works. | ||||||
|  | 
 | ||||||
|  | - ‘The Source Code’: the human-readable form of the Work which is the most | ||||||
|  |   convenient for people to study and modify. | ||||||
|  | 
 | ||||||
|  | - ‘The Executable Code’: any code which has generally been compiled and which is | ||||||
|  |   meant to be interpreted by a computer as a program. | ||||||
|  | 
 | ||||||
|  | - ‘The Licensor’: the natural or legal person that distributes or communicates | ||||||
|  |   the Work under the Licence. | ||||||
|  | 
 | ||||||
|  | - ‘Contributor(s)’: any natural or legal person who modifies the Work under the | ||||||
|  |   Licence, or otherwise contributes to the creation of a Derivative Work. | ||||||
|  | 
 | ||||||
|  | - ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of | ||||||
|  |   the Work under the terms of the Licence. | ||||||
|  | 
 | ||||||
|  | - ‘Distribution’ or ‘Communication’: any act of selling, giving, lending, | ||||||
|  |   renting, distributing, communicating, transmitting, or otherwise making | ||||||
|  |   available, online or offline, copies of the Work or providing access to its | ||||||
|  |   essential functionalities at the disposal of any other natural or legal | ||||||
|  |   person. | ||||||
|  | 
 | ||||||
|  | 2. Scope of the rights granted by the Licence | ||||||
|  | 
 | ||||||
|  | The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, | ||||||
|  | sublicensable licence to do the following, for the duration of copyright vested | ||||||
|  | in the Original Work: | ||||||
|  | 
 | ||||||
|  | - use the Work in any circumstance and for all usage, | ||||||
|  | - reproduce the Work, | ||||||
|  | - modify the Work, and make Derivative Works based upon the Work, | ||||||
|  | - communicate to the public, including the right to make available or display | ||||||
|  |   the Work or copies thereof to the public and perform publicly, as the case may | ||||||
|  |   be, the Work, | ||||||
|  | - distribute the Work or copies thereof, | ||||||
|  | - lend and rent the Work or copies thereof, | ||||||
|  | - sublicense rights in the Work or copies thereof. | ||||||
|  | 
 | ||||||
|  | Those rights can be exercised on any media, supports and formats, whether now | ||||||
|  | known or later invented, as far as the applicable law permits so. | ||||||
|  | 
 | ||||||
|  | In the countries where moral rights apply, the Licensor waives his right to | ||||||
|  | exercise his moral right to the extent allowed by law in order to make effective | ||||||
|  | the licence of the economic rights here above listed. | ||||||
|  | 
 | ||||||
|  | The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to | ||||||
|  | any patents held by the Licensor, to the extent necessary to make use of the | ||||||
|  | rights granted on the Work under this Licence. | ||||||
|  | 
 | ||||||
|  | 3. Communication of the Source Code | ||||||
|  | 
 | ||||||
|  | The Licensor may provide the Work either in its Source Code form, or as | ||||||
|  | Executable Code. If the Work is provided as Executable Code, the Licensor | ||||||
|  | provides in addition a machine-readable copy of the Source Code of the Work | ||||||
|  | along with each copy of the Work that the Licensor distributes or indicates, in | ||||||
|  | a notice following the copyright notice attached to the Work, a repository where | ||||||
|  | the Source Code is easily and freely accessible for as long as the Licensor | ||||||
|  | continues to distribute or communicate the Work. | ||||||
|  | 
 | ||||||
|  | 4. Limitations on copyright | ||||||
|  | 
 | ||||||
|  | Nothing in this Licence is intended to deprive the Licensee of the benefits from | ||||||
|  | any exception or limitation to the exclusive rights of the rights owners in the | ||||||
|  | Work, of the exhaustion of those rights or of other applicable limitations | ||||||
|  | thereto. | ||||||
|  | 
 | ||||||
|  | 5. Obligations of the Licensee | ||||||
|  | 
 | ||||||
|  | The grant of the rights mentioned above is subject to some restrictions and | ||||||
|  | obligations imposed on the Licensee. Those obligations are the following: | ||||||
|  | 
 | ||||||
|  | Attribution right: The Licensee shall keep intact all copyright, patent or | ||||||
|  | trademarks notices and all notices that refer to the Licence and to the | ||||||
|  | disclaimer of warranties. The Licensee must include a copy of such notices and a | ||||||
|  | copy of the Licence with every copy of the Work he/she distributes or | ||||||
|  | communicates. The Licensee must cause any Derivative Work to carry prominent | ||||||
|  | notices stating that the Work has been modified and the date of modification. | ||||||
|  | 
 | ||||||
|  | Copyleft clause: If the Licensee distributes or communicates copies of the | ||||||
|  | Original Works or Derivative Works, this Distribution or Communication will be | ||||||
|  | done under the terms of this Licence or of a later version of this Licence | ||||||
|  | unless the Original Work is expressly distributed only under this version of the | ||||||
|  | Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee | ||||||
|  | (becoming Licensor) cannot offer or impose any additional terms or conditions on | ||||||
|  | the Work or Derivative Work that alter or restrict the terms of the Licence. | ||||||
|  | 
 | ||||||
|  | Compatibility clause: If the Licensee Distributes or Communicates Derivative | ||||||
|  | Works or copies thereof based upon both the Work and another work licensed under | ||||||
|  | a Compatible Licence, this Distribution or Communication can be done under the | ||||||
|  | terms of this Compatible Licence. For the sake of this clause, ‘Compatible | ||||||
|  | Licence’ refers to the licences listed in the appendix attached to this Licence. | ||||||
|  | Should the Licensee's obligations under the Compatible Licence conflict with | ||||||
|  | his/her obligations under this Licence, the obligations of the Compatible | ||||||
|  | Licence shall prevail. | ||||||
|  | 
 | ||||||
|  | Provision of Source Code: When distributing or communicating copies of the Work, | ||||||
|  | the Licensee will provide a machine-readable copy of the Source Code or indicate | ||||||
|  | a repository where this Source will be easily and freely available for as long | ||||||
|  | as the Licensee continues to distribute or communicate the Work. | ||||||
|  | 
 | ||||||
|  | Legal Protection: This Licence does not grant permission to use the trade names, | ||||||
|  | trademarks, service marks, or names of the Licensor, except as required for | ||||||
|  | reasonable and customary use in describing the origin of the Work and | ||||||
|  | reproducing the content of the copyright notice. | ||||||
|  | 
 | ||||||
|  | 6. Chain of Authorship | ||||||
|  | 
 | ||||||
|  | The original Licensor warrants that the copyright in the Original Work granted | ||||||
|  | hereunder is owned by him/her or licensed to him/her and that he/she has the | ||||||
|  | power and authority to grant the Licence. | ||||||
|  | 
 | ||||||
|  | Each Contributor warrants that the copyright in the modifications he/she brings | ||||||
|  | to the Work are owned by him/her or licensed to him/her and that he/she has the | ||||||
|  | power and authority to grant the Licence. | ||||||
|  | 
 | ||||||
|  | Each time You accept the Licence, the original Licensor and subsequent | ||||||
|  | Contributors grant You a licence to their contributions to the Work, under the | ||||||
|  | terms of this Licence. | ||||||
|  | 
 | ||||||
|  | 7. Disclaimer of Warranty | ||||||
|  | 
 | ||||||
|  | The Work is a work in progress, which is continuously improved by numerous | ||||||
|  | Contributors. It is not a finished work and may therefore contain defects or | ||||||
|  | ‘bugs’ inherent to this type of development. | ||||||
|  | 
 | ||||||
|  | For the above reason, the Work is provided under the Licence on an ‘as is’ basis | ||||||
|  | and without warranties of any kind concerning the Work, including without | ||||||
|  | limitation merchantability, fitness for a particular purpose, absence of defects | ||||||
|  | or errors, accuracy, non-infringement of intellectual property rights other than | ||||||
|  | copyright as stated in Article 6 of this Licence. | ||||||
|  | 
 | ||||||
|  | This disclaimer of warranty is an essential part of the Licence and a condition | ||||||
|  | for the grant of any rights to the Work. | ||||||
|  | 
 | ||||||
|  | 8. Disclaimer of Liability | ||||||
|  | 
 | ||||||
|  | Except in the cases of wilful misconduct or damages directly caused to natural | ||||||
|  | persons, the Licensor will in no event be liable for any direct or indirect, | ||||||
|  | material or moral, damages of any kind, arising out of the Licence or of the use | ||||||
|  | of the Work, including without limitation, damages for loss of goodwill, work | ||||||
|  | stoppage, computer failure or malfunction, loss of data or any commercial | ||||||
|  | damage, even if the Licensor has been advised of the possibility of such damage. | ||||||
|  | However, the Licensor will be liable under statutory product liability laws as | ||||||
|  | far such laws apply to the Work. | ||||||
|  | 
 | ||||||
|  | 9. Additional agreements | ||||||
|  | 
 | ||||||
|  | While distributing the Work, You may choose to conclude an additional agreement, | ||||||
|  | defining obligations or services consistent with this Licence. However, if | ||||||
|  | accepting obligations, You may act only on your own behalf and on your sole | ||||||
|  | responsibility, not on behalf of the original Licensor or any other Contributor, | ||||||
|  | and only if You agree to indemnify, defend, and hold each Contributor harmless | ||||||
|  | for any liability incurred by, or claims asserted against such Contributor by | ||||||
|  | the fact You have accepted any warranty or additional liability. | ||||||
|  | 
 | ||||||
|  | 10. Acceptance of the Licence | ||||||
|  | 
 | ||||||
|  | The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ | ||||||
|  | placed under the bottom of a window displaying the text of this Licence or by | ||||||
|  | affirming consent in any other similar way, in accordance with the rules of | ||||||
|  | applicable law. Clicking on that icon indicates your clear and irrevocable | ||||||
|  | acceptance of this Licence and all of its terms and conditions. | ||||||
|  | 
 | ||||||
|  | Similarly, you irrevocably accept this Licence and all of its terms and | ||||||
|  | conditions by exercising any rights granted to You by Article 2 of this Licence, | ||||||
|  | such as the use of the Work, the creation by You of a Derivative Work or the | ||||||
|  | Distribution or Communication by You of the Work or copies thereof. | ||||||
|  | 
 | ||||||
|  | 11. Information to the public | ||||||
|  | 
 | ||||||
|  | In case of any Distribution or Communication of the Work by means of electronic | ||||||
|  | communication by You (for example, by offering to download the Work from a | ||||||
|  | remote location) the distribution channel or media (for example, a website) must | ||||||
|  | at least provide to the public the information requested by the applicable law | ||||||
|  | regarding the Licensor, the Licence and the way it may be accessible, concluded, | ||||||
|  | stored and reproduced by the Licensee. | ||||||
|  | 
 | ||||||
|  | 12. Termination of the Licence | ||||||
|  | 
 | ||||||
|  | The Licence and the rights granted hereunder will terminate automatically upon | ||||||
|  | any breach by the Licensee of the terms of the Licence. | ||||||
|  | 
 | ||||||
|  | Such a termination will not terminate the licences of any person who has | ||||||
|  | received the Work from the Licensee under the Licence, provided such persons | ||||||
|  | remain in full compliance with the Licence. | ||||||
|  | 
 | ||||||
|  | 13. Miscellaneous | ||||||
|  | 
 | ||||||
|  | Without prejudice of Article 9 above, the Licence represents the complete | ||||||
|  | agreement between the Parties as to the Work. | ||||||
|  | 
 | ||||||
|  | If any provision of the Licence is invalid or unenforceable under applicable | ||||||
|  | law, this will not affect the validity or enforceability of the Licence as a | ||||||
|  | whole. Such provision will be construed or reformed so as necessary to make it | ||||||
|  | valid and enforceable. | ||||||
|  | 
 | ||||||
|  | The European Commission may publish other linguistic versions or new versions of | ||||||
|  | this Licence or updated versions of the Appendix, so far this is required and | ||||||
|  | reasonable, without reducing the scope of the rights granted by the Licence. New | ||||||
|  | versions of the Licence will be published with a unique version number. | ||||||
|  | 
 | ||||||
|  | All linguistic versions of this Licence, approved by the European Commission, | ||||||
|  | have identical value. Parties can take advantage of the linguistic version of | ||||||
|  | their choice. | ||||||
|  | 
 | ||||||
|  | 14. Jurisdiction | ||||||
|  | 
 | ||||||
|  | Without prejudice to specific agreement between parties, | ||||||
|  | 
 | ||||||
|  | - any litigation resulting from the interpretation of this License, arising | ||||||
|  |   between the European Union institutions, bodies, offices or agencies, as a | ||||||
|  |   Licensor, and any Licensee, will be subject to the jurisdiction of the Court | ||||||
|  |   of Justice of the European Union, as laid down in article 272 of the Treaty on | ||||||
|  |   the Functioning of the European Union, | ||||||
|  | 
 | ||||||
|  | - any litigation arising between other parties and resulting from the | ||||||
|  |   interpretation of this License, will be subject to the exclusive jurisdiction | ||||||
|  |   of the competent court where the Licensor resides or conducts its primary | ||||||
|  |   business. | ||||||
|  | 
 | ||||||
|  | 15. Applicable Law | ||||||
|  | 
 | ||||||
|  | Without prejudice to specific agreement between parties, | ||||||
|  | 
 | ||||||
|  | - this Licence shall be governed by the law of the European Union Member State | ||||||
|  |   where the Licensor has his seat, resides or has his registered office, | ||||||
|  | 
 | ||||||
|  | - this licence shall be governed by Belgian law if the Licensor has no seat, | ||||||
|  |   residence or registered office inside a European Union Member State. | ||||||
|  | 
 | ||||||
|  | Appendix | ||||||
|  | 
 | ||||||
|  | ‘Compatible Licences’ according to Article 5 EUPL are: | ||||||
|  | 
 | ||||||
|  | - GNU General Public License (GPL) v. 2, v. 3 | ||||||
|  | - GNU Affero General Public License (AGPL) v. 3 | ||||||
|  | - Open Software License (OSL) v. 2.1, v. 3.0 | ||||||
|  | - Eclipse Public License (EPL) v. 1.0 | ||||||
|  | - CeCILL v. 2.0, v. 2.1 | ||||||
|  | - Mozilla Public Licence (MPL) v. 2 | ||||||
|  | - GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 | ||||||
|  | - Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for | ||||||
|  |   works other than software | ||||||
|  | - European Union Public Licence (EUPL) v. 1.1, v. 1.2 | ||||||
|  | - Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong | ||||||
|  |   Reciprocity (LiLiQ-R+). | ||||||
|  | 
 | ||||||
|  | The European Commission may update this Appendix to later versions of the above | ||||||
|  | licences without producing a new version of the EUPL, as long as they provide | ||||||
|  | the rights granted in Article 2 of this Licence and protect the covered Source | ||||||
|  | Code from exclusive appropriation. | ||||||
|  | 
 | ||||||
|  | All other changes or additions to this Appendix require the production of a new | ||||||
|  | EUPL version. | ||||||
|  |  | ||||||
							
								
								
									
										19
									
								
								README.md
								
								
								
								
							
							
						
						
									
										19
									
								
								README.md
								
								
								
								
							|  | @ -62,7 +62,8 @@ Minimal config file should look like: | ||||||
|             "singlefilters":"./urls-domains.txt", |             "singlefilters":"./urls-domains.txt", | ||||||
|             "doublefilters":"./urls-hosts.txt",  |             "doublefilters":"./urls-hosts.txt",  | ||||||
|             "blackholeip":"127.0.0.1", |             "blackholeip":"127.0.0.1", | ||||||
|             "hostsfile":"./urls-local.txt" |             "hostsfile":"./urls-local.txt", | ||||||
|  |             "cache":true | ||||||
|         }, |         }, | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -84,7 +85,7 @@ configs: | ||||||
| - doublefilters: name of the file, for blacklists following the "doublefilter" schema.(one URL per line) | - doublefilters: name of the file, for blacklists following the "doublefilter" schema.(one URL per line) | ||||||
| - blackholeip: IP address to return when the IP is banned. This is because you may want to avoid MX issues, mail loops on localhost, or you have a web server running on localhost | - blackholeip: IP address to return when the IP is banned. This is because you may want to avoid MX issues, mail loops on localhost, or you have a web server running on localhost | ||||||
| - hostsfile: path where you keep your local blacklistfile : this is in the format "singlefilter", meaning one domain per line, unlike hosts file. | - hostsfile: path where you keep your local blacklistfile : this is in the format "singlefilter", meaning one domain per line, unlike hosts file. | ||||||
| 
 | - cache: if set to false disable the cache for this configuration. Boolean, defaults true | ||||||
| 
 | 
 | ||||||
| Advanced configuration includes support for multiple configurations based on IP Source and timetables: | Advanced configuration includes support for multiple configurations based on IP Source and timetables: | ||||||
| <pre> | <pre> | ||||||
|  | @ -104,6 +105,7 @@ Advanced configuration includes support for multiple configurations based on IP | ||||||
|     }, |     }, | ||||||
|     "ipaliases":{ |     "ipaliases":{ | ||||||
|         "pc8":"192.168.178.29", |         "pc8":"192.168.178.29", | ||||||
|  |         "lg-tv":"192.168.178.10", | ||||||
|         "localhost":"127.0.0.1" |         "localhost":"127.0.0.1" | ||||||
|     }, |     }, | ||||||
|     "ipgroups":[ |     "ipgroups":[ | ||||||
|  | @ -111,6 +113,11 @@ Advanced configuration includes support for multiple configurations based on IP | ||||||
|             "ips":["localhost", "::1", "192.168.178.30", "192.168.178.31", "pc8"], |             "ips":["localhost", "::1", "192.168.178.30", "192.168.178.31", "pc8"], | ||||||
|             "cfg":"", |             "cfg":"", | ||||||
|             "timetable":"tt_children" |             "timetable":"tt_children" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "ips":["lg-tv"], | ||||||
|  |             "cfg":"tv", | ||||||
|  |             "timetable":"" | ||||||
|         } |         } | ||||||
|     ], |     ], | ||||||
|     "timetables":{ |     "timetables":{ | ||||||
|  | @ -146,6 +153,14 @@ Advanced configuration includes support for multiple configurations based on IP | ||||||
|             "doublefilters":"./urls-hosts-restricted.txt",  |             "doublefilters":"./urls-hosts-restricted.txt",  | ||||||
|             "blackholeip":"127.0.0.1", |             "blackholeip":"127.0.0.1", | ||||||
|             "hostsfile":"./urls-local.txt" |             "hostsfile":"./urls-local.txt" | ||||||
|  |         }, | ||||||
|  |         "tv":{ | ||||||
|  |             "upstream":"./dns-upstream.txt", | ||||||
|  |             "singlefilters":"", | ||||||
|  |             "doublefilters":"",  | ||||||
|  |             "blackholeip":"127.0.0.1", | ||||||
|  |             "hostsfile":"", | ||||||
|  |             "cache":false | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ package main | ||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"log" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"math/rand" | 	"math/rand" | ||||||
|  | @ -14,7 +15,9 @@ import ( | ||||||
| //first server to answer wins
 | //first server to answer wins
 | ||||||
| //accepts config name to select the UP DNS source list
 | //accepts config name to select the UP DNS source list
 | ||||||
| func ForwardQuery(query *dns.Msg, config string, nocache bool) *dns.Msg { | func ForwardQuery(query *dns.Msg, config string, nocache bool) *dns.Msg { | ||||||
| 
 | 	if ZabovDebug { | ||||||
|  | 		log.Println("ForwardQuery: nocache", nocache) | ||||||
|  | 	} | ||||||
| 	go incrementStats("ForwardQueries", 1) | 	go incrementStats("ForwardQueries", 1) | ||||||
| 
 | 
 | ||||||
| 	r := new(dns.Msg) | 	r := new(dns.Msg) | ||||||
|  | @ -27,8 +30,14 @@ func ForwardQuery(query *dns.Msg, config string, nocache bool) *dns.Msg { | ||||||
| 	if !nocache { | 	if !nocache { | ||||||
| 		if cached := GetDomainFromCache(lfqdn); cached != nil { | 		if cached := GetDomainFromCache(lfqdn); cached != nil { | ||||||
| 			go incrementStats("CacheHit", 1) | 			go incrementStats("CacheHit", 1) | ||||||
|  | 			Rcode := cached.MsgHdr.Rcode | ||||||
| 			cached.SetReply(query) | 			cached.SetReply(query) | ||||||
|  | 			cached.MsgHdr.Rcode = Rcode | ||||||
| 			cached.Authoritative = true | 			cached.Authoritative = true | ||||||
|  | 			if ZabovDebug { | ||||||
|  | 				log.Println("ForwardQuery: CacheHit") | ||||||
|  | 			} | ||||||
|  | 			cached.Compress = true | ||||||
| 			return cached | 			return cached | ||||||
| 
 | 
 | ||||||
| 		} | 		} | ||||||
|  | @ -42,7 +51,8 @@ func ForwardQuery(query *dns.Msg, config string, nocache bool) *dns.Msg { | ||||||
| 	for { | 	for { | ||||||
| 		// round robin with retry
 | 		// round robin with retry
 | ||||||
| 
 | 
 | ||||||
| 		if !NetworkUp { | 		// local responder should always be available also if no internet connection
 | ||||||
|  | 		if !NetworkUp && localresponderConfigName != config { | ||||||
| 			time.Sleep(10 * time.Second) | 			time.Sleep(10 * time.Second) | ||||||
| 			go incrementStats("Network Problems ", 1) | 			go incrementStats("Network Problems ", 1) | ||||||
| 			continue | 			continue | ||||||
|  | @ -57,9 +67,16 @@ func ForwardQuery(query *dns.Msg, config string, nocache bool) *dns.Msg { | ||||||
| 			continue | 			continue | ||||||
| 		} else { | 		} else { | ||||||
| 			go incrementStats(d, 1) | 			go incrementStats(d, 1) | ||||||
|  | 			Rcode := in.MsgHdr.Rcode | ||||||
| 			in.SetReply(query) | 			in.SetReply(query) | ||||||
|  | 			in.MsgHdr.Rcode = Rcode | ||||||
| 			in.Authoritative = true | 			in.Authoritative = true | ||||||
|  | 			in.Compress = true | ||||||
| 			go DomainCache(lfqdn, in) | 			go DomainCache(lfqdn, in) | ||||||
|  | 			if ZabovDebug { | ||||||
|  | 				log.Println("ForwardQuery: OK!") | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			return in | 			return in | ||||||
| 
 | 
 | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -269,7 +269,7 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { | ||||||
| 		if len(ZabovLocalResponder) > 0 { | 		if len(ZabovLocalResponder) > 0 { | ||||||
| 			if !strings.Contains(fqdn, ".") || | 			if !strings.Contains(fqdn, ".") || | ||||||
| 				(len(ZabovLocalDomain) > 0 && strings.HasSuffix(fqdn, ZabovLocalDomain)) { | 				(len(ZabovLocalDomain) > 0 && strings.HasSuffix(fqdn, ZabovLocalDomain)) { | ||||||
| 				config = "__localresponder__" | 				config = localresponderConfigName | ||||||
| 				ret := ForwardQuery(r, config, true) | 				ret := ForwardQuery(r, config, true) | ||||||
| 				w.WriteMsg(ret) | 				w.WriteMsg(ret) | ||||||
| 				go logQuery(remIP, fqdn, QType, config, timetable, "localresponder") | 				go logQuery(remIP, fqdn, QType, config, timetable, "localresponder") | ||||||
|  | @ -282,12 +282,12 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { | ||||||
| 
 | 
 | ||||||
| 			msg.Answer = append(msg.Answer, &dns.A{ | 			msg.Answer = append(msg.Answer, &dns.A{ | ||||||
| 				Hdr: dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 60}, | 				Hdr: dns.RR_Header{Name: domain, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 60}, | ||||||
| 				A:   net.ParseIP(ZabovConfig.ZabovAddBL), | 				A:   ZabovConfig.ZabovAddBL, | ||||||
| 			}) | 			}) | ||||||
| 			go logQuery(remIP, fqdn, QType, config, timetable, "killed") | 			go logQuery(remIP, fqdn, QType, config, timetable, "killed") | ||||||
| 		} else { | 		} else { | ||||||
| 			go logQuery(remIP, fqdn, QType, config, timetable, "forwarded") | 			go logQuery(remIP, fqdn, QType, config, timetable, "forwarded") | ||||||
| 			ret := ForwardQuery(r, config, false) | 			ret := ForwardQuery(r, config, !ZabovConfig.ZabovCache) | ||||||
| 			w.WriteMsg(ret) | 			w.WriteMsg(ret) | ||||||
| 		} | 		} | ||||||
| 	case dns.TypePTR: | 	case dns.TypePTR: | ||||||
|  | @ -297,13 +297,13 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { | ||||||
| 
 | 
 | ||||||
| 		if len(ZabovLocalResponder) > 0 { | 		if len(ZabovLocalResponder) > 0 { | ||||||
| 			// if set use local responder for reverse lookup (suffix ".in-addr.arpa.")
 | 			// if set use local responder for reverse lookup (suffix ".in-addr.arpa.")
 | ||||||
| 			config = "__localresponder__" | 			config = localresponderConfigName | ||||||
| 		} | 		} | ||||||
| 		ret := ForwardQuery(r, config, true) | 		ret := ForwardQuery(r, config, true) | ||||||
| 		w.WriteMsg(ret) | 		w.WriteMsg(ret) | ||||||
| 		go logQuery(remIP, msg.Question[0].Name, QType, config, timetable, "localresponder") | 		go logQuery(remIP, msg.Question[0].Name, QType, config, timetable, "localresponder") | ||||||
| 	default: | 	default: | ||||||
| 		ret := ForwardQuery(r, config, false) | 		ret := ForwardQuery(r, config, !ZabovConfig.ZabovCache) | ||||||
| 		w.WriteMsg(ret) | 		w.WriteMsg(ret) | ||||||
| 		if len(ZabovDebugDBPath) > 0 { | 		if len(ZabovDebugDBPath) > 0 { | ||||||
| 			go logQuery(remIP, msg.Question[0].Name, QType, config, timetable, "forwarded") | 			go logQuery(remIP, msg.Question[0].Name, QType, config, timetable, "forwarded") | ||||||
|  |  | ||||||
							
								
								
									
										3
									
								
								main.go
								
								
								
								
							
							
						
						
									
										3
									
								
								main.go
								
								
								
								
							|  | @ -37,10 +37,11 @@ type handler struct{} | ||||||
| type ZabovConfig struct { | type ZabovConfig struct { | ||||||
| 	ZabovSingleBL  string   // json:singlefilters -> ZabovSingleBL list of urls returning a file with just names of domains
 | 	ZabovSingleBL  string   // json:singlefilters -> ZabovSingleBL list of urls returning a file with just names of domains
 | ||||||
| 	ZabovDoubleBL  string   // json:doublefilters -> ZabovDoubleBL list of urls returning a file with  IP<space>domain
 | 	ZabovDoubleBL  string   // json:doublefilters -> ZabovDoubleBL list of urls returning a file with  IP<space>domain
 | ||||||
| 	ZabovAddBL     string   // json:blackholeip  -> ZabovAddBL is the IP we want to send all the clients to. Usually is 127.0.0.1
 | 	ZabovAddBL     net.IP   // json:blackholeip  -> ZabovAddBL is the IP we want to send all the clients to. Usually is 127.0.0.1
 | ||||||
| 	ZabovHostsFile string   // json:hostsfile -> ZabovHostsFile is the file we use to keep our hosts
 | 	ZabovHostsFile string   // json:hostsfile -> ZabovHostsFile is the file we use to keep our hosts
 | ||||||
| 	ZabovUpDNS     string   // json:upstream -> ZabovUpDNS keeps the name of upstream DNSs
 | 	ZabovUpDNS     string   // json:upstream -> ZabovUpDNS keeps the name of upstream DNSs
 | ||||||
| 	ZabovDNSArray  []string // contains all the DNS we mention, parsed from ZabovUpDNS file
 | 	ZabovDNSArray  []string // contains all the DNS we mention, parsed from ZabovUpDNS file
 | ||||||
|  | 	ZabovCache     bool     // allows to disable cache
 | ||||||
| 	references     int      // contains references to this config; if zero, config shall be removed
 | 	references     int      // contains references to this config; if zero, config shall be removed
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue