Skip to content
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • По умолчанию (Нет скина)
  • Нет скина
Collapse

Networks Engineering

  1. Главная
  2. Информационная безопасность
  3. Сетевая безопасность
  4. ошибка 404 в скрипте Python для удаления объектов из FMC с помощью файла CSV

ошибка 404 в скрипте Python для удаления объектов из FMC с помощью файла CSV

Запланировано Прикреплена Закрыта Перенесена Сетевая безопасность
16 Сообщения 0 Posters 7 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • M Не в сети
    M Не в сети
    Maneck_UK
    написал в отредактировано
    #1

    У меня есть полностью рабочий скрипт на Python, который может отправлять объекты в API FMC (6.5.0.4) с помощью файла .csv для данных. Я хочу использовать тот же подход/метод для удаления объектов, но после многих дней попыток мне так и не удалось заставить скрипт работать. Сначала я добавлял объект в скрипт в виде данных, а не в URL-адресе, но исправил это, используя
    один объект, если я добавляю объект в скрипт, используя: del_data = ['005056A6-6972-0ed3-0000-090194313992'] URL работает, и объекты удаляются. Но это противоречит цели скрипта, так как я могу удалить один объект более простыми способами. Я полагаю, что теперь у меня есть скрипт, который добавляет ID объекта хоста в URL, но он по-прежнему дает ошибку 404: Ошибка подключения -->
    404 Ошибка клиента: не найдено для URL-адреса: https://
    <FMC-NAME>
    /api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/hosts/005056A6-6972-0ed3-0000-090194314504 Я новичок в сфере Python-скриптов и буду благодарен за любые советы. Ниже приведены части моего скрипта, имеющие отношение к данному вопросу: Заранее спасибо Компонент скрипта для создания URL
    f = open("delid.csv")
    objectsfile = csv.DictReader(f)
    for object in objectsfile:
    del_data = {
    object["objectid"]
    }
    for object in del_data:
    del_url = server + api_path + object
    try:
    r = requests.delete(del_url, headers=headers, verify=False)
    status_code = r.status_code
    resp = r.text
    log = open('delete_objects.log', 'a')
    print(" Status Code: "+str(status_code))
    json_resp = json.loads(resp)
    log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': ')))
    if status_code == 201 or status_code == 202:
    print(" SUCCESS ")
    elif status_code == 400:
    print((" Сообщение: ")+ resp + ('\n'))
    else:
    r.raise_for_status
    print((" Сообщение: ")+ resp + ('\n'))
    except requests.exceptions.HTTPError as err:
    print("Ошибка соединения --> "+str(err))
    finally:
    if r: r.close

    1 ответ Последний ответ
    0
    • J Не в сети
      J Не в сети
      JonasKs
      написал в отредактировано
      #2

      Чтобы не нарушить работу скрипта в случае, если ресурс не найден, можно просто добавить
      if status_code == 404
      в свою логику, например так: <... your code> elif status_code == 400: print(" Message: " + resp + '\n') elif status_code == 404: print(" Message: " + resp + '\n') else: r.raise_for_status print(" Message: "+ resp + '\n') <...your code> Именно это r.raise_for_status функция, которая фактически вызывает исключение, приводящее к сбою программы. (Если только вы не перехватите это исключение)

      1 ответ Последний ответ
      0
      • M Не в сети
        M Не в сети
        Maneck_UK
        написал в отредактировано
        #3

        f = open("del-hostid.csv")
        elementsfile = csv.DictReader(f) for element in elementsfile: del_data = { element["objectid"], } for element in del_data: del_url = server + api_path + element try: print(del_url) r = requests.delete(del_url, headers=headers, verify=False) status_code = r.status_code resp = r.text log = open('delete_objects.log', 'a') print(" Status code: "+str(status_code)) json_resp = json.loads(resp) log.write('\n=====\n') log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': '))) if status_code == 201 or status_code == 202: print(" SUCCESS ") elif status_code == 400: print((" Message: ")+ resp + ('\n')) else: r.raise_for_status print((" Message: ")+ resp + ('\n')) except requests.exceptions.HTTPError as err: print("Connection error -> "+str(err)) finally: if r: r.close

        1 ответ Последний ответ
        0
        • J Не в сети
          J Не в сети
          JonasKs
          написал в отредактировано
          #4

          Странно, мой ответ, кажется, был удален? Я перепощу его: f = open("del-hostid.csv")
          elementsfile = csv.DictReader(f) for element in elementsfile: del_data = { element["objectid"], } for element in del_data: del_url = server + api_path + element try: print(del_url) r = requests.delete(del_url, headers=headers, verify=False) status_code = r.status_code resp = r.text log = open('delete_objects.log', 'a') print(" Status code: "+str(status_code)) json_resp = r.json log.write('\n=====\n') log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': '))) if status_code == 201 or status_code == 202: print(" SUCCESS ") elif status_code == 400 or status_code == 404: print(" Message: " + resp + '\n') else: r.raise_for_status print(" Message: " + resp + '\n') except requests.exceptions.HTTPError as err: print("Connection error -> "+str(err)) У вас был двойной цикл for, который был не нужен. # Old : elif status_code == 400:

          Old : print((" Message: ")+ resp + ('\n'))

          New : elif status_code == 400 or status_code == 404:

          New : print(" Message: " + resp + '\n') Я изменил две вещи: # Old : json_resp = json.loads(resp)

          New : json_resp = r.json

          1 ответ Последний ответ
          0
          • J Не в сети
            J Не в сети
            JonasKs
            написал в отредактировано
            #5

            В вашем коде вы делаете следующее: for object in del_data: del_url = server + api_path + object try: ... Когда вам нужно отступить ваш try, чтобы каждый раз вызывать del_url: for object in del_data: del_url = server + api_path + object try: ... put code here. Также никогда не используйте object в качестве имени переменной, так как оно затеняет встроенный класс Python object. Назовите его element или чем-то подобным. Что касается вашего вопроса, я бы порекомендовал вывести URL-адрес на печать перед вызовом r.delete(..), чтобы проверить, правильно ли он отформатирован. Код 404 указывает, что ресурс, к которому вы пытаетесь получить доступ, не существует. Скорее всего, вы уже удалили его в предыдущем запуске, и, поскольку в вашей текущей версии отступы указаны неверно, вы вызвали API только для последнего элемента в вашем CSV-файле.

            1 ответ Последний ответ
            0
            • M Не в сети
              M Не в сети
              Maneck_UK
              написал в отредактировано
              #6

              @JonasKs
              Спасибо за помощь. Когда я впервые прочитал эту информацию, мне понадобился смайлик «моя голова просто взорвалась». Я прочитал ее еще несколько раз и, кажется, понял; пойду попробую...

              1 ответ Последний ответ
              0
              • J Не в сети
                J Не в сети
                JonasKs
                написал в отредактировано
                #7

                Хе-хе, я понимаю. Всё сводится к следующим шагам: 1. Распечатайте URL-адрес, на который вы отправляете сообщение. Это позволит понять, что происходит с вашим кодом. Но я попробую написать это для вас: for object in objectsfile: del_data = { object["objectid"] } В этом фрагменте вы создаете
                набор
                элементов.
                del_data
                теперь будет выглядеть так: del_data = {'first element', 'second element', 'third element'} Затем вы пробегаете по этому набору: for object in del_data: del_url = server + api_path + object И затем вы
                выходите
                из цикла. Итак, что происходит: # first loop
                del_url = 'first_element'

                second loop

                del_url = 'second_element'

                third loop

                del_url = 'third_element' Теперь следующее, что вы делаете, — это выполняете свой код: try: r = requests.delete(del_url, headers=headers, verify=False) Но, как вы видите, вы не делаете это
                внутри
                цикла
                for
                . Поэтому это происходит только один раз. Если мы посмотрим на этот запрос повнимательнее, то
                del_url
                — это
                third_element,
                и я
                предполагаю
                , что вы действительно хотели, чтобы это происходило для каждого элемента в вашем наборе: try: r = requests.delete('third_element', headers=headers, verify=False) Итак, я написал выше, что вам следует сделать так: for object in del_data: del_url = server + api_path + object try: r = requests.delete(del_url, headers=headers, verify=False) выглядело так: for object in del_data: del_url = server + api_path + object try:
                print(del_url)
                r = requests.delete(del_url, headers=headers, verify=False) Это гарантирует, что для
                каждого
                элемента в вашем наборе
                del_data
                вы будете выполнять эту команду. 2. Не называйте свои переменные
                object
                , это недопустимое имя для использования в Python, поскольку это встроенный класс.

                1 ответ Последний ответ
                0
                • M Не в сети
                  M Не в сети
                  Maneck_UK
                  написал в отредактировано
                  #8

                  @JonasKs Спасибо, я написал свой пост с обновлением, не видя этого обновления (на написание поста у меня ушло много времени). Это очень поможет. Я еще раз посмотрю.

                  1 ответ Последний ответ
                  0
                  • M Не в сети
                    M Не в сети
                    Maneck_UK
                    написал в отредактировано
                    #9

                    Я просмотрел дополнительную справку и разобрался с частью, касающейся удаления. Мне просто нужно было отступить: for element in del_data: del_url = server + api_path + element try: чтобы он работал под: for element in elementsfile: del_data = { element["objectid"], } f = open("del-hostid.csv") elementsfile = csv.DictReader(f) for element in elementsfile: del_data = { element["objectid"], } for element in del_data: del_url = server + api_path + element try: print(del_url) r = requests.delete(del_url, headers=headers, verify=False) status_code = r.status_code resp = r.text log = open('delete_objects.log', 'a') print(" Status code: "+str(status_code)) json_resp = json.loads(resp) log.write('\n=====\n') log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': '))) if status_code == 201 or status_code == 202: print(" УСПЕХ ") elif status_code == 400: print((" Сообщение: ")+ resp + ('\n')) else: r.raise_for_status print((" Сообщение: ")+ resp + ('\n')) except requests.exceptions.HTTPError as err: print("Ошибка соединения -> "+str(err)) finally: if r: r.close

                    1 ответ Последний ответ
                    0
                    • M Не в сети
                      M Не в сети
                      Maneck_UK
                      написал в отредактировано
                      #10

                      Я обновил свой код, чтобы отразить предложенные изменения, и теперь могу удалить один объект из файла csv. Это большое улучшение, спасибо. Но удаляется только последний объект в моем файле csv. Кроме того, если есть объект, который уже удален, скрипт завершается и выдает ошибку 404. Мои попытки обновить операцию error msg с 400 на 404 (elif status_code == 404:) для устранения ошибки 404 приводят к ошибке: Ошибка: Код статуса: 404
                      Сообщение: {"error":{"category":"FRAMEWORK","messages":[{"description":"No resource found"}],"severity":"ERROR"}} Но когда мой скрипт заканчивается из-за того, что объект уже удален, я получаю ошибку 404: Ошибка: Код статуса: 404 Ошибка
                      соединения -> 404 Ошибка клиента: Не найдено для url:
                      https://v-uxfmc01.brunel.ac.uk/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/hosts/005056A6-6972-0ed3-0000-090194314100 При использовании этой операции в моем рабочем объекте POST из скрипта csv скрипт продолжал работу после объекта, который уже существовал. Поэтому я снова прошу о помощи... Во-первых, чтобы понять, почему используется только последний объект в моем csv, и как заставить его удалить все объекты в файле? и Как продолжить работу после объекта, который больше не существует? Большое спасибо всем за помощь, без вас я бы не дошел до этого. Обновленный скрипт f = open("del-hostid.csv")
                      elementsfile = csv.DictReader(f) for element in elementsfile:
                      del_data = {
                      element["objectid"],
                      } for element in del_data:
                      del_url = server + api_path + element
                      try:
                      r = requests.delete(del_url, headers=headers, verify=False)
                      status_code = r.status_code
                      resp = r.text
                      log = open('delete_objects.log', 'a')
                      print(" Статус-код: "+str(status_code))
                      json_resp = json.loads(resp)
                      log.write('\n=====\n')
                      log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': ')))
                      if status_code == 201 or status_code == 202:
                      print(" SUCCESS ")
                      elif status_code == 400:
                      print((" Message: ")+ resp + ('\n'))
                      else:
                      r.raise_for_status
                      print((" Message: ")+ resp + ('\n')) except requests.exceptions.HTTPError as err:
                      print("Ошибка соединения -> "+str(err))
                      finally:
                      if r: r.close print('\nФайл журнала "delete_objects.log" добавлен\n')
                      input("Нажмите <Enter>, чтобы вернуться к командной строке CMD")

                      1 ответ Последний ответ
                      0
                      • M Не в сети
                        M Не в сети
                        Maneck_UK
                        написал в отредактировано
                        #11

                        @JonasKs
                        Отличная помощь, спасибо Я пробовал это, но не сработало. Оказалось, что сбой обработки сообщений был вызван неправильным отступом, который прервал цикл моего скрипта по обработке файла csv.

                        1 ответ Последний ответ
                        0
                        • J Не в сети
                          J Не в сети
                          JonasKs
                          написал в отредактировано
                          #12

                          Ага, да, 4 пробела на отступ — это то, что нужно. Я действительно рекомендую использовать редактор, который помогает увидеть такие вещи, например PyCharm или Visual Studio Code с плагинами Python. Рад, что вы решили эту проблему.

                          1 ответ Последний ответ
                          0
                          • M Не в сети
                            M Не в сети
                            Maneck_UK
                            написал в отредактировано
                            #13

                            У меня остался один вопрос, если кто-нибудь может помочь с ним, было бы замечательно: Если есть объект, который уже удален, скрипт завершается и выдает ошибку 404. Мои попытки обновить операцию error msg с 400 на 404 (elif status_code == 404:) для устранения ошибки 404 приводят к ошибке: Ошибка: Код статуса: 404
                            Сообщение: {"error":{"category":"FRAMEWORK","messages":[{"description":"No resource found"}],"severity":"ERROR"}} Но когда мой скрипт заканчивается из-за того, что объект уже удален, я получаю ошибку 404: Ошибка: Код состояния: 404 Ошибка
                            соединения -> 404 Ошибка клиента: Не найдено для URL:
                            https://v-uxfmc01.brunel.ac.uk/api/fmc_config/v1/domain/e276abec-e0f2-11e3-8169-6d9ed49b625f/object/hosts/005056A6-6972-0ed3-0000-090194314100 При использовании этой операции в моем рабочем объекте POST из скрипта csv скрипт продолжал работу после объекта, который уже существовал. Кто-нибудь знает, как исправить мою проблему с проходом мимо объекта, который больше не существует? Заранее спасибо.

                            1 ответ Последний ответ
                            0
                            • J Не в сети
                              J Не в сети
                              JonasKs
                              написал в отредактировано
                              #14

                              Кстати, если вы нажмете
                              «Ответить»,
                              а затем кнопку
                              «Вставить код»,
                              нам будет проще прочитать ваш код.

                              1 ответ Последний ответ
                              0
                              • M Не в сети
                                M Не в сети
                                Maneck_UK
                                написал в отредактировано
                                #15

                                Я этого не знал. Спасибо.

                                1 ответ Последний ответ
                                0
                                • J Не в сети
                                  J Не в сети
                                  JonasKs
                                  написал в отредактировано
                                  #16

                                  f = open("del-hostid.csv")
                                  elementsfile = csv.DictReader(f) for element in elementsfile: del_data = { element["objectid"], } for element in del_data: del_url = server + api_path + element try: print(del_url) r = requests.delete(del_url, headers=headers, verify=False) status_code = r.status_code resp = r.text log = open('delete_objects.log', 'a') print(" Status code: "+str(status_code)) json_resp = r.json log.write('\n=====\n') log.write(json.dumps(json_resp,sort_keys=True,indent=4, separators=(',', ': '))) if status_code == 201 or status_code == 202: print(" SUCCESS ") elif status_code == 400 or status_code == 404: print(" Message: " + resp + '\n') else: r.raise_for_status print(" Message: " + resp + '\n') except requests.exceptions.HTTPError as err:

                                  This will only happen if the r.raise_for_status line is hit print("Connection error -> "+str(err)) Попробуй это. Я изменился elif status_code == 400: на elif status_code == 400 or status_code == 404: и json_resp = json.loads(resp) на json_resp = r.json , а также удалил ваш двойной цикл for.

                                  1 ответ Последний ответ
                                  0

                                  Здравствуйте! Похоже, вам интересна эта беседа, но у вас пока нет учетной записи.

                                  Вы устали просматривать одни и те же посты каждый раз, когда заходите на сайт? После регистрации, вам не придётся искать обсуждения в которых вы принимали участие, настройте уведомления о новых сообщениях так как вам это удобно (по электронной почте или уведомлением). У вас появится возможность сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

                                  С вашими комментариями этот пост может стать ещё лучше 💗

                                  Зарегистрироваться Войти
                                  Ответить
                                  • Ответить, создав новую тему
                                  Авторизуйтесь, чтобы ответить
                                  • Сначала старые
                                  • Сначала новые
                                  • По количеству голосов


                                  • Войти

                                  • Нет учётной записи? Зарегистрироваться

                                  • Login or register to search.
                                  • Первое сообщение
                                    Последнее сообщение
                                  0
                                  • Категории
                                  • Последние
                                  • Метки
                                  • Популярные
                                  • Пользователи
                                  • Группы