ManagerConfig.py
Go to the documentation of this file.
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 


openrtm_aist_python
Author(s): Shinji Kurihara
autogenerated on Thu Aug 27 2015 14:17:28