peakwinter/python-nginx

解析不了 session_sticky; 这样命令

netblack opened this issue · 2 comments

解析不了 session_sticky; 这样命令

nginx config file :
upstream xx.com_backend{
server 10.193.2.2:9061 weight=1 max_fails=2 fail_timeout=30s;
server 10.193.2.1:9061 weight=1 max_fails=2 fail_timeout=30s;
session_sticky;
}
server {
listen 80;
location / {
set $xlocation 'test';
proxy_pass http://xx.com_backend;
}
}

import nginx
c = nginx.loadf('/tmp/site.conf')
Traceback (most recent call last):
File "", line 1, in
File "/home/wangjifeng/.pyenv/versions/2.7.12/lib/python2.7/site-packages/nginx.py", line 530, in loadf
return load(f)
File "/home/wangjifeng/.pyenv/versions/2.7.12/lib/python2.7/site-packages/nginx.py", line 520, in load
return loads(fobj.read())
File "/home/wangjifeng/.pyenv/versions/2.7.12/lib/python2.7/site-packages/nginx.py", line 469, in loads
if isinstance(lopen[0], Container):
IndexError: list index out of range

You can try using this function instead of loadf. It returns the object 'conf' back.

def Read(configPath):
    d = nginx.Conf()
    brac = []
    with open(configPath) as f:
        content = f.readlines()
        for line in content:

            m = re.compile(r'^\s*events\s*{', re.S).match(line)
            if m:
                e = nginx.Http()
                brac.insert(len(brac), e)
            m = re.compile(r'^\s*http\s*{', re.S).match(line)
            if m:
                h = nginx.Http()
                brac.insert(len(brac), h)

            m = re.compile(r'^\s*server\s*{', re.S).match(line)
            if m:
                s = nginx.Server(m.group(0))
                brac.insert(len(brac), s)

            m = re.compile(r'^\s*location\s*(.*?\S+)\s*{', re.S).match(line)
            if m:
                b = nginx.Location(m.group(1))
                brac.insert(len(brac), b)

            m = re.compile(r'^\s*if\s*(.*?\S+)\s*{', re.S).match(line)
            if m:
                ifs = nginx.If(m.group(1))
                brac.insert(len(brac), ifs)

            m = re.compile(r'^\s*upstream\s*(.*?\S+)\s*{', re.S).match(line)
            if m:
                u = nginx.Upstream(m.group(1))
                brac.insert(len(brac), u)

            m = re.compile(r'^(\s*)#\s*(.*?)\n', re.S).match(line)
            if m:
                c = nginx.Comment(m.group(2), inline='\n' not in m.group(1))
                if brac:
                    (brac[-1]).add(c)
                else:
                    d.add(c)

            m = re.compile(r'^\s*}', re.S).search(line)
            if m:
                c = brac[-1]
                brac.pop()
                if brac:
                    (brac[-1]).add(c)
                else:
                    d.add(c)

            key_with_quoted = r'^\s*(\S*?)\s*"([^"]+)";?|\'([^\']+)\';?|\\S+;?'
            key_wo_quoted = r'^\s*([a-zA-Z0-9-_]+?)\s+(.+?);'
            m1 = re.compile(key_with_quoted, re.S).match(line)
            m2 = re.compile(key_wo_quoted, re.S).match(line)
            if m1 and m2:
                if m1.start() <= m2.start():
                    m = m1
                else:
                    m = m2
            else:
                m = m1 or m2
            if m:
                k = nginx.Key(m.group(1), m.group(2))
                if brac:
                    (brac[-1]).add(k)
                else:
                    d.add(k)

            m = re.compile(r'^\s*(\S+);', re.S).match(line)
            if m:
                k = nginx.Key(m.group(1), '')
                if brac:
                    brac[-1].add(k)
                else:
                    d.add(k)
    return d