111 lines
4.6 KiB
Python
111 lines
4.6 KiB
Python
import psycopg2
|
||
import re
|
||
import yaml
|
||
|
||
def generate_password(length=8):
|
||
# Определяем возможные символы для разных категорий
|
||
lower_case = string.ascii_lowercase
|
||
upper_case = string.ascii_uppercase
|
||
digits = string.digits
|
||
special_characters = string.punctuation
|
||
|
||
# Гарантируем, что в пароле будет хотя бы один символ каждого типа
|
||
password = [
|
||
secrets.choice(lower_case), # строчная буква
|
||
secrets.choice(upper_case), # заглавная буква
|
||
secrets.choice(digits), # цифра
|
||
secrets.choice(special_characters) # спецсимвол
|
||
]
|
||
|
||
# Заполняем оставшиеся символы случайными из всех категорий
|
||
all_characters = lower_case + upper_case + digits + special_characters
|
||
password += [secrets.choice(all_characters) for _ in range(length - 4)]
|
||
|
||
# Перемешиваем полученные символы
|
||
secrets.SystemRandom().shuffle(password)
|
||
|
||
# Собираем строку из символов и возвращаем
|
||
return ''.join(password)
|
||
|
||
# Функция для чтения конфигурации из YAML файла
|
||
def get_configurations(properties_file):
|
||
with open(properties_file, 'r') as file:
|
||
config = yaml.safe_load(file) # Чтение YAML файла
|
||
|
||
# Извлекаем данные из конфигурации
|
||
db_url = config.get('spring', {}).get('datasource', {}).get('url', '')
|
||
db_user = config.get('spring', {}).get('datasource', {}).get('username', '')
|
||
current_password = config.get('spring', {}).get('datasource', {}).get('password', '')
|
||
|
||
# Разбираем URL для получения host, port, и dbname
|
||
match = re.match(r'jdbc:postgresql://([^:]+):(\d+)/([^?]+)', db_url)
|
||
if match:
|
||
db_host = match.group(1)
|
||
db_port = match.group(2)
|
||
db_name = match.group(3)
|
||
else:
|
||
raise ValueError("Database URL is invalid in the properties file.")
|
||
|
||
return db_host, db_port, db_name, db_user, current_password
|
||
|
||
# Функция для обновления пароля в файле конфигурации
|
||
def update_password_in_file(properties_file, current_password, new_password):
|
||
with open(properties_file, 'r') as file:
|
||
content = file.read()
|
||
|
||
# Заменяем старый пароль на новый
|
||
updated_content = re.sub(rf'spring.datasource.password={current_password}', f'spring.datasource.password={new_password}', content)
|
||
|
||
with open(properties_file, 'w') as file:
|
||
file.write(updated_content)
|
||
|
||
# Основная функция для смены пароля в PostgreSQL
|
||
def change_postgresql_password(db_host, db_port, db_name, db_user, current_password, new_password):
|
||
try:
|
||
# Подключаемся к PostgreSQL с использованием старого пароля
|
||
conn = psycopg2.connect(
|
||
dbname=db_name,
|
||
user=db_user,
|
||
password=current_password,
|
||
host=db_host,
|
||
port=db_port
|
||
)
|
||
conn.autocommit = True
|
||
|
||
# Создаем курсор для выполнения SQL-запроса
|
||
cursor = conn.cursor()
|
||
|
||
# Запрос для изменения пароля пользователя
|
||
cursor.execute(f"ALTER USER {db_user} WITH PASSWORD '{new_password}';")
|
||
|
||
cursor.close()
|
||
conn.close()
|
||
|
||
print(f"Password for user {db_user} successfully changed.")
|
||
except Exception as e:
|
||
print(f"Error changing password in PostgreSQL: {e}")
|
||
return False
|
||
return True
|
||
|
||
# Главная логика скрипта
|
||
def main():
|
||
# Путь к файлу конфигурации Spring Boot
|
||
properties_file = "application.yml"
|
||
|
||
# Получаем данные из файла конфигурации
|
||
db_host, db_port, db_name, db_user, current_password = get_configurations(properties_file)
|
||
|
||
# Новый пароль
|
||
new_password = generate_password() # Укажите новый пароль здесь
|
||
|
||
# Меняем пароль в PostgreSQL
|
||
if change_postgresql_password(db_host, db_port, db_name, db_user, current_password, new_password):
|
||
# Обновляем пароль в файле конфигурации
|
||
update_password_in_file(properties_file, current_password, new_password)
|
||
print(f"Password updated successfully in {properties_file}.")
|
||
else:
|
||
print("Password change failed.")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|