Manipulação de Arquivo de Configuração ha.conf com Python

Requisitos:

O usuário deve inserir um dicionário no formato de string para realizar as seguintes operações no arquivo de configuração ha.conf sob a seção backend www.oldboy.org:

  • Consulta
  • Adição: backend e record
  • Adição: apenas record, se o backend já existir

Abordagem:

O programa é composto por duas funções que realizam três operações principaiss:

  • fetch: consulta os registros sob um detemrinado backend.
  • add:
  1. Se o backend não existe, adiciona o novo backend e o record ao final do arquivo.
  2. Se o backend existe e o record também, copia o arquivo ha.conf para new_ha.conf e encerra o programa.
  3. Se o backend existe, mas o record não, adiciona o record ao backend.

Estrutura do Programa:

O programa inclui:

  • Um arquivo principal
  • O arquivo de cnofiguração ha.conf
  • Um novo arquivo de configuração new_ha.conf gerado após a execução

Código Principal:

#!/usr/bin/python
#_*_coding:utf-8 _*_
def buscar(backend):
    resultados = []
    with open('ha.conf', 'r') as f:
        encontrado = False
        for linha in f:
            if linha.strip().startswith("backend") and linha.strip() == "backend " + backend:
                encontrado = True
                continue
            if encontrado and linha.strip().startswith("backend"):
                encontrado = False
                break
            if encontrado and linha.strip():
                resultados.append(linha.strip())
    return resultados

def adicionar(backend, registro):
    registros = buscar(backend)
    if not registros:
        with open('ha.conf', 'r') as antigo, open("new_ha.conf", 'w') as novo:
            for linha in antigo:
                novo.write(linha)
            novo.write("\n" * 2 + "backend " + backend + "\n")
            novo.write(" " * 8 + registro + "\n")
    else:
        if registro in registros:
            import shutil
            shutil.copy("ha.conf", "new_ha.conf")
        else:
            registros.append(registro)
            with open('ha.conf', 'r') as antigo, open('new_ha.conf', 'w') as novo:
                encontrado = False
                for linha in antigo:
                    if linha.strip().startswith('backend') and linha.strip() == "backend " + backend:
                        encontrado = True
                        novo.write(linha)
                        for reg in registros:
                            novo.write(" " * 8 + reg + "\n")
                        continue
                    if encontrado and linha.strip().startswith("backend"):
                        encontrado = False
                    if linha.strip() and not encontrado:
                        novo.write(linha)

# Exemplo de uso:
bk = "buy.oldboy.org"
rd = "server 100.1.7.90 100.1.7.90 weight 20 maxconn 30000"
adicionar(bk, rd)

# Uso alternativo:
import json
entrada = input("Digite o dicionário: ")
dicionario = json.loads(entrada)
bk = dicionario['backend']
rd = "server %s %s weight %d maxconn %d" % (dicionario['record']['server'], dicionario['record']['server'], dicionario['record']['weight'], dicionario['record']['maxconn'])
adicionar(bk, rd)

# Formato do dicionário:
# {"backend": "test.oldboy.org", "record": {"server": "100.1.7.9", "weight": 20, "maxconn": 30}}

Conteúdo do arquivo ha.conf:

global
    log 127.0.0.1 local2
    daemon
    maxconn 256
    log 127.0.0.1 local2 info
defaults
    log global
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    option dontlognull

listen stats :8888
    stats enable
    stats uri /admin
    stats auth admin:1234

frontend oldboy.org
    bind 0.0.0.0:80
    option httplog
    option httpclose
    option forwardfor
    log global
    acl www hdr_reg(host) -i www.oldboy.org
    use_backend www.oldboy.org if www

backend www.oldboy.org
    server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000

backend buy.oldboy.org
    server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000

Tags: Python file manipulation configuration files backend ha.conf

Publicado em 8-26 10:08