00001 #!/usr/bin/env python 00002 # -*- coding: euc-jp -*- 00003 00004 ## 00005 # @file ManagerConfig.py 00006 # @brief RTC manager configuration 00007 # @date $Date: $ 00008 # @author Noriaki Ando <n-ando@aist.go.jp> and Shinji Kurihara 00009 # 00010 # Copyright (C) 2003-2008 00011 # Task-intelligence Research Group, 00012 # Intelligent Systems Research Institute, 00013 # National Institute of 00014 # Advanced Industrial Science and Technology (AIST), Japan 00015 # All rights reserved. 00016 00017 00018 import sys 00019 import os 00020 import re 00021 import getopt 00022 import platform 00023 00024 import OpenRTM_aist 00025 00026 00027 ## 00028 # @if jp 00029 # 00030 # @class ManagerConfig 00031 # @brief Manager configuration クラス 00032 # 00033 # Manager のコンフィギュレーションを行う、コマンドライン引数を受け取り、 00034 # (あるいは引数なしで)インスタンス化される。 00035 # コマンドライン引数で指定された設定ファイル、環境変数などから Manager の 00036 # プロパティ情報を設定する。 00037 # 00038 # 各設定の優先度は以下のとおりである。 00039 # <OL> 00040 # <LI>コマンドラインオプション "-f" 00041 # <LI>環境変数 "RTC_MANAGER_CONFIG" 00042 # <LI>デフォルト設定ファイル "./rtc.conf" 00043 # <LI>デフォルト設定ファイル "/etc/rtc.conf" 00044 # <LI>デフォルト設定ファイル "/etc/rtc/rtc.conf" 00045 # <LI>デフォルト設定ファイル "/usr/local/etc/rtc.conf" 00046 # <LI>デフォルト設定ファイル "/usr/local/etc/rtc/rtc.conf" 00047 # <LI>埋め込みコンフィギュレーション値 00048 #</OL> 00049 # ただし、コマンドラインオプション "-d" が指定された場合は、 00050 # (たとえ -f で設定ファイルを指定しても)埋め込みコンフィギュレーション値 00051 # が使用される。 00052 # 00053 # @since 0.4.0 00054 # 00055 # @else 00056 # 00057 # @class ManagerConfig 00058 # @brief Manager configuration class 00059 # 00060 # Modify Manager's configuration. 00061 # This class receives the command line arguments and will be instantiated. 00062 # Set property information of Manager with the configuration file specified 00063 # by the command line argument or the environment variable etc. 00064 # 00065 # The priorities of each configuration are as follows: 00066 # <OL> 00067 # <LI>Command option "-f" 00068 # <LI>Environment variable "RTC_MANAGER_CONFIG" 00069 # <LI>Default configuration file "./rtc.conf" 00070 # <LI>Default configuration file "/etc/rtc.conf" 00071 # <LI>Default configuration file "/etc/rtc/rtc.conf" 00072 # <LI>Default configuration file "/usr/local/etc/rtc.conf" 00073 # <LI>Default configuration file "/usr/local/etc/rtc/rtc.conf" 00074 # <LI>Embedded configuration value 00075 # </OL> 00076 # If the command option "-d" is specified (even if specify configuration file 00077 # by "-f" option), the embedded configuration values will be used. 00078 # 00079 # @since 0.4.0 00080 # 00081 # @endif 00082 class ManagerConfig : 00083 """ 00084 """ 00085 00086 ## 00087 # @if jp 00088 # @brief Manager コンフィギュレーションのデフォルト・ファイル・パス 00089 # @else 00090 # @brief The default configuration file path for manager 00091 # @endif 00092 config_file_path = ["./rtc.conf", 00093 "/etc/rtc.conf", 00094 "/etc/rtc/rtc.conf", 00095 "/usr/local/etc/rtc.conf", 00096 "/usr/local/etc/rtc/rtc.conf", 00097 None] 00098 00099 00100 ## 00101 # @if jp 00102 # @brief デフォルト・コンフィギュレーションのファイル・パスを識別する 00103 # 環境変数 00104 # @else 00105 # @brief The environment variable to distinguish the default configuration 00106 # file path 00107 # @endif 00108 config_file_env = "RTC_MANAGER_CONFIG" 00109 00110 00111 ## 00112 # @if jp 00113 # 00114 # @brief コンストラクタ 00115 # 00116 # 与えられた引数によりコンフィギュレーション情報の初期化を行う。 00117 # 00118 # @param self 00119 # @param argv コマンドライン引数(デフォルト値:None) 00120 # 00121 # @else 00122 # 00123 # @brief ManagerConfig constructor 00124 # 00125 # The constructor that performs initialization at the same time with 00126 # given arguments. 00127 # 00128 # @param argv The command line arguments 00129 # 00130 # @endif 00131 def __init__(self, argv=None): 00132 00133 self._configFile = "" 00134 self._argprop = OpenRTM_aist.Properties() 00135 self._isMaster = False 00136 if argv: 00137 self.init(argv) 00138 00139 00140 ## 00141 # @if jp 00142 # 00143 # @brief 初期化 00144 # 00145 # コマンドライン引数に応じて初期化を実行する。コマンドラインオプションは 00146 # 以下のものが使用可能である。 00147 # 00148 # -f file : コンフィギュレーションファイルを指定する。<br> 00149 # -l module : ロードするモジュールを指定する。(未実装)<br> 00150 # -o options: その他オプションを指定する。<br> 00151 # -d : デフォルトのコンフィギュレーションを使う。<br> 00152 # 00153 # @param self 00154 # @param argv コマンドライン引数 00155 # 00156 # @else 00157 # 00158 # @brief Initialization 00159 # 00160 # Initialize with command line options. The following command options 00161 # are available. 00162 # 00163 # -f file : Specify a configuration file. <br> 00164 # -l module : Specify modules to be loaded at the beginning. <br> 00165 # -o options: Other options. <br> 00166 # -d : Use default static configuration. <br> 00167 # 00168 # @endif 00169 def init(self, argv): 00170 self.parseArgs(argv) 00171 return 00172 00173 ## 00174 # @if jp 00175 # @brief Configuration 情報を Property に設定する 00176 # 00177 # Manager のConfiguration 情報を指定された Property に設定する。 00178 # 00179 # @param self 00180 # @param prop Configuration 設定対象 Property 00181 # 00182 # @else 00183 # @brief Specify the configuration information to the Property 00184 # 00185 # Configure to the properties specified by Manager's configuration 00186 # 00187 # @endif 00188 def configure(self, prop): 00189 prop.setDefaults(OpenRTM_aist.default_config) 00190 if self.findConfigFile(): 00191 try: 00192 fd = file(self._configFile,"r") 00193 prop.load(fd) 00194 fd.close() 00195 except: 00196 print OpenRTM_aist.Logger.print_exception() 00197 00198 self.setSystemInformation(prop) 00199 if self._isMaster: 00200 prop.setProperty("manager.is_master","YES") 00201 00202 # Properties from arguments are marged finally 00203 prop.mergeProperties(self._argprop) 00204 return prop 00205 00206 00207 ####### 00208 # @if jp 00209 # 00210 # @brief コンフィギュレーションを取得する(未実装) 00211 # 00212 # コンフィギュレーションを取得する。init()呼び出し前に呼ぶと、 00213 # 静的に定義されたデフォルトのコンフィギュレーションを返す。 00214 # init() 呼び出し後に呼ぶと、コマンドライン引数、環境変数等に 00215 # 基づいた初期化されたコンフィギュレーションを返す。 00216 # 00217 # @else 00218 # 00219 # @brief Get configuration value. 00220 # 00221 # This operation returns default configuration statically defined, 00222 # when before calling init() function. When after calling init() function, 00223 # this operation returns initialized configuration value according to 00224 # command option, environment value and so on. 00225 # 00226 # @endif 00227 #def getConfig(self): 00228 #pass 00229 00230 00231 ## 00232 # @if jp 00233 # 00234 # @brief コマンド引数をパースする 00235 # 00236 # -f file : コンフィギュレーションファイルを指定する。<br> 00237 # -l module : ロードするモジュールを指定する。(未実装)<br> 00238 # -o options: その他オプションを指定する。<br> 00239 # -d : デフォルトのコンフィギュレーションを使う。<br> 00240 # 00241 # @param self 00242 # @param argv コマンドライン引数 00243 # 00244 # @else 00245 # 00246 # @brief Parse command arguments 00247 # 00248 # -f file : Specify a configuration file. <br> 00249 # -l module : Specify modules to be loaded at the beginning. <br> 00250 # -o options: Other options. <br> 00251 # -d : Use default static configuration. <br> 00252 # 00253 # @endif 00254 def parseArgs(self, argv): 00255 try: 00256 opts, args = getopt.getopt(argv[1:], "adlf:o:p:") 00257 except getopt.GetoptError: 00258 print OpenRTM_aist.Logger.print_exception() 00259 return 00260 00261 for opt, arg in opts: 00262 if opt == "-a": 00263 self._argprop.setProperty("manager.corba_servant","NO") 00264 00265 if opt == "-f": 00266 self._configFile = arg 00267 00268 if opt == "-l": 00269 pass 00270 00271 if opt == "-o": 00272 pos = arg.find(":") 00273 if pos > 0: 00274 self._argprop.setProperty(arg[:pos],arg[pos+1:]) 00275 00276 if opt == "-p": 00277 num = [-1] 00278 ret = OpenRTM_aist.stringTo(num, arg) 00279 if ret: 00280 arg_ = ":" + arg 00281 self._argprop.setProperty("corba.endpoints",arg_) 00282 00283 if opt == "-d": 00284 self._isMaster = True 00285 pass 00286 00287 return 00288 00289 00290 ## 00291 # @if jp 00292 # 00293 # @brief Configuration file の検索 00294 # 00295 # Configuration file を検索し、設定する。 00296 # 既に Configuration file が設定済みの場合は、ファイルの存在確認を行う。 00297 # 00298 # Configuration file の優先順位<br> 00299 # コマンドオプション指定>環境変数>デフォルトファイル>デフォルト設定 00300 # 00301 # デフォルト強制オプション(-d): デフォルトファイルがあっても無視して 00302 # デフォルト設定を使う 00303 # 00304 # @param self 00305 # 00306 # @return Configuration file 検索結果 00307 # 00308 # @else 00309 # 00310 # @brief Find the configuration file 00311 # 00312 # Find the configuration file and configure it. 00313 # Confirm the file existence when the configuration file has 00314 # already configured. 00315 # 00316 # The priority of the configuration file<br> 00317 # The command option>the environment variable>the default file> 00318 # the default configuration 00319 # 00320 # Default force option(-d): Ignore any default files and use the default 00321 # configuration. 00322 # 00323 # @return Configuration file search result 00324 # 00325 # @endif 00326 def findConfigFile(self): 00327 if self._configFile != "": 00328 if not self.fileExist(self._configFile): 00329 print OpenRTM_aist.Logger.print_exception() 00330 return False 00331 return True 00332 00333 env = os.getenv(self.config_file_env) 00334 if env: 00335 if self.fileExist(env): 00336 self._configFile = env 00337 return True 00338 00339 i = 0 00340 while (self.config_file_path[i]): 00341 if self.fileExist(self.config_file_path[i]): 00342 self._configFile = self.config_file_path[i] 00343 return True 00344 i += 1 00345 00346 return False 00347 00348 00349 ## 00350 # @if jp 00351 # 00352 # @brief システム情報を設定する 00353 # 00354 # システム情報を取得しプロパティにセットする。設定されるキーは以下の通り。 00355 # - manager.os.name : OS名 00356 # - manager.os.release : OSリリース名 00357 # - manager.os.version : OSバージョン名 00358 # - manager.os.arch : OSアーキテクチャ 00359 # - manager.os.hostname: ホスト名 00360 # - manager.pid : プロセスID 00361 # 00362 # @param self 00363 # @param prop システム情報を設定したプロパティ 00364 # 00365 # @else 00366 # 00367 # @brief Set system information 00368 # 00369 # Get the following system info and set them to Manager's properties. 00370 # - manager.os.name : OS name 00371 # - manager.os.release : OS release name 00372 # - manager.os.version : OS version 00373 # - manager.os.arch : OS architecture 00374 # - manager.os.hostname: Hostname 00375 # - manager.pid : process ID 00376 # 00377 # @endif 00378 def setSystemInformation(self, prop): 00379 if sys.platform == 'win32': 00380 sysinfo = platform.uname() 00381 else: 00382 sysinfo = os.uname() 00383 00384 prop.setProperty("manager.os.name", sysinfo[0]) 00385 prop.setProperty("manager.os.hostname", sysinfo[1]) 00386 prop.setProperty("manager.os.release", sysinfo[2]) 00387 prop.setProperty("manager.os.version", sysinfo[3]) 00388 prop.setProperty("manager.os.arch", sysinfo[4]) 00389 prop.setProperty("manager.pid", os.getpid()) 00390 00391 return prop 00392 00393 00394 ## 00395 # @if jp 00396 # @brief ファイルの存在確認 00397 # 00398 # 指定されたファイルが存在するか確認する。 00399 # 00400 # @param self 00401 # @param filename 確認対象ファイル名称 00402 # 00403 # @return 対象ファイル確認結果(存在する場合にtrue) 00404 # 00405 # @else 00406 # @brief Check the file existence 00407 # 00408 # Confirm whether the specified file exists 00409 # 00410 # @param filename The target confirmation file 00411 # 00412 # @return file existance confirmation (True if the file exists.) 00413 # 00414 # @endif 00415 def fileExist(self, filename): 00416 try: 00417 fp = open(filename) 00418 except: 00419 return False 00420 else: 00421 fp.close() 00422 return True 00423 00424 return False 00425 00426