CSVからTera Term Menuを生成するスクリプトを作った

仕事でTera Term Menuを使っているところに出くわしました。
サーバーの管理表はあるのですが、それと別にTera Term Menuがあります。
もらったTera Term Menuがこれまでの消えたサーバーとかIPアドレス変わったやつとかあってやたら多いしつながらない！
というわけで管理表からTera Term Menuを作るスクリプトを作りました。
蓋を開けてみればレジストリをいじるだけなので簡単でした。
しかもレジストリのファイルはini形式のテキストファイル！
面倒なパーサーいらずで作れました。no pip 最高！

一応いっておきますけど**MITライセンスです。無保証です。**

# 使い方

```bash
python csvmenu.py {変換するcsv} 
```
## 例
```bash
python csvmenu.py servers.csv
```
csvの中身はこんな感じです。ただレジストリに投げるやつをあげただけ。

```csv:servers.csv
Name,HostName,Mode,UserFlag,UserName,PasswdFlag,Password,TeraTerm,INI_File,Option,LoginPrompt,PasswdPrompt,MacroFile,TeraTerm Mode,Startup,Log,PrivateKeyFile,Challenge,Pageant
例,192.168.0.1,0,1,admin,1,pass,.\\ttermpro.exe,.\\TERATERM_MENU.INI,/KT=UTF8 /KR=UTF8,login:,password:,C:example.ttl,1,0,C:example.log,C:id_rsa,0,0
```

```python:teraterm_csvmenu.py
import os
import sys
import csv
import configparser

filepath=sys.argv[1]

csv_file = open(filepath , "r", encoding="ms932")
reader = csv.DictReader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True)

def to_dword(s):
  return 'dword:'+str(int(s)).zfill(8) if s else "\"\""

# ttpmenu\winmisc#106参照。疲れた。。。
def encode_password(s):
  return_array=['00']
  for cha in list(s):
    return_array.append('{:02x}'.format(int(cha.encode().hex() ,16) ^ 0xff))
  return ','.join(reversed(return_array))

def to_hex(s):
  return 'hex:'+encode_password(s)

def to_escape(s):
  return "\"{}\"".format(s) if s else "\"\""



default_config={
"HostName":"",
"Mode":"0",
"UserFlag":"0",
"UserName":"",
"PasswdFlag":"0",
"Password":'',
"TeraTerm":".\\ttermpro.exe",
"INI_File":".\\TERATERM.INI",
"Option":"",
"LoginPrompt":"login:",
"PasswdPrompt":"Password:",
"MacroFile":"",
"TeraTerm Mode":"0",
"Startup":"0",
"Log":"",
"PrivateKeyFile":"",
"Challenge":"0",
"Pageant":"0",
}


config = configparser.ConfigParser()

for row in reader:
  if row['Name']=='': continue 
  reg_dir='HKEY_CURRENT_USER\\Software\\ShinpeiTools\\TTermMenu\\'+row['Name']
  config[reg_dir]={}
  config[reg_dir]['HostName']=to_escape(row['HostName'] or default_config['HostName'])
  config[reg_dir]['Mode']=to_dword(row['Mode'] or default_config['Mode'])
  config[reg_dir]['UserFlag']=to_dword(row['UserFlag'] or default_config['UserFlag'])
  config[reg_dir]['UserName']=to_escape(row['UserName'] or default_config['UserName'])
  config[reg_dir]['PasswdFlag']=to_dword(row['PasswdFlag'] or default_config['PasswdFlag'])
  config[reg_dir]['Password']=to_hex(row['Password'] or default_config['Password'])
  config[reg_dir]['TeraTerm']=to_escape(row['TeraTerm'] or default_config['TeraTerm'])
  config[reg_dir]['INI_File']=to_escape(row['INI_File'] or default_config['INI_File'])
  config[reg_dir]['Option']=to_escape(row['Option'] or default_config['Option'])
  config[reg_dir]['LoginPrompt']=to_escape(row['LoginPrompt'] or default_config['LoginPrompt'])
  config[reg_dir]['PasswdPrompt']=to_escape(row['PasswdPrompt'] or default_config['PasswdPrompt'])
  config[reg_dir]['MacroFile']=to_escape(row['MacroFile'] or default_config['MacroFile'])
  config[reg_dir]['TeraTerm Mode']=to_dword(row['TeraTerm Mode'] or default_config['TeraTerm Mode'])
  config[reg_dir]['Startup']=to_dword(row['Startup'] or default_config['Startup'])
  config[reg_dir]['Log']=to_escape(row['Log'] or default_config['Log'])
  config[reg_dir]['PrivateKeyFile']=to_escape(row['PrivateKeyFile'] or default_config['PrivateKeyFile'])
  config[reg_dir]['Challenge']=to_dword(row['Challenge'] or default_config['Challenge'])
  config[reg_dir]['Pageant']=to_dword(row['Pageant'] or default_config['Pageant'])



aaa="""
config['HKEY_CURRENT_USER\Software\ShinpeiTools\TTermMenu\129_SCUL#1'] ={
"HostName":"w27sk-----scul000100",
"Mode":0,
"UserFlag":0,
"UserName":"root",
"PasswdFlag":0,
"Password":b'\x8b\x90\x90\x8d\x00',
"TeraTerm":".\\ttermpro.exe",
"INI_File":".\\TERATERM_MENU.INI",
"Option":"",
"LoginPrompt":"login:",
"PasswdPrompt":"Password:",
"MacroFile":"",
"TeraTerm Mode":1,
"Startup":0,
"Log":"",
"PrivateKeyFile":"",
"Challenge":1,
"Pageant":0,
}
"""

return_str="""Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\ShinpeiTools\TTermMenu]
"IconMode"=dword:00000000
"LeftButtonPopup"=dword:00000001
"Hotkey"=dword:00000000
"MenuTextColor"=dword:00000000
"lfHeight"=dword:fffffff4
"lfWidth"=dword:00000000
"lfEscapement"=dword:00000000
"lfOrientation"=dword:00000000
"lfWeight"=dword:00000190
"lfItalic"=dword:00000000
"lfUnderline"=dword:00000000
"lfStrikeOut"=dword:00000000
"lfCharSet"=dword:00000080
"lfOutPrecision"=dword:00000000
"lfClipPrecision"=dword:00000000
"lfQuality"=dword:00000000
"lfPitchAndFamily"=dword:00000000
"lfFaceName"="MS UI Gothic"

"""


for section in config.sections():
    return_str+="[{}]".format(section)+'\n'
    for key in default_config.keys() :
      return_str+="\"{}\"={}".format(key,config[section][key])+'\n'
    return_str+='\n'

with open(os.path.splitext(os.path.basename(filepath))[0]+'.reg','w') as f:
  f.write(return_str)

```

Tera Term Projectにマージしてもらえればなあ…