Измените файл wpa_supplicant.conf с помощью Python

#python #python-3.x

Вопрос:

Я хочу изменить файл wpa_supplicant.conf с помощью python. Поэтому я и написал этот сценарий

 def command_add_wifi(json):
  print("-> Adding wifi")
  
  # Read file WPA suppliant
  networks = []
  with open("wpa_supplicant.conf", "r") as f:
    in_lines = f.readlines()  

  # Discover networks
  out_lines = []
  networks = []
  country = ""
  i = 0
  isInside = False
  for line in in_lines:
    if "network={" == line.strip().replace(" ", ""):
      networks.append({})
      isInside = True
    elif "}" == line.strip().replace(" ", ""):
      i  = 1
      isInside = False
    elif isInside:      
      key_value = line.strip().split("=")
      networks[i][key_value[0]] = key_value[1]
    else:
      out_lines.append(line)

  # Update password or add new
  isFound = False
  for network in networks:
    if network["ssid"] == f""{json['ssid']}"":
      network["psk"] = f""{json['psk']}""
      network["key_mgmt"] = f""{json['key_mgmt']}""
      isFound = True
      break
    elif network["ssid"] != f""{json['ssid']}"":
      network["ssid"] = f""{json['ssid']}""
      network["psk"] = f""{json['psk']}""
      network["key_mgmt"] = f""{json['key_mgmt']}""
      isFound = True
      break;
  if not isFound:
     networks.append({
     'ssid': f""{json['ssid']}"",
     'psk': f""{json['psk']}"",
     'key_mgmt': "WPA-PSK"
     })

  # Generate new WPA Supplicant
  for network in networks:
    out_lines.append("network={n")
    for key, value in network.items():
      out_lines.append(f"    {key}={value}n")      
    out_lines.append("}nn")

  # Write to WPA Supplicant
  with open('wpa_supplicant.conf', 'w') as f:
    for line in out_lines:
      f.write(line)

  print("-> Wifi added !")
  
  
  
command_add_wifi({"ssid": "wiefaaeir_nraume", "psk": "fpassword", "key_mgmt": "key_mgmt"})
 
 

Но я не могу изменить код страны. И я не вижу леса перед деревом. Как я могу также изменить/прочитать страну параметра?

Это файл

  # WiFi configuration generated by openHABian
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
# Network configuration was created by wpa_passphrase to ensure correct handling of special characters

network={
    ssid="wiefaaeir_nraume"
    psk="fpassword"
    key_mgmt="key_mgmt"
}
 

Скрипт пока работает, но я не могу изменить код страны.

Комментарии:

1. Какую часть вашего сценария вы ожидали сделать с кодом страны?

2. Как человек, который занимается devop уже буквально десятилетия, я не рекомендую писать код для изменения файлов конфигурации на месте. Гораздо более приемлемо вместо этого создавать шаблоны для создания этих файлов из данных в форме, с которой будет легко работать. (Что-то вроде: JSON — > механизм шаблонов — > > файлы конфигурации)

3. (чтобы сделать это для всего дистрибутива Linux, см. NixOS, где configuration.nix используется для программного создания любого другого файла конфигурации в системе и написан на достаточно мощном языке программирования, чтобы там можно было выполнить любую необходимую логику домена).

4. Сразу после комментария «# Откройте для себя сети». Это должна быть новая переменная со страной, и там ДЕ должно быть сохранено

5. …необходимость разбора произвольных форматов файлов конфигурации делает ваш код уязвимым-любая функция, которую вы в настоящее время не поддерживаете, означает возможный сбой разбора или неправильный разбор; и еще хуже случаи, когда ваш код генерации не возвращается к своим входным данным, когда он передается обратно через ваш синтаксический анализатор. Идти по этой дороге-значит навлечь на вас гору технических долгов.