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:
- Se o backend não existe, adiciona o novo backend e o record ao final do arquivo.
- Se o backend existe e o record também, copia o arquivo
ha.confparanew_ha.confe encerra o programa. - 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.confgerado 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