Пропустить сервер в списке словарей вместо остановки кода - PullRequest
0 голосов
/ 08 апреля 2020

Таким образом, в основном этот код подключается к серверам и загружает файлы, соответствующие этому шаблону, из одного каталога в другой. Однако, если сервер недоступен, он останавливает весь процесс. Я хочу, чтобы он пропустил его на следующий сервер. Как я могу это сделать?

Также он загружает каждый файл, содержащий pc_dblatmonstat_. Хотя это отчасти правильно, мне нужны только те файлы, имена которых имеют вид pc_dblatmonstat_x_x, где x заменяет фактическое значение этого файла в каталоге.

Например, я хочу файл pc_dblatmonstat_tpc01n1_scl000101018.log вместо pc_dblatmonstat_tpc01n1 .log

Вот что у меня есть

import os
import paramiko
import re

# 1. Create function
def get_server_files(local_path, host, port, username, password, remote_path, file_pattern):
    """Connects to host and searches for files matching file_pattern
    in remote_path. Downloads all matches to 'local_path'"""
    #Opening ssh and ftp
    ssh_con = paramiko.SSHClient()
    ssh_con.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_con.connect(host, port, username, password)
    sftp_con = ssh_con.open_sftp()

    print('Connecting to', host)

    # Finding files
    all_files_in_path = sftp_con.listdir(path=remote_path)
    r = re.compile(file_pattern)
    files = list(filter(r.match, all_files_in_path))

    #Download files
    for file in files:
        file_remote = remote_path + file
        file_local = local_path + file

        print(file_remote + ' >>> ' + file_local)

        sftp_con.get(file_remote, file_local)
        #sftp_con.put(file_local, file_remote)

    sftp_con.close()
    ssh_con.close()

# 2. list of servers
# Add new dictionary for each server to this list
list_of_servers = [
    { 'host': '192.168.1.64',
      'port': 22, 
      'username': 'pi', 
      'password': 'pi', 
      'remote_path': '/home/pi/Desktop/logs/', 
      'file_pattern': 'pc_dblatmonstat_*_'},

      { 'host': '192.168.1.65',
      'port': 22, 
      'username': 'pi', 
      'password': 'pi', 
      'remote_path': '/home/pi/Desktop/logs/',  
      'file_pattern': 'pc_dblatmonstat_*_'}
]

# You could add the local_path to the function to define individual places for the
# files that you download.
local_path = r'C:\Users\urale\Desktop\logs\\'


# 3. Iterate through the list_of_servers, using the function above
for server in list_of_servers:
    get_server_files(local_path, **server)

1 Ответ

1 голос
/ 08 апреля 2020

В вашем для l oop вы можете try, except сообщить об ошибке, когда сервер недоступен, и перейти к следующему, например так:

for server in list_of_servers:
    try:
        get_server_files(local_path, **server)
    except:
        continue

Чтобы решить вторую проблему, почему бы не обновить file_pattern, чтобы указать, что должен быть второй 'x', как вы описали: 'pc_dblatmonstat_[^_]*_.*'. Эта часть [^_]* означает, что вы ожидаете любое количество символов, не являющихся подчеркиванием, в то время как остальная часть шаблона указывает, что должно быть другое подчеркивание, за которым следует любое количество символов. В результате файлы, которые имеют только одно подчеркивание, например pc_dblatmonstat_tpc01n1.log из вашего примера, не будут учитываться

...