キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 
cancel
3143
閲覧回数
11
いいね!
0
コメント
yushimaz
Cisco Employee
Cisco Employee

     

    はじめに

    leaf, spine switch を工場出荷時の状態に戻すには /bin/prepare-mfg.sh という スクリプトを用います。 今回はスクリプトの内容を確認し、実際にどのような処理を しているのかを確認してみます。
     

    Leaf/Spine

    /bin/prepare-mfg.sh

    まず最初にスクリプトの場所と実行権限を確認します。

    leaf1# which prepare-mfg.sh
    /bin/prepare-mfg.sh
    leaf1#
    leaf1# ls -l /bin/prepare-mfg.sh
    -rwsr-xr-x 1 root root 1409 Jan 17 01:41 /bin/prepare-mfg.sh

    全ユーザに実行権限があることが確認できます。
    次に、このスクリプトを開いて中身を確認してみることにします。

     

    leaf1# cat -n /bin/prepare-mfg.sh
         1  #!/bin/bash
         2
         3  . /etc/isim_include
         4
         5  if [ -z $1 ]; then
         6      echo "No image?"
         7      echo "Usage: prepare-mfg.sh  "
         8      echo "image should be in bootflash, do not give /bootflash/"
         9      exit
        10  else
        11      if [ ! -f /bootflash/$1 ]; then
        12          echo "Cant find image"
        13          exit
        14      fi
        15  fi
        16
        17  usr=`id -un `
        18
        19  if [ $usr == "root" ]; then
        20
        21      echo "Preparing to erase all config"
        22      rm -rf /bootflash/isim.conf
        23      touch /mnt/pss/.clean
        24      touch /mnt/cfg/0/clean-config
        25      touch /mnt/cfg/1/clean-config
        26
        27  #rm -rf /mnt/ifc/cfg/db/*
        28      echo "Cleanup cores"
        29      rm -rf /logflash/core/*
        30      rm -rf /logflash/log/*
        31      rm -rf /mnt/pss/logs/*
        32      rm -rf /mnt/ifc/log/*
        33      rm -rf /recovery/*
        34
        35      echo "Setting up recovery image wait 30 seconds"
        36      cp /bootflash/$1 /recovery
        37
        38      sync
        39      sleep 30
        40      sync
        41
        42      rm -rf /bootflash/*
        43      cp /recovery/$1 /bootflash
        44
        45      sync
        46      sleep 30
        47      sync
        48
        49      echo "Setting up boot variables"
        50      touch /mnt/cfg/0/boot/grub/menu.lst.local
        51      touch /mnt/cfg/1/boot/grub/menu.lst.local
        52      echo "boot $1" > /mnt/cfg/0/boot/grub/menu.lst.local
        53      echo "boot $1" > /mnt/cfg/1/boot/grub/menu.lst.local
        54
        55      touch /mnt/cfg/0/boot/grub/menu.lst.recovery
        56      touch /mnt/cfg/1/boot/grub/menu.lst.recovery
        57      echo "boot $1" > /mnt/cfg/0/boot/grub/menu.lst.recovery
        58      echo "boot $1" > /mnt/cfg/1/boot/grub/menu.lst.recovery
        59  else
        60      bg_action /tmp/prepare-mfg $1
        61  fi

    60 行程度のスクリプトになります。
    5 - 15 行目でスクリプト実行時の引数を確認しエラーを出力させています。
    21 - 33 行目で初期化処理を行っています。
    35 - 43 行目で起動用イメージ以外の bootflash ディレクトリにあるファイルを消去しています。
    49 - 58 行目で起動イメージの設定を行っています。

    starup-config を削除し、bootvar を編集するだけの IOS と異なり、複数のファイルを 削除する必要があるので、こういったスクリプトが用意されています。


    ただ、よく見ると 19 行目に if 文があり、初期化処理は root しか実行できないように見えます。
    先ほど、全ユーザに実行権限があることを確認しましたが、一般ユーザがこのスクリプトを実行した 場合にはどのようになるのでしょう?

    ということで、もう少しこのスクリプトを調べてみることにします。

        59  else
        60      bg_action /tmp/prepare-mfg $1
        61  fi

    else 文に書いてある通り、root 以外のユーザは、bg_action /tmp/prepare-mfg $1 というコマンドを 実行しています。 $1 は /bin/prepare-mfg を実行した際の引数なので、aci-n9000-dk9.11.0.2m.bin のような起動用イメージファイル名が指定されているはずです。 (わかりやすくするため、今後 $1 は aci-n9000-dk9.11.0.2m.bin を入れたとして話を進めます。)
     

    leaf1# bg[tab][tab]
    bg            bg-action.sh

    bg の後に tab を 2 回押しても、bg_action が出てきません。 そこで、スクリプトをもう 1 度よく見ると、3 行目に . /etc/isim_include という行があります。
    早速実行してみると、bg_action が出てきました。

     

    leaf1# . /etc/isim_include
    leaf1# bg[tab][tab]
    bg            bg-action.sh  bg_action
    leaf1# bg

    どうやら、bg_action は /etc/isim_include に定義されているようです。

     

    /etc/isim_include

    このスクリプトは長いので、bg_action() のみ抜き出してみます。

    leaf1# cat -n /etc/isim_include | grep -A 15 bg_action
        10  bg_action() {
        11      touch $1
        12      echo $2 > $1
        13
        14      while true
        15      do
        16        echo "In progress"
        17        if [ -f $1 ]; then
        18            sleep 5;
        19        else
        20            break
        21        fi
        22      done
        23
        24      echo "Done"
        25  }
    leaf1#

     

    $1 は /tmp/prepare-mfg で $2 は aci-n9000-dk9.11.0.2m.bin なので、 11, 12 行目は /tmp/prepare-mfg という名前のファイルを作成し、そのファイルに aci-n9000-dk9.11.0.2m.bin という文字を書き込んでいるだけになります。
    14 行目からの while ループでは、そのファイルがあるかどうかを確認し、ある場合 5 秒待ち、ない場合 Done と表示しこの関数は終了します。


    では、誰がこのファイルを消しているのでしょうか?

    先ほど、bg[tab][tab] と打った時に出てきた bg-action.sh が名前からしてどうも 怪しい気がしますが、このスクリプトも誰かから呼び出されないと動きません。
    裏側で定期的に呼び出すもので最も怪しいのは cron なので、とりあえず crontab -l で調べてみると、何も出てきません。。
     

    leaf1# crontab -l
    /var/spool/cron: No such file or directory
    /var/spool/cron: mkdir: No such file or directory


    手詰まりっぽくなってしまいましたが、先ほどの /bin/prepare-mfg.bin はわざわざ root かどうかをチェックしていたのを思い出し root で crontab -l を実行してみる ことにします。
    注) root access するためには、TAC SR を open し、password を発行してもらう 必要があるので、(中の人を除き) 気軽に login できるものではありません。

     

    leaf1# exit
    logout
    Connection to leaf1 closed.
    admin@apic1:~> ssh -l root leaf1
    Password:
    Cisco Nexus Operating System (NX-OS) Software
    TAC support: http://www.cisco.com/tac
    Copyright (c) 2002-2014, Cisco Systems, Inc. All rights reserved.
    The copyrights to certain works contained in this software are
    owned by other third parties and used and distributed under
    license. Certain components of this software are licensed under
    the GNU General Public License (GPL) version 2.0 or the GNU
    Lesser General Public License (LGPL) Version 2.1. A copy of each
    such license is available at
    http://www.opensource.org/licenses/gpl-2.0.php and
    http://www.opensource.org/licenses/lgpl-2.1.php
    leaf1#
    leaf1#
    leaf1# crontab -l | grep bg
    -*/1 * * * * /bin/bg-action.sh
    leaf1#
    leaf1# ls -l /bin/bg-action.sh
    -rwxr-xr-x 1 root root 1585 Jan 17 01:41 /bin/bg-action.sh

    admin ユーザから root ユーザへ ssh でログインしなおし、crontab -l を実行すると、 見つかりました。
    やはり、bg-action.sh を定期的に実行しているようです。

     

    /bin/bg-action.sh

    leaf1# cat -n /bin/bg-action.sh | head -20
         1  #!/bin/bash
         2
         3  for cmd in /tmp/disable-klogs \
         4           /tmp/clear-bootvars \
         5           /tmp/setup-bootvars \
         6           /tmp/prepare-mfg \
         7           /tmp/clear-core \
         8           /tmp/setup-clean-config \
         9           /tmp/setup-admin-ssh
        10  do
        11      if [ -f $cmd ]; then
        12          date >> /tmp/bg_action.out
        13          echo "Running command $cmd" >> /tmp/bg_action.out
        14          new_cmd=$(basename $cmd)
        15          echo "/bin/$new_cmd.sh" >> /tmp/bg_action.out
        16          /bin/$new_cmd.sh `cat $cmd` >> /tmp/bg_action.out
        17          rm -rf $cmd
        18      fi
        19  done
        20

    3 - 9 行目のファイルを順番に読み込み、10 行目以降で処理しているようです。 11 行目で /tmp/hoge というファイルを確認し、存在する場合、/bin/hoge.sh [file の中身] というコマンドを実行しています。
    先ほどまでの処理で、/tmp/prepare-mfg というファイルに aci-n9000-dk9.11.0.2m.bin という内容が 書き込まれているので、16 行目で /bin/prepare-mfg.sh aci-n9000-dk9.11.0.2m.bin が実行されること になります。

    prepare-mfg.sh は /bin/prepare-mfg.sh aci-n9000-dk9.11.0.2m.bin のように使用するので、 振出しに戻ってしまいました。

    ただ、bg-action.sh は cron を使用し、root が実行しているので、今度は if 文にマッチし、 初期化処理を行うことができます。
    また、17 行目で /tmp/prepare-mfg を削除しているので、先ほどの bg_action も終了します。

    まわりくどい処理を行ってきましたが、結局 prepare-mfg.sh を実行すると、誰が実行しても root が処理したのと同じ結果になります。


    ちなみに、上記を見ると prepare-mfg と同様のスクリプトが合計で 7 つ存在することが確認できます。
    ファイル名から setup-bootvars は、grub を書き換えてくれるだけのスクリプトで、setup-clean-config は設定だけを削除してくれるようなスクリプトだということが想像できるかと思います。
    興味があれば実際にスクリプトの中身を読んでみてください。
    ACI には、面倒な作業を一括で行ってくれるスクリプトが複数用意されているので、たまに 探してみると知らないスクリプトに出会うかもしれません。

    ちなみに、setup-bootvars と setup-clean-config は既に下記でも紹介されています。
    https://supportforums.cisco.com/document/12325246/tip-day-how-erase-leaf-spine-configuration-and-restore-factory-defaults

     

    APIC

    Leaf/Spine は /bin/prepare-mfg.sh を用いましたが、APIC を初期化するコマンドは eraseconfig setup になります。
    setup オプションを使用することで、初期出荷時のように、セットアップダイアログ画面が表示され、APIC の初期設定 画面まで戻すことができます。
    このコマンド自体は python で書かれています。

    admin@apic1:~> eraseconfig
        Carriage Return
     setup  Erases the setup data
    
    admin@apic1:~> which eraseconfig
    /controller/bin/eraseconfig
    admin@apic1:~> cat /controller/bin/eraseconfig
    #!/usr/bin/python2.7
    
    try:
        from insieme.cli.executor import main
        main()
    except KeyboardInterrupt:
        pass
    
    admin@apic1:~>

     

    最終的には、下記ファイルが呼び出されています。
    eraseconfig setup を実行し、Y と入力した場合、30 行目の cat /.aci/.system/setup を 実行しているのと同じです。
    /.aci/.system は基本的にユーザが直接アクセスすることは想定していないので、 用意されているコマンドを使用することが一般的ですがスクリプトをたどっていくと 知らなかったコマンドが用意されてることがあるので興味があれば調べてみてください。
     

    admin@apic1:~> cat -n /controller/ishell/cmds/systemcmd/pydefs/eraseconfig.py |
    grep -A 20 "class eraseconfig"
        20  class eraseconfig(Command):
        21
        22      @classmethod
        23      @kbdinterruptsafe
        24      def execute(cls, cmdContext, args, matchedPath):
        25          if args.setup:
        26              c = raw_input("Do you want to cleanup the initial setup data? The system will be REBOOTED. (Y/n): ")
        27              if c != "Y":
        28                  return False
        29
        30              os.system("cat /.aci/.system/setup")
        31              return True
        32
        33          c = raw_input("Do you want to restore this APIC to factory settings? The system will be REBOOTED. (Y/n): ")
        34          if c != "Y":
        35              return False
        36
        37          os.system("cat /.aci/.system/clean")
        38          return True
        39
        40      @classmethod
    admin@apic1:~>
    Getting Started

    検索バーにキーワード、フレーズ、または質問を入力し、お探しのものを見つけましょう

    シスコ コミュニティをいち早く使いこなしていただけるよう役立つリンクをまとめました。みなさんのジャーニーがより良いものとなるようお手伝いします