@@ -50,45 +50,51 @@ def parse(self, content, root=None, path_info=None):
5050 # Were parse nginx dump
5151 LOG .info ("Switched to parse nginx configuration dump." )
5252 root_filename = self ._prepare_dump (parsed )
53+ path_info = root_filename
5354 self .is_dump = True
5455 self .cwd = os .path .dirname (root_filename )
5556 parsed = self .configs [root_filename ]
5657
57- self .parse_block (parsed , root )
58+ self .parse_block (parsed , root , path_info )
5859 return root
5960
60- def parse_block (self , parsed_block , parent ):
61+ def parse_block (self , parsed_block , parent , path_info ):
6162 for parsed in parsed_block :
6263 parsed_type = parsed .getName ()
64+ line = parsed .get ('line' , None )
6365 parsed_name = parsed [0 ]
66+ parsed_info = {parsed_name : line }
6467 parsed_args = parsed [1 :]
6568 if parsed_type == "include" :
6669 # TODO: WTF?!
67- self ._resolve_include (parsed_args , parent )
70+ self ._resolve_include (parsed_args , parent , path_info )
6871 else :
6972 directive_inst = self .directive_factory (
70- parsed_type , parsed_name , parsed_args
73+ parsed_type , parsed_info , parsed_args , path_info
7174 )
7275 if directive_inst :
7376 parent .append (directive_inst )
7477
75- def directive_factory (self , parsed_type , parsed_name , parsed_args ):
76- klass = self ._get_directive_class (parsed_type , parsed_name )
78+ def directive_factory (self , parsed_type , parsed_info , parsed_args , path_info ):
79+ klass = self ._get_directive_class (parsed_type , parsed_info , path_info )
7780 if not klass :
7881 return None
7982
83+ parsed_name = list (parsed_info .keys ())[0 ]
8084 if klass .is_block :
8185 args = [to_native (v ).strip () for v in parsed_args [0 ]]
8286 children = parsed_args [1 ]
8387
8488 inst = klass (parsed_name , args )
85- self .parse_block (children , inst )
89+ self .parse_block (children , inst , path_info )
8690 return inst
8791 else :
8892 args = [to_native (v ).strip () for v in parsed_args ]
8993 return klass (parsed_name , args )
9094
91- def _get_directive_class (self , parsed_type , parsed_name ):
95+ def _get_directive_class (self , parsed_type , parsed_info , path_info ):
96+ parsed_name = list (parsed_info .keys ())[0 ]
97+ parsed_line = parsed_info .get (parsed_name , '<unknown>' )
9298 if (
9399 parsed_type in self .directives
94100 and parsed_name in self .directives [parsed_type ]
@@ -99,7 +105,7 @@ def _get_directive_class(self, parsed_type, parsed_name):
99105 elif parsed_type == "directive" :
100106 return directive .Directive
101107 elif parsed_type == "unparsed_block" :
102- LOG .warning ('Skip unparseable block: "%s"' , parsed_name )
108+ LOG .warning ('Skip unparseable block in %s beginning at line %s : "%s"' , path_info , parsed_line , parsed_name )
103109 return None
104110 else :
105111 return None
@@ -108,7 +114,7 @@ def _init_directives(self):
108114 self .directives ["block" ] = block .get_overrides ()
109115 self .directives ["directive" ] = directive .get_overrides ()
110116
111- def _resolve_include (self , args , parent ):
117+ def _resolve_include (self , args , parent , path_info ):
112118 pattern = args [0 ]
113119 # TODO(buglloc): maybe file providers?
114120 if self .is_dump :
@@ -117,9 +123,9 @@ def _resolve_include(self, args, parent):
117123 LOG .debug ("Includes are disallowed, skip: {0}" .format (pattern ))
118124 return
119125
120- return self ._resolve_file_include (pattern = pattern , parent = parent )
126+ return self ._resolve_file_include (pattern = pattern , parent = parent , path_info )
121127
122- def _resolve_file_include (self , pattern , parent ):
128+ def _resolve_file_include (self , pattern , parent , path_info ):
123129 path = os .path .join (self .cwd , pattern )
124130 exists = False
125131 for file_path in glob .iglob (path ):
@@ -140,7 +146,7 @@ def _resolve_dump_include(self, pattern, parent):
140146 founded = True
141147 include = block .IncludeBlock ("include" , [file_path ])
142148 parent .append (include )
143- self .parse_block (parsed , include )
149+ self .parse_block (parsed , include , file_path )
144150
145151 if not founded :
146152 LOG .warning ("File not found: {0}" .format (path ))
0 commit comments