vaccine_gene&breed_gene 対策

今だ流れ着いてくる
vaccine_gene
breed_gene
ですが、mayaScannerをインストールしていると感染前に止めてくれますが
インストールしてなかったり、loadしてなかったりすると感染してしまう。

うっかり感染しちゃったうっかりさんの為に対応策を考える。

**※会社や組織に属していてシステムの人が在籍してる場合は、自分で何とかしないでその人に報告して対処してもらってください。**


処理を確認
--

感染　感染　と言ってるけれども、実際何がどのように処理されているのかを確認してみる。

**1: 感染してるファイルを開く**
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/c4f266da-8f7f-a467-e3f0-968c4224573d.png">

**2: vaccine_gene のスクリプトが実行される**
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/f223a747-62fd-57ca-9e59-5bcab89c06b9.png">

cmds.internalVar(userAppDir=True) + '/scripts' にあるuserSetup.pyに

    import vaccine
    cmds.evalDeferred('leukocyte = vaccine.phage()')
    cmds.evalDeferred('leukocyte.occupation()')

を追記する。存在しない場合は生成する

**3:breed_gene のスクリプトが実行される**
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/225de567-7787-b497-7ac0-3e4425f22a49.png">
vaccine_gene.notesの内容を使用して
cmds.internalVar(userAppDir=True) + '/scripts'　にvaccine.pyを生成する

**4:maya再起動**
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/e82f9272-dbf6-380c-c7a1-095f342cdd9f.png">
userSetup.pyが読み込まれ

    import vaccine
    cmds.evalDeferred('leukocyte = vaccine.phage()')
    cmds.evalDeferred('leukocyte.occupation()')

が起動時に実行される。

それによってスクリプトジョブがシーンに追加される

    cmds.scriptJob(event=["SceneSaved", "leukocyte.antivirus()"], protected=True)


**5:ファイル保存**
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484234/0c7d3030-60ee-15e0-8d60-67b1ad052f7c.png">
vaccine.pyが実行され、**vaccine_gene**　と　**breed_gene**　をシーン内に生成する。

つまり 感染した状況　とは

- vaccine.py　が存在する
- userSetup.py に追記されている

状況の事になる。

対応
--

**1:vaccine.pyの除去**
- 
    cmds.internalVar(userAppDir=True) + '/scripts'

の場所を開き、vaccine.py　と　vaccine.pyc を削除する
最低限これをやっておけば **vaccine_gene**　と　**breed_gene** は生成されなくなる。
ただしuserSetup でコケるようになるので、個人的にuserSetup をカスタムしてる場合には次項も必要。

**2:userSetup.pyの再編集**
-
    cmds.internalVar(userAppDir=True) + '/scripts'

の場所を開き、userSetup.py　の中身を確認。

    import vaccine
    cmds.evalDeferred('leukocyte = vaccine.phage()')
    cmds.evalDeferred('leukocyte.occupation()')

この3行を削除。

1はともかく、2は少しハードルが高いので、まとめてスクリプト化してみる。

    targetPath = cmds.internalVar(userAppDir=True) + '/scripts'

    ##vaccine.py vaccine.pycの削除
    if os.path.exists(targetPath + "/vaccine.py"):
        os.remove(targetPath + "/vaccine.py")
        print("remove " + targetPath + "/vaccine.py")

    if os.path.exists(targetPath + "/vaccine.pyc"):
        os.remove(targetPath + "/vaccine.pyc")
        print("remove " + targetPath + "/vaccine.pyc")

    ##userSetup.py の編集
    ##念のため編集前のファイルをuserSetup_backupとして保存
    if os.path.exists(targetPath + "/userSetup.py"):
        removeLine = [
                    "import vaccine",
                    "cmds.evalDeferred('leukocyte = vaccine.phage()')",
                    "cmds.evalDeferred('leukocyte.occupation()')"
        ]

        output = []    
        health = True
        
        with open(targetPath + "/userSetup.py", "r") as f:
            for line in f:
                line = line.rstrip()

                if line in removeLine:
                    health = False
                else:
                    output.append(line + "\n")                
        f.close()                

        if health == False:
            shutil.copy2(targetPath + "/userSetup.py", targetPath + "/userSetup_backup")
            print("backuped " + targetPath + "/userSetup_backup")            
            with open(targetPath + "/userSetup.py", "w") as f:
                f.writelines(output)
            f.close()        
            print("edited " + targetPath + "/userSetup.py")


ただし、感染状態でmayaを起動してしまっていると

    cmds.scriptJob(event=["SceneSaved", "leukocyte.antivirus()"], protected=True)

これらがアクティブなので、またvaccine.pyが生成されてしまう。

追記

    for i in cmds.scriptJob(listJobs =True):
        if "leukocyte.antivirus()" in i:
            index = int(i.split(":")[0])
            cmds.scriptJob(kill = index, force =True)

対象のスクリプトジョブを除去。