17.08.2015 Views

Veritas Cluster Server Agent 开 发 人 员 指 南

Veritas(TM) Cluster Server Agent 开发人员指南 - Symantec

Veritas(TM) Cluster Server Agent 开发人员指南 - Symantec

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Veritas</strong> <strong>Cluster</strong> <strong>Server</strong><strong>Agent</strong> <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> <strong>指</strong> <strong>南</strong>AIX, Linux, Solaris5.1


<strong>Veritas</strong> <strong>Cluster</strong> <strong>Server</strong> <strong>Agent</strong> <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> <strong>指</strong> <strong>南</strong>本 手 册 所 述 软 件 是 根 据 许 可 协 议 而 提 供 , 仅 可 按 该 协 议 的 条 款 使 用 。产 品 版 本 :5.1文 档 版 本 :5.1.0法 律 声 明Copyright © 2009 Symantec Corporation. © 2009 年 Symantec Corporation 版 权 所有 。 All rights reserved. 保 留 所 有 权 利 。Symantec、 Symantec 徽 标 、 <strong>Veritas</strong> 和 <strong>Veritas</strong> Storage Foundation 是 SymantecCorporation 或 其 附 属 公 司 在 美 国 和 其 他 国 家 / 地 区 的 商 标 或 注 册 商 标 。“Symantec” 和 “ 赛 门 铁 克 ” 是 Symantec Corporation 在 中 国 的 注 册 商 标 。 其 他 名称 可 能 为 其 各 自 所 有 者 的 商 标 , 特 此 声 明 。本 文 档 中 介 绍 的 产 品 根 据 限 制 其 使 用 、 复 制 、 分 <strong>发</strong> 和 反 编 译 / 逆 向 工 程 的 授 权 许 可 协议 分 <strong>发</strong> 。 未 经 Symantec Corporation ( 赛 门 铁 克 公 司 ) 及 其 特 许 <strong>人</strong> ( 如 果 存 在 ) 事先 书 面 授 权 , 不 得 以 任 何 方 式 任 何 形 式 复 制 本 文 档 的 任 何 部 分 。本 文 档 按 “ 现 状 ” 提 供 , 对 于 所 有 明 示 或 暗 示 的 条 款 、 陈 述 和 保 证 , 包 括 任 何 适 销性 、 针 对 特 定 用 途 的 适 用 性 或 无 侵 害 知 识 产 权 的 暗 示 保 证 , 均 不 提 供 任 何 担 保 , 除 非此 类 免 责 声 明 的 范 围 在 法 律 上 视 为 无 效 。 Symantec Corporation ( 赛 门 铁 克 公 司 )不 对 任 何 与 提 供 、 执 行 或 使 用 本 文 档 相 关 的 伴 随 或 后 果 性 损 害 负 责 。 本 文 档 所 含 信 息如 有 更 改 , 恕 不 另 行 通 知 。根 据 FAR 12.212 中 的 定 义 , 授 权 许 可 的 软 件 和 文 档 被 视 为 “ 商 业 计 算 机 软 件 ”, 受FAR 第 52.227-19 节 “Commercial Computer Software - Restricted Rights”( 商 业计 算 机 软 件 受 限 权 利 ) 和 DFARS 第 227.7202 节 “Rights in Commercial ComputerSoftware or Commercial Computer Software Documentation”( 商 业 计 算 机 软 件 或商 业 计 算 机 软 件 文 档 权 利 ) 中 的 适 用 规 定 , 以 及 所 有 后 续 法 规 中 规 定 的 权 利 的 制 约 。美 国 政 府 仅 可 根 据 本 协 议 的 条 款 对 授 权 许 可 的 软 件 和 文 档 进 行 使 用 、 修 改 、 <strong>发</strong> 布 复 制 、执 行 、 显 示 或 披 露 。Symantec Corporation350 Ellis StreetMountain View, CA 94043www.symantec.com/region/cn


技 术 支 持Symantec 技 术 支 持 具 有 全 球 性 支 持 中 心 。 技 术 支 持 的 主 要 任 务 是 响 应 有 关 产 品 特 性和 功 能 的 特 定 查 询 。 技 术 支 持 小 组 还 负 责 创 建 我 们 的 联 机 知 识 库 文 章 。 技 术 支 持 小 组与 Symantec 内 的 其 他 职 能 部 门 相 互 协 作 , 及 时 解 答 您 的 问 题 。 例 如 , 技 术 支 持 小 组与 产 品 工 程 和 Symantec 安 全 响 应 中 心 协 作 , 提 供 警 报 服 务 和 病 毒 定 义 更 新 服 务 。Symantec 提 供 的 维 护 服 务 包 括 :■ 一 系 列 支 持 服 务 , 使 您 能 为 任 何 规 模 的 单 位 选 择 适 用 的 支 持 服 务■ 电 话 和 基 于 Web 的 支 持 , 提 供 快 速 响 应 及 最 新 信 息■ 升 级 保 证 可 提 供 自 动 软 件 升 级 防 护■ 全 天 候 提 供 全 球 支 持■ 高 级 功 能 , 包 括 “ 客 户 管 理 服 务 ”有 关 Symantec 维 护 计 划 的 更 多 信 息 , 请 访 问 我 们 的 网 站 :www.symantec.com/business/support/index.jsp与 技 术 支 持 联 系具 有 有 效 维 护 协 议 的 客 户 可 以 通 过 以 下 网 址 访 问 技 术 支 持 信 息 :www.symantec.com/business/support/contact_techsupp_static.jsp在 联 系 技 术 支 持 之 前 , 请 确 保 您 的 计 算 机 符 合 产 品 文 档 中 所 列 的 系 统 要 求 。 而 且 ,您 应 当 坐 在 <strong>发</strong> 生 问 题 的 计 算 机 旁 边 , 以 便 需 要 时 重 现 问 题 。联 系 技 术 支 持 时 , 请 准 备 好 以 下 信 息 :■ 产 品 版 本 信 息■ 硬 件 信 息■ 可 用 内 存 、 磁 盘 空 间 和 NIC 网 卡 信 息■ 操 作 系 统■ 版 本 和 修 补 程 序 级 别■ 网 络 拓 扑■ 路 由 器 、 网 关 和 IP 地 址 信 息■ 问 题 说 明 :■ 错 误 消 息 和 日 志 文 件■ 联 系 Symantec 之 前 执 行 过 的 故 障 排 除 操 作■ 最 近 所 做 的 软 件 配 置 更 改 和 网 络 更 改授 权 许 可 与 注 册如 果 您 的 Symantec 产 品 需 要 注 册 或 许 可 证 密 钥 , 请 访 问 我 们 的 非 技 术 支 持 网 页 ,网 址 为 :customercare.symantec.com


客 户 服 务文 档 反 馈可 从 以 下 网 站 获 得 客 户 服 务 信 息 :customercare.symantec.com客 户 服 务 可 帮 助 您 解 决 以 下 几 类 问 题 :■ 有 关 产 品 授 权 许 可 或 序 列 号 的 问 题■ 产 品 注 册 更 新 ( 例 如 , 更 改 地 址 或 名 称 )■ 一 般 产 品 信 息 ( 功 能 、 可 用 的 语 言 、 当 地 经 销 商 )■ 有 关 产 品 更 新 和 升 级 的 最 新 信 息■ 有 关 升 级 保 障 和 维 护 合 同 的 信 息■ Symantec 采 购 计 划 的 相 关 信 息■ 有 关 Symantec 技 术 支 持 选 项 的 建 议■ 非 技 术 性 的 售 前 问 题■ 与 光 盘 或 手 册 相 关 的 问 题您 对 产 品 文 档 的 反 馈 对 我 们 很 重 要 。 请 <strong>发</strong> 送 改 进 建 议 和 有 关 错 误 或 疏 漏 的 报 告 。 请 在您 的 报 告 中 包 括 所 报 告 的 文 本 内 容 的 文 档 标 题 和 文 档 版 本 ( 位 于 第 二 页 上 ) 以 及 章节 标 题 。 请 将 反 馈 <strong>发</strong> 送 到 :sfha_docs@symantec.com


维 护 协 议 资 源如 果 想 就 现 有 维 护 协 议 事 宜 联 络 Symantec, 请 通 过 以 下 方 式 联 络 您 所 在 地 区 的 维 护协 议 管 理 部 门 :亚 太 区 和 日 本欧 洲 、 中 东 和 非 洲北 美 洲 和 拉 丁 美 洲customercare_apac@symantec.comsemea@symantec.comsupportsolutions@symantec.com其 他 企 业 服 务Symantec 全 面 提 供 各 种 服 务 以 使 您 能 够 充 分 利 用 您 对 Symantec 产 品 的 投 资 , 并 拓展 您 的 知 识 、 技 能 和 全 球 视 野 , 让 您 在 管 理 企 业 安 全 风 险 方 面 占 据 主 动 。现 有 下 列 企 业 服 务 :Symantec 预 警 解 决 方 案托 管 安 全 服 务 合 作 伙 伴咨 询 服 务这 些 解 决 方 案 提 供 计 算 机 攻 击 的 预 警 、 全 面 的 威 胁 分 析 以 及 防 止 攻 击 <strong>发</strong> 生的 应 对 措 施 。这 些 服 务 消 除 了 管 理 和 监 控 安 全 设 备 和 事 件 的 负 担 , 确 保 能 够 对 实 际 威 胁快 速 响 应 。Symantec 咨 询 服 务 由 Symantec 及 其 可 信 赖 的 合 作 伙 伴 提 供 现 场 专 业 技 术<strong>指</strong> 导 。Symantec 咨 询 服 务 提 供 各 种 预 先 包 装 和 可 自 定 义 的 服 务 选 项 , 其 中包 括 评 估 、 设 计 、 实 施 、 监 控 和 管 理 功 能 , 每 种 功 能 都 注 重 于 建 立 和 维 护您 的 IT 资 源 的 完 整 性 和 可 用 性 。教 育 服 务 教 育 服 务 提 供 全 面 的 技 术 培 训 、 安 全 教 育 、 安 全 认 证 和 安 全 意 识 交 流 计 划 。要 访 问 有 关 企 业 服 务 的 更 多 信 息 , 请 通 过 以 下 URL 访 问 我 们 的 网 站 :www.symantec.com/region/cn从 站 点 索 引 选 择 您 所 在 的 国 家 / 地 区 或 所 用 的 语 言 。


目 录第 1 章第 2 章介 绍关 于 VCS 代 理 .......................................................................................................16代 理 工 作 原 理 .........................................................................................................17关 于 代 理 框 架 .................................................................................................17资 源 类 型 定 义 .................................................................................................17关 于 代 理 函 数 ( 入 口 点 ).............................................................................17关 于 On-Off 资 源 、 On-only 资 源 和 持 久 性 资 源 ......................................18关 于 属 性 .........................................................................................................18关 于 应 用 程 序 有 意 脱 机 .................................................................................21关 于 <strong>开</strong> <strong>发</strong> 代 理 .........................................................................................................22应 用 程 序 的 注 意 事 项 .....................................................................................22代 理 <strong>开</strong> <strong>发</strong> 流 程 高 级 概 述 .................................................................................23代 理 入 口 点 概 述关 于 代 理 入 口 点 .....................................................................................................26支 持 的 入 口 点 .................................................................................................26代 理 框 架 与 入 口 点 进 行 交 互 的 方 式 .............................................................26描 述 的 代 理 入 口 点 .................................................................................................27关 于 monitor 入 口 点 ....................................................................................27关 于 info 入 口 点 ............................................................................................27关 于 online 入 口 点 ........................................................................................29关 于 offline 入 口 点 .......................................................................................29关 于 clean 入 口 点 .........................................................................................30关 于 action 入 口 点 ........................................................................................32关 于 attr_changed 入 口 点 ...........................................................................33关 于 open 入 口 点 ..........................................................................................33关 于 close 入 口 点 ..........................................................................................34关 于 shutdown 入 口 点 .................................................................................34入 口 点 的 返 回 值 .....................................................................................................35使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项 ....................................................................36关 于 VCSAgStartup 例 程 .............................................................................36关 于 代 理 信 息 文 件 .................................................................................................38示 例 代 理 信 息 文 件 (UNIX) ............................................................................38实 现 代 理 XML 信 息 文 件 ...............................................................................41关 于 ArgList 和 ArgListValues 属 性 ..................................................................41注 册 为 V50 及 更 高 版 本 的 代 理 的 ArgListValues 属 性 .............................41


8 目 录名 称 元 组 格 式 的 概 述 ............................................................................. 42关 于 入 口 点 超 时 ............................................................................................. 43注 册 为 V40 及 更 早 版 本 的 代 理 的 ArgListValues 属 性 ............................. 44第 3 章使 用 C++ 创 建 入 口 点关 于 使 用 C++ 创 建 入 口 点 .................................................................................... 48本 章 的 入 口 点 示 例 ......................................................................................... 49数 据 结 构 ................................................................................................................ 50C++ 入 口 点 的 语 法 ................................................................................................ 51C++ VCSAgStartup 的 语 法 .......................................................................... 51C++ monitor 的 语 法 ..................................................................................... 52C++ info 的 语 法 ............................................................................................ 53C++ online 的 语 法 ........................................................................................ 57C++ offline 的 语 法 ........................................................................................ 58C++ clean 的 语 法 .......................................................................................... 59C++ action 的 语 法 ........................................................................................ 60C++ attr_changed 的 语 法 ............................................................................ 62C++ open 的 语 法 ........................................................................................... 64C++ close 的 语 法 .......................................................................................... 64C++ shutdown 的 语 法 .................................................................................. 66代 理 框 架 基 元 ........................................................................................................ 67VCSAgRegisterEPStruct ............................................................................. 67VCSAgSetCookie .......................................................................................... 67VCSAgSetCookie2 ........................................................................................ 67VCSAgRegister ............................................................................................. 69VCSAgUnregister ......................................................................................... 70VCSAgGetCookie .......................................................................................... 71VCSAgStrlcpy ............................................................................................... 72VCSAgStrlcat ................................................................................................ 72VCSAgSnprintf ............................................................................................. 72VCSAgCloseFile ............................................................................................ 72VCSAgDelString ........................................................................................... 72VCSAgExec .................................................................................................... 73VCSAgExecWithTimeout ............................................................................ 74VCSAgGenSnmpTrap .................................................................................. 76VCSAgSendTrap .......................................................................................... 76VCSAgLockFile ............................................................................................. 76VCSAgInitEntryPointStruct ....................................................................... 77VCSAgSetStackSize ..................................................................................... 77VCSAgUnlockFile ......................................................................................... 78VCSAgDisableCancellation ........................................................................ 78VCSAgRestoreCancellation ........................................................................ 78VCSAgSetEntryPoint ................................................................................... 78


目 录9VCSAgValidateAndSetEntryPoint .............................................................78VCSAgSetLogCategory ................................................................................78VCSAgGetProductName .............................................................................79VCSAgIsMonitorLevelOne ..........................................................................79VCSAgIsMonitorLevelTwo .........................................................................79VCSAgMonitorReturn .................................................................................79VCSAgSetResEPTimeout ............................................................................80VCSAgDecryptKey .......................................................................................80VCSAgGetConfDir ........................................................................................80VCSAgGetHomeDir ......................................................................................80VCSAgGetLogDir ..........................................................................................80VCSAgGetSystemName ..............................................................................80用 于 提 供 容 器 支 持 的 代 理 框 架 基 元 .....................................................................81VCSAgISContainerCapable .........................................................................81VCSAgExecInContainerWithTmo .............................................................81VCSAgExecInContainerWithTimeout ......................................................81VCSAgGetUID ...............................................................................................82VCSAgIsPidInContainer ..............................................................................82VCSAgIsProcInContainer ...........................................................................82VCSAgGetContainerID2 ..............................................................................83VCSAgGetContainerName2 ........................................................................83第 4 章第 5 章使 用 脚 本 创 建 入 口 点关 于 使 用 脚 本 创 建 入 口 点 .....................................................................................86使 用 脚 本 入 口 点 的 规 则 .................................................................................86脚 本 入 口 点 的 参 数 和 值 .................................................................................86ArgList 属 性 ..................................................................................................86示 例 .................................................................................................................87脚 本 入 口 点 的 语 法 .................................................................................................88monitor 脚 本 的 语 法 .....................................................................................88online 脚 本 的 语 法 .........................................................................................88offline 脚 本 的 语 法 ........................................................................................88clean 脚 本 的 语 法 ..........................................................................................89action 脚 本 的 语 法 .........................................................................................89attr_changed 脚 本 的 语 法 ............................................................................89info 脚 本 的 语 法 .............................................................................................90open 脚 本 的 语 法 ...........................................................................................90close 脚 本 的 语 法 ...........................................................................................90shutdown 脚 本 的 语 法 ..................................................................................90示 例 脚 本 入 口 点 .....................................................................................................91日 志 记 录 代 理 消 息关 于 日 志 记 录 代 理 消 息 .........................................................................................96在 C++ 和 基 于 脚 本 的 入 口 点 中 的 日 志 记 录 ................................................96


10 目 录代 理 消 息 : 格 式 ............................................................................................. 96C++ 代 理 日 志 记 录 API ......................................................................................... 98C++ 入 口 点 的 代 理 应 用 程 序 日 志 记 录 宏 ..................................................... 98C++ 入 口 点 的 代 理 调 试 日 志 记 录 宏 ............................................................. 99C++ 宏 的 严 重 程 度 参 数 ...............................................................................100使 用 VCSAG_LOG_INIT 初 始 化 function_name ....................................101日 志 类 别 ......................................................................................................101在 某 个 C++ 代 理 中 使 用 的 日 志 记 录 API 的 示 例 ......................................102脚 本 入 口 点 日 志 记 录 函 数 ...................................................................................105在 脚 本 中 使 用 函 数 .......................................................................................106VCSAG_SET_ENVS ....................................................................................106VCSAG_LOG_MSG .....................................................................................108VCSAG_LOGDBG_MSG .............................................................................109脚 本 代 理 中 使 用 的 日 志 记 录 函 数 的 示 例 ...................................................111第 6 章第 7 章构 建 自 定 义 代 理用 于 代 理 <strong>开</strong> <strong>发</strong> 的 文 件 ...........................................................................................114为 自 定 义 代 理 创 建 类 型 定 义 文 件 .......................................................................115类 型 定 义 文 件 的 命 名 约 定 ...........................................................................115创 建 agentTypes.cf 文 件 时 要 满 足 的 要 求 ................................................115例 如 :FileOnOffTypes.cf ..........................................................................115例 如 : 支 持 有 意 脱 机 的 自 定 义 代 理 的 类 型 定 义 .......................................115向 配 置 添 加 自 定 义 类 型 定 义 .......................................................................115在 UNIX 上 构 建 自 定 义 代 理 ...............................................................................116使 用 脚 本 实 现 入 口 点 ...................................................................................116例 如 : 在 UNIX 上 使 用 脚 本 入 口 点 ...........................................................117例 如 : 在 UNIX 上 使 用 VCSAgStartup() 和 脚 本 入 口 点 .........................118使 用 C++ 实 现 入 口 点 ..................................................................................119例 如 : 在 UNIX 上 使 用 C++ 入 口 点 ..........................................................119例 如 : 在 UNIX 上 使 用 C++ 和 脚 本 入 口 点 ..............................................122安 装 自 定 义 代 理 ..................................................................................................125为 自 定 义 资 源 类 型 定 义 资 源 ...............................................................................125示 例 资 源 定 义 ..............................................................................................125测 试 代 理关 于 测 试 代 理 ......................................................................................................128使 用 调 试 消 息 ......................................................................................................128调 试 代 理 函 数 ( 入 口 点 )...........................................................................128调 试 代 理 框 架 ..............................................................................................129使 用 引 擎 进 程 测 试 代 理 .......................................................................................129测 试 命 令 ......................................................................................................130使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理 ..............................................................131


目 录11第 8 章静 态 类 型 属 性关 于 静 态 属 性 .......................................................................................................136改 写 静 态 类 型 属 性 .......................................................................................136静 态 类 型 属 性 定 义 ...............................................................................................137ActionTimeout ............................................................................................137AEPTimeout ................................................................................................137<strong>Agent</strong>Class ...................................................................................................137<strong>Agent</strong>FailedOn ............................................................................................137<strong>Agent</strong>Priority ..............................................................................................137<strong>Agent</strong>ReplyTimeout ..................................................................................138<strong>Agent</strong>StartTimeout ....................................................................................138ArgList .........................................................................................................138AttrChangedTimeout ................................................................................138CleanTimeout .............................................................................................139CloseTimeout ..............................................................................................139ContainerOpts ............................................................................................139ConfInterval ................................................................................................140FaultOnMonitorTimeouts .........................................................................140FireDrill .......................................................................................................141InfoInterval .................................................................................................141InfoTimeout ................................................................................................141IntentionalOffline ......................................................................................141Leveltwomonitorfrequency ......................................................................141LogDbg .........................................................................................................142LogFileSize ..................................................................................................142ManageFaults .............................................................................................142MonitorInterval ..........................................................................................143MonitorStatsParam ...................................................................................143MonitorTimeout .........................................................................................143NumThreads ...............................................................................................144OfflineMonitorInterval .............................................................................144OfflineTimeout ...........................................................................................144OnlineRetryLimit .......................................................................................144OnlineTimeout ...........................................................................................144OnlineWaitLimit ........................................................................................145OpenTimeout ..............................................................................................145Action ...........................................................................................................145RegList .........................................................................................................145RestartLimit ................................................................................................146ScriptClass ..................................................................................................146ScriptPriority ..............................................................................................146SupportedActions ......................................................................................147ToleranceLimit ...........................................................................................147


12 目 录第 9 章第 10 章附 录 A状 态 转 换 图状 态 转 换 ..............................................................................................................150有 关 ManageFaults 属 性 的 状 态 转 换 ................................................................159国 际 化 消 息创 建 SMC 文 件 ....................................................................................................168SMC 格 式 .....................................................................................................168示 例 SMC 文 件 ............................................................................................168设 置 SMC 文 件 的 格 式 ................................................................................169命 名 SMC 文 件 、 BMC 文 件 ......................................................................169消 息 示 例 ......................................................................................................170使 用 格 式 <strong>指</strong> 定 ..............................................................................................170将 SMC 文 件 转 换 为 BMC 文 件 ..........................................................................171存 储 BMC 文 件 ............................................................................................171显 示 BMC 文 件 的 内 容 ................................................................................171使 用 BMC 映 射 文 件 ............................................................................................172BMC 映 射 文 件 的 位 置 .................................................................................172创 建 BMC 映 射 文 件 ....................................................................................172示 例 BMC 映 射 文 件 ....................................................................................172更 新 BMC 文 件 ....................................................................................................173使 用 5.0 之 前 版 本 的 VCS 代 理使 用 5.0 之 前 版 本 的 VCS 代 理 并 将 其 注 册 为 V51 或 更 高 版 本 .....................175将 V40 代 理 更 改 为 V51 的 步 骤 概 述 .........................................................175注 册 为 V51 或 更 高 版 本 的 代 理 的 名 称 值 元 组 格 式 .................................176在 脚 本 入 口 点 中 引 用 ag_i18n_inc 模 块 ...................................................177使 用 4.0 之 前 版 本 的 VCS 代 理 的 准 则 ..............................................................1784.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息 ...........................................................179日 志 标 记 (4.0 之 前 版 本 的 VCS) 到 日 志 严 重 程 度 (VCS 4.0) 的 映 射 .179VCS 4.0 及 更 高 版 本 如 何 显 示 4.0 之 前 版 本 的 VCS 消 息 ........................180将 4.0 之 前 版 本 的 VCS API 与 VCS 4.0 日 志 记 录 宏 进 行 比 较 ...............1804.0 之 前 版 本 的 VCS Message API ....................................................................181VCSAgLogConsoleMsg ..............................................................................181VCSAgLogI18NMsg ...................................................................................182VCSAgLogI18NMsgEx ...............................................................................183VCSAgLogI18NConsoleMsg .....................................................................184VCSAgLogI18NConsoleMsgEx .................................................................185索 引 187


1介 绍■■■关 于 VCS 代 理代 理 工 作 原 理关 于 <strong>开</strong> <strong>发</strong> 代 理


16 介 绍关 于 VCS 代 理关 于 VCS 代 理代 理 是 在 服 务 器 场 环 境 中 用 于 管 理 资 源 ( 如 磁 盘 组 或 装 入 点 ) 的 程 序 。 每 种 资 源类 型 都 需 要 一 个 代 理 。 代 理 通 常 通 过 使 VCS 联 机 、 监 视 其 状 态 或 使 其 脱 机 充 当 VCS与 其 管 理 的 资 源 之 间 的 媒 介 。打 包 到 一 起 VCS 的 代 理 称 为 “ 捆 绑 代 理 ”。 捆 绑 代 理 的 示 例 包 括 IP (Internet 协议 ) 代 理 和 NIC ( 网 络 接 口 卡 ) 代 理 。 有 关 VCS 捆 绑 代 理 的 更 多 信 息 ( 包 括 其 属性 和 运 行 模 式 ), 请 参 见 “Bundled <strong>Agent</strong>s 参 考 <strong>指</strong> <strong>南</strong> ”。与 一 起 使 用 的 产 品 VCS 分 <strong>开</strong> 打 包 的 代 理 称 为 “ 高 可 用 性 代 理 ”。 高 可 用 性 代 理 包 括( 例 如 )Oracle 代 理 。 有 关 如 何 根 据 您 的 配 置 购 买 代 理 的 信 息 , 请 与 Symantec 销售 代 表 联 系 。注 :Symantec 技 术 支 持 部 门 不 支 持 自 定 义 代 理 ( 亦 即 非 Symantec 公 司 <strong>开</strong> <strong>发</strong> 的代 理 )。


介 绍代 理 工 作 原 理17代 理 工 作 原 理关 于 代 理 框 架一 个 代 理 可 以 管 理 单 个 系 统 上 多 个 同 种 类 型 的 资 源 。 例 如 , NIC 代 理 可 管 理 所 有NIC 资 源 。 待 管 理 资 源 是 在 VCS 配 置 内 定 义 的 资 源 。在 承 载 应 用 程 序 的 系 统 上 运 行 的 VCS 后 台 驻 留 程 序 是 HAD。VCS 进 程 HAD 在 系 统 上 启 动 时 , 会 自 动 启 动 系 统 上 待 管 理 的 资 源 类 型 所 需 的 代 理 。该 后 台 驻 留 程 序 为 代 理 提 供 这 些 资 源 的 特 定 配 置 信 息 。代 理 根 据 需 要 执 行 来 自 VCS 的 命 令 使 资 源 联 机 , 监 视 其 状 态 或 使 其 脱 机 。 代 理 崩溃 或 挂 起 时 , VCS 可 检 测 到 该 故 障 并 重 新 启 动 该 代 理 。代 理 框 架 是 编 译 到 每 种 资 源 类 型 的 代 理 中 的 一 组 预 定 义 函 数 。 这 些 函 数 能 够 连 接 到VCS 引 擎 , 也 能 了 解 常 用 配 置 属 性 ( 如 RestartLimit 和 MonitorInterval)。 使 用C++ 构 建 代 理 的 代 码 后 , 用 include 语 句 将 代 理 框 架 编 译 到 该 代 理 中 。 如 果 代 理 是使 用 脚 本 语 言 ( 如 shell 或 Perl) 构 建 的 , 则 所 提 供 的 代 理 二 进 制 文 件 为 :UNIX上 的 Script51<strong>Agent</strong> 或 Windows 上 的 Default<strong>Agent</strong>.dll 提 供 代 理 框 架 函 数 。 代 理框 架 可 处 理 大 量 无 需 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 考 虑 的 复 杂 问 题 。资 源 类 型 定 义每 种 资 源 类 型 的 代 理 都 需 要 一 个 资 源 类 型 定 义 , 该 定 义 用 于 描 述 代 理 控 制 该 类 型 的资 源 所 需 的 信 息 。 可 认 为 该 类 型 定 义 与 C 程 序 中 的 头 文 件 类 似 。 类 型 定 义 用 于 定义 属 性 的 数 据 类 型 , 以 提 供 错 误 检 查 , 并 为 可 影 响 该 类 型 的 所 有 资 源 的 某 些 属 性 提供 默 认 值 。Address 属 性 属 于 为 IP 资 源 类 型 定 义 的 属 性 之 一 , 该 属 性 用 于 存 储 特 定 IP 资 源 的实 际 IP 地 址 。 此 属 性 定 义 为 “ 字 符 串 标 量 ”, 这 是 因 为 使 用 句 号 表 示 IP 地 址 时 ,属 性 的 可 接 受 值 将 变 成 字 符 串 。关 于 代 理 函 数 ( 入 口 点 )入 口 点 是 代 理 对 资 源 执 行 特 定 任 务 时 所 用 的 C++ 函 数 或 脚 本 ( 如 Shell 或 P+erl)。代 理 框 架 支 持 特 定 入 口 点 集 , 其 中 每 个 入 口 点 将 执 行 不 同 的 任 务 并 返 回 。 例 如 ,Online 入 口 点 可 使 资 源 联 机 。请 参 见 第 26 页 的 “ 支 持 的 入 口 点 ”。代 理 使 用 某 种 资 源 类 型 在 该 类 型 的 资 源 上 执 行 所 需 任 务 时 , 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 会 实 现 该资 源 类 型 的 入 口 点 。 例 如 , 在 Mount 资 源 类 型 的 Online 入 口 点 中 , 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong>在 其 中 包 含 了 基 于 提 供 给 入 口 点 的 参 数 装 入 文 件 系 统 的 逻 辑 。 这 些 参 数 是 某 个 特 定资 源 ( 如 装 入 点 、 设 备 名 称 和 装 入 选 项 ) 的 属 性 。 在 Monitor 入 口 点 中 , 代 理 <strong>开</strong><strong>发</strong> <strong>人</strong> <strong>员</strong> 会 检 查 装 入 资 源 的 状 态 , 并 返 回 一 个 代 码 以 <strong>指</strong> 示 该 装 入 资 源 处 于 联 机 状 态 还是 脱 机 状 态 。请 参 见 第 26 页 的 “ 关 于 代 理 入 口 点 ”。


18 介 绍代 理 工 作 原 理关 于 On-Off 资 源 、 On-only 资 源 和 持 久 性 资 源不 同 资 源 类 型 需 要 不 同 控 制 类 型 , 从 而 要 求 实 现 不 同 的 入 口 点 。 资 源 可 分 为On-Off 资 源 、 On-only 资 源 和 持 久 性 资 源 。■■■On-Off 资 源大 多 数 资 源 为 On-Off 资 源 , 这 意 味 着 代 理 会 根 据 需 要 启 动 和 停 止 这 些 资 源 。例 如 , 使 资 源 联 机 时 , VCS 会 向 <strong>指</strong> 定 的 NIC 分 配 IP 地 址 , 而 使 资 源 脱 机 时 ,它 会 删 除 所 分 配 的 IP 地 址 。 另 一 个 示 例 为 DiskGroup 资 源 。 VCS 在 需 要 时 导入 磁 盘 组 , 而 不 再 需 要 时 则 逐 出 该 磁 盘 组 。 On-Off 资 源 的 代 理 可 以 实 现 所 有入 口 点 。On-only 资 源On-only 资 源 会 联 机 , 但 关 联 的 服 务 组 脱 机 时 , 该 资 源 不 会 脱 机 。 例 如 , 对 于FileOnOnly 资 源 , 引 擎 在 需 要 时 创 建 <strong>指</strong> 定 的 文 件 , 但 关 联 的 服 务 组 脱 机 时 不会 删 除 该 文 件 。 on-only 资 源 的 代 理 不 需 要 也 不 会 调 用 offline 入 口 点 。持 久 性 资 源不 能 使 持 久 性 资 源 联 机 或 脱 机 , 但 配 置 中 必 须 提 供 该 资 源 才 能 对 资 源 进 行 监视 。 例 如 , 无 法 启 动 或 停 止 NIC 资 源 , 但 该 资 源 必 须 正 在 运 行 , 关 联 的 IP 地址 才 能 正 常 工 作 。 代 理 将 监 视 持 久 性 资 源 以 确 保 其 状 态 和 运 行 正 常 。 持 久 性 资源 的 代 理 不 需 要 也 不 会 调 用 online 或 offline 入 口 点 。 该 代 理 仅 使 用 monitor入 口 点 。关 于 属 性VCS 具 有 以 下 类 型 的 属 性 , 具 体 类 型 取 决 于 应 用 该 属 性 的 对 象 。资 源 类 型 属 性 与 VCS 中 的 资 源 类 型 关 联 的 属 性 。 这 些 属 性 可 以 进 一 步 分 为 :■ Type-independent - 所 有 代 理 ( 或 资 源 类 型 ) 都 了 解 的 属 性 。 例 如 :RestartLimit 和 MonitorInterval; 可 以 为 任 意 资 源 类 型 设 置 这 些 属 性 。通 常 , 会 为 特 定 类 型 的 所 有 资 源 设 置 这 些 属 性 。 例 如 , 如 果 为 IP 资 源类 型 设 置 MonitorInterval, 则 同 一 值 会 应 用 到 IP 类 型 的 所 有 资 源 。您 还 可 以 覆 盖 这 些 属 性 的 值 , 也 就 是 说 , 可 以 为 该 类 型 的 每 个 资 源 配置 不 同 的 属 性 值 。■ Type-dependent - 适 用 于 特 定 资 源 类 型 的 属 性 。例 如 :MountPath 属 性 只 应 用 于 Mount 资 源 类 型 。 Address 属 性 只 适用 于 IP 资 源 类 型 。在 types 文 件 (types.platform. xml) 中 定 义 的 属 性 会 应 用 于 该 资 源 类 型的 所 有 资 源 。 在 配 置 资 源 时 , 您 可 以 向 这 些 属 性 <strong>指</strong> 定 特 定 于 资 源 的 值 ,这 将 显 示 在 main.cf 文 件 中 。例 如 , FileOnOff 资 源 类 型 的 PathName 属 性 与 类 型 相 关 , 在 配 置 时 ,该 属 性 可 采 用 特 定 于 资 源 的 值 。■ Static - 这 些 属 性 应 用 于 所 有 资 源 类 型 , 且 每 个 资 源 类 型 都 有 一 个 不 同的 值 。 可 以 覆 盖 这 些 static 属 性 , 并 为 其 <strong>指</strong> 派 特 定 于 资 源 的 值 。 这 些属 性 使 用 词 语 static 作 为 前 缀 , 并 且 不 包 括 在 资 源 的 参 数 列 表 中 。


介 绍代 理 工 作 原 理19属 性 数 据 类 型VCS 支 持 以 下 属 性 数 据 类 型 。字 符 串字 符 串 为 字 符 的 序 列 。 如 果 字 符 串 包 含 双 引 号 , 则 必 须 在 双 引 号 的 正 前 方使 用 反 斜 杠 。 在 字 符 串 中 , 反 斜 杠 使 用 \\ 表 示 。 如 果 字 符 串 以 字 母 <strong>开</strong> 头 且只 包 含 字 母 、 数 字 、 短 划 线 (-) 和 下 划 线 (_), 则 不 需 要 引 号 。 例 如 , 定 义 网络 接 口 的 字 符 串 ( 如 hme0 或 eth0) 就 不 需 要 引 号 , 因 为 该 字 符 串 中 只 包含 字 母 和 数 字 。 而 定 义 IP 地 址 的 字 符 串 中 包 含 句 点 , 因 此 需 要 引 号 , 例如 :“192.168.100.1”整 型布 尔 型带 符 号 整 型 常 数 是 一 组 从 0 到 9 的 数 字 。 这 些 数 字 的 前 面 可 以 带 短 划 线 , 且以 十 进 制 数 表 示 。 整 型 值 不 能 超 出 32 位 的 带 符 号 整 数 值 :21471183247。布 尔 型 值 是 一 个 整 数 , 可 能 的 值 包 括 0 (false) 和 1 (true)。属 性 维 数VCS 属 性 具 有 以 下 维 数 。标 量 标 量 只 有 一 个 值 。例 如 :MountPoint = "/Backup"向 量 向 量 是 值 的 有 序 列 表 。 使 用 以 零 <strong>开</strong> 头 的 正 整 数 作 为 各 个 值 的 索 引 。可 以 使 用 逗 号 (,) 或 分 号 (;) 分 隔 这 些 值 。属 性 名 称 后 面 的 一 对 方 括 号 ([]) 表 示 该 维 数 是 一 个 向 量 。代 理 的 类 型 定 义 文 件 的 示 例 片 段 :str BackupSys[]当 在 main.cf 配 置 文 件 中 为 向 量 属 性 分 配 了 值 时 , 该 属 性 定 义 可 能 如 下 所 示 :BackupSys[] = { sysA, sysB, sysC }例 如 , 代 理 的 ArgList 定 义 为 :static str ArgList[] = {RVG, DiskGroup, Primary, SRL,Links}


20 介 绍代 理 工 作 原 理键 列 表 键 列 表 是 字 符 串 的 无 序 列 表 , 在 该 列 表 中 每 个 字 符 串 都 唯 一 。可 以 使 用 逗 号 (,) 或 分 号 (;) 分 隔 这 些 值 。例 如 , 要 <strong>指</strong> 定 将 在 其 上 使 用 VCS 启 动 服 务 组 的 系 统 的 列 表 ( 通 常 在 系 统 引导 时 ), 可 采 用 以 下 方 法 :AutoStartList = {SystemA; SystemB; SystemC}例 如 :keylist BackupVols = {}当 在 main.cf 文 件 中 为 键 列 表 属 性 分 配 了 值 时 , 键 列 表 属 性 可 能 如 下 所 示 :BackupVols = { vol1, vol2 }关 联 关 联 是 名 称 - 值 对 的 无 序 列 表 。可 以 使 用 逗 号 (,) 或 分 号 (;) 分 隔 这 些 值 。属 性 名 称 后 面 的 一 对 大 括 号 ({}) 表 示 该 属 性 是 关 联 。例 如 , 要 <strong>指</strong> 定 配 置 为 要 运 行 服 务 组 的 系 统 和 系 统 优 先 级 的 列 表 :SystemList = {SystemA=1, SystemB=2, SystemC=3}例 如 :int BackupSysList {}当 在 main.cf 文 件 中 为 关 联 属 性 分 配 了 值 时 , 关 联 属 性 可 能 如 下 所 示 :BackupSysList{} = { sysa=1, sysb=2, sysc=3 }属 性 在 系 统 上 的 作 用 域 : 全 局 属 性 和 本 地 属 性如 果 在 配 置 有 服 务 组 的 所 有 系 统 上 , 属 性 具 有 相 同 的 值 , 则 该 属 性 的 作 用 域 为“ 全 局 ”。 按 各 个 系 统 应 用 值 的 属 性 的 作 用 域 是 “ 本 地 ”。at 运 算 符 (@) 表 示 某 个 局 部 值 应 用 到 的 系 统 。在 以 下 MultiNICA 资 源 类 型 示 例 中 , 本 地 应 用 的 属 性 由 属 性 名 称 后 的 @system表 示 :MultiNICA mnic (Device@sysa = { le0 = "166.98.16.103", qfe3 ="166.98.16.105" }Device@sysb = { le0 = "166.98.16.104", qfe3 ="166.98.16.106" }NetMask = "255.255.255.0"ArpDelay = 5RouteOptions@sysa = "default 166.98.16.103 0"RouteOptions@sysb = "default 166.98.16.104 0")在 上 述 示 例 中 , NetMask 属 性 的 值 在 所 有 系 统 上 均 为 255.255.255.0, 而 Device属 性 和 RouteOptions 属 性 的 值 在 sysa 和 sysb 上 不 同 。


介 绍代 理 工 作 原 理21属 性 生 命 周 期 : 临 时 属 性可 以 在 types 文 件 中 定 义 临 时 属 性 。 只 要 VCS HAD 进 程 处 于 运 行 状 态 , 临 时 属性 的 值 就 会 一 直 保 留 在 内 存 中 。 但 在 重 新 启 动 HAD 进 程 时 , 临 时 属 性 的 值 将 不可 用 。因 为 这 些 属 性 值 没 有 存 储 在 main.cf 文 件 中 。临 时 属 性 不 能 转 换 为 永 久 属 性 , 反 之 亦 然 。 保 存 配 置 时 , VCS 会 将 临 时 属 性 定 义及 其 默 认 值 保 存 在 类 型 定 义 文 件 中 。只 有 在 VCS 处 于 运 行 状 态 时 , 才 能 修 改 属 性 值 。关 于 应 用 程 序 有 意 脱 机当 某 个 应 用 程 序 失 去 VCS 的 控 制 而 被 有 意 关 闭 时 , 某 些 代 理 可 以 识 别 出 来 。如 果 管 理 <strong>员</strong> 有 意 关 闭 了 失 去 VCS 控 制 的 应 用 程 序 , VCS 不 会 将 其 视 为 故 障 。 根 据服 务 组 中 其 他 资 源 的 状 态 , VCS 可 将 服 务 组 状 态 设 置 为 offline 或 partial。通 过 此 功 能 , 管 理 <strong>员</strong> 能 够 停 止 应 用 程 序 而 不 会 导 致 故 障 转 移 。请 参 见 第 141 页 的 “IntentionalOffline”。


22 介 绍关 于 <strong>开</strong> <strong>发</strong> 代 理关 于 <strong>开</strong> <strong>发</strong> 代 理应 用 程 序 的 注 意 事 项在 创 建 代 理 之 前 , 需 要 考 虑 一 些 注 意 事 项 并 制 定 规 划 , 尤 其 需 要 考 虑 为 其 创 建 代 理的 资 源 类 型 。为 其 <strong>开</strong> <strong>发</strong> VCS 代 理 的 应 用 程 序 必 须 可 受 该 代 理 控 制 , 并 可 在 服 务 器 场 环 境 下 运行 。 以 下 条 件 描 述 了 可 在 服 务 器 场 中 成 功 运 行 的 应 用 程 序 :■■该 应 用 程 序 必 须 可 由 某 个 已 定 义 的 过 程 启 动 。 必 须 提 供 一 些 方 法 来 启 动 该 应 用程 序 的 外 部 资 源 ( 如 用 来 存 储 数 据 库 的 文 件 系 统 , 或 用 于 侦 听 器 进 程 的 IP 地址 等 )。应 用 程 序 的 每 个 实 例 必 须 能 够 由 某 个 已 定 义 的 过 程 停 止 。 不 得 影 响 该 应 用 程 序的 其 他 实 例 。■ 如 果 需 要 , 应 用 程 序 须 能 强 制 彻 底 停 止 。■■■■必 须 能 够 单 独 监 视 应 用 程 序 的 每 个 实 例 。 监 视 可 以 是 简 单 的 ; 也 可 以 是 深 入的 , 以 便 在 应 用 程 序 运 行 时 获 得 较 高 的 信 任 级 别 。 监 视 过 程 与 应 用 程 序 用 户 的实 际 活 动 类 似 时 , 可 更 有 效 地 监 视 应 用 程 序 。为 实 现 故 障 转 移 功 能 , 应 用 程 序 必 须 能 够 将 数 据 存 储 在 共 享 磁 盘 上 而 非 本 地 存储 或 存 储 于 内 存 中 , 且 每 个 系 统 都 必 须 能 够 访 问 该 数 据 以 及 运 行 该 应 用 程 序 所需 的 全 部 信 息 。应 用 程 序 必 须 具 有 崩 溃 容 错 性 。 它 必 须 能 够 在 崩 溃 的 系 统 上 运 行 , 并 能 够 在 某个 状 态 已 知 的 故 障 转 换 节 点 上 启 动 。 这 通 常 意 味 着 数 据 会 定 期 写 入 共 享 存 储 中而 非 存 储 到 内 存 中 。应 用 程 序 在 服 务 器 场 内 必 须 独 立 于 主 机 ; 也 就 是 说 , 没 有 会 妨 碍 成 功 进 行 故障 转 移 的 授 权 要 求 或 主 机 名 依 赖 关 系 。■ 应 用 程 序 必 须 能 够 与 服 务 器 场 中 的 其 他 应 用 程 序 一 起 正 确 运 行 。


介 绍关 于 <strong>开</strong> <strong>发</strong> 代 理23代 理 <strong>开</strong> <strong>发</strong> 流 程 高 级 概 述以 下 几 章 中 的 示 例 将 介 绍 创 建 和 实 现 代 理 的 步 骤 。<strong>开</strong> <strong>发</strong> 入 口 点决 定 是 使 用 C++ 代 码 、 脚 本 还 是 使 用 两 者 的 组 合 来 实 现 代 理 。请 参 见 第 36 页 的 “ 使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项 ”。创 建 入 口 点 。请 参 见 第 3 章 的 “ 使 用 C++ 创 建 入 口 点 ”。请 参 见 第 4 章 的 “ 使 用 脚 本 创 建 入 口 点 ”。构 建 代 理构 建 代 理 、 创 建 所 需 文 件 并 将 代 理 放 到 特 定 目 录 下 。types 文 件 包 含 随 VCS 捆 绑 的 资 源 类 型 的 定 义 。 文 件 名 为 :types.cf自 定 义 的 资 源 类 型 定 义 应 放 置 在 <strong>指</strong> 定 了 自 定 义 资 源 的 名 称 的 文 件 中 。 例 如 :MyResourceTypes.cf在 VCS 配 置 文 件 main.cf 中 , 通 过 一 个 include 语 句 引 用 了 该 文 件 。请 参 见 第 115 页 的 “ 为 自 定 义 代 理 创 建 类 型 定 义 文 件 ”。有 关 资 源 类 型 定 义 的 更 多 信 息 , 请 参 见第 113 页 的 第 6 章 ,“ 构 建 自 定 义 代 理 ” 。提 供 以 下 示 例 文 件 以 构 建 代 理 。测 试 代 理使 用 <strong>Agent</strong> <strong>Server</strong> 实 用 程 序 或 通 过 在 配 置 中 定 义 资 源 类 型 来 测 试 代 理 。请 参 见 第 127 页 的 第 7 章 ,“ 测 试 代 理 ” 。


24 介 绍关 于 <strong>开</strong> <strong>发</strong> 代 理


2代 理 入 口 点 概 述■■■■■■关 于 代 理 入 口 点描 述 的 代 理 入 口 点入 口 点 的 返 回 值使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项关 于 ArgList 和 ArgListValues 属 性关 于 代 理 信 息 文 件


26 代 理 入 口 点 概 述关 于 代 理 入 口 点关 于 代 理 入 口 点<strong>开</strong> <strong>发</strong> 代 理 涉 及 <strong>开</strong> <strong>发</strong> 该 代 理 可 以 调 用 以 对 资 源 执 行 操 作 ( 如 使 资 源 联 机 、 使 资 源 脱机 或 监 视 资 源 ) 的 “ 入 口 点 ”。支 持 的 入 口 点代 理 框 架 支 持 下 列 入 口 点 :■■■■■■■■■■monitor - 确 定 资 源 的 状 态info - 提 供 关 于 联 机 资 源 的 信 息online - 使 资 源 联 机offline - 使 资 源 脱 机clean - 终 止 正 在 进 行 的 与 资 源 关 联 的 任 务action - 为 资 源 启 动 一 个 已 定 义 的 操 作attr_changed - 对 资 源 的 属 性 值 更 改 作 出 响 应open - 在 代 理 <strong>开</strong> 始 管 理 某 个 资 源 之 前 初 始 化 该 资 源close - 在 代 理 停 止 管 理 某 个 资 源 之 前 取 消 初 始 化 该 资 源shutdown - 当 代 理 关 闭 时 调 用请 参 见 第 27 页 的 “ 描 述 的 代 理 入 口 点 ”。代 理 框 架 与 入 口 点 进 行 交 互 的 方 式代 理 框 架 确 保 一 次 只 有 一 个 入 口 点 为 给 定 的 资 源 运 行 。 如 果 接 收 到 多 个 请 求 或 为 同一 资 源 安 排 了 多 个 事 件 , 则 代 理 会 为 其 排 队 并 一 次 处 理 它 们 中 的 一 个 。 该 行 为 的 一个 例 外 情 况 是 优 化 , 此 时 代 理 框 架 会 为 已 经 处 于 监 视 中 的 资 源 或 已 暂 停 监 视 请 求 的资 源 放 弃 内 部 生 成 的 periodic monitoring 请 求 。代 理 框 架 是 多 线 程 的 。 这 意 味 着 一 个 代 理 进 程 可 以 同 时 为 多 个 资 源 运 行 入 口 点 。 但是 , 如 果 代 理 收 到 使 给 定 资 源 脱 机 的 请 求 , 并 且 同 时 收 到 关 闭 它 的 请 求 , 则 它 会 首先 调 用 offline 入 口 点 。 仅 在 offline 请 求 返 回 或 超 时 后 才 会 调 用 close 入 口点 。 如 果 一 个 资 源 收 到 offline 请 求 , 而 另 一 个 资 源 收 到 close 请 求 , 则 该 代理 可 以 同 时 调 用 它 们 。代 理 框 架 支 持 的 入 口 点 将 在 以 下 几 节 中 进 行 介 绍 。 除 monitor 之 外 , 其 他 入 口 点都 是 可 选 的 。 每 个 入 口 点 都 可 以 使 用 C++ 或 脚 本 实 现 。


代 理 入 口 点 概 述描 述 的 代 理 入 口 点27描 述 的 代 理 入 口 点关 于 monitor 入 口 点本 节 详 细 介 绍 每 个 入 口 点 。monitor 入 口 点 通 常 包 含 用 于 确 定 资 源 状 态 的 逻 辑 。 例 如 , IP 代 理 的 monitor入 口 点 会 检 查 是 否 已 配 置 IP 地 址 并 返 回 online、 offline 或 unknown 状 态 。注 : 该 入 口 点 是 强 制 的 。代 理 框 架 在 完 成 online 和 offline 入 口 点 之 后 , 会 调 用 monitor 入 口 点 以 确定 使 资 源 联 机 或 脱 机 是 否 有 效 。 代 理 框 架 还 会 定 期 调 用 此 入 口 点 以 检 测 资 源 是 否 已联 机 或 意 外 脱 机 。默 认 情 况 下 , 当 资 源 处 于 联 机 状 态 时 , monitor 入 口 点 每 六 十 秒 运 行 一 次(MonitorInterval 属 性 的 默 认 值 )。当 预 期 某 个 资 源 脱 机 时 , 该 入 口 点 每 300 秒 运 行 一 次(OfflineMonitorInterval 属 性 的 默 认 值 )。monitor 入 口 点 接 受 资 源 名 称 和 ArgList 属 性 值 作 为 输 入 ( 请 参 见 第 138 页 的“ArgList 引 用 属 性 ”)。入 口 点 将 返 回 资 源 状 态 和 信 任 级 别 。请 参 见 第 35 页 的 “ 入 口 点 的 返 回 值 ”。只 有 在 资 源 状 态 为 联 机 时 , 入 口 点 才 会 返 回 信 任 级 别 。 信 任 级 别 仅 提 供 信 息 , 并 不供 引 擎 使 用 。 可 通 过 测 试 ConfidenceLevel 属 性 的 值 时 引 用 该 信 任 级 别 。C++ 入 口 点 可 以 返 回 一 个 0-100 的 信 任 级 别 。 脚 本 入 口 点 会 将 状 态 和 信 任 级 别 组 合到 一 个 数 字 中 。请 参 见 第 88 页 的 “ 脚 本 入 口 点 的 语 法 ”。关 于 info 入 口 点info 入 口 点 使 代 理 可 以 获 取 关 于 联 机 资 源 的 信 息 。 例 如 , Mount 代 理 的 info 入口 点 可 以 用 于 报 告 文 件 系 统 中 的 可 用 空 间 。 info 入 口 点 收 集 的 所 有 信 息 都 存 储 在temp 属 性 ResourceInfo 中 。请 参 见 第 28 页 的 “ 关 于 ResourceInfo 属 性 ”。有 关 temp 属 性 的 信 息 , 请 参 见 “ 管 理 <strong>指</strong> <strong>南</strong> ”。


28 代 理 入 口 点 概 述描 述 的 代 理 入 口 点通 过 使 用 以 下 命 令 添 加 或 更 新 其 他 名 称 - 值 对 ,( 脚 本 ) 入 口 点 还 可 以 修 改 资 源 的ResourceInfo 属 性 :hares -modify res ResourceInfo -add key value或hares -modify res ResourceInfo -update key value有 关 修 改 字 符 串 关 联 属 性 的 值 的 更 多 信 息 , 请 参 考 hares 手 册 页 。请 参 见 第 28 页 的 “ 关 于 ResourceInfo 属 性 ”。请 参 见 第 51 页 的 “C++ 入 口 点 的 语 法 ”。Info 入 口 点 的 返 回 值■■如 果 info 入 口 点 退 出 时 返 回 0 ( 成 功 ), 则 会 将 在 脚 本 入 口 点 的 标 准 输 出 上 获得 的 输 出 或 C++ 入 口 点 的 info_output 参 数 的 内 容 转 储 到 ResourceInfo 属性 的 Msg 键 中 。 仅 当 info 入 口 点 成 功 时 , 才 会 更 新 Msg 键 。 State 键 的 值 设置 为 :Valid。如 果 入 口 点 退 出 时 返 回 非 零 值 , 则 会 更 新 ResourceInfo 以 <strong>指</strong> 示 该 错 误 ; 将忽 略 脚 本 的 标 准 输 出 或 C++ 入 口 点 的 info_output。State 键 的 值 设 置 为 :Invalid。 错 误 消 息 将 写 入 代 理 的 日 志 文 件 。■ 如 果 info 入 口 点 超 时 , 则 会 忽 略 入 口 点 的 输 出 。 State 键 的 值 设 置 为 :Invalid。 错 误 消 息 将 写 入 代 理 的 日 志 文 件 。■如 果 用 户 终 止 了 info 入 口 点 ( 例 如 , kill -15 pid), 则 会 将 State 键 的值 设 置 为 :Invalid。 错 误 消 息 将 写 入 代 理 的 日 志 文 件 。请 参 见 第 96 页 的 “ 关 于 日 志 记 录 代 理 消 息 ”。■ 如 果 调 用 该 入 口 点 的 资 源 脱 机 或 出 现 故 障 , 则 会 将 State 键 的 值 设 置 为 :Stale。■如 果 没 有 实 现 info 入 口 点 , 则 会 将 State 键 的 值 设 置 为 :Stale。 错 误 消息 将 写 入 代 理 的 日 志 文 件 。关 于 ResourceInfo 属 性ResourceInfo 属 性 是 一 个 用 于 存 储 名 称 - 值 对 的 字 符 串 关 联 。 默 认 情 况 下 , 这 样的 名 称 - 值 对 有 以 下 三 种 :■State <strong>指</strong> 示 包 含 在 ResourceInfo 属 性 中 的 信 息 的 状 态 (Valid、 Invalid或 Stale)。■ Msg <strong>指</strong> 示 info 入 口 点 的 输 出 ( 如 果 有 )。■ TS <strong>指</strong> 示 上 次 更 新 ResourceInfo 属 性 时 的 时 间 戳 。


代 理 入 口 点 概 述描 述 的 代 理 入 口 点29这 些 键 仅 能 通 过 代 理 框 架 更 新 , 不 能 通 过 入 口 点 更 新 。 该 入 口 点 可 以 定 义 和 添 加 其他 键 ( 名 称 - 值 对 ), 并 更 新 它 们 。ResourceInfo ( 字 符 串 关 联 ) 是 一 个 临 时 属 性 , 对 于 故 障 转 移 组 , 引 擎 会 将 其作 用 域 设 置 为 全 局 , 对 于 并 行 组 , 引 擎 会 将 其 作 用 域 设 置 为 本 地 。 由 于ResourceInfo 是 一 个 临 时 属 性 , 所 以 永 远 不 会 将 其 值 转 储 到 配 置 文 件 。ResourceInfo 的 值 可 通 过 使 用 hares 命 令 来 显 示 。 hares -display 的 输 出 显示 当 前 值 的 前 20 个 字 符 ;hares -value resource ResourceInfo 的 输 出 显 示键 列 表 中 的 所 有 名 称 - 值 对 。调 用 info 入 口 点 的 资 源 必 须 处 于 联 机 状 态 。当 某 个 资 源 脱 机 或 出 现 故 障 时 , 会 将 State 键 标 记 为 Stale, 因 为 该 信 息 不 是 最 新的 。 如 果 info 入 口 点 异 常 退 出 , 则 会 将 State 键 标 记 为 Invalid, 因 为 已 知 并 不是 所 有 信 息 都 是 有 效 的 。 其 他 键 数 据 ( 包 括 Msg 和 TS 键 ) 不 会 被 改 变 。 可 以 通过 使 用 hares -flushinfo 命 令 手 动 清 除 ResourceInfo 属 性 的 值 。 该 命 令 会删 除 ResourceInfo 属 性 的 任 何 可 选 的 键 并 将 这 三 个 强 制 键 设 置 为 其 默 认 值 。请 参 见 hares 手 册 页 。关 于 online 入 口 点关 于 offline 入 口 点调 用 info 入 口 点可 以 从 命 令 行 使 用 hares -refreshinfo 命 令 为 给 定 的 联 机 资 源 调 用 info 入 口 点 。通 过 将 InfoInterval 属 性 设 置 为 某 个 非 零 值 , 可 以 将 代 理 配 置 为 定 期 为 某 个 联机 资 源 调 用 info 入 口 点 。请 参 见 第 141 页 的 “InfoInterval”。online 入 口 点 通 常 包 含 使 资 源 联 机 的 代 码 。 例 如 ,IP 代 理 的 online 入 口 点 可 配置 IP 地 址 。 联 机 过 程 完 成 后 , 代 理 框 架 会 自 动 调 用 monitor 入 口 点 以 验 证 资 源 是否 联 机 。online 入 口 点 将 资 源 名 称 和 ArgList 属 性 值 作 为 输 入 接 收 。 它 会 返 回 一 个 整数 , <strong>指</strong> 示 等 待 联 机 生 效 所 需 的 秒 数 。 标 准 的 返 回 值 为 0。 如 果 该 返 回 值 不 为 零 ,则 该 代 理 框 架 会 等 待 该 返 回 值 <strong>指</strong> 示 的 秒 数 , 为 该 资 源 调 用 monitor 入 口 点 。offline 入 口 点 可 以 使 资 源 脱 机 。 例 如 , IP 代 理 的 offline 入 口 点 将 从 系 统 中删 除 一 个 IP 地 址 。 脱 机 过 程 完 成 后 , 框 架 会 自 动 调 用 monitor 入 口 点 以 验 证 资 源是 否 脱 机 。offline 入 口 点 将 资 源 名 称 和 ArgList 属 性 值 作 为 输 入 接 收 。 它 会 返 回 一 个 整数 , <strong>指</strong> 示 等 待 脱 机 生 效 所 需 的 秒 数 。 典 型 的 返 回 值 是 0。 如 果 返 回 值 不 为 零 , 则 代理 框 架 会 等 待 返 回 值 <strong>指</strong> 示 的 秒 数 以 为 该 资 源 调 用 monitor 入 口 点 。


30 代 理 入 口 点 概 述描 述 的 代 理 入 口 点关 于 clean 入 口 点当 必 须 终 止 与 某 资 源 关 联 的 所 有 正 在 进 行 的 任 务 时 以 及 必 须 使 该 资 源 脱 机 时 ( 可能 是 强 制 的 ), 代 理 框 架 会 调 用 clean 入 口 点 。 该 入 口 点 将 资 源 名 称 、 描 述 为 何调 用 该 入 口 点 的 编 码 原 因 和 ArgList 属 性 值 作 为 输 入 接 收 。 如 果 该 操 作 成 功 , 它必 定 返 回 0; 如 果 该 操 作 失 败 , 它 必 定 返 回 1。调 用 该 入 口 点 的 原 因 是 根 据 以 下 的 enum 类 型 进 行 编 码 的 :enum VCSAgWhyClean {VCSAgCleanOfflineHung,VCSAgCleanOfflineIneffective,VCSAgCleanOnlineHung,VCSAgCleanOnlineIneffective,VCSAgCleanUnexpectedOffline,VCSAgCleanMonitorHung};对 于 基 于 脚 本 的 Clean 入 口 点 , 会 将 Clean 原 因 作 为 一 个 整 数 传 递 :0 => offline hung1 => offline ineffective2 => online hung3 => online ineffective4 => unexpected offline5 => monitor hung以 上 是 一 个 enum 类 型 , 因 此 会 传 递 相 同 的 整 数 值 , 而 与 该 入 口 点 是 使 用 C++ 编写 的 还 是 基 于 脚 本 的 无 关 。■■■■■■VCSAgCleanOfflineHungoffline 入 口 点 在 预 期 的 时 间 内 没 有 完 成 。请 参 见 第 144 页 的 “OfflineTimeout”。VCSAgCleanOfflineIneffectiveoffline 入 口 点 无 效 。 在 资 源 的 offline 入 口 点 的 计 划 调 用 之 后 ,MONITOR入 口 点 返 回 了 一 个 offline 之 外 的 状 态 。VCSAgCleanOnlineHungonline 入 口 点 在 预 期 的 时 间 内 没 有 完 成 。( 请 参 见 第 144 页 的 “OnlineTimeout”。)VCSAgCleanOnlineIneffectiveonline 入 口 点 无 效 。 在 online 入 口 点 调 用 之 后 为 资 源 调 用 的 MONITOR 入口 点 返 回 的 状 态 不 是 online。VCSAgCleanUnexpectedOffline由 于 意 外 脱 机 该 联 机 资 源 出 现 故 障 。VCSAgCleanMonitorHung由 于 monitor 入 口 点 始 终 无 法 在 预 期 的 时 间 内 完 成 , 该 联 机 资 源 出 现 故 障 。( 请 参 见 第 140 页 的 “FaultOnMonitorTimeouts”。)


代 理 入 口 点 概 述描 述 的 代 理 入 口 点31实 现 了 clean 入 口 点 之 后 , 该 代 理 支 持 以 下 任 务 :■ 当 资 源 出 现 故 障 时 , 会 自 动 在 本 地 系 统 上 重 新 启 动 该 资 源 。请 参 见 第 146 页 的 “RestartLimit”。■ 在 使 资 源 联 机 的 尝 试 失 败 后 , 会 自 动 重 试 online 入 口 点 。请 参 见 第 144 页 的 “OnlineRetryLimit”。■ 当 资 源 的 online 入 口 点 在 本 地 系 统 上 失 败 时 , 让 引 擎 能 够 使 该 资 源 在 另 一个 系 统 上 联 机 。对 于 以 上 要 <strong>发</strong> 生 的 操 作 , clean 入 口 点 必 须 成 功 运 行 , 即 返 回 退 出 代 码 0。


32 代 理 入 口 点 概 述描 述 的 代 理 入 口 点关 于 action 入 口 点在 资 源 上 运 行 预 先 <strong>指</strong> 定 的 操 作 。 使 用 该 入 口 点 可 运 行 非 定 期 的 操 作 , 如 挂 起 数 据 库或 恢 复 已 挂 起 的 数 据 库 。SupportedActions 属 性 是 一 个 键 列 表 属 性 , 列 出 了 受 支 持 的 所 有 操 作 。 由 名 称 或action_token 来 标 识 每 个 操 作 。请 参 见 第 147 页 的 “SupportedActions”。对 于 一 个 代 理 , 所 有 action 入 口 点 必 须 全 部 为 C++ 或 全 部 为 基 于 脚 本 的 action 入口 点 ; 不 能 同 时 使 用 C++ 和 脚 本 。请 确 保 操 作 脚 本 位 于 代 理 目 录 下 的 一 个 actions 目 录 内 。 为 每 个 操 作 创 建 一 个 脚本 。 将 正 确 的 action_token 用 作 该 脚 本 名 。例 如 , 当 通 过 hares -action 命 令 调 用 action_token "suspend" 时 , 一 个 名 为suspend 的 脚 本 会 定 义 要 执 行 的 操 作 。对 于 C++ 入 口 点 , 操 作 是 通 过 切 换 语 句 实 现 的 , 该 切 换 语 句 为 每 一 个 可 能 的action_token 定 义 一 种 情 况 。请 参 见 第 60 页 的 “C++ action 的 语 法 ”。下 面 显 示 与 hares 命 令 一 起 使 用 的 -action 选 项 的 语 法 :hares -action res_name action_token [-actionargs arg1 arg2 ... ][-sys sys_name] [-user user@domain] [-domain domaintype]以 下 示 例 命 令 显 示 通 过 使 用 示 例 操 作 令 牌 DBSuspend 和 DBResume 对 action入 口 点 的 调 用 :hares -action DBResource DBSuspend -actionargs dbsuspend -sysSys1同 时 ,hares -action DBResource DBResume -actionargs dbstart -sys Sys1另 请 参 见 第 145 页 的 “RegList”。action 入 口 点 的 返 回 值如 果 action 入 口 点 成 功 , 则 退 出 时 返 回 0, 如 果 失 败 , 则 退 出 时 返 回 1。 如 果action 入 口 点 退 出 时 返 回 0, 则 命 令 hares -action 退 出 时 也 返 回 0; 如 果action 入 口 点 失 败 , 则 该 命 令 退 出 时 返 回 1 。代 理 框 架 将 基 于 脚 本 的 action 入 口 点 的 输 出 限 制 为 2048 个 字 节 。输 出 是 <strong>指</strong> 脚 本 输 出 到 stdout 或 stderr 的 信 息 。 用 户 运 行 hares -action 命 令 时 ,该 命 令 会 输 出 该 输 出 。 该 输 出 还 会 记 录 到 HAD 日 志 文 件 。


代 理 入 口 点 概 述描 述 的 代 理 入 口 点33关 于 attr_changed 入 口 点关 于 open 入 口 点该 入 口 点 提 供 了 一 种 对 资 源 属 性 值 更 改 作 出 响 应 的 方 式 。 当 某 个 资 源 属 性 被 修 改 后 ,仅 当 该 资 源 属 性 向 代 理 框 架 进 行 了 注 册 要 进 行 通 知 时 , 才 会 调 用 attr_changed 入口 点 。请 参 见 第 69 页 的 “VCSAgRegister”。请 参 见 第 70 页 的 “VCSAgUnregister”。对 于 基 于 C++ 的 代 理 , 可 以 通 过 VCSAgRegister 方 法 完 成 注 册 , 对 于 基 于 脚 本 的代 理 , 可 以 通 过 RegList 中 的 定 义 完 成 注 册 。请 参 见 第 145 页 的 “RegList”。attr_changed 入 口 点 将 向 代 理 框 架 注 册 以 进 行 通 知 的 资 源 名 称 、 已 更 改 的 资 源的 名 称 、 已 更 改 的 属 性 的 名 称 和 新 的 属 性 值 作 为 输 入 接 收 。 该 入 口 点 无 返 回 值 。代 理 启 动 时 , 在 调 用 每 个 已 配 置 资 源 的 online、 offline 或 monitor 入 口 点 之前 , 将 先 调 用 其 open 入 口 点 。 这 样 您 将 能 够 包 含 对 特 定 资 源 的 初 始 化 。 大 多 数 代理 不 需 要 此 功 能 并 且 不 会 实 现 该 入 口 点 。每 当 资 源 的 Enabled 属 性 从 0 变 为 1 时 , 也 会 调 用 open 入 口 点 。 该 入 口 点 接 受资 源 名 称 和 ArgList 属 性 值 作 为 输 入 且 不 返 回 任 何 值 。仅 当 代 理 可 管 理 资 源 时 , 才 可 以 使 该 资 源 联 机 、 脱 机 并 对 其 进 行 监 视 。 代 理 要 管 理某 个 资 源 , 必 须 将 该 资 源 的 Enabled 属 性 值 设 置 为 1。 该 入 口 点 创 建 运 行 其 他 入口 点 所 需 要 的 环 境 。 例 如 , 该 入 口 点 可 以 创 建 资 源 的 其 他 入 口 点 所 需 的 文 件 , 或 执行 某 些 资 源 特 定 的 设 置 。资 源 的 入 口 点 , 或 执 行 某 些 资 源 特 定 的 设 置 。


34 代 理 入 口 点 概 述描 述 的 代 理 入 口 点关 于 close 入 口 点每 当 资 源 的 Enabled 属 性 从 1 变 为 0 时 , 或 者 从 正 在 运 行 的 服 务 器 场 上 的 配 置 中删 除 某 个 资 源 且 该 资 源 的 状 态 允 许 运 行 close 入 口 点 时 , 就 会 调 用 close 入 口 点 。请 注 意 , 仅 当 代 理 可 管 理 某 个 资 源 时 , 才 会 监 视 该 资 源 。 代 理 要 管 理 某 个 资 源 , 必须 将 该 资 源 的 Enabled 属 性 值 设 置 为 1。请 参 见 下 表 , 以 了 解 从 正 在 运 行 的 服 务 器 场 中 删 除 资 源 时 , 资 源 的 哪 种 状 态 允 许运 行 close 入 口 点 。 它 会 将 资 源 名 称 和 ArgList 属 性 值 作 为 输 入 接 收 且 不 会 返 回任 何 值 。 如 果 已 实 现 , 此 入 口 点 通 常 会 取 消 初 始 化 该 资 源 。 大 多 数 代 理 不 需 要 此 功能 并 且 不 会 实 现 该 入 口 点 。表 2-1运 行 CLOSE 入 口 点 所 处 的 状 态 - 基 于 资 源 的 操 作 类 型资 源 类 型OnlineStateOffline State ProbingGoingOfflineWaitingGoingOnlineWaitingNone 是 无 是 是 无OnOnly 是 是 是 是 是OnOff 否 是 是 否 否open 入 口 点 和 close 入 口 点 在 某 个 意 义 上 是 相 关 的 :open 入 口 点 会 创 建 其 他 入 口点 所 需 的 环 境 , 而 close 入 口 点 会 清 除 由 open 入 口 点 创 建 的 设 置 。关 于 shutdown 入 口 点在 代 理 关 闭 之 前 , 会 调 用 shutdown 入 口 点 。 该 入 口 点 会 执 行 在 该 代 理 退 出 之 前所 需 的 任 何 代 理 清 理 。 它 不 会 接 收 任 何 输 入 且 不 会 返 回 任 何 值 。 大 多 数 代 理 不 需 要此 功 能 并 且 不 会 实 现 该 入 口 点 。


代 理 入 口 点 概 述入 口 点 的 返 回 值35入 口 点 的 返 回 值下 表 总 结 了 每 个 入 口 点 的 返 回 值 。表 2-2入 口 点Monitor入 口 点 的 返 回 值返 回 值基 于 C++ 的 返 回 ResStateValues:■ VCSAgResOnline■ VCSAgResOffline■ VCSAgResUnknown■ VCSAgResIntentionalOffline基 于 脚 本 的 Exit 值 :■ 99 - Unknown■ 100 - Offline■ 101-110 - Online■ 200 - Intentional Offline■ 其 他 值 - Unknown。Info如 果 成 功 , 返 回 0; 如 果 失 败 , 则 返 回 非 零 值Online 返 回 一 个 整 数 , <strong>指</strong> 定 monitor 在 可 以 检 查 资 源 状 态 之 前 要 等 待 的 秒 数 ;通 常 为 0, 即 立 即 检 查 资 源 状 态 。Offline 返 回 一 个 整 数 , <strong>指</strong> 定 monitor 在 可 以 检 查 资 源 状 态 之 前 要 等 待 的 秒 数 ;通 常 为 0, 即 立 即 检 查 资 源 状 态 。Clean如 果 成 功 , 返 回 0; 如 果 失 败 , 则 返 回 非 零 值如 果 clean 失 败 , 则 资 源 会 保 持 在 等 待 下 一 个 定 期 监 视 的 转 换 状 态 。 在定 期 监 视 之 后 , 会 再 次 尝 试 clean。 监 视 之 后 的 clean 尝 试 序 列 会 一 直 继续 , 直 到 clean 成 功 为 止 。有 关 内 部 转 换 状 态 的 说 明 , 请 参 见 第 149 页 的 第 9 章 ,“ 状 态 转 换 图 ” 。ActionAttr_changedOpenCloseShutdown如 果 成 功 , 返 回 0; 如 果 失 败 , 则 返 回 非 零 值无无无无


36 代 理 入 口 点 概 述使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项关 于 VCSAgStartup 例 程可 以 用 C++ 函 数 或 脚 本 实 现 入 口 点 。■使 用 C++ 的 优 点 是 可 以 使 用 代 理 框 架 库 编 译 和 链 接 入 口 点 。 这 些 入 口 点 会 作为 代 理 进 程 的 一 部 分 运 行 , 所 以 当 调 用 它 们 时 , 不 需 任 何 用 于 创 建 一 个 新 进 程的 系 统 <strong>开</strong> 销 。 同 时 , 因 为 入 口 点 调 用 仅 是 一 个 函 数 调 用 , 所 以 入 口 点 的 执 行 相对 较 快 。 但 是 , 如 果 需 要 更 改 入 口 点 的 功 能 , 则 需 要 重 新 编 译 代 理 以 使 这 些 更改 生 效 。■ 使 用 脚 本 的 优 点 是 您 能 够 以 动 态 方 式 修 改 入 口 点 。 但 是 , 要 运 行 脚 本 , 就 要 为每 个 入 口 点 调 用 创 建 一 个 的 新 的 进 程 , 所 以 与 C++ 实 现 相 比 , 入 口 点 的 执 行相 对 较 慢 并 会 使 用 更 多 系 统 资 源 。请 注 意 , 您 可 以 任 意 组 合 使 用 C++ 或 脚 本 来 为 单 个 代 理 实 现 多 个 入 口 点 。 这 使 您能 够 以 最 有 利 的 方 式 实 现 每 个 入 口 点 。 例 如 , 当 使 用 C++ 实 现 monitor 入 口 点( 该 入 口 点 经 常 被 调 用 ) 时 , 您 可 以 使 用 脚 本 实 现 大 多 数 入 口 点 。 如 果 monitor入 口 点 是 使 用 脚 本 编 写 的 , 则 每 次 调 用 monitor 入 口 点 时 , 代 理 必 须 创 建 一 个 新进 程 以 运 行 该 入 口 点 。请 参 见 第 47 页 的 第 3 章 ,“ 使 用 C++ 创 建 入 口 点 ” 。请 参 见 第 85 页 的 第 4 章 ,“ 使 用 脚 本 创 建 入 口 点 ” 。当 代 理 启 动 时 , 它 会 使 用 名 为 VCSAgStartup 的 例 程 来 初 始 化 代 理 的 数 据 结 构 。如 果 使 用 脚 本 实 现 入 口 点如 果 您 将 代 理 的 所 有 入 口 点 实 现 为 脚 本 :在 UNIX 上 , 使 用 Script51<strong>Agent</strong> 二 进 制 文 件 。这 些 二 进 制 文 件 中 的 VCSAgStartup() 内 置 实 现 会 初 始 化 代 理 的 数 据 结 构 , 从 而 导致 代 理 查 找 并 执 行 这 些 入 口 点 的 脚 本 。请 参 见 第 85 页 的 第 4 章 ,“ 使 用 脚 本 创 建 入 口 点 ” 。


代 理 入 口 点 概 述使 用 C++ 或 脚 本 入 口 点 的 注 意 事 项37如 果 您 使 用 C++ 实 现 全 部 入 口 点 或 某 些 入 口 点如 果 您 <strong>开</strong> <strong>发</strong> 的 代 理 至 少 有 一 个 C++ 实 现 的 入 口 点 , 则 必 须 实 现 函 数VCSAgStartup() 并 使 用 所 需 的 C++ 基 元 以 向 代 理 框 架 注 册 C++ 入 口 点 。例 如 : 使 用 C++ 和 脚 本 入 口 点 的 VCSAgStartup当 使 用 C++ 实 现 入 口 点 时 , 请 使 用 VCSAgInit API 并 <strong>指</strong> 定 入 口 点 和 函 数 名 称 。在 以 下 示 例 中 , 函 数 my_shutdown 被 定 义 为 Shutdown 入 口 点 。#include "VCSAgApi.h"void my_shutdown() {...}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(v51);VCSAgValidateAndSetEntryPoint(VCSAgEPShutdown, my_shutdown);}请 注 意 , monitor 入 口 点 是 强 制 性 的 , 会 给 它 分 配 一 个 NULL 值 , <strong>指</strong> 示 它 是 用 脚本 实 现 的 。 如 果 您 正 在 使 用 脚 本 入 口 点 , 或 如 果 您 没 有 实 现 可 选 的 入 口 点 , 请 将 相对 应 的 字 段 设 置 为 NULL。对 于 一 个 其 字 段 被 设 置 为 NULL 的 入 口 点 , 代 理 会 自 动 查 找 要 执 行 的 正 确 脚 本 :UNIX:$VCS_HOME/bin/resource_type/


38 代 理 入 口 点 概 述关 于 代 理 信 息 文 件关 于 代 理 信 息 文 件示 例 代 理 信 息 文 件 (UNIX)图 形 用 户 界 面 (GUI) <strong>Cluster</strong> Manager 可 以 显 示 关 于 给 定 资 源 类 型 的 属 性 的 信 息 。对 于 每 个 自 定 义 代 理 , <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 创 建 一 个 包 含 供 GUI 使 用 的 属 性 信 息 的 XML文 件 。 该 XML 文 件 还 包 含 GUI 要 使 用 的 信 息 , 以 允 许 或 禁 止 对 代 理 所 管 理 的 资 源执 行 某 些 操 作 。代 理 的 信 息 文 件 是 一 个 名 为 agent_name.xml 的 XML 文 件 , 位 于 代 理 目 录 下 。 该文 件 包 含 关 于 代 理 的 信 息 ( 如 代 理 名 称 和 版 本 ) 和 资 源 类 型 属 性 的 参 数 的 说 明 。例 如 , 以 下 文 件 包 含 FileOnOff 代 理 的 信 息 :Creates, removes, and monitors files.SolarisBinaryNo5.0SymantecSpecifies the absolute pathname.


代 理 入 口 点 概 述关 于 代 理 信 息 文 件39代 理 信 息介 绍 代 理 的 信 息 包 含 在 该 XML 文 件 的 第 一 节 中 。 下 表 介 绍 此 信 息 , 上 一 个 文 件 示例 中 也 包 含 此 信 息 :表 2-3代 理 信 息代 理 名 称版 本代 理 说 明代 理 信 息 XML 文 件 中 的 代 理 信 息示 例name="FileOnOff"version="x.y"Creates, removes,and monitors files.平 台 。 例 如 , Linux、 Windows 2000i386 或 Solaris Sparc 或 HP-UX。代 理 供 应 商是 否 实 现 了 info 入 口 点 ;Yes( 是 ) 或 No ( 否 ); 如 果 没 有 <strong>指</strong>示 , 则 认 为 没 有 实 现 info 入 口 点 。代 理 类 型 , 例 如 , 二 进 制 、 脚 本 或混 合与 <strong>Cluster</strong> <strong>Server</strong> 的 兼 容 性 ; 支 持 该代 理 所 需 的 最 低 版 本WindowsSymantecNoBinary4.0


40 代 理 入 口 点 概 述关 于 代 理 信 息 文 件属 性 参 数 详 细 信 息代 理 的 属 性 信 息 是 由 几 个 参 数 来 描 述 的 。 下 表 将 对 其 进 行 描 述 。 另 请 参 考FileOnOff 代 理 的 上 一 个 XML 文 件 示 例 , 并 参 见 如 何 将 PathName 属 性 信 息 包 含在 该 文 件 中 。表 2-4参 数XML 文 件 中 对 属 性 参 数 详 细 信 息 的 说 明说 明type 属 性 类 型 的 可 能 值 , 例 如 “str” 代 表 字 符 串 。请 参 见 第 19 页 的 “ 属 性 数 据 类 型 ”。dimensioneditableimportantmustconfigureunique属 性 维 数 的 值 , 例 如 “Scalar;”请 参 见 第 18 页 的 “ 关 于 属 性 ”。可 能 的 值 = True 或 False<strong>指</strong> 示 该 属 性 是 否 可 以 编 辑 。 在 大 多 数 情 况 下 , 资 源 属 性 是 可 编 辑 的 。可 能 的 值 = True 或 False<strong>指</strong> 示 属 性 是 否 足 够 重 要 以 至 需 要 显 示 。 大 多 数 情 况 下 , 该 值 是 True。可 能 的 值 = True 或 False<strong>指</strong> 示 是 否 必 须 配 置 该 属 性 以 使 该 资 源 联 机 。GUI 显 示 那 些 具 有 特 殊 <strong>指</strong> 示 的属 性 。如 果 没 有 为 属 性 <strong>指</strong> 定 任 何 值 , 而 mustconfigure 参 数 为 true, 则 该 资源 状 态 在 第 一 个 监 视 周 期 中 会 变 为 UNKNOWN。 这 类 属 性 的 示 例 有 IP 代理 的 Address、 NIC 代 理 的 Device 和 Mount 代 理 的 FsckOpt。可 能 的 值 = True 或 False<strong>指</strong> 示 该 属 性 值 在 配 置 中 是 否 必 须 唯 一 ; 即 同 一 资 源 类 型 的 两 个 资 源 是 否 可以 具 有 相 同 的 此 属 性 的 值 。 IP 代 理 的 Address 就 是 这 类 属 性 的 一 个 示例 。 GUI 中 不 使 用 该 参 数 。persistent 可 能 的 值 = True。 应 始 终 将 此 参 数 设 置 为 True; 该 参 数 保 留 供 将 来 使 用 。rangedefaultdisplayname定 义 属 性 值 的 可 接 受 的 范 围 。GUI 或 任 何 其 他 客 户 端 可 以 使 用 此 值 以 进 行属 性 值 验 证 。值 的 格 式 : 取 值 范 围 是 以 {a,b} 或 [a,b] 形 式 <strong>指</strong> 定 的 。 方 括 号 表 示 取 值 范 围包 含 临 界 值 。 大 括 号 表 示 取 值 范 围 不 包 含 临 界 值 。 例 如 , {a,b] 表 示 该 范围 是 从 a 到 b, 包 含 b, 不 包 含 a。 取 值 范 围 大 于 a 且 没 有 上 限 的 情 况 ,可 以 表 示 为 {a,], 类 似 地 , 没 有 最 小 值 的 情 况 , 可 以 表 示 为 {,b]。它 <strong>指</strong> 示 属 性 的 默 认 值GUI 或 客 户 端 会 使 用 此 参 数 来 以 用 户 友 好 的 方 式 显 示 属 性 。 例 如 , 对 于FsckOpt, 其 值 可 以 是 fsck option。


代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性41实 现 代 理 XML 信 息 文 件在 创 建 了 代 理 XML 信 息 文 件 后 , 可 以 按 照 以 下 方 式 来 实 现 该 文 件 :在 GUI 中 实 现 代 理 XML 信 息 文 件1 确 保 XML 文 件 agent.xml 位 于 以 下 目 录 :$VCS_HOME/bin/resource_type2 确 保 命 令 服 务 器 在 服 务 器 场 中 的 每 个 节 点 上 运 行 。3 重 新 启 动 GUI 以 使 代 理 的 信 息 显 示 在 GUI 中 。关 于 ArgList 和 ArgListValues 属 性ArgList 属 性 <strong>指</strong> 定 需 将 哪 些 属 性 传 递 给 代 理 入 口 点 。 代 理 框 架 使 用 属 性 的 列 表 及 其关 联 值 填 充 ArgListValues 属 性 。在 C++ 代 理 中 , 通 过 类 型 为 void ** 的 参 数 来 传 递 ArgListValues 属 性 的 值 。例 如 , online 入 口 点 的 签 名 是 :unsigned intres_online(const char *res_name, void **attr_val);在 脚 本 代 理 中 , ArgListValues 属 性 的 值 作 为 命 令 行 参 数 传 递 给 入 口 点 脚 本 。注 册 为 V50 及 更 高 版 本 的 代 理 的 ArgListValues 属 性对 于 注 册 为 V50 或 更 高 版 本 的 代 理 , ArgListValues 属 性 以 元 组 格 式 <strong>指</strong> 定 属 性 及其 值 。■ 对 于 标 量 属 性 , 有 三 个 组 件 用 于 定 义 ArgListValues 参 数 。■ 属 性 名 称■ 值 中 的 元 素 数 ( 对 于 标 量 属 性 来 说 始 终 为 1)■ 值 本 身■对 于 非 标 量 属 性 ( 向 量 、 键 列 表 和 关 联 ), 每 个 属 性 的 ArgListValues 属 性 都有 N+2 个 组 件 , 其 中 N 等 于 属 性 值 中 元 素 的 数 目 。■ 属 性 名 称■ 属 性 值 中 元 素 的 数 目■ 剩 余 的 N 个 元 素 对 应 于 属 性 值 。 请 注 意 , N 可 以 为 零 。


42 代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性名 称 - 值 元 组 格 式 的 概 述5.0 之 前 版 本 的 代 理 要 求 参 数 按 照 资 源 类 型 中 定 义 的 ArgList 属 性 <strong>指</strong> 示 的 顺 序 传 递到 入 口 点 。 参 数 的 解 析 顺 序 由 它 们 在 资 源 类 型 定 义 中 的 位 置 决 定 。采 用 V50 及 更 高 版 本 的 代 理 框 架 时 , 代 理 可 使 用 名 称 - 值 元 组 格 式 将 参 数 及 其 值 传递 给 入 口 点 。 采 用 这 样 的 格 式 表 示 , 将 按 属 性 的 名 称 来 解 析 属 性 及 其 值 , 而 不 是 按它 们 在 ArgList 属 性 中 的 位 置 来 解 析 。ArgList 中 属 性 的 一 般 元 组 格 式 是 : 标 量 属 性 格 式对 于 “ 标 量 ” 属 性 , 无 论 是 字 符 串 、 整 型 还 是 布 尔 型 , 格 式 均 为 : 1 例 如 :DiskGroupName 1 mydg向 量 属 性 格 式对 于 “ 向 量 ” 属 性 , 无 论 是 字 符 串 还 是 整 型 , 格 式 均 为 : 例 如 :MyVector 3 aa cc ddMyEmptyVector 0键 列 表 属 性 格 式对 于 字 符 串 “ 键 列 表 ” 属 性 , 该 格 式 为 : 例 如 :DiskAttr 4 hdisk3 hdisk4 hdisk5 hdisk6DiskAttr 0关 联 属 性 格 式对 于 关 联 属 性 , 无 论 是 字 符 串 还 是 整 型 , 格 式 均 为 : 例 如 :MyAssoc 4 key1 val1 key2 val2MyAssoc 0


代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性43关 于 入 口 点 超 时使 用 AEPTimeout 属 性 为 传 递 给 入 口 点 的 参 数 列 表 中 的 特 定 条 目 附 加 超 时 值 。此 功 能 不 适 用 于 V50 以 前 的 代 理 。如 果 将 AEPTimeout 设 置 为 1, 则 代 理 框 架 会 使 用 名 称 - 值 元 组 格 式 将 入 口 点 的 超时 值 作 为 该 入 口 点 的 参 数 来 传 递 。所 传 递 的 属 性 的 名 称 为 AEPTimeout。这 可 以 简 化 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 对 有 关 入 口 点 超 时 值 的 信 息 进 行 检 索 的 任 务 。 此 时 , 代 理 <strong>开</strong><strong>发</strong> <strong>人</strong> <strong>员</strong> 只 需 查 找 字 符 串 AEPTimeout, 而 无 需 查 找 其 他 字 符 串 ( 如 MonitorTimeout和 CleanTimeout)。例 如 , 如 果 某 代 理 使 用 一 个 名 为 PathName 的 属 性 且 该 属 性 设 置 为 /tmp/foo, 则传 递 给 monitor 入 口 点 的 参 数 为 :如 果 AEPTimeout 设 置 为 0 PathName 1 /tmp/foo如 果 AEPTimeout 设 置 为 1 PathName 1 /tmp/foo AEPTimeout 1如 果 将 同 一 示 例 应 用 于 clean 入 口 点 , 则 参 数 为 :如 果 AEPTimeout 设 置 为 0如 果 AEPTimeout 设 置 为 1 PathName 1 /tmp/foo PathName 1 /tmp/fooAEPTimeout 1 如 果 在 资 源 级 别 改 写 超 时 属 性 , 则 该 机 制 会 负 责 将 改 写 的 值 传 递 给 该 资 源 的 入口 点 。请 参 见 第 137 页 的 “AEPTimeout”。


44 代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性注 册 为 V40 及 更 早 版 本 的 代 理 的 ArgListValues 属 性对 于 注 册 为 V40 及 更 早 版 本 的 代 理 , ArgListValues 属 性 是 一 个 属 性 值 有 序 列 表 。属 性 值 是 按 照 ArgList 属 性 中 的 顺 序 列 出 的 。例 如 , 如 果 在 文 件 types.cf 中 将 类 型 Foo 定 义 为 :Type Foo (str Nameint IntAttrstr StringAttrstr VectorAttr[]str AssocAttr{}static str ArgList[] = { IntAttr, StringAttr,VectorAttr, AssocAttr })并 且 如 果 在 文 件 main.cf 中 将 资 源 Bar 定 义 为 :Foo Bar (IntAttr = 100StringAttr = "Oracle"VectorAttr = { "vol1", "vol2", "vol3" }AssocAttr = { "disk1" = "1024", "disk2" = "512" })然 后 , 对 于 V50 及 更 高 版 本 , 参 数 attr_val 为 :attr_val[0] = "IntAttr"attr_val[1] = "1" // Number of components in// IntAttr attr valueattr_val[2] = "100" // Value of IntAttrattr_val[3] = "StringAttr"attr_val[4] = "1" // Number of components in// StringAttr attr valueattr_val[5] = "Oracle" // Value of StringAttrattr_val[6] = "VectorAttr"attr_val[7] = "3" // Number of components in// VectorAttr attr valueattr_val[8] = "vol1"attr_val[9] = "vol2"attr_val[10] = "vol3"attr_val[11] = "AssocAttr"attr_val[12] = "4" // Number of components in// AssocAttr attr valueattr_val[13] = "disk1"attr_val[14] = "1024"attr_val[15] = "disk2"attr_val[16] = "512"attr_val[17] = NULL // Last element


代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性45或 者 , 对 于 V40 及 更 早 版 本 , 参 数 attr_val 为 :attr_val[0] ===> "100" // Value of IntAttr, the first// ArgList attribute.attr_val[1] ===> "Oracle" // Value of StringAttr.attr_val[2] ===> "3" // Number of components in// VectorAttr.attr_val[3] ===> "vol1"attr_val[4] ===> "vol2"attr_val[5] ===> "vol3"attr_val[6] ===> "4"attr_val[7] ===> "disk1"attr_val[8]===> "1024"attr_val[9] ===> "disk2"attr_val[10]===> "512"attr_val[11]===> NULL// Number of components in// AssocAttr。// Last element.


46 代 理 入 口 点 概 述关 于 ArgList 和 ArgListValues 属 性


3使 用 C++ 创 建 入 口 点■■■■■关 于 使 用 C++ 创 建 入 口 点数 据 结 构C++ 入 口 点 的 语 法代 理 框 架 基 元用 于 提 供 容 器 支 持 的 代 理 框 架 基 元


48 使 用 C++ 创 建 入 口 点关 于 使 用 C++ 创 建 入 口 点关 于 使 用 C++ 创 建 入 口 点由 于 代 理 框 架 是 多 线 程 的 , 因 此 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 编 写 的 所 有 C++ 代 码 必 须 是 多 线 程安 全 的 。 请 避 免 使 用 全 局 变 量 以 获 得 最 佳 结 果 。 如 果 必 须 使 用 全 局 变 量 , 则 须 将 访问 权 限 序 列 化 ( 例 如 , 通 过 使 用 互 斥 锁 )。以 下 准 则 同 样 适 用 :■不 要 使 用 在 多 线 程 应 用 程 序 中 不 安 全 的 C 库 函 数 。 而 是 使 用 等 效 的 可 重 入 版本 , 如 readdir_r() 而 非 readdir()。 要 访 问 以 下 任 一 命 令 的 手 册 页 , 请 输入 :man command。■ 获 得 资 源 ( 例 如 , 动 态 分 配 内 存 或 打 <strong>开</strong> 文 件 ) 后 , 请 使 用 线 程 取 消 处 理 程 序 以确 保 可 以 正 确 释 放 资 源 。 有 关 详 细 信 息 , 请 参 见 pthread_cleanup_push 和pthread_cleanup_pop 的 手 册 页 。 要 访 问 以 下 任 一 命 令 的 手 册 页 , 请 输 入 :man command。如 果 您 <strong>开</strong> <strong>发</strong> 的 代 理 至 少 有 一 个 C++ 实 现 的 入 口 点 , 则 必 须 实 现 函 数 VCSAgStartup()并 使 用 所 需 的 C++ 基 元 以 向 代 理 框 架 注 册 C++ 入 口 点 。含 有 使 用 C++ 入 口 点 创 建 代 理 所 用 模 板 的 示 例 文 件 位 于 :UNIX:$VCS_HOME/src/agent/Sample您 可 以 使 用 C++ <strong>开</strong> <strong>发</strong> 代 理 来 监 视 在 容 器 ( 包 括 非 全 局 区 域 ) 中 运 行 的 应 用 程 序 。VCS 提 供 了 用 于 支 持 容 器 的 API。请 参 见 第 81 页 的 “ 用 于 提 供 容 器 支 持 的 代 理 框 架 基 元 ”。


使 用 C++ 创 建 入 口 点关 于 使 用 C++ 创 建 入 口 点49本 章 的 入 口 点 示 例本 章 中 , 代 理 的 入 口 点 示 例 名 为 Foo。 示 例 代 理 的 资 源 类 型 定 义 如 下 :types.cf 格 式 :type Foo (str PathNamestatic str ArgList[] = { PathName })此 资 源 类 型 的 入 口 点 定 义 如 下 :入 口 点onlinemonitorofflinecleanactioninfo在 此 代 理 中 所 起 的 作 用创 建 Pathname 属 性 <strong>指</strong> 定 的 文 件检 查 PathName 属 性 <strong>指</strong> 定 的 文 件 是 否 存 在删 除 PathName 属 性 <strong>指</strong> 定 的 文 件强 制 删 除 PathName 属 性 <strong>指</strong> 定 的 文 件运 行 预 先 <strong>指</strong> 定 的 操 作使 用 PathName 属 性 <strong>指</strong> 定 的 属 性 值 填 充 ResourceInfo 属 性


50 使 用 C++ 创 建 入 口 点数 据 结 构数 据 结 构VCSAgResState 枚 举 支 持 monitor 入 口 点 的 下 列 返 回 代 码 。■ VCSAgResOffline■ VCSAgResOnline■ VCSAgResUnknown■ VCSAgResIntentionalOffline ( 仅 对 于 V51 及 更 高 版 本 的 代 理 )// Values for the reason why the clean entry point// is called.enum VCSAgWhyClean {VCSAgCleanOfflineHung, // offline entry point did// not complete within the// expected time.VCSAgCleanOfflineIneffective, // offline entry point// was ineffective.VCSAgCleanOnlineHung, // online entry point did// not complete within the// expected time.VCSAgCleanOnlineIneffective, // online entry point// was ineffective.VCSAgCleanUnexpectedOffline, // the resource became// offline unexpectedly.VCSAgCleanMonitorHung // monitor entry point did// not complete within the// expected time.};


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法51C++ 入 口 点 的 语 法本 节 描 述 了 C++ 入 口 点 的 语 法 。C++ VCSAgStartup 的 语 法void VCSAgStartup();注 意 , C++ 函 数 的 名 称 必 须 为 VCSAgStartup()。例 如 :// This example shows the VCSAgStartup() entry point// implementation,assuming that the monitor, online, offline// and clean entry points are implemented in C++ and the// respective function names are res_monitor, res_online,// res_offline, and res_clean.#include "VCSAgApi.h"void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);VCSAgResState res_monitor(const char *res_name, void**attr_val, int*conf_level) {...}unsigned int res_online(const char *res_name,void **attr_val) {...}unsigned int res_offline(const char *res_name,void **attr_val) {...}


52 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ monitor 的 语 法VCSAgResStateres_monitor(const char *res_name, void **attr_val,int*conf_level);您 可 以 选 择 任 意 函 数 名 称 。参 数 conf_level 是 一 个 输 出 参 数 。 返 回 值 用 于 <strong>指</strong> 示 资 源 状 态 , 须 为 已 定 义 的VCSAgResState 值 。请 参 见 第 35 页 的 “ 入 口 点 的 返 回 值 ”。例 如 :#include "VCSAgApi.h"VCSAgResStateres_monitor(const char *res_name, void **attr_val, int*conf_level){}// Code to determine the state of a resource.VCSAgResState res_state = ...if (res_state == VCSAgResOnline) {// Determine the confidence level (0 to 100).*conf_level = ...}else {*conf_level = 0;}return res_state;void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法53C++ info 的 语 法unsigned int (*info) (const char *res_name,VCSAgResInfoOp resinfo_op, void **attr_val, char**info_output, char ***opt_update_args, char***opt_add_args);您 可 以 选 择 任 意 函 数 名 称 。resinfo_opresinfo_op 参 数 <strong>指</strong> 示 是 初 始 化 还 是 更 新 ResourceInfo 属 性 中 的 数 据 。 下 表 描述 了 该 字 段 的 值 及 其 含 义 :值resinfo_op含 义1 将 非 默 认 键 添 加 到 三 个 默 认 键 State、 Msg 和 TS 中 ,并 初 始 化 ResourceInfo 属 性 中 的 名 称 - 值 数 据 对 。此 调 用 表 示 , 对 于 该 入 口 点 , ResourceInfo 属 性 的 当前 值 仅 包 含 三 个 基 本 键 State、 Msg 和 TS。2 仅 更 新 ResourceInfo 属 性 中 的 非 默 认 键 - 值 数 据 对 ,而 不 更 新 默 认 键 State、 Msg 和 TS。此 调 用 表 示 ResourceInfo 属 性 除 默 认 键 之 外 还 包 含 非默 认 键 , 且 仅 更 新 非 默 认 键 。 尝 试 使 用 此 调 用 添 加 键时 会 出 错 。info_output参 数 info_output 是 一 个 字 符 串 , 用 于 存 储 info 入 口 点 的 输 出 。 输 出 值 可 为 资源 的 任 意 汇 总 数 据 。 ResourceInfo 属 性 中 的 Msg 键 是 使 用 info_output 更 新的 。 如 果 info 入 口 点 退 出 成 功 (0), 则 info_output 中 存 储 的 输 出 将 转 储 到ResourceInfo 属 性 的 Msg 键 中 。info 入 口 点 负 责 为 info_output 分 配 内 存 。 代 理 框 架 负 责 删 除 分 配 给 此 参 数 的内 存 。 由 于 内 存 在 入 口 点 分 配 但 在 代 理 框 架 中 删 除 , 因 此 入 口 点 需 将 所 分 配 内 存 的地 址 传 递 给 代 理 框 架 。opt_update_argsopt_update_args 参 数 为 一 个 字 符 串 数 组 , 表 示 ResourceInfo 属 性 中 的 不 同名 称 - 值 对 。 此 参 数 的 内 存 是 在 info 入 口 点 分 配 的 , 但 为 其 分 配 的 内 存 将 在 代 理框 架 中 释 放 。 ResourceInfo 属 性 是 使 用 以 下 名 称 - 值 对 更 新 的 。 此 数 组 中 的 名 称必 须 存 在 于 ResourceInfo 属 性 中 。


54 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法例 如 :ResourceInfo = { State = Valid, Msg = "Info entry point output",TS = "Wed May 28 10:34:11 2003", FileOwner = root,FileGroup = root, FileSize = 100 }此 ResourceInfo 属 性 的 有 效 opt_update_args 数 组 为 :opt_update_args = { "FileSize", "102" }此 名 称 - 值 对 数 组 可 更 新 存 储 于 ResourceInfo 属 性 中 的 动 态 数 据 。无 效 opt_update_args 数 组 为 <strong>指</strong> 定 ResourceInfo 属 性 中 尚 不 存 在 的 键 的 数组 或 者 <strong>指</strong> 定 下 列 键 的 数 组 :State、 Msg 或 TS。 这 三 个 键 仅 可 通 过 代 理 框 架 而 不能 通 过 入 口 点 更 新 。opt_add_argsopt_add_args 为 一 个 字 符 串 数 组 , 表 示 要 添 加 到 ResourceInfo 属 性 中 的 不同 名 称 - 值 对 。 此 数 组 中 的 名 称 表 示 ResourceInfo 关 联 列 表 中 尚 不 存 在 但 需 添 加到 属 性 中 的 键 。 此 参 数 的 内 存 是 在 info 入 口 点 分 配 的 , 但 此 内 存 会 在 代 理 框 架 中释 放 。 使 用 以 下 名 称 - 值 对 填 充 ResourceInfo 属 性 。例 如 :ResourceInfo = { State = Valid, Msg = "Info entry point output",TS = "Wed May 28 10:34:11 2003" }此 属 性 的 有 效 opt_add_args 数 组 为 :opt_add_args = { "FileOwner", "root", "FileGroup","root","FileSize", "100" }此 名 称 - 值 对 数 组 添 加 到 存 储 在 ResourceInfo 属 性 中 的 静 态 数 据 和 动 态 数 据 中 ,并 将 这 些 数 据 初 始 化 。无 效 opt_add_args 数 组 为 <strong>指</strong> 定 已 存 在 于 ResourceInfo 属 性 中 的 键 的 数 组 或者 <strong>指</strong> 定 State、Msg 或 TS 键 中 任 一 键 的 数 组 ; 这 些 键 仅 可 通 过 代 理 框 架 而 不 能 通过 入 口 点 更 新 。


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法55例 如 : 使 用 C++ 实 现 info 入 口 点将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称(res_info)。如 下 例 所 示 , 在 入 口 点 分 配 info 输 出 缓 冲 区 。 缓 冲 区 可 以 为 任 何 大 小 ( 示 例 使用 80), 但 代 理 框 架 会 将 其 截 短 至 2048 字 节 。 可 选 名 称 - 值 对 的 名 称 和 值 的 上 限各 为 4096 字 节 ( 示 例 使 用 15)。V51 入 口 点 示 例 :extern "C" unsigned int res_info(const char *res_name,VCSAgResInfoOp resinfo_op, void **attr_val, char **info_output,char ***opt_update_args, char ***opt_add_args){struct stat stat_buf;int i;char **args = NULL;char *out = new char [80];*info_output = out;VCSAgSnprintf(out, 80,"Output of info entry point - updatesthe \"Msg\" key in ResourceInfo attribute");// Use the stat system call on the file to get its// information The attr_val array will look like "PathName"// "1" "" ...Assuming that PathName is the// first attribute in the attr_val array, the value// of this attribute will be in index 2 of this attr_val// arrayif (attr_val[2]) {if ((strlen((CHAR *)(attr_val[2])) != 0) &&(stat((CHAR *)(attr_val[2]), &stat_buf) == 0)) {if (resinfo_op == VCSAgResInfoAdd) {// Add and initialize all the static and// dynamic keys in the ResourceInfo attributeargs = new char * [7];for (i = 0; i < 6; i++) {args[i] = new char [15];}// All the static information - file owner// and groupVCSAgSnprintf(args[0], 15, "%s", "Owner");VCSAgSnprintf(args[1], 15, "%d",stat_buf.st_uid);VCSAgSnprintf(args[2], 15, "%s", "Group");VCSAgSnprintf(args[3], 15, "%d",stat_buf.st_gid);


56 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法// Initialize the dynamic information for the fileVCSAgSnprintf(args[4], 15, "%s", "FileSize");VCSAgSnprintf(args[5], 15, "%d",stat_buf.st_size);args[6] = NULL;*opt_add_args = args;}else {// Simply update the dynamic keys in the// ResourceInfo attribute.In this case, the// dynamic info on the fileargs = new char * [3];for (i = 0; i < 2; i++) {args[i] = new char [15];}VCSAgSnprintf(args[0], 15, "%s", "FileSize");VCSAgSnprintf(args[1], 15, "%d",stat_buf.st_size);args[2] = NULL;*opt_update_args = args;}}else {// Set the output to indicate the errorVCSAgSnprintf(out, 80, "Stat on the file %s failed",attr_val[2]);return 1;}}else {// Set the output to indicate the errorVCSAgSnprintf(out, 80, "Error in arglist values passed tothe info entry point");return 1;}// Successful completion of the info entry pointreturn 0;} // End of entry point definition


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法57C++ online 的 语 法unsigned intres_online(const char *res_name, void **attr_val);您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_online 定 义 为 Online 入 口 点 。例 如 :#include "VCSAgApi.h"unsigned intres_online(const char *res_name, void **attr_val) {// Implement the code to online a resource here....// If monitor can check the state of the resource// immediately, return 0. Otherwise, return the// appropriate number of seconds to wait before// calling monitor.return 0;}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);


58 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ offline 的 语 法unsigned intres_offline(const char *res_name, void **attr_val);您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_offline 定 义 为 Offline 入 口 点 。例 如 :#include "VCSAgApi.h"unsigned intres_offline(const char *res_name, void **attr_val) {// Implement the code to offline a resource here....// If monitor can check the state of the resource// immediately, return 0. Otherwise, return the// appropriate number of seconds to wait before// calling monitor.return 0;}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法59C++ clean 的 语 法unsigned intres_clean(const char *res_name, VCSAgWhyClean reason, void**attr_val);您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_clean 定 义 为 Clean 入 口 点 。例 如 :#include "VCSAgApi.h"unsigned intres_clean(const char *res_name, VCSAgWhyClean reason,void **attr_val) {// Code to forcibly offline a resource....// If the procedure is successful, return 0; else// return 1.return 0;void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


60 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ action 的 语 法unsigned intaction(const char *res_name, const char *action_token,void **attr_val, char **args, char *action_output);在 下 面 用 户 从 命 令 行 或 等 效 的 GUI 中 触 <strong>发</strong>$> hares -action res1 myaction...的 示 例 中 , 对 传 递 到 C++ action 入 口 点 的 参 数 进 行 了 说 明 。■■■■res_name: 这 是 一 个 输 入 参 数 。 在 其 上 下 文 中 调 用 action 入 口 点 的 资 源 的 名称 。 在 上 面 的 示 例 中 , res_name 将 设 置 为 res1。action_token: 这 是 一 个 输 入 参 数 。 该 参 数 <strong>指</strong> 定 用 户 要 运 行 的 操 作 的 名 称 。 在上 面 的 示 例 中 , action_token 将 设 置 为 myaction。如 果 用 户 运 行 了$> hares -action res1 youraction ...则 将 调 用 上 述 同 一 函 数 , 但 action_token 将 设 置 为 youraction。 该 参 数 可 以为 同 一 代 理 实 现 不 同 的 操 作 , 所 有 这 些 操 作 都 可 通 过 上 述 同 一 函 数 来 处 理 。attr_val: 这 是 一 个 输 入 参 数 。 该 参 数 包 含 为 其 调 用 操 作 的 资 源 的ArgListValues。args: 这 是 一 个 输 入 参 数 。 该 参 数 包 含 调 用 hares -action 命 令 时 传 递 到-actionargs <strong>开</strong> 关 的 字 符 串 的 列 表 。$> hares -action res1 myaction -actionargs foo bar fubar -sys...将 在 args 参 数 中 提 供 foo、 bar 和 fubar。■ action_output: 这 是 一 个 输 出 参 数 。 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 希 望 用 户 看 到 的 任 何 输 出( 调 用 hares -action 命 令 时 的 输 出 结 果 ) 都 需 要 填 充 到 由 该 参 数 <strong>指</strong> 定 其 <strong>指</strong> 针 的缓 冲 区 中 。 将 显 示 给 用 户 的 最 大 字 符 数 为 2048 (2K)。使 用 VCSAgValidateAndSetEntryPoint() API 来 注 册 用 于 为 代 理 实 现 action 入 口点 的 函 数 的 名 称 。例 如 :extern "C"unsigned int res_action (const char *res_name, const char*token,void **attr_val, char **args, char*action_output){const int output_buffer_size = 2048;//// checks on the attr_val entry point arg list// perform an action based on the action token passed inif (!strcmp(token, "token1")) {//// Perform action corresponding to token1


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法61//} else if (!strcmp(token, "token2") {//// Perform action corresponding to token2//}:::} else {//// a token for which no action is implemented yet//VCSAgSnprintf(action_output, output_buffer_size, "No implementationprovided for token(%s)", token);}//// Any other checks to be done////// return value should indicate whether the ep succeeded or// not:// return 0 on success// any other value on failure//if (success) {return 0;}else {return 1;}}


62 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ attr_changed 的 语 法voidres_attr_changed(const char *res_name, const char*changed_res_name,const char *changed_attr_name,void **new_val);参 数 new_val 包 含 属 性 的 新 值 。 new_val 的 编 码 与 第 41 页 的 “ 关 于 ArgList 和ArgListValues 属 性 ” 的 编 码 类 似 。您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_attr_changed 定 义 为 attr_changed 入 口 点 。注 : 仅 在 使 用 基 元 第 69 页 的 “VCSAgRegister” 或 代 理 参 数 RegList ( 参 见 第 145 页的 “RegList”) 注 册 更 改 通 知 时 调 用 此 入 口 点 。例 如 :#include "VCSAgApi.h"voidres_attr_changed(const char *res_name,const char *changed_res_name,const char *changed_attr_name,void **new_val) {// When the value of attribute Foo changes, take some action.if ((strcmp(res_name, changed_res_name) == 0) &&(strcmp(changed_attr_name, "Foo") == 0)) {// Extract the new value of Foo. Here, it is assumed// to be a string.const char *foo_val = (char *)new_val[0];// Implement the action....}


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法63// Resource Ora1 managed by this agent needs to// take some action when the Size attribute of// the resource Disk1 is changed.if ((strcmp(res_name, "Ora1") == 0) &&(strcmp(changed_attr_name, "Size") == 0) &&(strcmp(changed_res_name, "Disk1") == 0)) {}}// Extract the new value of Size.Here, it is// assumed to be an integer.int sizeval = atoi((char *)new_val[0]);// Implement the action....void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


64 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ open 的 语 法void res_open(const char *res_name, void **attr_val);您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_open 定 义 为 Open 入 口 点 。例 如 :#include "VCSAgApi.h"void res_open(const char *res_name, void **attr_val) {// Perform resource initialization, if any.// Register for attribute change notification, if needed.}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPOpen, res_open);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法65C++ close 的 语 法void res_close(const char *res_name, void **attr_val);您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_close 定 义 为 Close 入 口 点 。例 如 :#include "VCSAgApi.h"void res_close(const char *res_name,void **attr_val) {// Resource-specific de-initialization, if needed.// Unregister for attribute change notification, if any.}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPClose, res_close);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


66 使 用 C++ 创 建 入 口 点C++ 入 口 点 的 语 法C++ shutdown 的 语 法void res_shutdown();您 可 以 选 择 任 意 函 数 名 称 。将 VCSAgValidateAndSetEntryPoint() 参 数 设 置 为 入 口 点 的 函 数 的 名 称 。在 以 下 示 例 中 , 函 数 res_shutdown 定 义 为 Shutdown 入 口 点 。例 如 :#include "VCSAgApi.h"void res_shutdown() {// <strong>Agent</strong>-specific de-initialization, if any.}void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);VCSAgValidateAndSetEntryPoint(VCSAgEPShutdown,res_shutdown);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);}


使 用 C++ 创 建 入 口 点代 理 框 架 基 元67代 理 框 架 基 元VCSAgRegisterEPStructVCSAgSetCookieVCSAgSetCookie2基 元 是 代 理 框 架 实 现 的 C++ 方 法 。 在 以 下 各 节 中 定 义 基 元 。另 请 参 见 : 第 81 页 的 “ 用 于 提 供 容 器 支 持 的 代 理 框 架 基 元 ”void VCSAgRegisterEPStruct (VCSAg<strong>Agent</strong>Version version, void *entry_points);此 基 元 请 求 代 理 框 架 使 用 在 entry_points 中 <strong>指</strong> 定 的 入 口 点 实 现 。 仅 可 从VCSAgStartup 入 口 点 调 用 此 基 元 。已 废 弃 。 请 参 见 第 67 页 的 “VCSAgSetCookie2”。void *VCSAgSetCookie2(const char *name, void *cookie)此 基 元 请 求 代 理 框 架 存 储 由 无 效 *cookie 参 数 提 供 的 cookie。 如 果 存 在 与 该 cookie相 关 联 的 值 , 则 基 元 会 设 置 新 值 并 自 动 返 回 旧 值 。 如 果 没 有 与 cookie 相 关 联 的值 , 则 基 元 会 返 回 NULL。这 个 值 对 于 代 理 框 架 是 透 明 的 , 并 且 可 以 通 过 调 用 基 元 VCSAgGetCookie() 获取 。 不 会 永 久 存 储 cookie。 代 理 进 程 退 出 后 cookie 将 丢 失 。 可 从 任 何 入 口 点 调 用此 基 元 。 例 如 :#include "VCSAgApi.h"...// Assume that the online, offline, and monitor// operations on resource require a certain key. Also// assume that obtaining this key is time consuming, but// that it can be reused until this process is// terminated.//// In this example, the open entry point obtains the key// and stores it as a cookie. Subsequent online,// offline, and monitor entry points get the cookie and// use the key.//// Note that the cookie name can be any unique string.// This example uses the resource name as the cookie// name.//void *get_key() {...}void res_open(const char *res_name, void **attr_val) {if (VCSAgGetCookie(res_name) == NULL) {


68 使 用 C++ 创 建 入 口 点代 理 框 架 基 元void *key = get_key();VCSAgSetCookie2(res_name, key);}}VCSAgResState res_monitor(const char *res_name, void**attr_val, int *conf_level_ptr) {VCSAgResState state = VCSAgResUnknown;*conf_level_ptr = 0;void *key = VCSAgGetCookie(res_name);if (key == NULL) {// Take care of the rare cases when// the open entry point failed to// obtain the key and set the the cookie.key = get_key();VCSAgSetCookie2(res_name, key);}// Use the key for testing if the resource is// online, and set the state accordingly....return state;}


使 用 C++ 创 建 入 口 点代 理 框 架 基 元69VCSAgRegistervoidVCSAgRegister(const char *notify_res_name,const char *res_name,const char *attr_name);当 资 源 res_name 的 属 性 attr_name 的 值 被 修 改 时 , 此 基 元 请 求 代 理 框 架 通 知资 源 notify_res_name。 通 过 调 用 notify_res_name 的 attr_changed 入口 点 <strong>发</strong> 出 该 通 知 。注 意 , notify_res_name 可 与 res_name 相 同 。可 以 从 任 何 入 口 点 调 用 此 基 元 , 但 仅 在 attr_changed 入 口 点 实 现 后 此 基 元 才 有用 。 例 如 :#include "VCSAgApi.h"...void res_open(const char *res_name, void **attr_val) {// Register to get notified when the// "CriticalAttr" of this resource is modified.VCSAgRegister(res_name, res_name, "CriticalAttr");// Register to get notified when the// "CriticalAttr" of "CentralRes" is modified.VCSAgRegister(res_name, "CentralRes","CriticalAttr");}// Register to get notified when the// "CriticalAttr" of another resource is modified.// It is assumed that the name of the other resource// is given as the first ArgList attribute.VCSAgRegister(res_name, (const char *)attr_val[0],"CriticalAttr");


70 使 用 C++ 创 建 入 口 点代 理 框 架 基 元VCSAgUnregistervoidVCSAgUnregister(const char *notify_res_name, const char*res_name,const char *attr_name);当 资 源 res_name 的 属 性 attr_name 的 值 被 修 改 时 , 此 基 元 会 请 求 代 理 框 架 停止 通 知 资 源 notify_res_name。 可 从 任 何 入 口 点 调 用 此 基 元 。 例 如 :#include "VCSAgApi.h"...void res_close(const char *res_name, void **attr_val) {// Unregister for the "CriticalAttr" of this resource.VCSAgUnregister(res_name, res_name, "CriticalAttr");}// Unregister for the "CriticalAttr" of another// resource.It is assumed that the name of the// other resource is given as the first ArgList// attribute.VCSAgUnregister(res_name, (const char *)attr_val[0], "CriticalAttr");


使 用 C++ 创 建 入 口 点代 理 框 架 基 元71VCSAgGetCookievoid *VCSAgGetCookie(const char *name);此 基 元 请 求 代 理 框 架 获 取 先 前 通 过 调 用 VCSAgSetCookie2() 设 置 的 cookie。 如 果没 有 预 先 设 置 cookie, 则 该 基 元 将 返 回 NULL。 可 从 任 何 入 口 点 调 用 此 基 元 。 例 如 :#include "VCSAgApi.h"...// Assume that the online, offline, and monitor// operations on resource require a certain key. Also// assume that obtaining this key is time consuming, but// that it can be reused until this process is terminated.//// In this example, the open entry point obtains the key// and stores it as a cookie. Subsequent online,// offline, and monitor entry points get the cookie and// use the key.//// Note that the cookie name can be any unique string.// This example uses the resource name as the cookie name.//void *get_key() {...}void res_open(const char *res_name, void **attr_val) {if (VCSAgGetCookie(res_name) == NULL) {void *key = get_key();VCSAgSetCookie2(res_name, key);}}VCSAgResState res_monitor(const char *res_name, void**attr_val, int *conf_level_ptr) {VCSAgResState state = VCSAgResUnknown;*conf_level_ptr = 0;void *key = VCSAgGetCookie(res_name);if (key == NULL) {// Take care of the rare cases when the open// entry point failed to obtain the key and// set the the cookie.key = get_key();VCSAgSetCookie2(res_name, key);}// Use the key for testing if the resource is// online, and set the state accordingly....return state;}


72 使 用 C++ 创 建 入 口 点代 理 框 架 基 元VCSAgStrlcpyvoid VCSAgStrlcpy(CHAR *dst, const CHAR *src, int size)此 基 元 将 输 入 缓 冲 区 src 的 内 容 复 制 到 输 出 缓 冲 区 dst, 内 容 最 多 为 size 个 字 符 。此 处 size <strong>指</strong> 的 是 输 出 缓 冲 区 dst 的 大 小 。 这 有 助 于 防 止 缓 冲 区 溢 出 错 误 。 如 果 缓 冲区 大 小 不 足 , 则 会 裁 截 缓 冲 区 dst 中 所 含 的 输 出 。VCSAgStrlcatvoid VCSAgStrlcat(CHAR *dst, const CHAR *src, int size)此 基 元 将 输 入 缓 冲 区 src 中 的 内 容 连 接 到 输 出 缓 冲 区 dst 中 的 内 容 , 内 容 最 多 为 缓冲 区 dst 的 最 大 字 符 , 以 使 缓 冲 区 dst 中 的 总 字 符 数 不 超 过 size 的 值 。 此 处 size <strong>指</strong>的 是 输 出 缓 冲 区 dst 的 大 小 。这 有 助 于 防 止 缓 冲 区 溢 出 错 误 。 如 果 缓 冲 区 大 小 不 足 , 则 会 裁 截 缓 冲 区 dst 中 所 含的 输 出 。VCSAgSnprintfVCSAgCloseFileVCSAgDelStringint VCSAgSnprintf(CHAR *dst, int size, const char *format, ...)此 基 元 接 受 的 参 数 数 量 可 变 , 且 其 运 行 方 式 与 C 库 函 数 sprintf 类 似 。 不 同 之 处 在于 , 此 基 元 会 接 受 作 为 参 数 提 供 的 输 出 缓 冲 区 dst 的 大 小 。 此 基 元 仅 在 输 出 缓 冲 区dst 中 存 储 最 多 size 个 字 符 。 这 有 助 于 防 止 缓 冲 区 溢 出 错 误 。 如 果 缓 冲 区 大 小 不足 , 则 会 裁 截 缓 冲 区 dst 中 所 含 的 输 出 。void VCSAgCloseFile(void *vp)用 于 关 闭 文 件 的 线 程 清 理 处 理 程 序 。 输 入 ( 即 vp) 必 须 为 文 件 描 述 符 。void VCSAgDelString(void *vp)用 于 删 除 (char *) 的 线 程 清 理 处 理 程 序 。 输 入 (vp) 必 须 为 <strong>指</strong> 向 使 用 new char[xx]分 配 的 内 存 的 <strong>指</strong> 针 。


使 用 C++ 创 建 入 口 点代 理 框 架 基 元73VCSAgExecint VCSAgExec(const char *path, char *const argv[], char *buf, longbuf_size, unsigned long *exit_codep)派 生 新 进 程 , 执 行 程 序 , 等 待 完 成 , 然 后 返 回 该 状 态 。 同 时 捕 获 从 stdout 和stderr 到 缓 冲 区 的 消 息 。 调 用 程 序 必 须 确 保 缓 冲 区 大 小 >= buf_size。VCSAgExec 为 强 制 取 消 点 。 即 使 调 用 VCSAgExec 的 C++ 入 口 点 在 调 用 此 API 之前 禁 用 取 消 , 也 可 以 在 VCSAgExec 内 取 消 该 线 程 。 因 此 , 入 口 点 必 须 确 保 在 调 用VCSAgExec 之 前 推 送 出 合 适 的 取 消 清 理 处 理 程 序 。 强 制 取 消 可 确 保 运 行 超 时 入 口点 的 服 务 线 程 不 会 持 续 运 行 或 等 待 此 API 创 建 的 子 过 程 退 出 , 而 是 在 接 收 到 取 消请 求 后 服 从 该 取 消 请 求 。函 数 参 数 说 明 :path 要 执 行 的 程 序 名 。argvbufbufsizeexit_codep程 序 参 数 。 argv[0] 必 须 与 path 相 同 。 argv 的 最 后 一 个 条 目 必 须 为NULL。( 与 execv 语 法 相 同 )用 于 容 纳 来 自 stdout 或 stderr 的 消 息 的 缓 冲 区 。 缓 冲 区 必 须 由 调 用 程序 提 供 。 该 函 数 不 会 分 配 缓 冲 区 。 该 函 数 返 回 时 , 缓 冲 区 将 以 NULL结 尾 。缓 冲 区 的 大 小 。 如 果 stdout/stderr 收 到 的 消 息 总 大 小 超 过bufsize, 则 仅 返 回 前 (buf_size - 1) 个 字 符 。<strong>指</strong> 向 将 存 储 已 执 行 程 序 的 退 出 代 码 的 位 置 的 <strong>指</strong> 针 。 应 按 Unix 上 的wait() 中 所 述 解 释 此 值返 回 值 :VCSAgSuccess ( 如 果 执 行 成 功 )。例 如 ://// ...//char **args = new char* [3];char buf[100];unsigned int status;args[0] = "/usr/bin/ls";args[1] = "/tmp";args[2] = NULL;int result = VCSAgExec(args[0], args, buf, 100, &status);if (result == VCSAgSuccess) {// Windows NT:


74 使 用 C++ 创 建 入 口 点代 理 框 架 基 元printf("Exit code of %s is %d\n", args[0], status);// Unix:if (WIFEXITED(status)) {printf("Child process returned %d\n", WEXITSTATUS(status));}else {printf("Child process terminated abnormally(%x)\n", status);}}else {printf("Error executing %s\n", args[0]);}//// ...//VCSAgExecWithTimeoutint VCSAgExecWithTimeout(const char *path, char *const argv[],unsigned int timeout, char *buf, long buf_size, unsigned long*exit_codep)派 生 新 进 程 , 执 行 程 序 , 等 待 完 成 , 然 后 返 回 该 状 态 。 如 果 进 程 不 能 在 超 时 值 内 完成 , 则 终 止 该 进 程 。 同 时 捕 获 从 stdout 或 stderr 到 缓 冲 区 的 消 息 。 调 用 程 序 必 须确 保 缓 冲 区 大 小 >= buf_size。VCSAgExecWithTimeout 为 强 制 取 消 点 。 即 使 调 用VCSAgExecWithTimeout 的 C++ 入 口 点 在 调 用 此 API 之 前 禁 用 取 消 , 也 可 以 在VCSAgExecWithTimeout 内 取 消 该 线 程 。 因 此 , 入 口 点 必 须 确 保 在 调 用VCSAgExecWithTimeout 之 前 推 送 出 合 适 的 取 消 清 理 处 理 程 序 。 强 制 取 消 可 确 保运 行 超 时 入 口 点 的 服 务 线 程 不 会 持 续 运 行 或 等 待 此 API 创 建 的 子 过 程 退 出 , 而 是在 接 收 到 取 消 请 求 后 服 从 该 取 消 请 求 。


使 用 C++ 创 建 入 口 点代 理 框 架 基 元75函 数 参 数 说 明 :path 要 执 行 的 程 序 名 。argvtimeoutbufbufsizeexit_codep程 序 参 数 。 argv[0] 必 须 与 path 相 同 。 argv 的 最 后 一 个 条 目 必 须 为NULL。( 与 execv 语 法 相 同 )。进 程 完 成 执 行 过 程 应 花 的 秒 数 。 如 果 <strong>指</strong> 定 为 零 , 则 此 API 默 认 为VCSAgExec(), 表 示 将 忽 略 超 时 。 如 果 <strong>指</strong> 定 的 超 时 值 超 过 为 入 口 点 自 身 超时 所 留 的 时 间 , 则 此 API 将 自 动 使 用 可 能 的 最 大 超 时 值 。 例 如 , 如 果 此API 中 <strong>指</strong> 定 的 超 时 值 为 40 秒 , 但 入 口 点 自 身 在 20 秒 后 超 时 , 则 代 理 内 部将 此 API 的 超 时 值 设 置 为 20-3=17 秒 。 3 秒 是 使 用 此 API 创 建 的 进 程 的 超时 与 入 口 点 进 程 超 时 之 间 的 宽 限 期 。用 于 容 纳 来 自 stdout 或 stderr 的 消 息 的 缓 冲 区 。 缓 冲 区 必 须 由 调 用 程 序提 供 。 该 函 数 不 会 分 配 缓 冲 区 。 该 函 数 返 回 时 , 缓 冲 区 将 以 NULL 结 尾 。缓 冲 区 的 大 小 。 如 果 stdout/stderr 收 到 的 消 息 总 大 小 超 过 bufsize, 则 仅返 回 前 (buf_size - 1) 个 字 符 。<strong>指</strong> 向 将 存 储 已 执 行 程 序 的 退 出 代 码 的 位 置 的 <strong>指</strong> 针 。 应 按 Unix 上 的 wait()中 所 述 解 释 此 值返 回 值 :VCSAgSuccess ( 如 果 执 行 成 功 )。


76 使 用 C++ 创 建 入 口 点代 理 框 架 基 元VCSAgGenSnmpTrapvoid VCSAgGenSnmpTrap(int trap_num, const char *msg, VCSAgBoolis_global)此 API 用 于 通 过 SNMP 和 / 或 SMTP <strong>发</strong> 送 通 知 。 <strong>Cluster</strong>OutOfBand 陷 阱 用 于 从 代理 入 口 点 <strong>发</strong> 送 通 知 消 息 。函 数 参 数 说 明 :trap_num陷 阱 标 识 符 。 将 该 数 字 追 加 到 代 理 陷 阱 oid 以 生 成 此 事 件 的 唯 一 陷 阱 oid。msg 要 <strong>发</strong> 送 的 通 知 消 息 。is_global 一 个 布 尔 值 , 用 于 <strong>指</strong> 示 生 成 通 知 的 事 件 是 否 出 现 在 运 行 代 理 的 本 地 系 统 。VCSAgSendTrapVCSAgLockFilevoid VCSAgSendTrap(const CHAR *msg)此 API 用 于 通 过 通 知 程 序 进 程 <strong>发</strong> 送 通 知 。 输 入 ( 即 msg) 为 待 <strong>发</strong> 送 的 通 知 消 息 。int VCSAgLockFile(const char *fname, VCSAgLockType ltype,VCSAgBlockingType btype, VCSAgErrnoType *errp)获 取 <strong>指</strong> 定 文 件 上 的 读 取 或 写 入 ( 即 共 享 或 独 占 ) 锁 。 支 持 阻 止 和 非 阻 止 模 式 。如 果 可 获 取 锁 , 则 返 回 0, 而 如 果 请 求 的 是 非 阻 止 模 式 且 锁 正 忙 , 则 返 回VCSAgErrWouldBlock。 否 则 返 回 -1。 每 个 线 程 均 视 为 锁 的 不 同 所 有 者 。多 线 程 安 全 ; 推 迟 的 取 消 安 全 。警 告 : 除 通 过 VCSAgReadLockFile()、 VCSAgWriteLockFile() 和 VCSAgUnlockFile()接 口 之 外 , 不 要 在 此 进 程 中 对 文 件 进 行 任 何 操 作 ( 如 , 打 <strong>开</strong> 或 关 闭 )。


使 用 C++ 创 建 入 口 点代 理 框 架 基 元77VCSAgInitEntryPointStructvoid VCSAgInitEntryPointStruct(VCSAg<strong>Agent</strong>Version agent_version)通 过 此 基 元 , 代 理 能 够 根 据 传 递 给 此 API 的 代 理 框 架 版 本 初 始 化 代 理 框 架 和 入 口点 结 构 。例 如 :VCSAgInitEntryPointStruct(V50);VCSAgInitEntryPointStruct(V51);如 果 该 代 理 的 注 册 版 本 高 于 V40, 则 支 持 以 下 入 口 点 :■■■■■■■■■■onlineofflinemonitorcleanopencloseattr_changedshutdowninfoVCSAgSetStackSizeaction有 关 可 用 注 册 版 本 号 的 信 息 , 请 检 查 VCSAgApiDefs.h 头 文 件 。void VCSAgSetStackSize(int i)代 理 框 架 会 将 代 理 中 线 程 的 默 认 堆 栈 大 小 设 置 为 1MB。 可 使 用 VCSAgStackSize将 调 用 线 程 的 堆 栈 大 小 设 置 为 <strong>指</strong> 定 值 。


78 使 用 C++ 创 建 入 口 点代 理 框 架 基 元VCSAgUnlockFileint VCSAgUnlockFile(const char *fname, VCSAgErrnoType *errp)释 放 <strong>指</strong> 定 文 件 上 的 读 取 或 写 入 ( 即 共 享 或 独 占 ) 锁 。 如 果 锁 可 以 释 放 , 则 返 回 0,否 则 返 回 -1。多 线 程 安 全 ; 推 迟 的 取 消 安 全 。多 线 程 安 全 ; 推 迟 的 取 消 安 全 。警 告 : 除 通 过 VCSAgReadLockFile()、 VCSAgWriteLockFile() 和VCSAgUnlockFile() 接 口 之 外 , 不 要 在 此 进 程 中 对 文 件 进 行 任 何 操 作 ( 如 , 打 <strong>开</strong>或 关 闭 )。VCSAgDisableCancellationVCSAgRestoreCancellationVCSAgSetEntryPointint VCSAgDisableCancellation(int *old_statep)如 果 成 功 , 则 返 回 0 并 将 old_statep 设 置 为 先 前 的 取 消 状 态 。int VCSAgRestoreCancellation(int desired_state)如 果 成 功 , 则 返 回 0, 并 将 desired_state 设 置 为 当 前 取 消 状 态 。此 基 元 已 被 废 弃 。请 参 见 第 78 页 的 “VCSAgValidateAndSetEntryPoint”VCSAgValidateAndSetEntryPointVCSAgSetLogCategoryvoid VCSAgValidateAndSetEntryPoint(VCSAgEntryPoint ep, f_ptr)通 过 此 基 元 , 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 能 够 向 代 理 框 架 注 册 所 有 C++ 入 口 点 。VCSAgEntryPoint 是 在 VCSAgApiDefs.h 中 定 义 的 一 个 枚 举 数 据 类 型 。例 如 :VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, my_monitor_func);void VCSAgSetLogCategory(int cat_id)将 代 理 的 日 志 类 别 设 置 为 cat_id 中 <strong>指</strong> 定 的 值 。


使 用 C++ 创 建 入 口 点代 理 框 架 基 元79VCSAgGetProductNameVCSAgIsMonitorLevelOneVCSAgIsMonitorLevelTwoVCSAgMonitorReturnconst CHAR *VCSAgGetProductName()C++ 入 口 点 的 API, 能 够 获 取 产 品 名 称 以 便 记 录 日 志 。VCSAgBool VCSAgIsMonitorLevelOne();请 参 见 第 79 页 的 “VCSAgIsMonitorLevelTwo”。VCSAgBool VCSAgIsMonitorLevelTwo();Monitor 入 口 点 可 以 使 用 VCSAgIsMonitorLevelOne 和VCSAgIsMonitorLevelTwo 来 查 明 monitor 入 口 点 采 取 的 操 作 应 当 对 应 于 基 本 监视 , 还 是 对 应 于 详 细 监 视 。这 些 API 与 LevelTwoMonitorFrequency 属 性 协 同 工 作 。请 参 见 第 141 页 的 “Leveltwomonitorfrequency”。例 如 , 如 果 将 LevelTwoMonitorFrequency 设 置 为 5, 则 每 MonitorInterval 秒 ,VCSAgIsMonitorLevelOne() 就 会 返 回 TRUE。 此 外 , 每 第 5 个 监 视 周 期 ,VCSAgIsMonitorLevelTwo() API 也 会 返 回 TRUE。 这 可 以 帮 助 用 户 更 加 有 效 地 配置 详 细 的 监 视 , 并 且 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 不 需 要 通 过 计 算 来 确 定 何 时 需 要 执 行 与 详 细 监 视相 关 的 逻 辑 。VCSAgResState VCSAgMonitorReturn(VCSAgResState state, s32conf_level, const CHAR *conf_msg)VCSAgResState 状 态 :monitor 入 口 点 <strong>发</strong> 现 的 资 源 状 态 。int conf_level: 资 源 处 于 联 机 时 的 信 任 级 别 。 该 值 可 以 为 从 10 到 100 的 一 个数 字 。const char * conf_msg: 如 果 monitor 入 口 点 将 资 源 报 告 为 ONLINE 并 且 信 任 级 别低 于 100, 则 该 参 数 会 接 受 包 含 资 源 的 信 任 级 别 较 低 的 原 因 的 字 符 串 。 如 果 所 报 告的 信 任 级 别 为 100, 或 如 果 资 源 状 态 被 报 告 为 Offline 或 IntentionalOffline, 则 即使 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 向 此 API 提 供 了 一 个 信 任 消 息 字 符 串 , 信 任 消 息 也 将 自 动 清 除 。


80 使 用 C++ 创 建 入 口 点代 理 框 架 基 元VCSAgSetResEPTimeoutVCSAgDecryptKeyvoid VCSAgSetResEPTimeout(s32 tmo)该 API 允 许 代 理 入 口 点 从 入 口 点 的 执 行 上 下 文 内 动 态 延 长 其 超 时 值 。 如 果 从 入 口点 执 行 命 令 的 时 间 超 过 了 预 期 完 成 时 间 , 并 且 入 口 点 不 希 望 超 时 , 该 API 是 必 需的 。 Symantec 建 议 谨 慎 使 用 该 API, 因 为 超 时 的 目 的 是 确 保 入 口 点 准 时 完 成 。VCSAgDecryptKey(char *key, char *outbuf, int buflen);使 用 该 API, 可 以 解 密 用 户 在 ArgListValues 中 所 传 递 的 已 加 密 字 符 串 。 通 常 , 用户 使 用 VCS 提 供 的 加 密 命 令 对 密 码 的 字 符 串 属 性 值 进 行 加 密 。 入 口 点 可 以 使 用 该API 对 已 加 密 的 字 符 串 进 行 解 密 并 获 得 原 始 字 符 串 。VCSAgGetConfDirVCSAgGetHomeDirVCSAgGetLogDirvoid VCSAgGetConfDir(char *buf, int bufsize)返 回 VCS 配 置 目 录 的 名 称 。如 果 设 置 了 VCS_CONF 环 境 变 量 , 则 此 命 令 会 返 回 该 变 量 的 值 , 否 则 将 返 回 默 认 值 。调 用 方 必 须 提 供 缓 冲 区VCSAgGetSystemNamevoid VCSAgGetHomeDir(char *buf, int bufsize)返 回 VCS 主 目 录 的 名 称 。 如 果 配 置 了 VCS_HOME 环 境 , 则 此 命 令 会 返 回 该 变 量的 值 , 否 则 将 返 回 默 认 值 。调 用 方 必 须 提 供 缓 冲 区VCSAgGetLogDir(char *buf, int bufsize)返 回 VCS 日 志 目 录 的 名 称 。 如 果 设 置 了 VCS_LOG 环 境 变 量 , 则 此 命 令 会 返 回 该变 量 的 值 , 如 果 未 设 置 , 则 将 返 回 默 认 值 。调 用 方 必 须 提 供 缓 冲 区void VCSAgGetSystemName(char *buf, int bufsize)返 回 当 前 正 在 其 上 运 行 该 代 理 的 系 统 的 名 称 。调 用 方 必 须 提 供 缓 冲 区


使 用 C++ 创 建 入 口 点用 于 提 供 容 器 支 持 的 代 理 框 架 基 元81用 于 提 供 容 器 支 持 的 代 理 框 架 基 元以 下 API 可 在 AIX WPAR、XRM 容 器 和 Solaris 区 域 中 运 行 的 代 理 中 使 用 。 注 意 ,Solaris 版 本 10 及 更 高 版 本 支 持 区 域 。注 意 , 用 于 支 持 区 域 的 早 期 API 已 废 弃 :■■■■VCSAgGetContainerNameVCSAgGetContainerIDVCSAgExecInContainerVCSAgISZoneCapableVCSAgISContainerCapableVCSAgBool VCSAgIsContainerCapable();此 API 可 返 回 True 或 False。■■■VCSAgExecInContainerWithTmo对 于 solaris 区 域如 果 在 Solaris 10 ( 或 更 高 版 本 ) 系 统 上 运 行 代 理 , 则 API 返 回 True; 否 则返 回 False。代 理 可 使 用 此 API 决 定 是 否 执 行 特 定 于 区 域 的 操 作 , 如 将 psinfo 结 构 中 的zone_id 字 段 与 资 源 配 置 中 <strong>指</strong> 定 的 区 域 名 的 ID 相 比 较 以 确 认 找 到 的 进 程 是 否确 实 是 代 理 正 在 查 找 的 进 程 。对 于 XRM如 果 在 可 用 xrm 的 系 统 上 运 行 代 理 , 则 API 返 回 True; 否 则 返 回 False。对 于 WPAR如 果 在 具 有 可 用 WPAR 的 系 统 上 代 理 正 在 运 行 , 则 此 API 返 回 True; 否 则 返回 False。此 API 已 废 弃 。请 参 见 第 81 页 的 “VCSAgExecInContainerWithTimeout”。VCSAgExecInContainerWithTimeoutint VCSAgExecInContainerWithTimeout((const CHAR *path, CHAR *constargv[] u32 timeout, CHAR *buf, long buf_size, unsigned long*exit_codep);


82 使 用 C++ 创 建 入 口 点用 于 提 供 容 器 支 持 的 代 理 框 架 基 元此 API 与 VCSAgExecWithTimeout API 类 似 。 代 理 仅 可 使 用 此 API 在 系 统 的 特 定容 器 中 执 行 特 殊 命 令 或 脚 本 。 如 果 系 统 上 没 有 配 置 容 器 , 或 者 如 果 代 理 无 需 在 特 定容 器 中 执 行 脚 本 , 则 应 使 用 VCSAgExecWithTimeout API。应 由 调 用 函 数 分 配 buf 和 exit_codep 的 内 存 。VCSAgGetUIDint VCSAgGetUID(const CHAR *user, int *uid, int *euid, int*home_exists);VCSAgIsPidInContainerVCSAgIsProcInContainer此 API 检 查 <strong>指</strong> 定 用 户 是 否 如 资 源 对 象 中 所 述 在 容 器 内 有 效 。 如 果 已 设 置 资 源 的 容器 信 息 , 则 API 返 回 容 器 内 的 用 户 的 uid 和 euid; 如 果 未 设 置 资 源 的 容 器 信 息 ,则 API 返 回 全 局 容 器 中 的 用 户 的 uid 和 euid。home_exists 参 数 <strong>指</strong> 示 <strong>指</strong> 定 用 户 的 主目 录 是 否 存 在 于 容 器 内 。应 由 调 用 函 数 分 配 uid、 euid 和 home_exists 的 内 存 。成 功 时 API 返 回 0, 否 则 返 回 1。int VCSAgIsPidInContainer(VCSPID pid);此 API 检 查 <strong>指</strong> 定 pid 是 否 如 资 源 对 象 中 所 述 在 容 器 内 运 行 。返 回 值■ 如 果 proc pid 在 容 器 内 运 行 , 则 返 回 1■ 如 果 proc pid 未 在 容 器 内 运 行 , 则 返 回 0■如 果 API 无 法 验 证 进 程 的 容 器 信 息 , 则 返 回 -1。 如 果 ContainerType 为 无 效值 , 则 可 能 会 返 回 -1。int VCSAgIsProcInContainer(void *psinfop);此 API 检 查 与 <strong>指</strong> 定 psinfo 结 构 相 应 的 进 程 是 否 如 资 源 对 象 中 所 述 在 容 器 内 运 行 。返 回 值■ 如 果 proc pid 在 容 器 内 运 行 , 则 返 回 1■ 如 果 proc pid 未 在 容 器 内 运 行 , 则 返 回 0■如 果 API 无 法 验 证 进 程 的 容 器 信 息 , 则 返 回 -1。 如 果 ContainerType 为 无 效值 , 则 可 能 会 返 回 -1。


使 用 C++ 创 建 入 口 点用 于 提 供 容 器 支 持 的 代 理 框 架 基 元83VCSAgGetContainerID2int VCSAgGetContainerID2()此 API 可 检 索 容 器 的 ID。代 理 根 据 正 在 实 现 入 口 点 的 线 程 , 标 识 调 用 此 API 的 资 源 并 返 回 该 资 源 的 容 器ID。 容 器 ID 为 在 ContainerInfo 属 性 中 <strong>指</strong> 定 为 Name 键 值 的 容 器 ID。返 回 值VCSAgGetContainerName2■■如 果 资 源 或 容 器 名 为 NULL, 或 者 容 器 为 DOWN, 或 者 容 器 不 适 用 于 运 行 代理 的 OS 版 本 , 则 返 回 -1。如 果 容 器 名 有 效 且 容 器 为 UP, 则 返 回 非 负 数 容 器 ID。char *VCSAgGetContainerName2();对 于 Solaris 区 域 , 如 果 已 设 置 <strong>指</strong> 定 资 源 的 容 器 名 称 , 则 此 API 会 检 索 该 容 器 名 称 。对 于 XRM, 该 API 会 检 索 Execution Context 的 名 称 。对 于 WPAR, 此 API 会 检 索 WPAR 的 名 称 。此 API 会 返 回 <strong>指</strong> 向 容 器 名 的 <strong>指</strong> 针 。 调 用 程 序 负 责 释 放 与 返 回 的 <strong>指</strong> 针 相 关 联 的 内 存 。容 器 名 是 在 组 级 属 性 ContainerInfo 中 设 置 的 资 源 所 属 组 的 值 。


84 使 用 C++ 创 建 入 口 点用 于 提 供 容 器 支 持 的 代 理 框 架 基 元


4使 用 脚 本 创 建 入 口 点■■■关 于 使 用 脚 本 创 建 入 口 点脚 本 入 口 点 的 语 法示 例 脚 本 入 口 点


86 使 用 脚 本 创 建 入 口 点关 于 使 用 脚 本 创 建 入 口 点关 于 使 用 脚 本 创 建 入 口 点使 用 脚 本 入 口 点 的 规 则在 UNIX 上 , 脚 本 代 理 使 用 产 品 附 带 的 Script51<strong>Agent</strong> 二 进 制 文 件 。Script51<strong>Agent</strong> 二 进 制 文 件 位 于 :$VCS_HOME/bin/Script51<strong>Agent</strong>必 须 使 用 C++ 实 现 VCSAgStartup 入 口 点 。可 以 使 用 C++ 或 脚 本 实 现 其 他 入 口 点 。 如 果 没 有 使 用 C++ 实 现 其 他 入 口 点 , 则 不需 要 VCSAgStartup 入 口 点 。在 UNIX 上 , 使 用 Script51<strong>Agent</strong> 二 进 制 文 件 可 将 所 有 入 口 点 <strong>开</strong> <strong>发</strong> 为 脚 本 。您 可 以 使 用 Perl 或 shell 脚 本 来 <strong>开</strong> <strong>发</strong> 入 口 点 。脚 本 入 口 点 可 以 是 可 执 行 文 件 或 脚 本 , 如 shell 或 Perl ( 产 品 包 含 Perl 分 <strong>发</strong> 包 )。实 现 脚 本 入 口 点 时 , 请 遵 照 以 下 规 则 :在 UNIX 平 台 上■在 VCSAgStartup 入 口 点 中 , 如 果 没 有 使 用VCSAgValidateAndSetEntryPoint() API 为 入 口 点 设 置 C++ 函 数 , 则 代 理 框架 会 假 定 该 入 口 点 是 基 于 脚 本 的 入 口 点 。请 参 见 第 36 页 的 “ 关 于 VCSAgStartup 例 程 ”。■ 验 证 脚 本 文 件 的 名 称 是 否 与 入 口 点 的 名 称 相 同 。■请 将 文 件 放 在 $VCS_HOME/bin/resource_type 目 录 下 。 例 如 , 如 果 使用 Perl 实 现 Oracle 的 online 脚 本 , 则 online 脚 本 必 须 为 :$VCS_HOME/bin/Oracle/online.pl■ 如 果 以 shell 编 写 脚 本 , 请 验 证 PATH 环 境 变 量 是 否 包 含 sh 的 安 装 目 录 。脚 本 入 口 点 的 参 数 和 值脚 本 入 口 点 的 输 入 参 数 是 作 为 命 令 行 参 数 传 递 的 。 所 有 入 口 点 的 第 一 个 命 令 行 参 数为 资 源 名 称 (shutdown 除 外 , 该 入 口 点 没 有 任 何 参 数 )。某 些 入 口 点 的 输 出 参 数 通 过 程 序 退 出 值 返 回 。 有 关 更 多 信 息 , 请 参 见 入 口 点 的 说 明 。请 参 见 第 88 页 的 “ 脚 本 入 口 点 的 语 法 ”。ArgList 属 性请 参 见 第 41 页 的 “ 关 于 ArgList 和 ArgListValues 属 性 ”。


使 用 脚 本 创 建 入 口 点关 于 使 用 脚 本 创 建 入 口 点87示 例如 果 在 types.cf 中 将 类 型 Foo 定 义 为 :Type Foo (str Nameint IntAttrstr StringAttrstr VectorAttr[]str AssocAttr{}static str ArgList[] = { IntAttr, StringAttr,VectorAttr, AssocAttr })并 且 如 果 在 VCS 配 置 文 件 main.cf 中 将 资 源 Bar 定 义 为 :Foo Bar (IntAttr = 100StringAttr = "Oracle"VectorAttr = { "vol1", "vol2", "vol3" }AssocAttr = { "disk1" = "1024", "disk2" = "512" })在 为 Bar 调 用 V51 代 理 的 Online 脚 本 时 , 命 令 如 下 所 示 :online Bar IntAttr 1 100 StringAttr 1 Oracle VectorAttr 3 vol1vol2 vol3 AssocAttr 4 disk1 1024 disk2 512


88 使 用 脚 本 创 建 入 口 点脚 本 入 口 点 的 语 法脚 本 入 口 点 的 语 法以 下 几 段 描 述 了 脚 本 入 口 点 的 语 法 。monitor 脚 本 的 语 法monitor resource_name ArgList_attribute_values脚 本 入 口 点 将 状 态 和 信 任 级 别 组 合 到 退 出 值 中 。 例 如 :■ 99 表 示 未 知 。■ 100 表 示 脱 机 。■ 101 表 示 联 机 且 信 任 级 别 为 10。■ 102-109 表 示 联 机 且 信 任 级 别 为 20-90。■ 110 表 示 联 机 且 信 任 级 别 为 100。■ 200 表 示 有 意 脱 机 。如 果 退 出 值 未 在 上 述 值 中 列 出 , 则 认 为 状 态 为 未 知 。online 脚 本 的 语 法offline 脚 本 的 语 法online resource_name ArgList_attribute_values退 出 值 被 解 释 为 使 联 机 过 程 生 效 的 预 期 时 间 ( 秒 )。 它 还 表 示 执 行 monitor 入 口点 以 验 证 运 行 是 否 正 常 之 前 必 须 经 过 的 时 间 ( 秒 )。 退 出 值 通 常 为 0。offline resource_name ArgList_attribute_values退 出 值 被 解 释 为 使 脱 机 过 程 生 效 的 预 期 时 间 ( 秒 )。 退 出 值 通 常 为 0。


使 用 脚 本 创 建 入 口 点脚 本 入 口 点 的 语 法89clean 脚 本 的 语 法clean resource_name clean_reason argList_attribute_values变 量 clean_reason 等 于 以 下 值 之 一 :0 - offline 入 口 点 未 在 预 期 时 间 内 完 成 。( 请 参 见 第 144 页 的 “OfflineTimeout”。)1 - offline 入 口 点 无 效 。2 - online 入 口 点 未 在 预 期 时 间 内 完 成 。( 请 参 见 第 144 页 的 “OnlineTimeout”。)3 - online 入 口 点 无 效 。4 - 资 源 意 外 脱 机 。5 - monitor 入 口 点 始 终 无 法 在 预 期 时 间 内 完 成 。( 请 参 见 第 140 页 的 “FaultOnMonitorTimeouts”。)退 出 值 为 0 ( 如 果 成 功 ) 或 1。action 脚 本 的 语 法action resource_nameArgList_attribute_values_AND_action_arguments退 出 值 为 0 ( 如 果 成 功 ) 或 1 ( 如 果 失 败 )。代 理 框 架 将 action 入 口 点 的 输 出 限 制 为 2048 字 节 。attr_changed 脚 本 的 语 法attr_changed resource_name changed_resource_namechanged_attribute_name new_attribute_value忽 略 退 出 值 。注 : 仅 当 使 用 基 元 VCSAgRegister() ( 请 参 见 第 69 页 的 “VCSAgRegister”)或 代 理 参 数 RegList ( 请 参 见 第 145 页 的 “RegList”) 注 册 更 改 通 知 时 调 用 此入 口 点 。


90 使 用 脚 本 创 建 入 口 点脚 本 入 口 点 的 语 法info 脚 本 的 语 法info resource_name resinfo_op ArgList_attribute_values属 性 resinfo_op 的 值 可 为 1 或 2。resinfo_op 的 值含 义1 在 ResourceInfo 属 性 中 添 加 并 初 始 化 静 态 名 称 - 值 数 据 对 和动 态 名 称 - 值 数 据 对 。2 只 更 新 ResourceInfo 属 性 中 的 动 态 数 据 。此 入 口 点 可 以 将 静 态 名 称 - 值 对 和 动 态 名 称 - 值 对 添 加 到 ResourceInfo 属 性 中 并 更新 这 些 名 称 - 值 对 。 info 入 口 点 没 有 特 定 输 出 , 但 可 更 新 ResourceInfo 属 性 。open 脚 本 的 语 法close 脚 本 的 语 法shutdown 脚 本 的 语 法open resource_name ArgList_attribute_values忽 略 退 出 值 。close resource_name ArgList_attribute_values忽 略 退 出 值 。shutdown忽 略 退 出 值 。


使 用 脚 本 创 建 入 口 点示 例 脚 本 入 口 点91示 例 脚 本 入 口 点以 下 示 例 显 示 了 用 shell 脚 本 编 写 的 入 口 点 。FileOnOff 的 online 入 口 点FileOnOff 示 例 入 口 点 为 简 单 入 口 点 。 代 理 调 用 代 理 的 online 入 口 点 时 , 入 口 点要 求 将 资 源 名 称 作 为 第 一 个 参 数 , 随 后 是 剩 余 ArgList 属 性 的 值 。■■对 于 注 册 为 低 于 V50 的 代 理 , 入 口 点 要 求 属 性 值 的 顺 序 与 ArgList 属 性 中 <strong>指</strong> 定的 属 性 顺 序 相 同 。对 于 注 册 为 V50 及 更 高 版 本 的 代 理 , 入 口 点 要 求 ArgList 采 用 元 组 格 式 : 属 性名 称 、 属 性 值 中 的 元 素 数 量 以 及 值 。注 : 实 际 VCSFileOnOff 入 口 点 是 使 用 C++ 编 写 的 , 但 是 此 示 例 是 使 用 shell 脚 本编 写 的 。


92 使 用 脚 本 创 建 入 口 点示 例 脚 本 入 口 点FileOnOff 的 monitor 入 口 点代 理 调 用 代 理 的 monitor 入 口 点 时 , 入 口 点 要 求 将 资 源 名 称 作 为 第 一 个 参 数 , 随后 是 剩 余 ArgList 属 性 的 值 。■对 于 注 册 为 低 于 V50 的 代 理 , 入 口 点 要 求 属 性 值 的 顺 序 与 ArgList 属 性 中 <strong>指</strong> 定的 属 性 顺 序 相 同 。■ 对 于 注 册 为 V50 及 更 高 版 本 的 代 理 , 入 口 点 要 求 ArgList 采 用 元 组 格 式 : 属 性名 称 、 属 性 值 中 的 元 素 数 量 以 及 值 。如 果 文 件 存 在 , 则 monitor 返 回 退 出 代 码 110, 表 示 资 源 处 于 联 机 状 态 且 信 任 级 别为 100%。 如 果 文 件 不 存 在 , 则 monitor 返 回 100, 表 示 资 源 处 于 脱 机 状 态 。 如 果不 能 确 定 文 件 状 态 , 则 monitor 返 回 99。#!/bin/sh# FileOnOff Monitor script# Expects Resource Name and Pathname. $VCS_HOME/bin/ag_i18n_inc.shRESNAME=$1VCSAG_SET_ENVS $RESNAME#check if second attribute provided#Exit with unknown and log error if not provided.if [ -z "$2" ]thenVCSAG_LOG_MSG "W" "The value for PathName is not specified”\exit 99elseif [ -f $2 ]; then exit 110;# Exit online (110) if file exists# Exit offline (100) if file does not existelse exit 100;fifi


使 用 脚 本 创 建 入 口 点示 例 脚 本 入 口 点93处 于 有 意 脱 机 状 态 的 monitor 入 口 点此 脚 本 包 含 MyCustomApp 代 理 的 有 意 脱 机 功 能 。请 参 见 第 18 页 的 “ 关 于 On-Off 资 源 、 On-only 资 源 和 持 久 性 资 源 ”。注 意 , 检 测 应 用 程 序 是 否 有 意 脱 机 的 方 法 取 决 于 应 用 程 序 的 类 型 。 以 下 示 例 假 定 如果 应 用 程 序 被 有 意 停 止 , 则 该 应 用 程 序 会 将 状 态 代 码 写 入 文 件 。#!/bin/sh. ${CLUSTER_HOME}/bin/ag_i18n_inc.shResName=$1; shift;VCSAG_SET_ENVS $ResName// Obtain the attribute values from ArgListValuesparse_arglist_values();RETVAL=$?if [ ${RETVAL} -eq ${VCSAG_RES_UNKNOWN} ]; then// Could not get all the required attributes fromArgListValuesexit $VCSAG_RES_UNKNOWN;fi// Check if the application's process is present in the ps// outputcheck_if_app_is_running();RETVAL=$?if [ ${REVAL} -eq ${VCSAG_RES_ONLINE} ]; then// Application process foundexit $VCSAG_RES_ONLINE;fi// Application process was not found; Check if user gracefully// shutdown the applicationgrep "MyCustomAppCode 123 : User initiated shutdown command"${APPLICATION_CREATED_STATUS_FILE}RETVAL=$?if [ ${REVAL} -eq 0 ]; then// Found MyCustomAppCode 123 in the application's status// file that gets created by the application on graceful//shutdownexit $VCSAG_RES_INTENTIONALOFFLINE;else// Did not find MyCustomAppCode 123; hence application has// crashed or gone down unintentionallyexit $VCSAG_RES_OFFLINE;fi// Monitor should never come hereexit $VCSAG_RES_UNKNOWN;


94 使 用 脚 本 创 建 入 口 点示 例 脚 本 入 口 点FileOnOff 的 offline 入 口 点代 理 调 用 代 理 的 offline 入 口 点 时 , 入 口 点 要 求 将 资 源 名 称 作 为 第 一 个 参 数 , 随后 是 剩 余 的 ArgList 属 性 的 值 。■对 于 注 册 为 低 于 V50 的 代 理 , 入 口 点 要 求 属 性 值 的 顺 序 与 ArgList 属 性 中 <strong>指</strong> 定的 属 性 顺 序 相 同 。■ 对 于 注 册 为 V50 及 更 高 版 本 的 代 理 , 入 口 点 要 求 ArgList 采 用 元 组 格 式 : 属 性名 称 、 属 性 值 中 的 元 素 数 量 以 及 值 。入 口 点 接 受 这 些 值 后 , 会 删 除 文 件 。#!/bin/sh# FileOnOff Offline script# Expects ResourceName and Pathname#. $VCS_HOME/bin/ag_i18n_inc.shRESNAME=$1VCSAG_SET_ENVS $RESNAME#check if second attribute providedif [ -z "$2" ]thenVCSAG_LOG_MSG "W" "The value for PathName is not specified” \1020else#remove the file/bin/rm 杅 $2fiexit 0;


5日 志 记 录 代 理 消 息■■■■关 于 日 志 记 录 代 理 消 息在 C++ 和 基 于 脚 本 的 入 口 点 中 的 日 志 记 录C++ 代 理 日 志 记 录 API脚 本 入 口 点 日 志 记 录 函 数


96 日 志 记 录 代 理 消 息关 于 日 志 记 录 代 理 消 息关 于 日 志 记 录 代 理 消 息本 章 介 绍 API 和 函 数 , <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 在 其 自 定 义 代 理 中 使 用 它 们 生 成 符 合 标 准 消息 日 志 记 录 格 式 的 日 志 文 件 消 息 。■■有 关 创 建 和 管 理 国 际 化 消 息 的 信 息 , 请 参 见 第 167 页 的 第 10 章 ,“ 国 际 化消 息 ” 。有 关 VCS 3.5 及 更 早 版 本 使 用 的 API 的 信 息 , 请 参 见 第 179 页 的 “4.0 之 前 版本 的 VCS 代 理 中 的 日 志 消 息 ”。在 C++ 和 基 于 脚 本 的 入 口 点 中 的 日 志 记 录代 理 消 息 : 格 式创 建 C++ 代 理 入 口 点 的 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 使 用 一 组 宏 来 记 录 应 用 程 序 消 息 或 调 试 消 息 。基 于 脚 本 的 入 口 点 的 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 使 用 一 组 方 法 或 “ 包 装 程 序 ”, 它 们 会 调 用halog 实 用 程 序 来 生 成 应 用 程 序 消 息 或 调 试 消 息 。Symantec 建 议 使 用 ag_i18n_inc 子 例 程 进 行 日 志 记 录 。 该 子 例 程 为 这 些 消 息 设 置类 别 ID 并 为 该 日 志 消 息 提 供 一 个 标 头 , 该 标 头 包 含 该 资 源 名 称 和 该 入 口 点 名 称 。代 理 日 志 消 息 包 含 五 个 字 段 。 消 息 的 格 式 为 : 以 下 是 一 个 通 过 FileOnOff 代 理 的 online 入 口 点 生 成 的 严 重 程 度 为 ERROR 的 示例 消 息 。 当 该 代 理 尝 试 使 资 源 ( 名 为 MyFile 的 文 件 ) 联 机 时 , 会 生 成 以 下 消 息 :Jun 26 2003 11:32:56 VCS ERROR V-16-2001-14001FileOnOff:MyFile:online:Resource could not be brought upbecause,the attempt to create the file (filename) failedwith error (Is a Directory)以 上 消 息 的 前 四 个 字 段 由 timestamp、 用 于 代 表 该 产 品 的 大 写 mnemonic、severity 和 UMI ( 唯 一 消 息 ID) 组 成 。 接 下 来 的 几 行 为 message text。时 间 戳时 间 戳 <strong>指</strong> 示 消 息 生 成 的 时 间 。 其 格 式 根 据 区 域 设 置 来 设 置 。助 记 键助 记 键 字 段 用 于 表 示 产 品 。助 记 键 必 须 全 部 使 用 大 写 字 母 。 所 有 VCS 捆 绑 代 理 、 Enterprise <strong>Agent</strong> 和 自 定 义代 理 都 使 用 助 记 键 :"VCS"


日 志 记 录 代 理 消 息关 于 日 志 记 录 代 理 消 息97严 重 程 度每 条 消 息 的 严 重 程 度 会 显 示 在 该 消 息 的 第 三 个 字 段 中 ( 对 于 正 常 消 息 , 严 重 程 度分 为 Critical ( 严 重 )、 Error ( 错 误 )、 Warning ( 警 告 )、 Notice ( 通 知 ) 或Information ( 信 息 ); 对 于 调 试 消 息 , 严 重 程 度 为 1-21)。 所 有 C++ 日 志 记 录 宏和 基 于 脚 本 的 日 志 记 录 函 数 会 提 供 一 种 定 义 消 息 严 重 程 度 的 方 法 ( 包 括 正 常 消 息和 调 试 消 息 )。UMIUMI ( 唯 一 消 息 标 识 符 ) 包 含 <strong>发</strong> 起 者 ID、 类 别 ID 和 消 息 ID。■■<strong>发</strong> 起 者 ID 是 一 个 以 V- <strong>开</strong> 头 的 十 进 制 数 字 , 它 定 义 了 生 成 该 消 息 的 产 品 。 该ID 是 由 Symantec 分 配 的 。类 别 ID 是 由 Symantec 分 配 的 一 个 0 到 65536 范 围 内 的 数 字 。 类 别 ID 用 于 <strong>指</strong>示 生 成 该 消 息 的 代 理 。 对 于 每 个 自 定 义 代 理 , 必 须 与 Symantec 联 系 , 以 便 为代 理 注 册 一 个 唯 一 类 别 ID。■ 对 于 C++ 消 息 , 会 在 VCSAgStartup 入 口 点 中 定 义 类 别 ID。请 参 见 第 101 页 的 “ 日 志 类 别 ”。■ 对 于 基 于 脚 本 的 入 口 点 , 会 在 VCSAG_SET_ENVS 函 数 中 设 置 类 别请 参 见 第 106 页 的 “VCSAG_SET_ENVS”。■ 对 于 调 试 消 息 , 不 需 要 在 日 志 记 录 函 数 中 定 义 类 别 ID ( 默 认 情 况 下 为 50)。■对 于 一 个 类 别 ID, 消 息 ID 的 范 围 可 以 为 0 到 65536。 必 须 为 每 个 通 过 代 理 生成 的 正 常 消 息 ( 即 非 调 试 消 息 ) 分 配 一 个 消 息 ID。 对 于 C++ 入 口 点 , 会 将msgid 设 置 为 VCSAG_LOG_MSG 和 VCSAG_CONSOLE_LOG_MSG 宏 的 组 成部 分 。 对 于 基 于 脚 本 的 入 口 点 , 将 使 用 VCSAG_LOG_MSG 函 数 来 设 置msgid。 调 试 函 数 不 使 用 msgid 字 段 , 在 调 试 消 息 中 也 不 需 要 该 字 段 。请 参 见 第 108 页 的 “VCSAG_LOG_MSG”。消 息 文 本消 息 文 本 是 具 有 格 式 的 消 息 字 符 串 , 以 一 个 动 态 生 成 的 标 头 起 始 , 该 标 头 包 含 三 个字 段 ( 以 冒 号 分 隔 )。 即 , :::。 例 如 :FileOnOff:MyFile:online:Resource could not be brought upbecause,the attempt to create the file (MyFile) failedwith error (Is a Directory)■ 在 使 用 C++ 入 口 点 的 情 况 下 , 会 生 成 该 标 头 信 息 。■在 使 用 基 于 脚 本 的 入 口 点 的 情 况 下 , 会 在 VCSAG_SET_ENVS 函 数 中 设 置 该标 头 信 息 ( 请 参 见 第 106 页 的 “VCSAG_SET_ENVS”)。


98 日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 APIC++ 代 理 日 志 记 录 API代 理 框 架 提 供 了 四 个 日 志 记 录 API ( 宏 ), 可 以 用 于 以 C++ 编 写 的 代 理 入 口 点 中 。这 些 API 包 含 两 个 应 用 程 序 日 志 记 录 宏 :VCSAG_CONSOLE_LOG_MSG(sev, msgid, flags, fmt, variable_args...)VCSAG_LOG_MSG(sev, msgid, flags, fmt, variable_args...)以 及 用 于 调 试 的 宏 :VCSAG_LOGDBG_MSG(dbgsev, flags, fmt, variable_args...)VCSAG_RES_LOG_MSG(dbgsev, flags, fmt, variable args...)C++ 入 口 点 的 代 理 应 用 程 序 日 志 记 录 宏您 可 以 在 C++ 代 理 入 口 点 中 使 用 宏 VCSAG_LOG_MSG 来 记 录 严 重 程 度 在CRITICAL 到 INFORMATION 范 围 内 的 所 有 消 息 。 使 用VCSAG_CONSOLE_LOG_MSG 宏 将 消 息 <strong>发</strong> 送 到 HAD 日 志 。 如 果 消 息 的 严 重 程 度为 CRITICAL 或 ERROR, 还 会 将 消 息 记 录 到 控 制 台 。下 表 介 绍 了 用 于 应 用 程 序 日 志 记 录 宏 的 参 数 字 段 :sevmsgidflags来 自 该 应 用 程 序 的 消 息 的 严 重 程 度 。 sev 的 值 可 以 为 宏VCS_CRITICAL、 VCS_ERROR、 VCS_WARNING、 VCS_NOTICE 和VCS INFORMATION; 请 参 见 第 100 页 的 “C++ 宏 的 严 重 程 度 参 数 ”。16 位 整 数 的 消 息 ID。默 认 标 志 (0) 输 出 UMI、 NEWLINE。 宏 VCS_DEFAULT_FLAGS 表 示 这些 标 志 的 默 认 值 。fmt 一 个 包 含 格 式 <strong>指</strong> 定 符 号 的 带 有 格 式 的 字 符 串 。 例 如 :“ 无 法 关 闭 资 源 ,因 为 试 图 删 除 文 件 (%s) 时 失 败 且 返 回 错 误 (%d) ”variable_args 可 变 数 目 的 ( 最 多 6 个 )char、 char * 或 integer 类 型 参 数在 以 下 示 例 中 , 这 些 宏 用 于 将 错 误 消 息 记 录 到 代 理 日 志 和 控 制 台 :..VCSAG_LOG_MSG(VCS_ERROR, 14002, VCS_DEFAULT_FLAGS,"Resource could not be brought down because theattempt to remove the file(%s) failed with error(%d)",(CHAR *)(*attr_val), errno);VCSAG_CONSOLE_LOG_MSG(VCS_ERROR, 14002, VCS_DEFAULT_FLAGS,"Resource could not be brought down because, theattempt to remove the file(%s) failed with error(%d)",(CHAR *)(*attr_val), errno);


日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 API99C++ 入 口 点 的 代 理 调 试 日 志 记 录 宏在 代 理 入 口 点 中 使 用 宏 VCSAG_RES_LOG_MSG 和 VCSAG_LOGDBG_MSG 将 某 个特 定 严 重 程 度 级 别 的 调 试 消 息 记 录 到 代 理 日 志 。使 用 LogDbg 属 性 <strong>指</strong> 定 调 试 消 息 的 严 重 程 度 级 别 。 请 参 见 LogDbg 属 性 的 说 明( 第 142 页 的 “LogDbg”)。 将 LogDbg 属 性 设 置 为 该 资 源 类 型 级 别 。 可 以 改 写该 属 性 以 将 其 设 置 为 一 个 特 定 资 源 的 级 别 。VCSAG_LOGDBG_MSG 宏 会 控 制 在 该 资 源 类 型 级 别 上 进 行 日 志 记 录 , 而VCSAG_RES_LOG_MSG 宏 可 以 支 持 在 某 个 特 定 资 源 的 级 别 记 录 调 试 消 息 。下 表 介 绍 了 用 于 应 用 程 序 日 志 记 录 宏 的 参 数 字 段 :dbgsev消 息 的 调 试 严 重 程 度 。 dbgsev 的 值 是 VCS_DBG1 到 VCS_DBG21范 围 内 的 宏 。请 参 见 第 100 页 的 “C++ 宏 的 严 重 程 度 参 数 ”。flags 描 述 日 志 记 录 选 项 。默 认 标 志 (0) 输 出 UMI、 NEWLINE。 宏 VCS_DEFAULT_FLAGS 表示 这 些 标 志 的 默 认 值 。fmtvariable_args一 个 包 含 符 号 的 带 有 格 式 的 字 符 串 。 例 如 :“PathName is (%s)”可 变 数 目 的 ( 最 多 6 个 )char、 char * 或 integer 类 型 参 数例 如 :VCSAG_RES_LOG_MSG(VCS_DBG4, VCS_DEFAULT_FLAGS, "PathName is(%s)",(CHAR *)(*attr_val));对 于 所 给 示 例 , 如 果 已 启 用 特 定 资 源 ( 即 已 设 置 LogDbg 属 性 ) 以 记 录 处 于 严 重程 度 级 别 DBG4 的 调 试 消 息 , 则 可 以 将 <strong>指</strong> 定 的 消 息 记 录 到 该 代 理 日 志 。


100 日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 APIC++ 宏 的 严 重 程 度 参 数日 志 记 录 宏 的 严 重 程 度 参 数 ( 例 如 , VCS_ERROR 或 VCS_DBG1) 事 实 上 本 身 就是 一 个 可 以 扩 展 以 包 含 以 下 信 息 的 宏 :■■■实 际 消 息 严 重 程 度函 数 名 称包 含 该 函 数 的 文 件 的 名 称■ 扩 展 该 日 志 记 录 宏 的 行 号例 如 , FileOnOff 代 理 的 monitor 入 口 点 中 的 应 用 程 序 严 重 程 度 参 数VCS_ERROR 将 会 扩 展 以 包 含 以 下 信 息 :ERROR, res_monitor, FileOnOff.C, 28应 用 程 序 严 重 程 度 宏 会 映 射 到 由 枚 举 VCSAgAppSev 定 义 的 应 用 程 序 严 重 程 度 ,且 调 试 严 重 程 度 宏 会 映 射 到 由 枚 举 VCSAgDbgSev 定 义 的 严 重 程 度 。 例 如 , 在VCSAgApiDefs.h 头 文 件 中 , 会 将 这 些 枚 举 类 型 定 义 为 :enum VCSAgAppSev {AG_CRITICAL,AG_ERROR,AG_WARNING,AG_NOTICE,AG_INFORMATION};enum VCSAgDbgSev {DBG1,DBG2,DBG3,..DBG21,DBG_SEV_End};通 过 使 用 这 些 严 重 程 度 宏 , 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 不 需 要 在 每 个 日 志 调 用 中 <strong>指</strong> 定 函 数 的 名称 、 文 件 名 和 行 号 。 但 是 , 必 须 通 过 使 用 宏 VCSAG_LOG_INIT 初 始 化 该 函 数 的 名称 。 请 参 见 第 101 页 的 “ 使 用 VCSAG_LOG_INIT 初 始 化 function_name”。


日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 API101使 用 VCSAG_LOG_INIT 初 始 化 function_name包 含 在 C++ 函 数 中 的 消 息 的 日 志 记 录 的 一 个 要 求 是 初 始 化 每 个 函 数 中 的function_name 变 量 。 宏 VCSAG_LOG_INIT 定 义 了 一 个 本 地 字 符 串 常 量 以 存 储 以下 函 数 名 称 :VCSAG_LOG_INIT(func_name) const char *_function_name_ =func_name例 如 , 名 为 res_offline 的 函 数 包 含 :void res_offline (int a, char *b){VCSAG_LOG_INIT("res_offline");..}注 : 如 果 该 函 数 名 称 不 是 通 过 使 用 VCSAG_LOG_INIT 宏 初 始 化 的 , 则 在 编 译 该 代理 后 , 错 误 会 <strong>指</strong> 示 未 定 义 该 函 数 的 名 称 。有 关 VCSAG_LOG_INIT 宏 的 更 多 示 例 , 请 参 见 第 102 页 的 “ 在 某 个 C++ 代 理 中使 用 的 日 志 记 录 API 的 示 例 ”。日 志 类 别代 理 的 日 志 类 别 是 在 VCSAgStartup 入 口 点 中 使 用 基 元VCSAgSetLogCategory (cat_ID) 定 义 的 。 在 以 下 示 例 中 , 该 日 志 类 别 被 设 置为 10051:VCSEXPORT void VCSDECL VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgInitEntryPointStruct(V51);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor,res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline,res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline,res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);VCSAgSetLogCategory(10051);}char *s = setlocale(LC_ALL, NULL);VCSAG_LOGDBG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS, "Locale is%s", s);无 需 为 调 试 消 息 设 置 日 志 类 别 , 默 认 情 况 下 为 50。


102 日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 API在 某 个 C++ 代 理 中 使 用 的 日 志 记 录 API 的 示 例#include #include #include "VCSAgApi.h"void res_attr_changed(const char *res_name, const char*changed_res_name,const char *changed_attr_name, void**new_val){/** NOT REQUIRED if the function is empty or is not logging* any messages to the agent log file*/VCSAG_LOG_INIT("res_attr_changed");}extern "C" unsigned intres_clean(const char *res_name, VCSAgWhyClean wc, void**attr_val){VCSAG_LOG_INIT("res_clean");if ((attr_val) && (*attr_val)) {if ((remove((CHAR *)(*attr_val)) == 0) || (errno== ENOENT)) { return 0; // Success}}return 1; // Failure}void res_close(const char *res_name, void **attr_val){VCSAG_LOG_INIT("res_close");}//// Determine if the given file is online (file exists) or// offline (file does not exist).//extern "C" VCSAgResStateres_monitor(const char *res_name, void **attr_val, int*conf_level){VCSAG_LOG_INIT("res_monitor");VCSAgResState state = VCSAgResUnknown;*conf_level = 0;/** This msg will be printed for all resources if VCS_DBG4* is enabled for the resource type. Else it will be* logged only for that resource that has the dbg level* VCS_DBG4 enabled*/


日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 API103VCSAG_RES_LOG_MSG(VCS_DBG4, VCS_DEFAULT_FLAGS, "PathNameis(%s)", (CHAR *)(*attr_val));if ((attr_val) && (*attr_val)) {struct stat stat_buf;if ( (stat((CHAR *)(* attr_val), &stat_buf) == 0)&& (strlen((CHAR *)(* attr_val)) != 0) ) {state = VCSAgResOnline; *conf_level = 100;}else {}state = VCSAgResOffline;*conf_level = 0;}VCSAG_RES_LOG_MSG(VCS_DBG7, VCS_DEFAULT_FLAGS, "State is(%d)", (int)state);return state;}extern "C" unsigned intres_online(const char *res_name, void **attr_val) {int fd = -1;VCSAG_LOG_INIT("res_online");if ((attr_val) && (*attr_val)) {if (strlen((CHAR *)(* attr_val)) == 0) {VCSAG_LOG_MSG(VCS_WARNING, 3001, VCS_DEFAULT_FLAGS,"The value for PathName attribute is notspecified");VCSAG_CONSOLE_LOG_MSG(VCS_WARNING, 3001,VCS_DEFAULT_FLAGS,"The value for PathName attribute is notspecified");return 0;}if (fd = creat((CHAR *)(*attr_val), S_IRUSR|S_IWUSR) < 0) {VCSAG_LOG_MSG(VCS_ERROR, 3002, VCS_DEFAULT_FLAGS,"Resource could not be brought up because, ""the attempt to create the file(%s) failed ""with error(%d)", (CHAR *)(*attr_val), errno);


104 日 志 记 录 代 理 消 息C++ 代 理 日 志 记 录 API}VCSAG_CONSOLE_LOG_MSG(VCS_ERROR, 3002,VCS_DEFAULT_FLAGS,"Resource could not be brought up because, ""the attempt to create the file(%s) failed ""with error(%d)", (CHAR *)(*attr_val), errno);return 0;}close(fd);}return 0;extern "C" unsigned intres_offline(const char *res_name, void **attr_val){VCSAG_LOG_INIT("res_offline");if ((attr_val) && (*attr_val) && (remove((CHAR*)(*attr_val)) != 0) && (errno != ENOENT)) {VCSAG_LOG_MSG(VCS_ERROR, 14002, VCS_DEFAULT_FLAGS,"Resource could not be brought down because, theattempt to remove the file(%s) failed witherror(%d)", (CHAR *)(*attr_val), errno);}VCSAG_CONSOLE_LOG_MSG(VCS_ERROR, 14002,VCS_DEFAULT_FLAGS, "Resource could not be broughtdown because, the attempt to remove the file(%s)failed with error(%d)", (CHAR *)(*attr_val), errno);}return 0;


日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数105void res_open(const char *res_name, void **attr_val){VCSAG_LOG_INIT("res_open");}VCSEXPORT void VCSDECL VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgInitEntryPointStruct(V51);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor,res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline,res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline,res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);}VCSAgSetLogCategory(2001);char *s = setlocale(LC_ALL, NULL);VCSAG_LOGDBG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS, "Locale is%s", s);脚 本 入 口 点 日 志 记 录 函 数对 于 基 于 脚 本 的 入 口 点 , 请 使 用 本 节 所 介 绍 的 函 数 记 录 日 志 消 息 。注 :Symantec 建 议 不 要 在 脚 本 入 口 点 中 使 用 halog 命 令 。日 志 记 录 函 数 可 从 ag_i18n_inc 模 块 中 获 取 。VCSAG_SET_ENVS: 请 参 见 第 106 页 的 “VCSAG_SET_ENVS”。VCSAG_LOG_MSG: 请 参 见 第 108 页 的 “VCSAG_LOG_MSG”。VCSAG_LOGDBG_MSG: 请 参 见 第 109 页 的 “VCSAG_LOGDBG_MSG”。VCSAG_CONSOLE_LOG_MSG: 将 消 息 记 录 到 HAD 日 志 文 件 。


106 日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数在 脚 本 中 使 用 函 数这 些 基 于 脚 本 的 入 口 点 需 要 一 个 行 以 <strong>指</strong> 定 定 义 这 些 日 志 记 录 函 数 的 文 件 。 在 每 个 脚本 中 恰 好 包 含 一 次 以 下 行 。 任 何 日 志 函 数 应 在 该 行 之 后 使 用 。■■Shell 脚 本 包 括 文 件. ${VCS_HOME:-/opt/VRTSvcs}/bin/ag_i18n_inc.shPerl 脚 本 包 括 文 件use ag_i18n_inc;VCSAG_SET_ENVSVCSAG_SET_ENVS 函 数 用 于 在 每 个 基 于 脚 本 的 入 口 点 文 件 中 使 用 。 其 用 途 是 设 置和 导 出 用 于 标 识 代 理 类 别 ID、 代 理 名 称 、 资 源 名 称 和 入 口 点 名 称 的 环 境 变 量 。 使用 环 境 变 量 的 形 式 设 置 此 消 息 后 , 这 些 日 志 记 录 函 数 可 以 使 用 统 一 的 日 志 记 录 格 式处 理 消 息 及 其 参 数 , 而 无 需 在 脚 本 内 重 复 。VCSAG_SET_ENVS 函 数 为 资 源 设 置 以 下 环 境 变 量 :VCSAG_LOG_CATEGORY设 置 类 别 ID。 对 于 自 定 义 代 理 , Symantec 会 分 配 类 别ID。 有 关 类 别 ID 的 说 明 , 请 参 见 第 97 页 的 “UMI”。注 意 : 对 于 捆 绑 代 理 , 类 别 ID 是 基 于 写 入 该 代 理 的 平 台(Solaris、 Linux、 AIX、 HP-UX 或 Windows) 预 先 分配 的 。VCSAG_LOG_AGENT_NAME 到 该 代 理 的 绝 对 路 径 。例 如 :UNIX:/opt/VRTSvcs/bin/resource_type由 于 这 些 入 口 点 是 通 过 使 用 其 绝 对 路 径 调 用 的 , 所 以 会在 调 用 时 设 置 该 环 境 变 量 。 如 果 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 需 要 , 还可 以 对 此 代 理 名 称 进 行 硬 编 码 并 将 其 作 为 一 个 参 数 传 递给 VCSAG_SET_ENVS 函 数 。VCSAG_LOG_SCRIPT_NAME 该 入 口 点 脚 本 的 绝 对 路 径 。例 如 :UNIX:/opt/VRTSvcs/bin/resource_type/online由 于 这 些 入 口 点 是 通 过 使 用 其 绝 对 路 径 调 用 的 , 所 以 会在 调 用 时 设 置 该 环 境 变 量 。 可 以 改 写 该 脚 本 名 称 变 量 。VCSAG_LOG_RESOURCE_NAME 该 资 源 是 在 入 口 点 内 的 调 用 中 <strong>指</strong> 定 的 :VCSAG_SET_ENVS $resource_name


日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数107VCSAG_SET_ENVS 示 例 , Shell 脚 本 入 口 点必 须 在 调 用 任 何 其 他 日 志 记 录 函 数 之 前 调 用 VCSAG_SET_ENVS 函 数 。■ 最 小 调 用 :VCSAG_SET_ENVS ${resource_name}■设 置 类 别 ID:VCSAG_SET_ENVS ${resource_name} ${category_ID}VCSAG_SET_ENVS ${resource_name} 1062■ 改 写 默 认 脚 本 名 称 :VCSAG_SET_ENVS ${resource_name} ${script_name}VCSAG_SET_ENVS ${resource_name} "monitor"■ 设 置 类 别 ID 并 改 写 脚 本 名 称 :VCSAG_SET_ENVS ${resource_name} ${script_name}${category_id}VCSAG_SET_ENVS ${resource_name} "monitor" 1062或 ,VCSAG_SET_ENVS ${resource_name} ${category_id}${script_name}VCSAG_SET_ENVS ${resource_name} 1062 "monitor"VCSAG_SET_ENVS 示 例 , Perl 脚 本 入 口 点■ 最 小 调 用 :VCSAG_SET_ENVS ($resource_name);■设 置 类 别 ID:VCSAG_SET_ENVS ($resource_name, $category_ID);VCSAG_SET_ENVS ($resource_name, 1062);■ 改 写 脚 本 名 称 :VCSAG_SET_ENVS ($resource_name, $script_name);VCSAG_SET_ENVS ($resource_name, "monitor");■ 设 置 类 别 ID 并 改 写 脚 本 名 称 :VCSAG_SET_ENVS ($resource_name, $script_name, $category_id);VCSAG_SET_ENVS ($resource_name, "monitor", 1062);或 ,VCSAG_SET_ENVS ($resource_name, $category_id, $script_name);VCSAG_SET_ENVS ($resource_name, 1062, "monitor");


108 日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数VCSAG_LOG_MSGVCSAG_LOG_MSG 函 数 可 用 于 将 正 常 代 理 消 息 传 递 给 halog 实 用 程 序 。 该 函 数 至少 必 须 包 含 严 重 程 度 、 引 号 内 的 消 息 和 消 息 ID。 该 函 数 还 可 以 选 择 包 含 参 数 和 <strong>指</strong>定 一 种 编 码 格 式 。严 重 程 度 级 别 (sev)消 息 (msg)消 息 ID (msgid)编 码 格 式参 数“C”- critical ( 严 重 )、“E”- error ( 错 误 )、“W”- warning( 警 告 )、“N”- notice ( 通 知 )、“I”- information ( 信 息 );请 将 错 误 代 码 置 于 引 号 内引 号 内 的 一 条 文 本 消 息 ; 例 如 :“One file copied”0 到 65535 之 间 的 一 个 整 数UTF-8、 ASCII、 或 UCS-2, 形 式 如 下 : “-encodingformat”参 数 ( 最 多 六 个 ), 每 个 都 在 引 号 内VCSAG_LOG_MSG 示 例 , Shell 脚 本 入 口 点■ 调 用 一 个 没 有 参 数 或 编 码 格 式 的 函 数 :VCSAG_LOG_MSG "" "" VCSAG_LOG_MSG "C" "Two files found" 140■ 调 用 有 一 个 参 数 , 但 没 有 编 码 格 式 的 函 数 :VCSAG_LOG_MSG "" "" ""VCSAG_LOG_MSG "C" "$count files found" 140 "$count"■ 调 用 有 一 个 参 数 和 编 码 格 式 的 函 数 :VCSAG_LOG_MSG "" "" "-encoding """VCSAG_LOG_MSG "C" "$count files found" 140 "-encoding utf8""$count"请 注 意 , 如 果 将 编 码 格 式 和 参 数 传 递 给 这 些 函 数 , 则 必 须 在 传 递 任 何 参 数 之 前传 递 该 编 码 格 式 。


日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数109VCSAG_LOGDBG_MSGVCSAG_LOG_MSG 示 例 , Perl 脚 本 入 口 点■ 调 用 一 个 没 有 参 数 或 编 码 格 式 的 函 数 :VCSAG_LOG_MSG ("", "", );VCSAG_LOG_MSG ("C", "Two files found", 140);■ 调 用 有 一 个 参 数 , 但 没 有 编 码 格 式 的 函 数 :VCSAG_LOG_MSG ("", "", , "";VCSAG_LOG_MSG ("C", "$count files found", 140, "$count");■ 调 用 有 一 个 参 数 和 编 码 格 式 的 函 数 :VCSAG_LOG_MSG ("", "", , "-encoding", "");VCSAG_LOG_MSG ("C", "$count files found", 140, "-encodingutf8", "$count");请 注 意 , 如 果 将 编 码 格 式 和 参 数 传 递 给 这 些 函 数 , 则 必 须 在 传 递 任 何 参 数 之 前 传 递该 编 码 格 式 。该 函 数 可 以 用 于 将 调 试 消 息 传 递 给 halog 实 用 程 序 。 消 息 中 至 少 必 须 <strong>指</strong> 定 严 重 程度 。 此 外 , 还 可 以 <strong>指</strong> 定 编 码 格 式 和 其 他 参 数 。严 重 程 度 (dbg) 用 于 <strong>指</strong> 示 严 重 程 度 级 别 的 一 个 整 数 , 取 值 范 围 为 1 到 21。有 关 更 多 信 息 , 请 参 见 《<strong>Veritas</strong> <strong>Cluster</strong> <strong>Server</strong> 管 理 <strong>指</strong> <strong>南</strong> 》。消 息 (msg)编 码 格 式参 数引 号 内 的 一 条 文 本 消 息 ; 例 如 :“One file copied”UTF-8、 ASCII、 或 UCS-2, 形 式 如 下 : “-encodingformat”参 数 ( 最 多 六 个 ), 每 个 都 在 引 号 内VCSAG_LOGDBG_MSG 示 例 , Shell 脚 本 入 口 点■ 调 用 一 个 没 有 编 码 或 参 数 的 函 数 :VCSAG_LOGDBG_MSG ""VCSAG_LOGDBG_MSG 1 "This is string number 1"■ 调 用 有 一 个 参 数 但 没 有 编 码 格 式 的 函 数 :VCSAG_LOGDBG_MSG "" ""VCSAG_LOGDBG_MSG 2 "This is string number $count" "$count"■ 调 用 有 一 个 参 数 和 编 码 格 式 的 函 数 :VCSAG_LOGDBG_MSG "" "-encoding " "$count"VCSAG_LOGDBG_MSG 2 "This is string number $count" "$count"


110 日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数VCSAG_LOGDBG_MSG 示 例 , Perl 脚 本 入 口 点■ 调 用 一 个 函 数 :VCSAG_LOGDBG_MSG (, "");VCSAG_LOGDBG_MSG (1 "This is string number 1");■ 调 用 有 一 个 参 数 但 没 有 编 码 格 式 的 函 数 :VCSAG_LOGDBG_MSG (, "", "");VCSAG_LOGDBG_MSG (2, "This is string number $count","$count");■ 调 用 有 一 个 参 数 和 编 码 格 式 的 函 数 :VCSAG_LOGDBG_MSG "" "-encoding """VCSAG_LOGDBG_MSG (2, "This is string number $count","-encodingutf8", "$count");


日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数111脚 本 代 理 中 使 用 的 日 志 记 录 函 数 的 示 例以 下 示 例 显 示 在 online 入 口 点 的 一 个 shell 脚 本 中 使 用 VCSAG_SET_ENVS 和VCSAG_LOG_MSG 函 数 。!#/bin/kshResName=$1# Parse other input arguments::VCS_HOME="${VCS_HOME:-/opt/VRTSvcs}". $VCS_HOME/bin/ag_i18n_inc.sh# Assume the category id assigned by Symantec for this customagent #is 10061VCSAG_SET_ENVS $ResName 10061# Online entry point processing::# Successful completion of the online entry pointVCSAG_LOG_MSG "N" "online succeeded for resource $ResName" 1"$ResName"exit 0


112 日 志 记 录 代 理 消 息脚 本 入 口 点 日 志 记 录 函 数


6构 建 自 定 义 代 理■■■■■用 于 代 理 <strong>开</strong> <strong>发</strong> 的 文 件为 自 定 义 代 理 创 建 类 型 定 义 文 件在 UNIX 上 构 建 自 定 义 代 理安 装 自 定 义 代 理为 自 定 义 资 源 类 型 定 义 资 源


114 构 建 自 定 义 代 理用 于 代 理 <strong>开</strong> <strong>发</strong> 的 文 件用 于 代 理 <strong>开</strong> <strong>发</strong> 的 文 件VCS 安 装 程 序 提 供 以 下 文 件 以 帮 助 进 行 代 理 <strong>开</strong> <strong>发</strong> :表 6-1脚 本 代 理说 明包 含 VCSAgStartup 入 口 点 的 内置 实 现 的 现 成 可 用 代 理 。路 径 名UNIX: $VCS_HOME/bin/Script51<strong>Agent</strong>表 6-2C++ 代 理说 明包 含 一 个 示 例 C++ 代 理 和Makefile 的 目 录 。用 于 构 建 C++ 代 理 的 示 例Makefile。C++ 代 理 的 入 口 点 模 版 。路 径 名UNIX: $VCS_HOME/src/agent/SampleUNIX: $VCS_HOME/src/agent/Sample/MakefileUNIX: $VCS_HOME/src/agent/Sample/agent.C


构 建 自 定 义 代 理为 自 定 义 代 理 创 建 类 型 定 义 文 件115为 自 定 义 代 理 创 建 类 型 定 义 文 件您 所 创 建 的 代 理 需 要 一 个 资 源 类 型 定 义 文 件 。 此 文 件 的 功 能 是 提 供 资 源 的 常 规 类 型定 义 及 其 唯 一 性 属 性 。类 型 定 义 文 件 的 命 名 约 定按 照 resource_typeTypes.cf 约 定 命 名 资 源 类 型 定 义 文 件 。 例 如 , 对 于 资 源类 型 XYZ, 该 文 件 将 会 是 XYZTypes.cf。创 建 agentTypes.cf 文 件 时 要 满 足 的 要 求在 查 看 上 一 示 例 时 , 请 注 意 下 列 几 点 :■■■代 理 的 名 称ArgList 属 性 , 该 属 性 的 名 称 、 类 型 、 维 数 及 属 性 值 , 它 们 组 成 了 资 源 的 其他 属 性剩 余 属 性 ( 在 此 示 例 中 仅 有 PathName 属 性 )、 属 性 名 称 、 类 型 、 维 数 和说 明 。例 如 :FileOnOffTypes.cfFileOnOff 资 源 的 示 例 类 型 配 置 文 件 :// Define the resource type called FileOnOff (inFileOnOffTypes.cf).type FileOnOff (str PathName;static str ArgList[] = { PathName };)例 如 : 支 持 有 意 脱 机 的 自 定 义 代 理 的 类 型 定 义向 配 置 添 加 自 定 义 类 型 定 义type MyCustomApp (static int IntentionalOffline = 1static str ArgList[] = { PathName, Arguments }str PathNamestr Arguments)创 建 该 文 件 后 , 请 将 其 放 置 到 下 面 的 目 录 中 :UNIX: $VCS_HOME/conf/config


116 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理以 下 各 节 以 FileOnOff 资 源 为 例 介 绍 了 代 理 的 各 种 构 建 方 式 。 出 于 测 试 目 的 , 还 提供 了 在 单 个 系 统 上 安 装 该 代 理 的 说 明 。这 些 示 例 假 定 满 足 以 下 条 件 :■ 默 认 情 况 下 , VCS 安 装 在 /opt/VRTSvcs 下 。 如 果 您 的 安 装 目 录 有 所 不 同 ,请 相 应 地 更 改 VCS_HOME。■ 已 经 创 建 了 一 个 FileOnOff 类 型 定 义 文 件 。请 参 见 第 115 页 的 “ 为 自 定 义 代 理 创 建 类 型 定 义 文 件 ”。关 于 FileOnOff 代 理 入 口 点 , 请 注 意 以 下 几 点 。 一 个 FileOnOff 资 源 表 示 一 个 常 规文 件 。■ 如 果 该 文 件 尚 不 存 在 , FileOnOff online 入 口 点 会 创 建 该 文 件 。■ FileOnOff offline 入 口 点 将 删 除 该 文 件 。■ 如 果 该 文 件 存 在 , 则 FileOnOff monitor 入 口 点 会 返 回 online 和 信 任 级 别 100;否 则 , 它 会 返 回 offline。使 用 脚 本 实 现 入 口 点如 果 入 口 点 是 使 用 脚 本 实 现 的 , 则 必 须 将 脚 本 文 件 放 置 在 目 录$VCS_HOME/bin/resource_type 下 。 必 须 正 确 命 名 该 目 录 。请 参 见 第 86 页 的 “ 关 于 使 用 脚 本 创 建 入 口 点 ”。如 果 所 有 入 口 点 都 是 脚 本 , 则 所 有 脚 本 都 应 该 位 于 目 录$VCS_HOME/bin/resource_type 下 。 将 Script51<strong>Agent</strong> 复 制 到 代 理 目 录 ,如 $VCS_HOME/bin/resource_type/resource_type<strong>Agent</strong>。例 如 , 如 果 使 用 Perl 实 现 Oracle 的 Online 入 口 点 , 则 Online 脚 本 必 须 位 于 :$VCS_HOME/bin/Oracle/online。同 时 , 建 议 您 为 代 理 二 进 制 文 件 resource_type<strong>Agent</strong> 命 名 。 将 该 代 理 放 置 到目 录 $VCS_HOME/bin/resource_type 下 。例 如 , Oracle 的 代 理 二 进 制 文 件 应 位 于$VCS_HOME/bin/Oracle/Oracle<strong>Agent</strong>。如 果 该 代 理 文 件 位 于 不 同 目 录 , 例 如 /foo/ora_agent, 则 types.cf 文 件 必 须包 含 以 下 项 :...Type Oracle (...static str <strong>Agent</strong>File = "/foo/ora_agent"...)


构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理117例 如 : 在 UNIX 上 使 用 脚 本 入 口 点下 面 的 示 例 显 示 如 何 不 用 编 写 和 编 译 任 何 C++ 代 码 而 构 建 FileOnOff 代 理 。 此 示例 仅 实 现 online、 offline 和 monitor 入 口 点 。例 如 : 使 用 脚 本 实 现 入 口 点1 创 建 目 录 /opt/VRTSvcs/bin/FileOnOff:mkdir /opt/VRTSvcs/bin/FileOnOff2 将 VCS 代 理 /opt/VRTSvcs/bin/Script51<strong>Agent</strong> 用 作 FileOnOff 代 理 。 将 该 文件 复 制 到 以 下 路 径 :/opt/VRTSvcs/bin/FileOnOff/FileOnOff<strong>Agent</strong>或 创 建 一 个 链 接 。复 制 该 代 理 二 进 制 文 件 :cp /opt/VRTSvcs/bin/Script51<strong>Agent</strong>/opt/VRTSvcs/bin/FileOnOff/FileOnOff<strong>Agent</strong>创 建 一 个 到 该 代 理 二 进 制 文 件 的 链 接 :ln -s /opt/VRTSvcs/bin/Script51<strong>Agent</strong>/opt/VRTSvcs/bin/FileOnOff/FileOnOff<strong>Agent</strong>3 使 用 脚 本 实 现 online、 offline 和 monitor 入 口 点 。 使 用 任 意 编 辑 器 。■ 创 建 包 含 以 下 内 容 的 文 件 /opt/VRTSvcs/bin/FileOnOff/online:#!/bin/sh# Create the file specified by the PathName# attribute.touch $2exit 0■ 创 建 包 含 以 下 内 容 的 文 件/opt/VRTSvcs/bin/FileOnOff/offline:#!/bin/sh# Remove the file specified by the PathName# attribute.rm $2exit 0■ 创 建 包 含 以 下 内 容 的 文 件/opt/VRTSvcs/bin/FileOnOff/monitor:#!/bin/sh# Verify file specified by the PathName attribute# exists.if test -f $2then exit 110;else exit 100;fi4 此 外 , 您 可 以 实 现 info 和 action 入 口 点 。 对 于 action 入 口 点 , 请 在 代 理目 录 下 创 建 一 个 名 为 actions 的 子 目 录 , 并 在 子 目 录 中 创 建 与 action_tokens同 名 的 脚 本 。


118 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理例 如 : 在 UNIX 上 使 用 VCSAgStartup() 和 脚 本 入 口 点下 面 的 示 例 说 明 如 何 使 用 您 自 己 的 VCSAgStartup 入 口 点 来 构 建 FileOnOff 代 理 。此 示 例 仅 实 现 VCSAgStartup、 online、 offline 和 monitor 入 口 点 。例 如 : 使 用 VCSAgStartup 和 脚 本 入 口 点 实 现 代 理1 创 建 以 下 目 录 :mkdir /opt/VRTSvcs/src/agent/FileOnOff2 将 以 下 内 容 从 示 例 代 理 目 录 复 制 到 上 一 步 中 创 建 的 目 录 :cp /opt/VRTSvcs/src/agent/Sample/*/opt/VRTSvcs/src/agent/FileOnOff3 更 改 至 新 目 录 :cd /opt/VRTSvcs/src/agent/FileOnOff4 编 辑 文 件 agent.C 并 修 改 VCSAgStartup() 函 数 ( 最 后 几 行 ) 以 匹 配 以 下示 例 :void VCSAgStartup() {VCSAgInitEntryPointStruct(V51);// Do not configure any entry points because// this example does not implement any of them// using C++.VCSAgSetLogCategory(10041);}5 通 过 调 用 make 编 译 agent.C 并 构 建 该 代 理 。 ( 会 提 供 Makefile)make6 为 该 代 理 创 建 一 个 目 录 :mkdir /opt/VRTSvcs/bin/FileOnOff7 安 装 FileOnOff 代 理 。make install AGENT=FileOnOff8 实 现 online、 offline 和 monitor 入 口 点 。请 参 见 第 117 页 的 “ 例 如 : 在 UNIX 上 使 用 脚 本 入 口 点 ”。


构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理119使 用 C++ 实 现 入 口 点使 用 C++ 实 现 入 口 点1 编 辑 agent.C 以 自 定 义 该 实 现 ;agent.C 位 于 目 录$VCS_HOME/src/agent/Sample 下 。2 完 成 对 agent.C 的 更 改 后 , 请 调 用 make 命 令 以 构 建 该 代 理 。 请 从 Makefile所 在 的 $VCS_HOME/src/agent/Sample 目 录 中 调 用 该 命 令 。3 命 名 该 代 理 二 进 制 文 件 :resource_type <strong>Agent</strong>。4 将 该 代 理 放 置 到 目 录 $VCS_HOME/bin/resource_type 下 。例 如 , Oracle 的 代 理 二 进 制 文 件 应 当 为$VCS_HOME/bin/Oracle/Oracle<strong>Agent</strong>。例 如 : 在 UNIX 上 使 用 C++ 入 口 点本 节 中 的 示 例 显 示 如 何 使 用 您 自 己 的 VCSAgStartup 入 口 点 和 C++ 版 本 的online、 offline 和 monitor 入 口 点 来 构 建 FileOnOff 代 理 。 此 示 例 仅 实 现VCSAgStartup、 online、 offline 和 monitor 入 口 点 。例 如 :VCSAgStartup 和 C++ 入 口 点1 编 辑 文 件 agent.C 并 修 改 VCSAgStartup() 函 数 ( 最 后 几 行 ) 以 匹 配 以 下示 例 :// Description: This functions registers the entry points //void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPOnline, res_online);VCSAgValidateAndSetEntryPoint(VCSAgEPOffline, res_offline);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);}2 修 改 res_online():// This is a C++ implementation of the online entry// point for the FileOnOff resource type. This function// brings online a FileOnOff resource by creating the// corresponding file. It is assumed that the complete// pathname of the file will be passed as the first// ArgList attribute.unsigned int res_online(const char *res_name, void **attr_val) {WCHAR **new_args = NULL;


120 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理DWORDHANDLEwchar_tret;hFile = NULL;*pathName = NULL;VCSAG_LOG_INIT("res_online");VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS, I,"Insideonline.");ret = VCSAgGetEncodedArgList(VCSAgUTF8, attr_val, VCSAgUCS2,(void ***)&new_args);if (ret){VCSAG_LOG_MSG(VCS_NOTICE, 1001, VCS_DEFAULT_FLAGS,I,"Unable to get the arguments");goto exit;}int index_of_attr = -1;ret = vcsag_get_attr_value((wchar_t**)new_args, I,"PathName",&pathName, index_of_attr, 1);if(ret !=VCSAG_SUCCESS){goto exit;}hFile = CreateFile(pathName,GENERIC_READ | GENERIC_WRITE,0, NULL,OPEN_ALWAYS,res_ATTRIBUTE_NORMAL,(HANDLE)NULL);if (!hFile || hFile == INVALID_HANDLE_VALUE){VCSAG_LOG_MSG(VCS_ERROR, 1002, VCS_DEFAULT_FLAGS,I,"Unable to create the file");}else{VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS,I,"Onlinesuccessful.");CloseHandle(hFile);}exit:if(new_args)VCSAgDelEncodedArgList((void**)new_args);return 0;}


构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理1213 修 改 res_offline():// Function: res_offline// Description: This function deletes the file //unsigned int res_offline(const char *res_name, void **attr_val){WCHAR **new_args = NULL;DWORD ret;wchar_t *pathName = NULL;VCSAG_LOG_INIT("res_offline");VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS,I,"Insideoffline.");ret = VCSAgGetEncodedArgList(VCSAgUTF8, attr_val, VCSAgUCS2,(void ***)&new_args);if (ret){VCSAG_LOG_MSG(VCS_NOTICE, 1001, VCS_DEFAULT_FLAGS,I,"Unable to get the arguments");goto exit;}int index_of_attr = -1;ret = vcsag_get_attr_value((wchar_t**)new_args, I,"PathName",&pathName, index_of_attr, 1);if(ret !=VCSAG_SUCCESS){goto exit;}if (!DeleteFile(pathName)){VCSAG_LOG_MSG(VCS_ERROR, 1003, VCS_DEFAULT_FLAGS,I,"Unable to delete the file");}else{VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS,I,"offlinesuccessful.");}exit:if(new_args)VCSAgDelEncodedArgList((void**)new_args);return 0;}


122 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理4 修 改 res_monitor() 函 数 。请 参 见 第 122 页 的 “ 例 如 : 在 UNIX 上 使 用 C++ 和 脚 本 入 口 点 ”。5 通 过 调 用 make 编 译 agent.C 并 构 建 该 代 理 。 ( 会 提 供 Makefile)make6 为 该 代 理 二 进 制 文 件 创 建 目 录 :mkdir /opt/VRTSvcs/bin/FileOnOff7 安 装 FileOnOff 代 理 。make install AGENT=FileOnOff例 如 : 在 UNIX 上 使 用 C++ 和 脚 本 入 口 点以 下 示 例 说 明 如 何 使 用 您 自 己 的 VCSAgStartup 入 口 点 、 C++ 版 本 的 monitor入 口 点 以 及 脚 本 版 本 的 online 和 offline 入 口 点 , 构 建 FileOnOff 代 理 。 此 示例 仅 实 现 VCSAgStartup、 online、 offline 和 monitor 入 口 点 。例 如 : 使 用 VCSAgStartup、 C++ 和 脚 本 入 口 点 实 现 代 理1 为 该 代 理 创 建 一 个 目 录 :mkdir /opt/VRTSvcs/src/agent/FileOnOff2 将 以 下 内 容 从 示 例 代 理 复 制 到 上 一 步 中 创 建 的 目 录 :cp /opt/VRTSvcs/src/agent/Sample/*/opt/VRTSvcs/src/agent/FileOnOff3 更 改 至 新 目 录 :cd /opt/VRTSvcs/src/agent/FileOnOff4 编 辑 文 件 agent.C 并 修 改 VCSAgStartup() 函 数 ( 最 后 几 行 ) 以 匹 配 以 下示 例 :// Description:This functions registers the entry points //void VCSAgStartup(){VCSAG_LOG_INIT("VCSAgStartup");VCSAgSetLogCategory(10051);VCSAgInitEntryPointStruct(V51);}VCSAgValidateAndSetEntryPoint(VCSAgEPMonitor, res_monitor);VCSAgValidateAndSetEntryPoint(VCSAgEPClean, res_clean);


构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理1235 修 改 res_monitor() 函 数 :// Function: res_monitor// Description: Determine if the given file is online (file exists)// or offline (file does not exist).VCSAgResState res_monitor(const char *res_name, void**attr_val, int *conf_level){VCSAgResStatestate;WCHAR **new_args = NULL;DWORD ret, attrs;wchar_t *pathName = NULL;VCSAG_LOG_INIT("res_monitor");VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS,I,"Insidemonitor.");ret = VCSAgGetEncodedArgList(VCSAgUTF8, attr_val, VCSAgUCS2,(void ***)&new_args);if (ret){VCSAG_LOG_MSG(VCS_NOTICE, 1001, VCS_DEFAULT_FLAGS,I,"Unable to get the arguments");state = VCSAgResUnknown;goto exit;}state = VCSAgResUnknown;int index_of_attr = -1;ret = vcsag_get_attr_value((wchar_t**)new_args,I,"PathName",&pathName, index_of_attr, 1);if(ret !=VCSAG_SUCCESS){goto exit;}attrs = GetFileAttributes(pathName);if (attrs == 0xffffffff){state = VCSAgResOffline;*conf_level = 0;}else{state = VCSAgResOnline;*conf_level = 100;}VCSAG_RES_LOG_MSG(VCS_DBG1, VCS_DEFAULT_FLAGS,I,"Monitorsuccessful.");exit:if(new_args)VCSAgDelEncodedArgList((void**)new_args);return state;}


124 构 建 自 定 义 代 理在 UNIX 上 构 建 自 定 义 代 理6 通 过 调 用 make 编 译 agent.C 并 构 建 该 代 理 。 ( 会 提 供 Makefile)make7 为 该 代 理 构 建 脚 本 入 口 点 。请 参 见 第 117 页 的 “ 例 如 : 在 UNIX 上 使 用 脚 本 入 口 点 ”8 为 该 代 理 创 建 一 个 目 录 :mkdir /opt/VRTSvcs/bin/FileOnOff9 安 装 FileOnOff 代 理 。已 经 创 建 了 一 个 FileOnOff 类 型 定 义 文 件 。请 参 见 第 115 页 的 “ 为 自 定 义 代 理 创 建 类 型 定 义 文 件 ”。


构 建 自 定 义 代 理安 装 自 定 义 代 理125安 装 自 定 义 代 理您 可 以 在 下 列 目 录 之 一 中 安 装 自 定 义 代 理 。在 UNIX 上 :■■一 个 用 户 定 义 的 目 录 。 例 如 /myagents/custom_type/。 请 注 意 , 必 须 为 此 选项 配 置 <strong>Agent</strong>Directory 属 性 。/opt/VRTSvcs/bin/custom_type/注 : 仅 在 这 些 位 置 之 一 创 建 custom_type 目 录 。将 代 理 二 进 制 文 件 和 脚 本 入 口 点 添 加 到 custom_type 目 录 下 。注 : 要 封 装 该 代 理 , 请 参 见 操 作 系 统 文 档 。 安 装 要 在 区 域 中 运 行 的 代 理 时 , 如 果 要设 置 Solaris pkginfo 文 件 , 请 设 置 以 下 变 量 :SUNW_PKG_ALLZONES=true。为 自 定 义 资 源 类 型 定 义 资 源如 果 已 经 为 该 资 源 创 建 了 类 型 定 义 并 为 其 创 建 了 代 理 , 则 可 以 通 过 添 加 该 自 定 义 类型 的 资 源 并 为 资 源 属 性 <strong>指</strong> 定 值 , <strong>开</strong> 始 使 用 该 代 理 以 控 制 特 定 资 源 。可 以 在 main.cf 文 件 中 添 加 资 源 并 配 置 属 性 值 。示 例 资 源 定 义在 VCS 配 置 文 件 main.cf 中 , FileOnOff 资 源 类 型 的 一 个 特 定 资 源 可 能 如 下 所 示 :在 UNIX 上 的 示 例 main.cf 的 片 段 :include types.cf...FileOnOff temp_file1 (PathName = "/tmp/test")位 于 main.cf 文 件 <strong>开</strong> 头 的 include 语 句 会 命 名 types.cf 文 件 , 它 包 含 FileOnOff资 源 类 型 定 义 。 main.cf 文 件 中 定 义 的 资 源 会 <strong>指</strong> 定 :■■资 源 类 型 :FileOnOff资 源 名 称 temp_file1


126 构 建 自 定 义 代 理为 自 定 义 资 源 类 型 定 义 资 源■属 性 名 称 PathName■ PathName 属 性 的 值 :On UNIX:"/tmp/test"如 果 通 过 VCS 使 资 源 temp_file1 在 系 统 上 联 机 , 则 FileOnOff 代 理 会 在 该 系 统 上的 <strong>指</strong> 定 目 录 下 创 建 一 个 文 件 test。FileOnOff 代 理 如 何 使 用 配 置 信 息当 FileOnOff 代 理 在 服 务 器 场 中 的 某 个 节 点 上 启 动 时 , 引 擎 会 将 VCS 配 置 中 的 信息 传 递 给 该 代 理 。 传 递 到 该 代 理 的 信 息 包 括 : 在 系 统 上 配 置 的 类 型 为 FileOnOff 的资 源 名 称 、 相 应 的 资 源 属 性 以 及 该 类 型 的 所 有 资 源 的 属 性 值 。例 如 , 之 后 要 使 资 源 联 机 , VCS 可 以 为 该 代 理 提 供 入 口 点 (online) 的 名 称 和 资 源(temp_file01) 的 名 称 。 然 后 该 代 理 会 调 用 入 口 点 , 并 在 入 口 点 的 ArgList 中提 供 该 资 源 名 称 和 这 些 属 性 的 值 。 入 口 点 会 执 行 其 任 务 。


7测 试 代 理■■■■关 于 测 试 代 理使 用 调 试 消 息使 用 引 擎 进 程 测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理


128 测 试 代 理关 于 测 试 代 理关 于 测 试 代 理使 用 调 试 消 息调 试 代 理 函 数 ( 入 口 点 )在 对 代 理 进 行 测 试 之 前 , 请 确 保 已 构 建 并 安 装 和 配 置 了 该 代 理 。通 过 设 置 LogDbg 属 性 的 值 可 以 激 活 代 理 框 架 调 试 消 息 。 这 样 将 <strong>指</strong> 示 框 架 输 出 以 <strong>指</strong>定 的 严 重 程 度 记 录 的 消 息 。请 参 见 第 142 页 的 “LogDbg”。LogDbg 属 性 <strong>指</strong> 示 针 对 资 源 类 型 或 代 理 框 架 启 用 的 调 试 严 重 程 度 。 代 理 函 数 所 使 用的 调 试 严 重 程 度 范 围 为 DBG_1-BG_21。若 要 启 用 调 试 日 志 记 录 , 请 使 用 类 型 级 LogDbg 属 性 。为 特 定 资 源 类 型 设 置 调 试 严 重 程 度 :hatype -modify LogDbg -add [ ...]为 特 定 资 源 类 型 删 除 调 试 严 重 程 度 :hatype -modify LogDbg -delete [ ...]删 除 所 有 调 试 严 重 程 度 :hatype -modify LogDbg -delete -keys请 注 意 , 无 法 为 单 个 资 源 设 置 调 试 严 重 程 度 。要 调 试 特 定 代 理 的 入 口 点 , 请 参 见 该 代 理 的 文 档 。 所 以 , 对 于 捆 绑 代 理 , 请 参 见“Bundled <strong>Agent</strong> 参 考 <strong>指</strong> <strong>南</strong> ”。UNIX: $VCS_LOG/log/resource_type_A.log例 如 , 如 果 需 要 以 严 重 程 度 级 别 DBG_3 和 DBG_4 记 录 FileOnOff 资 源 类 型 的 调 试消 息 , 请 使 用 hatype 命 令 :# hatype -modify FileOnOff LogDbg -add DBG_3 DBG_4# hatype -display FileOnOff -attribute LogDbgTYPE ATTRIBUTE VALUEFileOnOff LogDbg DBG_3 DBG_4来 自 FileOnOff 代 理 且 调 试 严 重 程 度 为 DBG_3 和 DBG_4 的 调 试 消 息 会 输 出 至 日 志文 件 中 。 来 自 C++ 入 口 点 的 调 试 消 息 将 输 出 至 代 理 日 志 文 件 , 而 来 自 脚 本 入 口 点的 调 试 消 息 将 输 出 至 HAD 日 志 文 件 。 代 理 日 志 文 件 中 的 示 例 行 :..2003/06/06 11:02:35 VCS DBG_3 V-16-50-0FileOnOff:f1:monitor:This is a debug messageFileOnOff.C:res_monitor[28]


测 试 代 理使 用 引 擎 进 程 测 试 代 理129调 试 代 理 框 架LogDbg 属 性 <strong>指</strong> 示 针 对 资 源 类 型 或 代 理 框 架 启 用 的 调 试 严 重 程 度 。 来 自 代 理 框 架 的调 试 消 息 是 采 用 下 列 严 重 程 度 记 录 的 :■ DBG_AGDEBUG: 启 用 大 多 数 调 试 日 志 , 包 括 : 从 引 擎 接 收 到 的 调 试 命 令 、服 务 线 程 执 行 代 码 路 径 ( 即 , 服 务 线 程 何 时 选 取 用 于 运 行 入 口 点 或 修 改 属 性的 资 源 )、 代 理 所 使 用 的 环 境 变 量 的 输 出 、 计 时 器 相 关 处 理 ( 如 将 IAmAlive消 息 <strong>发</strong> 送 至 引 擎 ) 等 等 。■■DBG_AGINFO: 启 用 与 特 定 入 口 点 的 执 行 相 关 的 调 试 消 息 , 包 括 入 口 点 退 出代 码 、 资 源 在 各 种 内 部 状 态 间 的 转 换 、 入 口 点 调 用 前 的 ArgListValues 输 出 、与 入 口 点 执 行 相 关 的 属 性 ( 如 RunInContainer 和 PassCInfo) 的 值 等 等 。DBG_AGTRACE: 启 用 详 细 的 调 试 日 志 记 录 , 其 中 的 大 部 分 几 乎 为 在 代 理 框中 所 调 用 的 每 个 函 数 ( 如 function-tracing) 的 Begin 和 End 消 息 。使 用 引 擎 进 程 测 试 代 理如 果 在 系 统 上 激 活 VCS HAD 进 程 , 它 会 自 动 根 据 配 置 文 件 的 内 容 来 启 动 相 应 代 理进 程 。单 个 代 理 进 程 可 监 视 系 统 上 相 同 类 型 的 所 有 资 源 。激 活 VCS HAD 进 程 后 , 在 系 统 提 示 符 下 键 入 如 下 命 令 可 以 验 证 代 理 是 否 已 启 动 并在 运 行 :haagent -display 例 如 , 要 测 试 Oracle 代 理 , 请 键 入 :haagent -display Oracle如 果 Oracle 代 理 正 在 运 行 , 则 输 出 会 如 下 所 示 :#<strong>Agent</strong> Attribute ValueOracle <strong>Agent</strong>FileOracle Faults 0Oracle Running YesOracle Started Yes


130 测 试 代 理使 用 引 擎 进 程 测 试 代 理测 试 命 令下 面 的 示 例 显 示 如 何 使 用 命 令 来 测 试 代 理 :■ 要 激 活 C++ 代 理 的 代 理 调 试 消 息 , 请 键 入 :hatype -modify LogDbg -add DBG_AGINFO■ 要 检 查 资 源 的 状 态 , 请 键 入 :hares -display ■ 要 使 资 源 联 机 , 请 键 入 :hares -online -sys system这 样 会 调 用 相 应 代 理 的 online 入 口 点 。■ 要 使 资 源 脱 机 , 请 键 入 :hares -offline -sys system这 样 会 调 用 相 应 代 理 的 offline 入 口 点 。■ 要 停 用 C++ 代 理 的 代 理 调 试 消 息 , 请 键 入 :hatype -modify LogDbg -delete DBG_AGINFO


测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理131使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 , 可 以 在 不 运 行 HAD 进 程 的 情 况 对 代 理 进 行 测 试 。该 实 用 程 序 是 产 品 软 件 包 的 一 部 分 , 安 装 在UNIX: $VCS_HOME/bin 目 录 中 。如 果 引 擎 进 程 未 运 行 , 请 在 任 意 节 点 上 运 行 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 。启 动 <strong>Agent</strong><strong>Server</strong> 并 访 问 帮 助 信 息 (UNIX)1 键 入 以 下 命 令 以 启 动 <strong>Agent</strong><strong>Server</strong>:$VCS_HOME/bin/<strong>Agent</strong><strong>Server</strong><strong>Agent</strong><strong>Server</strong> 实 用 程 序 会 在 TCP 端 口 监 视 来 自 代 理 的 消 息 。 通 过 在/etc/services 文 件 中 将 以 下 字 符 串 设 置 为 端 口 号 来 配 置 此 端 口 。vcstest /tcp如 果 没 有 <strong>指</strong> 定 该 值 , <strong>Agent</strong><strong>Server</strong> 会 使 用 默 认 值 14142。2 启 动 <strong>Agent</strong><strong>Server</strong> 后 , 系 统 会 显 示 一 条 消 息 , 提 示 您 输 入 命 令 。 / 要 获 取<strong>Agent</strong><strong>Server</strong> 命 令 的 完 整 列 表 , 请 键 入 :> help输 出 信 息 如 下 所 示 :The following commands are supported.(Use help for moreinformation on using any command.)addattraddresaddstaticattraddtypedebughashdebugmemorydebugtimedeletedeleteresmodifyresmodifytypeofflineresonlineresprintproberesstartagentstopagentquit


132 测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理3 有 关 特 定 命 令 的 帮 助 信 息 , 请 在 <strong>Agent</strong><strong>Server</strong> 提 示 符 (>) 下 键 入 helpcommand_name。 例 如 , 有 关 如 何 使 资 源 联 机 的 信 息 , 请 键 入 :> help onlineres输 出 信 息 如 下 所 示 :Sends a message to an agent to online a resource.Usage:onlineres where is id for the agent - usually same asthe resource type name.where is the name of the resource.测 试 FileOnOff 代 理 (UNIX)1 启 动 该 资 源 类 型 的 代 理 :>startagent FileOnOff /opt/VRTSvcs/bin/FileOnOff/FileOnOff<strong>Agent</strong>会 收 到 下 列 消 息 :<strong>Agent</strong> (FileOnOff) has connected.<strong>Agent</strong> (FileOnOff) is ready to accept commands.2 以 下 是 在 测 试 FileOnOff 代 理 时 可 以 参 考 的 types.cf 和 main.cf 配 置 文 件 的示 例 :■ FileOnOff 代 理 的 示 例 types.cf 定 义 :type FileOnOff (str PathNamestatic str ArgList[] = { PathName })■ FileOnOff 资 源 的 示 例 main.cf 定 义 :...group ga (...) FileOnOff file1 (Enabled = 1PathName = "/tmp/VRTSvcsfile001")示 例 配 置 是 使 用 <strong>Agent</strong><strong>Server</strong> 命 令 设 置 的 。3 完 成 下 列 步 骤 以 便 将 此 示 例 配 置 传 递 至 该 代 理 。■ 添 加 类 型 :>addtype FileOnOff FileOnOff■ 添 加 该 类 型 的 属 性 :>addattr FileOnOff FileOnOff PathName str "">addattr FileOnOff FileOnOff Enabled int 0


测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理133■ 向 FileOnOff 资 源 类 型 添 加 静 态 属 性 :>addstaticattr FileOnOff FileOnOff ArgList vector PathName■ 添 加 LogLevel 属 性 以 查 看 来 自 该 代 理 的 调 试 消 息 :>addstaticattr FileOnOff FileOnOff LogLevel str info■ 添 加 资 源 :>addres FileOnOff file1 FileOnOff■ 设 置 资 源 属 性 :>modifyres FileOnOff file1 PathName str /tmp/VRTSvcsfile001>modifyres FileOnOff file1 Enabled int 14 添 加 并 修 改 资 源 后 , 键 入 如 下 命 令 以 获 得 资 源 的 状 态 :>proberes FileOnOff file1此 命 令 会 调 用 FileOnOff 代 理 的 monitor 入 口 点 。您 将 收 到 下 列 表 明 资 源 状 态 的 消 息 :Resource(file1) is OFFLINEResource(file1) confidence level is 0■ 使 资 源 联 机 :>onlineres FileOnOff file1此 命 令 会 调 用 FileOnOff 代 理 的 online 入 口 点 。 file1 联 机 后 , 会 显示 以 下 消 息 :Resource(file1) is ONLINEResource(file1) confidence level is 100■ 使 资 源 脱 机 :>offlineres FileOnOff file1此 命 令 会 调 用 FileOnOff 代 理 的 offline 入 口 点 。5 查 看 <strong>Agent</strong><strong>Server</strong> 进 程 所 启 动 的 代 理 的 列 表 :>print输 出 信 息 如 下 所 示 :Following <strong>Agent</strong>s are started:FileOnOff6 停 止 代 理 :>stopagent FileOnOff7 从 <strong>Agent</strong><strong>Server</strong> 退 出 :>quit


134 测 试 代 理使 用 <strong>Agent</strong><strong>Server</strong> 实 用 程 序 测 试 代 理


8静 态 类 型 属 性■■关 于 静 态 属 性静 态 类 型 属 性 定 义


136 静 态 类 型 属 性关 于 静 态 属 性关 于 静 态 属 性改 写 静 态 类 型 属 性预 定 义 的 静 态 资 源 类 型 属 性 适 用 于 所 有 的 资 源 类 型 。请 参 见 第 137 页 的 “ 静 态 类 型 属 性 定 义 ”当 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 创 建 代 理 并 为 这 些 代 理 定 义 资 源 类 型 时 , 静 态 类 型 属 性 就 会 成 为 类 型 定义 的 一 部 分 。通 常 情 况 下 , 某 一 资 源 类 型 的 静 态 属 性 值 适 用 于 该 类 型 的 所 有 资 源 。 但 是 您 可 以 覆盖 特 定 资 源 的 静 态 属 性 值 , 而 不 会 影 响 该 类 型 的 其 他 资 源 的 相 应 静 态 属 性 值 。 在 本章 中 , 对 每 个 代 理 属 性 的 说 明 都 会 <strong>指</strong> 出 该 属 性 的 值 是 否 可 以 改 写 。用 户 可 以 通 过 两 种 方 式 覆 盖 静 态 属 性 的 值 :■在 资 源 定 义 中 显 式 定 义 属 性■ 在 命 令 行 中 使 用 带 有 -override 选 项 的 hares 命 令 。改 写 后 的 属 性 的 值 可 以 使 用 hares -display 命 令 来 显 示 。 如 果 要 删 除 静 态 属 性的 改 写 值 , 可 以 在 命 令 行 中 使 用 hares -undo_override 命 令 选 项 。有 关 覆 盖 静 态 属 性 的 值 的 其 他 信 息 , 请 参 见 “ 管 理 <strong>指</strong> <strong>南</strong> ”。注 : 在 虚 拟 机 上 运 行 的 代 理 的 静 态 类 型 属 性 不 可 覆 盖 。有 关 更 多 信 息 , 请 参 见 “ 管 理 <strong>指</strong> <strong>南</strong> ”。


静 态 类 型 属 性静 态 类 型 属 性 定 义137静 态 类 型 属 性 定 义ActionTimeout以 下 各 节 介 绍 有 关 代 理 的 静 态 属 性 。hares -action 命 令 <strong>指</strong> 示 代 理 执 行 <strong>指</strong> 定 的 操 作 后 , action 入 口 点 就 有 了 由ActionTimeout 属 性 ( 标 量 整 型 ) <strong>指</strong> 定 的 时 间 来 执 行 该 操 作 。 如 果 经 过 改 写 ,ActionTimeout 的 值 也 可 以 针 对 个 别 的 资 源 进 行 设 置 。不 管 ActionTimeout 的 值 是 否 经 过 了 改 写 , 也 不 管 为 其 <strong>指</strong> 定 了 何 值 , 都 会 将 该 值内 部 限 制 为 0.5 * MonitorInterval。 关 于 MonitorInterval 属 性 的 说 明 如 下 所 示 。默 认 值 为 30 秒 。 可 以 改 写 ActionTimeout 属 性 值 。AEPTimeout<strong>Agent</strong>ClassAEPTimeout ( 附 加 入 口 点 超 时 ) 属 性 是 一 个 布 尔 型 属 性 。 将 该 属 性 设 置 为 true,可 以 为 传 递 给 入 口 点 的 参 数 列 表 中 的 特 定 条 目 附 加 超 时 值 。例 如 , 如 果 AEPTimeout 设 置 为 1, 则 代 理 框 架 以 名 称 - 值 元 组 格 式 将MonitorTimeout 属 性 的 值 传 递 给 monitor 入 口 点 。 同 样 , CleanTimeout 的 值 会传 递 给 clean 入 口 点 。此 功 能 不 适 用 于 V50 以 前 的 代 理 。请 参 见 第 43 页 的 “ 关 于 入 口 点 超 时 ”。<strong>指</strong> 出 代 理 进 程 的 调 度 等 级 。默 认 值 为 TS。<strong>Agent</strong>FailedOn键 列 表 属 性 , 用 于 <strong>指</strong> 出 代 理 在 哪 些 系 统 上 <strong>发</strong> 生 了 故 障 。 这 不 是 用 户 定 义 的 属 性 。默 认 情 况 下 为 空 键 列 表 。<strong>Agent</strong>Priority<strong>指</strong> 示 代 理 进 程 的 运 行 优 先 级 。默 认 值 为 0。


138 静 态 类 型 属 性静 态 类 型 属 性 定 义<strong>Agent</strong>ReplyTimeout<strong>Agent</strong>StartTimeout如 果 在 等 待 <strong>Agent</strong>ReplyTimeout 所 <strong>指</strong> 定 的 秒 数 后 还 没 有 收 到 代 理 传 来 的 “ 任 何 ”消 息 , HAD 进 程 就 会 重 新 启 动 该 代 理 。默 认 值 为 130 秒 , 该 值 适 用 于 大 多 数 配 置 。 如 果 在 服 务 器 场 处 于 稳 定 状 态 下 时HAD 进 程 重 新 启 动 代 理 的 次 数 过 于 频 繁 , 请 增 大 此 值 。 当 系 统 负 载 较 重 或 者 资 源数 超 过 400 时 , 会 <strong>发</strong> 生 这 种 情 况 。 请 参 考 有 关 haagent -display 命 令 的 说 明 。请 注 意 , HAD 进 程 还 将 重 新 启 动 崩 溃 了 的 代 理 。无 法 改 写 <strong>Agent</strong>ReplyTimeout 属 性 值 。<strong>Agent</strong>StartTimeout 的 值 <strong>指</strong> 定 HAD 进 程 在 启 动 代 理 之 后 、 尝 试 重 新 启 动 该 代 理 之前 所 等 待 的 初 始 代 理 “ 握 手 ” 时 间 长 度 。默 认 值 为 60 秒 。 无 法 改 写 <strong>Agent</strong>StartTimeout 属 性 值 。ArgList属 性 的 有 序 列 表 , 根 据 该 顺 序 将 属 性 值 传 递 到 open、 close、 online、 offline、monitor、 info、 action 和 clean 入 口 点 。默 认 情 况 下 为 空 列 表 。 无 法 改 写 该 ArgList 属 性 值 。ArgList 引 用 属 性引 用 属 性 <strong>指</strong> 的 是 其 他 资 源 的 属 性 。 如 果 某 个 资 源 的 属 性 值 是 另 一 个 资 源 的 名 称 ,则 第 一 个 资 源 的 ArgList 可 以 使 用 : 运 算 符 引 用 第 二 个 资 源 的 属 性 。例 如 假 定 类 型 T1 的 ArgList 参 数 形 式 如 下 :{ Attr1, Attr2, Attr3:Attr_A }AttrChangedTimeout其 中 Attr1、 Attr2 和 Attr3 都 是 类 型 T1 的 属 性 , 假 定 类 型 T1 存 在 资 源 res1T1,其 Attr3 的 值 就 是 另 一 个 资 源 res1T2 的 名 称 , 则 res1T1 的 入 口 点 上 就 会 依 次 传 递资 源 res1T1 的 Attr1 和 Attr2 属 性 的 值 以 及 资 源 res1T2 的 Attr_A 属 性 的 值 。请 注 意 , 将 Attr3:Attr_A 添 加 到 类 型 T1 的 ArgList 中 之 前 , 必 须 先 将 属 性 Attr3添 加 到 T1。 只 有 这 样 才 能 修 改 某 个 资 源 (res1T1) 的 Attr3 属 性 , 以 引 用 另 一 个 资源 (res1T2)。 另 外 , Attr3 的 值 既 可 以 是 同 一 时 间 的 另 一 资 源 (res2T1), 也 可 以 是另 一 类 型 的 资 源 (res1T2)。最 大 时 间 段 ( 秒 ), attr_changed 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 60 秒 。 可 以 改 写 AttrChangedTimeout 属 性 值 。


静 态 类 型 属 性静 态 类 型 属 性 定 义139CleanTimeoutCloseTimeout最 大 时 间 段 ( 秒 ), clean 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 60 秒 。 可 以 改 写 CleanTimeout 属 性 值 。最 大 时 间 段 ( 秒 ), close 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 60 秒 。 可 以 改 写 CloseTimeout 属 性 值 。ContainerOpts<strong>指</strong> 定 是 否 需 要 将 服 务 组 的 负 载 维 数 传 递 给 资 源 , 以 便 为 该 资 源 初 始 化 并 设 置 CPU共 享 。 它 还 <strong>指</strong> 定 资 源 是 否 需 要 在 容 器 的 上 下 文 中 运 行 。 对 于 您 希 望 将 其 作 为 区 域或 项 目 的 一 部 分 的 每 个 应 用 程 序 或 资 源 类 型 , 需 要 为 ContainerOpts 属 性 分 配 下列 值 :■ RunInContainer (RIC)RunInContainer 定 义 代 理 框 架 是 否 应 在 容 器 内 为 代 理 运 行 所 有 基 于 脚 本 的 入口 点 。 如 果 将 该 属 性 设 置 为 1, 则 所 有 基 于 脚 本 的 入 口 点 会 在 为 相 应 资 源 配 置的 本 地 容 器 内 执 行 。 如 果 将 该 属 性 设 置 为 0, 则 即 便 资 源 的 服 务 组 已 设 置 了ContainerInfo, 该 资 源 的 入 口 点 脚 本 也 将 仍 在 全 局 容 器 中 运 行 。■ PassCInfo (PCI)PassCInfo <strong>指</strong> 定 是 否 希 望 将 在 服 务 组 的 ContainerInfo 属 性 中 的 定 义 的 容 器 信息 传 递 给 资 源 。 如 果 希 望 将 容 器 信 息 传 递 给 资 源 , 则 将 该 值 <strong>指</strong> 定 为 1。 如 果 不希 望 将 容 器 信 息 传 递 给 资 源 , 则 将 该 值 <strong>指</strong> 定 为 0。■ PassLoadInfo (PLI)PassLoadInfo <strong>指</strong> 定 是 否 希 望 将 在 服 务 组 的 Load 属 性 中 定 义 的 服 务 组 负 载 维 数传 递 给 资 源 。 服 务 组 负 载 维 数 是 在 资 源 的 Workload 属 性 中 设 置 的 。 如 果 希 望将 服 务 组 负 载 维 数 传 递 给 资 源 , 则 将 该 值 <strong>指</strong> 定 为 1。 如 果 不 希 望 将 服 务 组 负 载维 数 传 递 给 资 源 , 则 将 该 值 <strong>指</strong> 定 为 0。每 个 资 源 类 型 还 包 括 Workload 属 性 , 该 属 性 为 非 静 态 属 性 。 当 资 源 的PassLoadInfo (ContainerOpts 属 性 ) 键 设 置 为 1 时 , 该 属 性 的 值 将 由 服 务 组 的Load 属 性 来 填 充 。


140 静 态 类 型 属 性静 态 类 型 属 性 定 义ConfInterval<strong>指</strong> 定 间 隔 ( 秒 )。 如 果 资 源 在 <strong>指</strong> 定 的 间 隔 内 保 持 联 机 ( 在 该 间 隔 内 所 有 的monitor 调 用 都 报 告 为 ONLINE), 则 会 忽 略 之 前 的 任 何 故 障 和 对 该 资 源 的 重 新 启动 尝 试 。 此 属 性 与 ToleranceLimit 一 起 使 用 , 以 使 monitor 入 口 点 能 够 在 该 资 源被 声 明 为 FAULTED 之 前 报 告 OFFLINE 状 态 数 次 。 如 果 monitor 报 告 OFFLINE 的 次 数大 于 在 ToleranceLimit 中 设 置 的 数 值 , 则 该 资 源 会 声 明 为 FAULTED。 但 是 , 如 果该 资 源 保 持 为 联 机 状 态 的 时 间 达 到 了 ConfInterval 中 <strong>指</strong> 定 的 间 隔 , 则 在 与ToleranceLimit 进 行 比 较 时 将 不 再 包 括 先 前 报 告 的 OFFLINE 数 。代 理 框 架 使 用 MonitorInterval (MI)、 MonitorTimeout (MT) 和 ToleranceLimit(TL) 的 值 来 确 定 将 ConfInterval 的 值 设 置 到 多 低 为 合 适 。 代 理 框 架 会 确 保ConfInterval (CI) 不 低 于 下 面 的 关 系 式 所 表 达 的 值 :(MI + MT) * TL + MI + 10会 忽 略 比 ConfInterval 所 <strong>指</strong> 定 的 值 更 低 的 值 。 例 如 , 假 设 MI 的 值 为 60,MT 的 值为 60, TL 的 值 为 0。 如 果 为 CI <strong>指</strong> 定 任 何 低 于 70 的 值 , 代 理 框 架 会 忽 略 <strong>指</strong> 定 的 值并 将 该 值 设 置 为 70。 但 是 您 可 以 成 功 地 为 CI <strong>指</strong> 定 并 设 置 任 何 高 于 70 的 值 。ConfInterval 还 可 以 与 RestartLimit 一 起 使 用 以 防 止 HAD 无 限 制 地 重 新 启 动 资 源 。HAD 进 程 在 放 弃 并 故 障 转 移 之 前 , 会 尝 试 根 据 在 ConfInterval 中 以 RestartLimit设 置 的 次 数 , 一 直 在 同 一 系 统 上 重 新 启 动 资 源 。 但 是 , 如 果 该 资 源 在 ConfInterval中 <strong>指</strong> 定 的 间 隔 内 仍 处 于 联 机 状 态 , 则 先 前 尝 试 重 新 启 动 的 次 数 不 会 将 RestartLimit中 设 置 的 次 数 计 算 在 内 。 默 认 值 为 600 秒 。可 以 改 写 ConfInterval 属 性 值 。FaultOnMonitorTimeouts<strong>指</strong> 出 经 过 多 少 次 连 续 的 监 视 故 障 后 即 可 视 为 资 源 故 障 。 如 果 在 由 MonitorTimeout属 性 <strong>指</strong> 定 的 时 间 内 未 完 成 监 视 尝 试 , 则 视 为 失 败 。当 监 视 尝 试 达 到 此 属 性 <strong>指</strong> 定 的 次 数 值 后 , 相 应 的 资 源 就 会 通 过 调 用 clean 入 口 点关 闭 。 然 后 , 资 源 会 标 记 为 FAULTED 或 者 重 新 启 动 , 具 体 行 为 取 决 于 RestartLimit 属 性 中 设 置 的 值 。注 : 此 属 性 仅 适 用 于 联 机 资 源 。 如 果 资 源 处 于 脱 机 状 态 , 则 在 监 视 故 障 期 间 不 会 有任 何 特 别 操 作 。当 FaultOnMonitorTimeouts 设 置 为 0 时 , 不 能 认 为 监 视 程 序 故 障 表 示 资 源 <strong>发</strong> 生 了故 障 。默 认 值 为 4。 可 以 改 写 FaultOnMonitorTimeouts 属 性 值 。


静 态 类 型 属 性静 态 类 型 属 性 定 义141FireDrill“ 防 火 练 习 ” 是 <strong>指</strong> 在 辅 助 或 备 用 系 统 上 准 备 数 据 库 或 应 用 程 序 的 过 程 , 以 便 对 辅 助数 据 进 行 某 些 处 理 , 或 者 验 证 应 用 程 序 能 否 在 主 系 统 <strong>发</strong> 生 故 障 时 在 辅 助 系 统 上 联机 。 FireDrill 属 性 可 <strong>指</strong> 定 是 否 对 资 源 类 型 启 用 防 火 练 习 。 如 果 FireDrill 属 性 的 值为 1, 则 表 明 已 启 用 防 火 练 习 。 如 果 值 为 0, 则 表 明 未 启 用 防 火 练 习 。默 认 值 为 0。 无 法 改 写 FireDrill 属 性 。有 关 如 何 设 置 和 实 现 防 火 练 习 的 详 细 信 息 , 请 参 考 “ 管 理 <strong>指</strong> <strong>南</strong> ”。InfoIntervalInfoTimeout<strong>指</strong> 定 对 给 定 的 资 源 连 续 调 用 info 入 口 点 的 间 隔 ( 以 秒 为 单 位 )。 InfoInterval 属性 的 默 认 值 为 0, 表 明 代 理 框 架 不 会 定 期 调 度 info 入 口 点 ; 但 是 用 户 可 以 通 过 命令 行 调 用 入 口 点 。可 以 改 写 InfoInterval 属 性 值 。标 量 整 型 , <strong>指</strong> 定 为 完 成 info 入 口 点 , 代 理 框 架 所 能 允 许 的 时 间 。默 认 值 为 30 秒 。 InfoTimeout 属 性 的 值 内 定 为 MonitorInterval / 2。 可 以 改 写InfoTimeout 属 性 值 。IntentionalOfflineLeveltwomonitorfrequency定 义 VCS 如 何 对 不 受 VCS 控 制 而 有 意 停 止 的 已 配 置 应 用 程 序 作 出 反 应 。请 为 能 够 支 持 检 测 不 受 VCS 控 制 而 有 意 脱 机 的 代 理 添 加 此 属 性 。请 注 意 , 有 意 脱 机 功 能 仅 可 用 于 注 册 为 V51 或 更 高 版 本 的 代 理 。 要 使 用 此 功 能 ,需 使 用 Script51<strong>Agent</strong>。当 值 为 0 时 , 如 果 受 支 持 的 资 源 不 受 VCS 控 制 而 <strong>发</strong> 生 脱 机 , 代 理 就 会 注 册 一 个 故障 并 启 动 服 务 组 的 故 障 转 移 。 此 属 性 的 默 认 值 为 0。当 值 为 1 时 , 如 果 相 应 的 应 用 程 序 不 受 VCS 控 制 而 停 止 , VCS 就 会 使 资 源 脱 机 。此 属 性 不 会 影 响 VCS 在 应 用 程 序 出 现 故 障 时 的 行 为 。 如 果 受 管 理 的 相 应 应 用 程 序出 现 故 障 , 则 VCS 仍 然 会 将 资 源 判 定 为 <strong>发</strong> 生 故 障 。请 参 见 第 18 页 的 “ 关 于 On-Off 资 源 、 On-only 资 源 和 持 久 性 资 源 ”。代 理 框 架 启 动 详 细 监 视 的 监 视 周 期 次 数 。 例 如 , 如 果 将 此 属 性 设 置 为 5, 则 代 理 框架 会 每 隔 五 个 监 视 周 期 启 动 一 次 详 细 监 视 。


142 静 态 类 型 属 性静 态 类 型 属 性 定 义LogDbgLogFileSizeLogDbg 属 性 <strong>指</strong> 示 针 对 资 源 类 型 或 代 理 框 架 启 用 的 调 试 严 重 程 度 。代 理 函 数 所 使 用 的 调 试 严 重 程 度 的 范 围 为 DBG_1-BG_21。 默 认 情 况 下 , LogDbg是 一 个 空 列 表 , 表 示 不 为 某 个 资 源 类 型 记 录 调 试 消 息 。 用 户 可 以 为 给 定 的 资 源 类 型修 改 此 属 性 , 以 <strong>指</strong> 定 需 要 启 用 的 调 试 严 重 程 度 , 从 而 将 这 些 调 试 消 息 输 出 至 日 志 文件 中 。来 自 代 理 框 架 的 调 试 消 息 是 采 用 下 列 严 重 程 度 记 录 的 :■ DBG_AGDEBUG: 启 用 大 多 数 调 试 日 志 。■ DBG_AGINFO: 启 用 与 执 行 的 特 定 入 口 点 相 关 的 调 试 消 息 。■ DBG_AGTRACE: 启 用 详 细 调 试 日 志 记 录 。请 参 见 第 128 页 的 “ 使 用 调 试 消 息 ”。有 关 可 用 于 记 录 来 自 代 理 入 口 点 的 日 志 调 试 消 息 的 API 的 信 息 , 请 参 见 第 96 页 的“ 关 于 日 志 记 录 代 理 消 息 ”。 这 些 API 将 调 试 严 重 程 度 与 要 记 录 的 消 息 用 作 参 数 。您 可 以 为 消 息 选 择 不 同 的 调 试 严 重 程 度 , 以 便 为 代 理 提 供 不 同 的 日 志 记 录 级 别 。当 在 LogDbg 属 性 中 启 用 某 个 特 定 的 严 重 程 度 时 , 代 理 入 口 点 会 记 录 相 应 的 消 息 。设 置 代 理 日 志 文 件 的 大 小 。 其 值 必 须 <strong>指</strong> 定 为 字 节 数 。 最 小 值 为 65536 字 节(64KB)。 最 大 值 为 134217728 字 节 (128MB)。 默 认 值 为 33554432 字 节 (32MB)。例 如 ,hatype -modify FileOnOff LogFileSize 2097152小 于 最 小 可 接 受 值 的 <strong>指</strong> 定 值 将 会 变 为 65536 字 节 。 大 于 最 大 可 接 受 值 的 <strong>指</strong> 定 值 将会 变 为 134217728 字 节 。 因 此 ,hatype -display restype -attribute LogFileSize命 令 显 示 的 超 出 范 围 的 值 将 是 使 用 -modify 选 项 输 入 的 值 , 而 不 是 实 际 值 。 无 法改 写 LogFileSize 属 性 值 。ManageFaults服 务 组 级 属 性 。ManageFaults <strong>指</strong> 定 VCS 是 否 通 过 对 资 源 调 用 clean 入 口 点 来 管理 服 务 组 中 的 资 源 故 障 。 可 以 将 此 属 性 值 设 置 为 ALL 或 NONE。 默 认 值 为 ALL。如 果 设 置 为 NONE, 则 VCS 不 会 为 组 中 的 任 何 资 源 调 用 clean 入 口 点 。 处 理 资 源故 障 时 需 要 用 户 干 预 。 如 果 ManageFaults 设 置 为 NONE 且 <strong>发</strong> 生 了 下 列 事 件 之 一 ,则 资 源 将 进 入 ADMIN_WAIT 状 态 :


静 态 类 型 属 性静 态 类 型 属 性 定 义1431 offline 入 口 点 在 预 期 的 时 间 内 没 有 完 成 。 资 源 状 态 为ONLINE|ADMIN_WAIT2 offline 入 口 点 无 效 。 资 源 状 态 为 ONLINE|ADMIN_WAIT3 online 入 口 点 在 预 期 的 时 间 内 没 有 完 成 。 资 源 状 态 为OFFLINE|ADMIN_WAIT4 online 入 口 点 无 效 。 资 源 状 态 为 OFFLINE|ADMIN_WAIT5 资 源 意 外 脱 机 。 资 源 状 态 为 OFFLINE|ADMIN_WAIT6 对 于 联 机 资 源 , monitor 入 口 点 始 终 无 法 在 预 期 的 时 间 内 完 成 。 资 源 状 态 为ONLINE| MONITOR_ TIMEDOUT|ADMIN_WAITMonitorIntervalMonitorStatsParam对 ONLINE 资 源 或 正 在 转 换 的 资 源 的 两 次 连 续 监 视 调 用 之 间 的 持 续 时 间 ( 秒 )。默 认 值 为 60 秒 。 可 以 改 写 MonitorInterval 属 性 值 。MonitorStatsParam 是 一 个 类 型 级 属 性 , 用 来 存 储 计 算 监 视 时 间 统 计 信 息 时 所 必需 的 参 数 值 。 例 如 :static str MonitorStatsParam = { Frequency = 10, ExpectedValue =3000, ValueThreshold = 100, AvgThreshold = 40 }■■■■MonitorTimeoutFrequency: 定 义 监 视 周 期 次 数 , 达 到 此 监 视 周 期 次 数 后 应 计 算 平 均 监 视 周 期时 间 并 将 其 <strong>发</strong> 送 到 HAD。 此 键 的 值 可 以 从 1 到 30。 如 果 值 为 零 (0), 则 表 明不 需 要 计 算 平 均 监 视 时 间 。 这 是 此 键 的 默 认 值 。ExpectedValue: 此 类 型 的 所 有 资 源 的 预 期 监 视 时 间 ( 以 毫 秒 为 单 位 )。 默 认值 =100。ValueThreshold: 预 期 监 视 周 期 时 间 (ExpectedValue) 和 实 际 监 视 周 期 时 间 之间 可 接 受 的 百 分 比 差 异 。 默 认 值 =100。AvgThreshold: 监 视 周 期 时 间 的 基 准 平 均 值 和 移 动 平 均 值 之 间 可 接 受 的 百 分比 差 异 。 默 认 值 =40。可 以 改 写 MonitorStatsParam 属 性 值 。有 关 更 多 信 息 :请 参 考 “ 管 理 <strong>指</strong> <strong>南</strong> ”。最 大 时 间 段 ( 秒 ), monitor 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。 默 认 值为 60 秒 。 可 以 改 写 MonitorTimeout 属 性 值 。可 以 使 用 MonitorStatsParam 属 性 帮 助 确 定 MonitorTimeout 属 性 的 合 适 值 。


144 静 态 类 型 属 性静 态 类 型 属 性 定 义NumThreadsNumThreads 用 于 <strong>指</strong> 定 代 理 可 以 创 建 的 最 大 服 务 线 程 数 。 服 务 线 程 是 代 理 中 服 务资 源 所 命 令 的 线 程 , 其 中 最 主 要 的 一 个 为 入 口 点 处 理 。 NumThreads 不 会 控 制 用于 其 他 内 部 用 途 的 线 程 数 。代 理 根 据 其 必 须 管 理 的 资 源 数 动 态 地 创 建 服 务 线 程 。 除 非 资 源 数 小 于 NumThreads的 值 , 否 则 添 加 新 资 源 时 会 使 代 理 相 应 地 创 建 额 外 的 服 务 线 程 。 同 样 , 如 果 由 于 删除 了 资 源 而 使 资 源 数 降 至 NumThreads 值 之 下 , 则 代 理 将 相 应 地 删 除 服 务 线 程 。 由于 只 有 在 配 置 中 至 少 存 在 一 个 某 类 型 的 资 源 时 , VCS HAD 进 程 才 会 启 动 该 类 型 的代 理 , 因 此 代 理 将 始 终 至 少 有 一 个 服 务 线 程 。 如 果 将 NumThreads 设 置 为 1, 即 可使 得 在 添 加 更 多 资 源 的 情 况 下 也 不 会 额 外 创 建 服 务 线 程 。可 以 为 NumThreads 设 置 的 最 大 值 为 30。默 认 值 为 10。 无 法 改 写 NumThreads 属 性 。OfflineMonitorInterval对 OFFLINE 资 源 的 两 次 连 续 监 视 调 用 之 间 的 持 续 时 间 ( 秒 )。 如 果 设 置 为 0, 则 不监 视 OFFLINE 资 源 。默 认 值 为 0 秒 。 可 以 改 写 OfflineMonitorInterval 属 性 值 。注 : 由 于 此 属 性 的 默 认 值 为 0, 因 此 检 测 不 到 并 <strong>发</strong> 冲 突 。 如 果 某 个 应 该 在 节 点 上 处于 脱 机 状 态 的 应 用 程 序 不 受 VCS 控 制 而 联 机 , 则 该 应 用 程 序 会 继 续 运 行 , 因 为VCS 无 法 检 测 出 此 状 态 更 改 。 将 使 用 I/O 防 护 来 保 护 数 据 。 我 们 已 经 提 到 过 , 要 避免 出 现 这 种 情 况 , 您 可 以 将 OfflineMonitorInterval 设 置 为 一 个 非 零 的 值 ( 为 特定 资 源 而 对 其 进 行 改 写 时 除 外 )。OfflineTimeoutOnlineRetryLimitOnlineTimeout最 大 时 间 段 ( 秒 ), offline 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 300 秒 。 可 以 改 写 OfflineTimeout 属 性 值 。尝 试 使 资 源 联 机 不 成 功 时 重 试 online 的 次 数 。 只 有 实 现 了 clean 时 , 此 属 性 才有 意 义 。默 认 值 为 0。 可 以 改 写 OnlineRetryLimit 属 性 值 。最 大 时 间 段 ( 秒 ), online 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 300 秒 。 可 以 改 写 OnlineTimeout 属 性 值 。


静 态 类 型 属 性静 态 类 型 属 性 定 义145OnlineWaitLimit完 成 联 机 过 程 之 后 等 待 资 源 联 机 的 监 视 间 隔 数 。 如 果 资 源 在 <strong>指</strong> 定 的 监 视 间 隔 数 后 未能 联 机 , 则 联 机 尝 试 会 视 为 无 效 。 只 有 实 现 了 clean 入 口 点 时 , 此 属 性 才 有 意 义 。如 果 未 实 现 clean 入 口 点 , 代 理 会 继 续 定 期 地 运 行 monitor, 直 到 资 源 联 机 为 止 。如 果 实 现 了 clean, 当 代 理 达 到 最 大 监 视 间 隔 数 时 , 就 会 假 定 联 机 过 程 无 效 , 并运 行 clean。 然 后 , 代 理 就 会 通 知 HAD 联 机 尝 试 失 败 , 或 者 重 试 联 机 过 程 , 这 取决 于 是 否 达 到 了 OnlineRetryLimit。默 认 值 为 2。 可 以 改 写 OnlineWaitLimit 属 性 值 。OpenTimeout最 大 时 间 段 ( 秒 ), open 入 口 点 必 须 在 此 时 间 内 完 成 , 否 则 将 终 止 。默 认 值 为 60 秒 。 可 以 改 写 OpenTimeout 属 性 值 。Action<strong>指</strong> 出 该 类 型 的 资 源 的 有 效 运 行 状 态 。 其 值 为 OnOff ( 可 以 联 机 和 脱 机 )、 OnOnly( 仅 可 联 机 ) 和 None ( 不 可 联 机 或 脱 机 )。默 认 值 为 OnOff。 无 法 改 写 Operations 属 性 值 。RegListRegList 是 一 种 类 型 级 键 列 表 属 性 , 可 以 用 于 存 储 或 注 册 某 些 资 源 级 属 性 的 列 表 。如 果 RegList 中 列 出 的 属 性 的 值 <strong>发</strong> 生 了 修 改 , 代 理 就 会 为 资 源 调 用attr_changed 入 口 点 。 当 重 要 属 性 的 值 中 所 <strong>发</strong> 生 的 更 改 需 要 有 可 以 通 过attr_changed 入 口 点 执 行 的 特 定 操 作 时 , RegList 属 性 非 常 有 用 。默 认 情 况 下 , RegList 属 性 不 会 包 括 在 资 源 的 类 型 定 义 中 , 但 是 可 以 使 用 如 下 所 示的 两 种 方 法 之 一 添 加 它 。假 设 将 RegList 属 性 添 加 到 了 FileOnOff 资 源 的 类 型 定 义 中 , 且 其 值 定 义 为PathName。 随 后 , 当 FileOnOff 资 源 的 PathName 属 性 值 <strong>发</strong> 生 了 修 改 时 , 就 会 调用 attr_changed 入 口 点 。■ 方 法 一 是 修 改 类 型 定 义 文 件 ( 例 如 types.cf), 将 RegList 属 性 包 括 进 来 。在 资 源 类 型 定 义 中 添 加 类 似 如 下 的 行 :static keylist RegList = { attribute1_name, attribute2_name,...}例 如 , 如 果 这 是 FileOnOff 资 源 的 类 型 定 义 , 且 要 注 册 的 属 性 的 名 称 是PathName, 则 修 改 后 的 类 型 定 义 类 似 如 下 :...


146 静 态 类 型 属 性静 态 类 型 属 性 定 义type FileOnOff (str PathNamestatic keylist RegList = { PathName }static str ArgList[] = { PathName })..■方 法 二 是 使 用 haattr 命 令 将 RegList 属 性 添 加 到 资 源 类 型 定 义 中 , 然 后 使 用hatype 命 令 修 改 该 类 型 的 RegList 属 性 值 ; 该 命 令 为 :haattr -add -static resource_type RegList -keylisthatype -modify resource_type RegList attribute_name例 如 :# haattr -add -static FileOnOff RegList -keylist# hatype -modify FileOnOff RegList PathName无 法 改 写 RegList 属 性 。RestartLimit影 响 代 理 对 资 源 故 障 的 响 应 方 式 。另 请 参 考 :第 140 页 的 “FaultOnMonitorTimeouts”第 147 页 的 “ToleranceLimit”。RestartLimit 的 非 零 值 将 会 导 致 调 用 online 入 口 点 , 而 不 是 使 服 务 组 故 障 转 移到 另 一 系 统 。 HAD 进 程 会 根 据 在 RestartLimit 中 设 置 的 次 数 尝 试 重 新 启 动 资 源 ,直 到 放 弃 并 尝 试 故 障 转 移 为 止 。 但 是 , 如 果 该 资 源 在 ConfInterval 中 <strong>指</strong> 定 的 间 隔内 仍 处 于 联 机 状 态 , 则 先 前 尝 试 重 新 启 动 的 次 数 不 会 将 RestartLimit 中 设 置 的 次数 计 算 在 内 。注 : 如 果 未 实 现 clean 入 口 点 , 代 理 将 不 会 重 新 启 动 <strong>发</strong> 生 了 故 障 的 资 源 。 因 此 ,RestartLimit 属 性 的 值 仅 在 实 现 了 clean 的 情 况 下 才 适 用 。默 认 值 为 0。 可 以 改 写 RestartLimit 属 性 值 。ScriptClassScriptPriority<strong>指</strong> 示 代 理 所 创 建 的 脚 本 进 程 ( 例 如 联 机 ) 的 调 度 等 级 。默 认 值 为 TS。<strong>指</strong> 示 代 理 所 创 建 的 脚 本 进 程 的 优 先 级 。默 认 值 为 0。


静 态 类 型 属 性静 态 类 型 属 性 定 义147SupportedActionsToleranceLimitSupportedActions ( 字 符 串 键 列 表 ) 属 性 用 于 列 出 为 代 理 所 定 义 的 所 有 可 能 操 作 ,包 括 由 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 定 义 的 操 作 。HAD 进 程 会 根 据 SupportedActions 属 性 验 证 在hares -action resource action_token 命 令 中 <strong>指</strong> 定 的 action_token 值 。 例如 , 如 果 在 SupportedActions 中 没 有 action_token, HAD 将 不 允 许 该 命 令 通 过 。代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 有 责 任 在 资 源 类 型 定 义 中 初 始 化 SupportedActions 属 性 , 并 且 为 添加 到 action 入 口 点 代 码 或 脚 本 中 的 每 个 新 操 作 都 更 新 定 义 。 对 于 使 用 命 令 行 或 图形 用 户 界 面 的 用 户 , 此 属 性 可 用 作 参 考 。请 参 见 第 32 页 的 “ 关 于 action 入 口 点 ”。一 个 VCS ResourceTypeTypes.cf 文 件 中 的 某 个 资 源 类 型 的 一 个 示 例 定 义 类 似如 下 :Type DBResource (static str ArgList[] = { Sid, Owner, Home, User, Pwork,StartOpt, ShutOpt }static keylist SupportedActions = { VRTS_GetRunningServices,DBRestrict, DBUndoRestrict, DBSuspend, DBResume }str Sidstr Ownerstr Homestr Userstr Pwordstr StartOptstr ShutOpt在 SupportedActions 属 性 定 义 中 , VRTS_GetRunningServices 是 <strong>Veritas</strong>预 定 义 操 作 , 该 操 作 之 后 的 操 作 由 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 定 义 。 无 法 改 写 SupportedActions属 性 值 。非 零 的 ToleranceLimit 允 许 monitor 入 口 点 在 声 明 ONLINE 资 源 为 FAULTED 之 前多 次 返 回 OFFLINE。 如 果 monitor 入 口 点 报 告 OFFLINE 的 次 数 大 于 在ToleranceLimit 中 设 置 的 数 值 , 则 该 资 源 会 声 明 为 FAULTED。 但 是 , 如 果 该 资 源 保持 为 联 机 状 态 的 时 间 达 到 了 ConfInterval 中 <strong>指</strong> 定 的 间 隔 , 则 在 与 ToleranceLimit进 行 比 较 时 将 不 再 包 括 先 前 报 告 的 OFFLINE 数 。 默 认 值 为 0。 可 以 改 写ToleranceLimit 属 性 值 。


148 静 态 类 型 属 性静 态 类 型 属 性 定 义


9状 态 转 换 图■■状 态 转 换有 关 ManageFaults 属 性 的 状 态 转 换


150 状 态 转 换 图状 态 转 换状 态 转 换本 节 介 绍 以 下 情 况 下 的 状 态 转 换 :■■■■打 <strong>开</strong> 资 源资 源 处 于 稳 定 状 态使 资 源 联 机使 资 源 脱 机■ 资 源 出 现 故 障 ( 未 自 动 重 新 启 动 )■ 资 源 出 现 故 障 ( 自 动 重 新 启 动 )■■对 持 久 性 资 源 进 行 监 视关 闭 资 源此 外 , 还 会 显 示 在 处 理 与 ManageFaults 服 务 组 属 性 有 关 的 资 源 时 的 状 态 转 换 。请 参 见 第 159 页 的 “ 有 关 ManageFaults 属 性 的 状 态 转 换 ”。


状 态 转 换 图状 态 转 换151该 代 理 框 架 会 使 这 些 图 中 所 显 示 的 状 态 与 每 个 资 源 相 关 联 。 这 些 状 态 仅 在 该 代 理 框架 中 使 用 , 并 且 不 依 赖 于 该 引 擎 所 <strong>指</strong> 示 的 IState 资 源 属 性 值 。将 LogDbg 参 数 ( 为 静 态 资 源 类 型 属 性 ) 的 值 设 置 为 DBG_AGINFO 时 , 该 代 理 会将 资 源 状 态 转 换 信 息 写 入 该 代 理 日 志 文 件 。 代 理 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 在 调 试 代 理 时 可 以 使 用 此信 息 。打 <strong>开</strong> 资 源Opening超 时 或 已 完 成 /启 动 PeriodicMonitoringProbing Onlineenabled=1monitor未 知状 态 为 OnlineDetached状 态 为 OfflineMonitoring Offline当 代 理 启 动 时 , 将 启 动 每 个 资 源 且 其 初 始 状 态 为 Detached。 当 资 源 处 于 Detached状 态 (Enabled=0) 下 时 , 代 理 将 拒 绝 所 有 使 资 源 联 机 或 脱 机 的 命 令 。当 启 用 该 资 源 时 (Enabled=1), 会 调 用 open 入 口 点 。 在 open 超 时 或 成 功 后 ,会 <strong>开</strong> 始 Periodic Monitoring。 根 据 monitor 的 返 回 值 , 该 资 源 状 态 将 转 换 为Online 或 Offline。 当 monitor 超 时 或 返 回 未 知 时 ( 通 常 不 会 <strong>发</strong> 生 ), 该 资 源将 处 于 Probing 状 态 。


152 状 态 转 换 图状 态 转 换资 源 处 于 稳 定 状 态Offline状 态 为 OfflinemonitorMonitoring(Offline)状 态 为 OnlineMonitoring(Online)monitor状 态 为 OnlineOnline当 资 源 处 于 Online 或 Offline 的 稳 定 状 态 时 , 会 定 期 对 这 些 资 源 进 行 监 视 。 监 视的 间 隔 由 处 于 Online 状 态 下 的 资 源 的 MonitorInterval 参 数 和 处 于 Offline 状态 下 的 资 源 的 OfflineMonitorInterval 参 数 <strong>指</strong> 定 。Online 资 源 如 果 意 外 地 被检 测 为 Offline, 该 资 源 将 被 视 为 出 现 故 障 。 请 参 考 介 绍 出 现 故 障 的 资 源 的 示 图 。


状 态 转 换 图状 态 转 换153使 资 源 联 机 :ManageFaults = ALLonline /停 止 PM成 功 且已 达 到 ORL /启 动 PM重 置 ORC设 置 为 FAULTEDGoingOnlineCleaning完 成 / 启 动 PM超 时或 失 败 /启 动 PMGoingOnlineWaitingMonitoring状 态 为 非 online且 已 达 到 OWL /停 止 PM, 重 置 OWC或超 时 且已 达 到 OWL超 时 且未 达 到 OWL /增 加 OWCClean状 态已 返 回未 联 机超 时成 功 ,monitor 且Offline 未 达 到 ORL未 达 到 OWL Online已 达 到 /增 加ORCClean 成 功已 达 到 ORL /启 动 PM已 达 到 /增 加OWC状 态 为 OnlineOWC - OnlineWaitCountOWL - OnlineWaitLimitORC - OnlineRetryCountORL - OnlineRetryLimitPM - Periodic Monitoring状 态 为 Offline,Monitor 超 时 , 已 达 到 OWL 和 ORL /启 动 PM, 重 置 ORC, 设 置 为 FAULTED。当 代 理 接 收 到 来 自 引 擎 的 使 资 源 联 机 的 请 求 时 , 该 资 源 将 进 入 Going Online 状态 , 在 该 状 态 下 将 调 用 online 入 口 点 。 如 果 online 成 功 完 成 , 则 该 资 源 会 进入 Going Online Waiting 状 态 , 在 该 状 态 下 它 会 等 待 下 一 个 监 视 周 期 。如 果 monitor 返 回 联 机 状 态 , 则 该 资 源 将 进 入 Online 状 态 。但 是 , 如 果 monitor 超 时 , 或 返 回 “ 非 Online” 状 态 ( 即 未 知 状 态 或 脱 机 状 态 ),则 代 理 会 将 该 资 源 返 回 到 Going Online Waiting 状 态 并 等 待 下 一 个 监 视 周 期 。达 到 OnlineWaitLimit 时 , 会 调 用 clean 入 口 点 。■■■如 果 clean 超 时 或 失 败 , 则 该 资 源 会 再 次 返 回 到 Going Online Waiting 状 态并 等 待 下 一 个 监 视 周 期 。 如 果 monitor 报 告 状 态 为 “ 非 Online”, 则 该 代 理会 再 次 调 用 clean 入 口 点 。如 果 clean 成 功 且 已 达 到 OnlineRetryLimit, 并 且 随 后 的 监 视 程 序 报 告状 态 为 脱 机 , 则 该 资 源 会 转 换 到 脱 机 状 态 并 被 标 记 为 FAULTED。如 果 clean 成 功 且 未 达 到 ORL, 则 该 资 源 会 转 换 到 Going Online 状 态 , 在 该状 态 下 会 重 试 online 入 口 点 。


154 状 态 转 换 图状 态 转 换使 资 源 脱 机GoingOffline超 时Cleaningoffline /停 止 PMOnline完 成 /启 动 PMGoingOfflineWaiting成 功 /cleaned = true启 动 PM超 时 或cleaned 为 false /启 动 PM状 态 为 非 Offline且 cleaned 为falseOffline状 态 为 OfflinemonitorMonitoring超 时 或状 态 为 非 Offline且 cleaned 为 true /已 设 置 UNABLE_TO_OFFLINE 标 志 ,启 动 PMPM - Periodic Monitoring在 接 收 到 来 自 引 擎 的 使 资 源 脱 机 的 请 求 后 , 代 理 会 将 该 资 源 置 于 Going Offline 状态 并 会 调 用 offline 入 口 点 。如 果 offline 成 功 , 则 该 资 源 会 进 入 Going Offline Waiting 状 态 , 该 状 态 下 它 会等 待 下 一 个 监 视 。如 果 monitor 返 回 脱 机 状 态 , 则 该 资 源 会 被 标 记 为 Offline。如 果 monitor 超 时 或 返 回 “ 非 Offline” 状 态 , 则 代 理 会 调 用 clean 入 口 点 。同 样 , 如 果 在 Going Offline 状 态 下 , offline 入 口 点 超 时 , 则 代 理 会 调 用clean 入 口 点 。■■如 果 clean 失 败 或 超 时 , 则 会 将 该 资 源 置 于 Going Offline Waiting 状 态 并 对其 进 行 监 视 。 如 果 monitor 报 告 “ 非 offline”, 则 代 理 会 调 用 clean 入 口点 , 此 时 会 重 复 事 件 的 序 列 。如 果 clean 返 回 成 功 , 则 会 将 该 资 源 置 于 Going Offline Waiting 状 态 并 对 其进 行 监 视 。 如 果 monitor 超 时 或 报 告 “ 非 offline”, 则 该 资 源 会 返 回 到GoingOfflineWaiting 状 态 。 将 UNABLE _TO_OFFLINE 标 志 <strong>发</strong> 送 到 引 擎 。


状 态 转 换 图状 态 转 换155资 源 出 现 故 障 ( 未 自 动 重 新 启 动 )Clean 超 时 或 失 败OnlinemonitorFMT - FaultOnMonitorTimeoutRL - RestartLimitTL - ToleranceLimitPM - Periodic Monitoring超 时 且 未达 到 FMT或 , 状 态 为 Offline且 未 达 到 TL,或 者 ,Clean 成 功 , 但monitor 返 回 OnlineClean成 功 ,monitor 返 回 值Offline / 启 动 PMMonitoringOffline状 态 为 Offline且 已 达 到 TL且 已 达 到 RL超 时且 已 达 到 FMT且 已 达 到 RLClean成 功 ,monitor 超 时或 返 回unknownmonitorCleaningclean成 功 /启 动 PMGoingOfflineWaiting此 图 介 绍 当 某 个 资 源 出 现 故 障 并 且 达 到 RestartLimit 时 将 会 <strong>发</strong> 生 的 活 动 。 当monitor 入 口 点 连 续 超 时 且 达 到 FaultOnMonitorTimeout 时 , 或 monitor 返回 脱 机 状 态 并 且 达 到 ToleranceLimit 时 , 代 理 会 调 用 clean 入 口 点 。如 果 clean 失 败 , 或 如 果 超 时 , 则 代 理 会 将 该 资 源 置 于 Online 状 态 , 就 好 像 没 有出 现 故 障 一 样 。如 果 clean 成 功 , 则 会 将 该 资 源 置 于 Going Offline Waiting 状 态 , 这 种 状 态 下 代理 会 等 待 下 一 个 监 视 。■■如 果 monitor 报 告 Online, 则 会 使 该 资 源 返 回 Online 状 态 , 就 好 像 没 有 出现 故 障 一 样 。 如 果 monitor 报 告 Offline, 则 会 将 该 资 源 置 于 Offline 状 态 并将 其 标 记 为 FAULTED。如 果 monitor 报 告 未 知 或 超 时 , 则 代 理 会 将 该 资 源 返 回 Going OfflineWaiting 状 态 , 并 且 会 在 引 擎 中 设 置 UNABLE_TO_OFFLINE 标 志 。


156 状 态 转 换 图状 态 转 换资 源 出 现 故 障 ( 自 动 重 新 启 动 )Online超 时 且 未 达 到 FMT, 或状 态 为 Offline 且 未 达 到 TLmonitorMonitoring超 时 或失 败 / 启 动 PM超 时 , 已达 到 FMT 但未 达 到 RL /停 止 PM ; 重 置 TC ;增 加 RC状 态 为 Offline且 已 达 到 TL但 未 达 到 RL /停 止 PM ; 重 置 TC ;增 加 RCGoingOnline成 功 ,启 动 OnlineCleaningFMT - FaultOnMonitorTimeoutRC - RestartCountRL - RestartLimitTC - ToleranceCountPM - Periodic MonitoringTL - ToleranceLimit此 图 介 绍 当 资 源 出 现 故 障 且 未 达 到 RestartLimit 时 将 会 <strong>发</strong> 生 的 活 动 。 当monitor 入 口 点 连 续 超 时 且 达 到 FaultOnMonitorTimeout 时 , 或 monitor返 回 脱 机 状 态 并 且 达 到 ToleranceLimit 时 , 代 理 会 调 用 clean 入 口 点 。■如 果 clean 成 功 , 则 会 将 该 资 源 置 于 Going Online 并 调 用 online 入 口 点 以重 新 启 动 该 资 源 ; 请 参 考 示 图 “ 使 资 源 联 机 ”。■ 如 果 clean 失 败 或 超 时 , 则 该 代 理 会 将 该 资 源 置 于 Online 状 态 , 就 好 像 没 有出 现 故 障 一 样 。有 关 当 资 源 出 现 故 障 并 达 到 RestartLimit 时 会 <strong>发</strong> 生 的 活 动 的 论 述 , 请 参 考 示 图“ 资 源 出 现 故 障 ( 未 自 动 重 新 启 动 )”。


状 态 转 换 图状 态 转 换157对 持 久 性 资 源 进 行 监 视Monitoring(Offline)monitor状 态 为 Offline联 机 或 脱 机 /ignoreOffline状 态 为 Online状 态 为 Offline且 已 达 到 TL /重 置 TC联 机 或 脱 机 /ignoreOnlinemonitor状 态 为 非 OfflineMonitoring(Online)状 态 为 Offline且 未 达 到 TL /增 加 TCTC - Tolerance CountTL - Tolerance Limit对 于 处 于 Online 状 态 的 某 个 持 久 性 资 源 , 如 果 monitor 返 回 offline 状 态 并 且未 达 到 ToleranceLimit, 则 该 资 源 会 保 持 Online 状 态 。 如 果 monitor 返 回脱 机 状 态 并 且 达 到 ToleranceLimit, 则 会 使 该 资 源 处 于 Offline 状 态 并 且 会将 其 标 记 为 FAULTED。 如 果 monitor 返 回 “ 非 offline”, 则 该 资 源 会 保 持Online 状 态 。同 样 , 对 于 处 于 Offline 状 态 的 持 久 性 资 源 , 如 果 monitor 返 回 脱 机 状 态 , 则 该资 源 会 保 持 在 Offline 状 态 。 如 果 monitor 返 回 联 机 状 态 , 则 会 使 该 资 源 处 于Online 状 态 。


158 状 态 转 换 图状 态 转 换关 闭 资 源OnlineGoingOfflineWaiting停 止 / 停 止 PM停 止 / 停 止 PMGoingOnlineWaiting停 止 / 停 止 PM停 止 / 停 止 PMClosing完 成 或 超 时DetachedPM - Periodic MonitoringOffline当 该 资 源 被 禁 用 时 (Enabled=0), 代 理 会 停 止 定 期 监 视 并 调 用 close 入 口 点 。当 close 入 口 点 成 功 或 超 时 时 , 会 使 该 资 源 处 于 Detached 状 态 。下 一 组 图 将 说 明 以 下 状 态 转 换 :


状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换159有 关 ManageFaults 属 性 的 状 态 转 换本 节 显 示 有 关 ManageFault 属 性 的 状 态 转 换 图 。默 认 情 况 下 , 会 将 ManageFaults 设 置 为 ALL, 在 此 情 况 下 VCS 会 调 用 clean 入口 点 。 请 参 见 第 142 页 的 “ManageFaults”。 该 图 涵 盖 以 下 情 况 :■■■■将 ManageFaults 属 性 设 置 为 NONE 时 , 使 资 源 联 机将 ManageFaults 属 性 设 置 为 NONE 时 , 使 资 源 脱 机将 ManageFaults 属 性 设 置 为 ALL 时 , 资 源 出 现 故 障将 ManageFaults 属 性 设 置 为 NONE 时 , 资 源 出 现 故 障 ( 意 外 offline)■ 将 ManageFaults 属 性 设 置 为 ALL 时 , 资 源 出 现 故 障 (monitor 被 挂 起 )■ 将 ManageFaults 属 性 设 置 为 NONE 时 , 资 源 出 现 故 障 (monitor 被 挂 起 )


160 状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换使 资 源 联 机 :ManageFaults attribute = NONEOfflineonline /停 止 PMGoingOnline超 时 /设 置 ADMIN-WAIT ;启 动 PMclean reason = ONH完 成 /插 入monitor ;启 动 PMONH - Online HangONI - Online IneffectiveORC - Online Retry CountORL - Online Retry LimitOWC - Online Wait CountOWL - Online Wait LimitPM - Periodic MonitoringMSG_RES_CLRADMINWAIT_FAULT / 重 置ADMIN_WAIT;ORC = ORLMSG_RES_CLRADMINWAIT或 MSG_RES_RESET_MF /重 置 ADMIN_WAIT ;ManageFaults = 1Going OnlineWaitingmonitor否 /启 动 PM否 / 设 置ADMIN-WAIT ;clean reason =ONIMonitoring是是 否 达 到已 达 到?是是 否 达 到已 达 到?status =onlinestatus = offline或 unknown或 monitor 超 时是 /重 置 OWCYESOnline否 ( 状 态unknown 或monitor 超 时 )/启 动 PM是status =Offline?是 /启 动 PMOffline


状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换161使 资 源 脱 机 ; ManageFaults = NoneOnlineoffline /停 止 PMGoingOffline完 成 /插 入 monitor ;启 动 PM超 时 /设 置 ADMIN_WAIT ;clean reason = OFHmonitorMonitoringstatus = offlineMSG_RES_CLRADMIN_WAIT或 MSG_RES_RESET_MF /清 除 ADMIN_WAIT ;插 入 monitorGoing OfflineWaiting否 / 设 置ADMIN_WAIT;clean reason =OFI是Offlinecleaned?status =online 或unknown 或monitor超 时OfflineMSG_RES_CLRADMINWAIT_FAULT /清 除 ADMIN_WAIT ;offline_cleaned = 1;插 入 monitor是 / 设 置UNABLE_TO_OFFLINEOFH - Offline HangOFI - Offline IneffectivePM - Periodic Monitoring


162 状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换资 源 出 现 故 障 :ManageFaults attribute = ALLOnlinemonitorStatus = online /启 动 PMStatus = offlineMonitoringStatus = offline启 动 PM否 / 增 加tolerance count是 否 达 到已 达 到?Offline是 / 停 止 PM ; faulted = 1调 用 clean ;增 加 clean countmonitorclean 超 时 或 失 败 /启 动 PMClean 成 功 /offline_cleaned = 1;增 加 restart count ;重 置 tolerance countCleaningclean 未实 现或 持 久 性资 源 /offline_cleaned = 0重 置 clean_countGoing OfflineWaiting状 态 为 unknown或 monitor 超 时否 /调 用 online ;设 置 FSTATE_RESTARTING是 否 达 到已 达 到?是Going Online请 参 见 “ 使 用 ManageFaults = ALL,使 资 源 联 机 ”PM - Periodic MonitoringRL - Restart LimitTL - Tolerance Limit


状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换163资 源 出 现 故 障 ( 意 外 脱 机 ):ManageFaults attribute = NONE是 / clean reason = 00 ;设 置 ADMIN_WAITMSG_RES_CLEARADMIN_WAIT 或MSG_RES_RESET_MF;重 置 ADMIN_WAIT ;插 入 monitorNO是 否 达 到已 达 到?OnlinemonitorMonitoringstatus = offline /启 动 PMstatus = online 或status = unknown /MONITOR_UNKNOWNsetmonitor 超 时 /已 设 置 MONITOR_TIMEDOUTOfflinestatus = online /重 置 faulted ; 重 置 clean count ;重 置 offline-cleaned ;启 动 PMmonitorstatus = unknown 或monitor 超 时MSG_RES_CLEARADMINWAIT_FAULT // 重 置 ADMIN_WAIT ; faulted = 1 ;插 入 monitorGoing OfflineWaitingPM - Periodic MonitoringTL - Tolerance Limit


164 状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换资 源 出 现 故 障 (monitor hung):ManageFaults attribute = ALLstatus = offline /启 动 PMOfflineOnlinemonitorstatus = online /重 置 为 连 续 的monitor 超 时 计 数Monitoringmonitorstatus = unknown 或monitor 超 时 / 设 置UNABLE_TO_OFFLINEGoing OfflineWaitingstatus = unknown /设 置 MONITOR_UNKNOWNstatus = online重 置 faulted ;重 置 clean count ;重 置 连 续 monitor超 时 计 数否 /增 加 连 续monitor 超 时 计 数clean 失 败 或超 时 /启 动 PMFOMT - Fault On Monitor TimeoutMH - Monitor HungPM - Periodic MonitoringRL - Restart Limit是是 否 达 到已 达 到?Cleaningmonitor 超 时 / 设 置MONITOR_TIMEDOUT是 /停 止 PM ;增 加 clean count ;调 用 clean (MH) ;faulted = 1clean 成 功 /增 加 连 续monitor 超 时 计 数否 / 调 用 online ;设 置 FSTATE_RESTARTING是 否 达 到已 达 到?GoingOffline是 /插 入 monitor /启 动 PM


状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换165资 源 出 现 故 障 (monitor hung):ManageFaults attribute = NONEMSG_RES_CLEARADMINWAIT 或MSG_RES_RESET_MF /重 置 ADMIN_WAITManageFaults = 1MSG_RES_CLRADMIN_WAIT_FAULT /重 置 ADMIN_WAIT ;faulted = 1Onlinemonitorstatus = online /重 置 为 连 续 的monitor 超 时 计 数Monitoringmonitorstatus = unknown 或monitor 超 时 / 设 置UNABLE_TO_OFFLINEGoing OfflineWaitingstatus = unknown /设 置 MONITOR_UNKNOWNstatus = online重 置 faulted ;重 置 clean count ;重 置 连 续 monitor超 时 计 数status = offline /启 动 PMOfflinemonitor 超时 / 设 置MONITOR_TIMEDOUT否 /增 加 连 续monitor 超 时 计 数是是 否 达 到已 达 到?是 /设 置 ADMIN_WAIT ;clean reason = MHFOMT - Fault On Monitor TimeoutMH - Monitor HungPM - Periodic Monitoring


166 状 态 转 换 图有 关 ManageFaults 属 性 的 状 态 转 换


10国 际 化 消 息VCS 在 “ 源 消 息 目 录 ” (SMC) 生 成 的 “ 二 进 制 消 息 目 录 ” (BMC) 中 处 理 国 际 化消 息 。■■源 消 息 目 录 (SMC) 是 使 用 ASCII 或 UCS-2 ( 双 字 节 Unicode 编 码 ) 编 码 的纯 文 本 目 录 文 件 。 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 使 用 <strong>指</strong> 定 格 式 创 建 消 息 , 并 将 其 存 储 在SMC 中 。二 进 制 消 息 目 录 (BMC) 是 采 用 VCS 可 用 的 格 式 的 目 录 文 件 。 通 过 使 用bmcgen 实 用 程 序 从 SMC 中 生 成 BMC。每 个 模 块 都 需 要 BMC。 例 如 , VCS 引 擎 (HAD)、 GAB 和 LLT 需 要 不 同 的 BMC,每 个 Enterprise <strong>Agent</strong> 和 每 个 自 定 义 代 理 也 需 要 不 同 的 BMC。 代 理 的 每 个 操 作 系统 平 台 都 需 要 BMC。生 成 BMC 后 , 必 须 将 其 放 置 到 与 消 息 模 块 和 语 言 相 对 应 的 特 定 目 录 下 。 可 以 运 行位 于 特 定 目 录 下 的 bmcmap 实 用 程 序 以 创 建 BMC “ 映 射 ” 文 件 ( 将 BMC 文 件 与其 对 应 的 模 块 、 语 言 和 消 息 ID 范 围 链 接 到 一 起 的 ASCII 文 本 文 件 )。 通 过 该 映 射文 件 , VCS 能 够 管 理 BMC 文 件 。可 以 更 改 现 有 的 SMC 文 件 以 生 成 更 新 的 BMC 文 件 。


168 国 际 化 消 息创 建 SMC 文 件创 建 SMC 文 件由 于 要 用 于 生 成 二 进 制 消 息 目 录 文 件 , 因 此 必 须 以 一 致 的 格 式 创 建 源 消 息 目 录 文 件 。SMC 格 式#!language = language_ID#!module = module_name#!version = version#!category = category_ID# commentmessage_ID1 {%s:msg}message_ID2 {%s:msg}message_ID3 {%s:msg}# commentmessage_ID4 {%s:msg}message_ID5 {%s:msg}...示 例 SMC 文 件检 查 示 例 SMC 文 件 :VRTSvcsSun<strong>Agent</strong>.smc该 文 件 基 于 SMC 格 式 :#!language = en#!module = HAD#!version = 4.0#!category = 203# common library100 {"%s:Invalid message for agent"}101 {"%s:Process %s restarted"}102 {"%s:Error opening /proc directory"}103 {"%s:online:No start program defined"}104 {"%s:Executed %s""}105 {"%s:Executed %s"}


国 际 化 消 息创 建 SMC 文 件169设 置 SMC 文 件 的 格 式■■SMC 文 件 必 须 使 用 UCS-2、 ASCII 或 UTF-8 进 行 解 码 。 有 关 文 件 命 名 约 定 的论 述 , 请 参 见 第 169 页 的 “ 命 名 SMC 文 件 、 BMC 文 件 ”。所 有 消 息 都 应 以 %s: <strong>开</strong> 头 , 该 “%s:” 表 示 代 理 框 架 生 成 的 分 为 三 部 分 的 标 头“<strong>Agent</strong>:Resource:EntryPoint”。■ 必 须 在 标 头 中 <strong>指</strong> 定 自 定 义 代 理 的 HAD 模 块 。 请 参 见 “ 示 例 SMC 文 件 。”■■■每 次 更 新 BMC 时 , 都 可 以 修 改 版 本 的 次 要 编 号 ( 例 如 , 2.x)。 主 要 编 号 仅 可由 VCS 更 改 。 版 本 号 表 示 处 理 将 使 用 目 录 的 消 息 的 进 程 。 请 参 见 “ 更 新 BMC文 件 。”在 SMC 标 头 中 ,# 字 符 和 ! 字 符 之 间 不 允 许 有 空 格 。 文 件 中 的 # 字 符 和 常 规 注释 后 可 含 有 空 格 。 请 参 见 上 述 示 例 。SMC 文 件 名 必 须 使 用 扩 展 名 :.smc。■ 消 息 包 含 的 字 符 串 格 式 <strong>指</strong> 定 不 应 超 过 六 个 。■消 息 ID 仅 可 包 含 数 字 字 符 , 不 能 包 含 字 母 字 符 。 例 如 , 2001003A 是 无 效 消息 ID。 消 息 ID 的 范 围 为 1 到 65535。■ SMC 文 件 内 的 消 息 ID 必 须 按 升 序 排 列 。■跨 多 行 格 式 的 消 息 必 须 使 用 \n 字 符 断 行 , 而 不 能 使 用 硬 回 车 断 行 。 允 许 自 动换 行 。 请 参 见 以 下 示 例 。命 名 SMC 文 件 、 BMC 文 件遵 循 命 名 约 定 的 BMC 文 件 是 从 SMC 文 件 生 成 的 。 SMC 文 件 的 名 称 决 定 生 成 的BMC 文 件 的 名 称 。 BMC 文 件 的 命 名 约 定 使 用 以 下 方 式 :VRTSvcs{Sun|AIX|HP|Lnx|W2K}{<strong>Agent</strong>_name}.bmc其 中 包 含 platform 和 agent_name。例 如 :VRTSvcsLnxOracle.bmc


170 国 际 化 消 息创 建 SMC 文 件消 息 示 例使 用 格 式 <strong>指</strong> 定■ 一 条 非 法 消 息 , 消 息 中 嵌 有 硬 回 车 :201 {"%s:To be or not to be!That is the question"}■一 条 有 效 消 息 , 其 使 用 了 \n:10010 {"%s:To be or not to be!\nThat is the question"}■ 一 条 有 效 消 息 , 其 文 本 自 动 换 行 到 下 一 行 :10012 {"%s:To be or not to be!\nThat is the question.\n Whether tis nobler in the mind tosuffer\n the slings and arrows of outrageous fortune\n or totake arms against a sea of troubles"}除 非 必 须 将 参 数 重 新 排 序 , 否 则 所 有 消 息 参 数 均 可 使 用 %s <strong>指</strong> 定 。 由 于 消 息 中 的 词序 可 能 会 因 语 言 而 不 同 , 通 过 使 用 格 式 <strong>指</strong> 定 %#$s, 可 将 消 息 中 的 参 数 重 新 排 序 ;其 中 # 字 符 为 1 到 99 之 间 的 数 字 。在 英 语 SMC 文 件 中 , 输 入 可 能 如 下 所 示 :301 {"%s:Setting cookie for proc=%s, PID = %s"}在 需 要 切 换 消 息 参 数 位 置 的 语 言 中 , 该 语 言 的 SMC 文 件 中 相 同 的 输 入 可 能 如 下所 示 :301 {"%s:Setting cookie for process with PID = %3$s, name = %2$s"}


国 际 化 消 息将 SMC 文 件 转 换 为 BMC 文 件171将 SMC 文 件 转 换 为 BMC 文 件存 储 BMC 文 件使 用 bmcgen 实 用 程 序 将 SMC 文 件 转 换 为 BMC 文 件 。 例 如 :bmcgen VRTSvcsLnx<strong>Agent</strong>.smc在 SMC 文 件 所 在 的 目 录 下 创 建 VRTSvcsLnx<strong>Agent</strong>.bmc 文 件 。 BMC 文 件 必 须 具有 扩 展 名 :.bmc。默 认 情 况 下 ,bmcgen 实 用 程 序 假 定 SMC 文 件 为 Unicode (UCS-2) 文 件 。ASCII 或UTF-8 编 码 的 文 件 使 用 -ascii 选 项 。 例 如 :bmcgen -ascii VRTSvcsSun<strong>Agent</strong>.smc默 认 情 况 下 , 必 须 将 BMC 文 件 安 装 在 /opt/VRTS/messages/language 下 ,其 中 language 为 包 含 某 种 特 定 支 持 语 言 的 BMC 的 目 录 。 例 如 , Solaris 系 统 上 <strong>指</strong>向 日 语 代 理 的 BMC 的 路 径 如 下 所 示 :/opt/VRTS/messages/ja/VRTSvcsSun<strong>Agent</strong>.bmc。VCS 语 言显 示 BMC 文 件 的 内 容VCS 支 持 的 语 言 列 为 /opt/VRTS/messages 目 录 下 的 子 目 录 , 如 /ja ( 日 语 )和 /en ( 英 语 )。通 过 bmcread 命 令 , 能 够 显 示 二 进 制 消 息 目 录 文 件 的 内 容 。 例 如 , 以 下 命 令 会 显示 <strong>指</strong> 定 BMC 文 件 的 内 容 :bmcread VRTSvcsLnx<strong>Agent</strong>.bmc


172 国 际 化 消 息使 用 BMC 映 射 文 件使 用 BMC 映 射 文 件BMC 映 射 文 件 的 位 置VCS 使 用 BMC 映 射 文 件 管 理 特 定 语 言 的 特 定 模 块 的 不 同 BMC 文 件 。HAD 是 VCS引 擎 、 捆 绑 代 理 、 Enterprise <strong>Agent</strong> 和 自 定 义 代 理 的 模 块 。 BMC 映 射 文 件 为 将BMC 文 件 与 其 类 别 和 唯 一 消 息 ID 范 围 相 关 联 的 ASCII 文 本 文 件 。默 认 情 况 下 , 映 射 文 件 创 建 在 与 其 相 对 应 的 BMC 文 件 相 同 的 目 录 下 :/opt/VRTS/messages/language。创 建 BMC 映 射 文 件示 例 BMC 映 射 文 件<strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 可 以 将 BMC 添 加 到 该 BMC 映 射 文 件 。 生 成 BMC 文 件 后 :1 将 BMC 文 件 复 制 到 相 对 应 的 目 录 下 。 例 如 :cp VRTSvcsSunLnxOracle.bmc /opt/VRTS/messages/en2 更 改 至 含 有 该 BMC 文 件 的 目 录 并 运 行 bmcmap 实 用 程 序 。 例 如 :cd /opt/VRTS/messages/enbmcmap -create en HADbmcmap 实 用 程 序 会 扫 描 该 目 录 下 的 内 容 并 以 动 态 方 式 生 成 BMC 映 射 。 在 这 种 情况 下 , 会 创 建 HAD.bmc 映 射 。在 以 下 示 例 中 , HAD 模 块 和 英 文 语 言 的 BMC 映 射 文 件 中 包 含 名 为VRTSvcsHPNewCustom<strong>Agent</strong>.bmc 的 BMC。## Copyright(C) Symantec Corporation.# ALL RIGHTS RESERVED.#Language=enHAD=VRTSvcsHad VRTSvcsHP<strong>Agent</strong> VRTSvcsHPNewCustom<strong>Agent</strong>


国 际 化 消 息更 新 BMC 文 件173# VCSVRTSvcsHad.version=5.1VRTSvcsHad.Category=1VRTSvcsHad.IDstart=0VRTSvcsHad.IDend=53502# HP Bundled <strong>Agent</strong>sVRTSvcsHP<strong>Agent</strong>.version=1.0VRTSvcsHP<strong>Agent</strong>.IDstart=100001VRTSvcsHP<strong>Agent</strong>.IDend=113501VRTSvcsHP<strong>Agent</strong>.Category=__________# HP NewCustom<strong>Agent</strong>VRTSvcsHPNewCustom<strong>Agent</strong>.version=1.0VRTSvcsHPNewCustom<strong>Agent</strong>.IDstart=2017001VRTSvcsHPNewCustom<strong>Agent</strong>.IDend=2017040VRTSvcsHPNewCustom<strong>Agent</strong>.Category=_________更 新 BMC 文 件可 以 更 新 现 有 BMC 文 件 。 例 如 , 添 加 新 消 息 或 更 改 消 息 可 能 是 必 要 的 。 可 以 按 照以 下 方 式 完 成 更 新 :1 如 果 特 定 BMC 文 件 存 在 原 始 SMC 文 件 , 则 可 以 使 用 文 本 编 辑 器 编 辑 该 原 始文 件 。 否 则 , 会 创 建 新 的 SMC 文 件 。■ 进 行 更 改 , 如 添 加 、 删 除 或 更 改 消 息 。■ 更 改 标 头 中 版 本 号 的 次 要 编 号 。 例 如 , 将 版 本 从 2.0 更 改 为 2.1。■ 保 存 文 件 。2 使 用 bmcgen 命 令 生 成 新 的 BMC 文 件 ; 将 新 的 BMC 文 件 放 置 到 相 对 应 的 语言 目 录 下 。3 在 包 含 BMC 文 件 的 目 录 下 , 运 行 bmcmap 命 令 以 创 建 新 的 BMC 映 射 文 件 。


174 国 际 化 消 息更 新 BMC 文 件


附 录A使 用 5.0 之 前 版 本 的 VCS 代 理■■■■使 用 5.0 之 前 版 本 的 VCS 代 理 并 将 其 注 册 为 V51 或 更 高 版 本使 用 4.0 之 前 版 本 的 VCS 代 理 的 准 则4.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息4.0 之 前 版 本 的 VCS Message API使 用 5.0 之 前 版 本 的 VCS 代 理 并 将 其 注 册为 V51 或 更 高 版 本VCS 5.0 的 代 理 框 架 已 得 到 增 强 。 所 <strong>开</strong> <strong>发</strong> 的 使 用 此 框 架 的 代 理 被 注 册 为 V50 或V51 代 理 。 通 过 该 框 架 , 您 能 够 使 用 5.0 之 前 版 本 的 代 理 并 将 其 注 册 为 V40 代 理 。以 下 各 节 介 绍 如 何 将 5.0 之 前 版 本 的 代 理 与 VCS 5.0 代 理 框 架 一 起 使 用 。将 5.0 之 前 版 本 的 代 理 与 VCS 一 起 使 用 时 , 可 以 在 进 行 必 要 的 修 改 后 将 它 们 注 册为 V51 代 理 。 进 行 此 转 换 可 为 您 带 来 以 下 好 处 , 这 些 好 处 包 括 :■ 可 以 在 VCS 中 的 不 同 系 统 上 使 用 一 个 代 理 的 不 同 版 本 。■您 可 以 更 改 在 某 些 系 统 上 使 用 的 资 源 类 型 定 义 , 而 不 会 影 响 较 旧 版 本 的 代 理 的运 行 方 式 。将 V40 代 理 更 改 为 V51 的 步 骤 概 述■修 改 PATH 变 量 和 <strong>指</strong> 向 VCS Script51<strong>Agent</strong> 二 进 制 文 件 ( 在 UNIX 上 ) 的 链接 可 能 是 必 需 的 。■ 将 属 性 及 其 值 传 递 到 入 口 点 的 方 式 , 从 V40 格 式 更 改 为 V51 名 称 - 值 元 组 格 式 。■ 在 Perl 和 Shell 的 路 径 中 包 含 /opt/VRTSvcs/lib 以 <strong>指</strong> 定 它 们 的 来 源 。■ 设 置 必 要 的 环 境 变 量 。


176 使 用 5.0 之 前 版 本 的 VCS 代 理使 用 5.0 之 前 版 本 的 VCS 代 理 并 将 其 注 册 为 V51 或 更 高 版 本注 册 为 V51 或 更 高 版 本 的 代 理 的 名 称 - 值 元 组 格 式5.0 之 前 版 本 的 VCS 代 理 要 求 参 数 按 照 资 源 类 型 中 定 义 的 ArgList 属 性 <strong>指</strong> 示 的 顺 序传 递 到 入 口 点 。 参 数 的 解 析 顺 序 由 它 们 的 预 定 义 位 置 决 定 。采 用 V51 代 理 框 架 时 , 代 理 可 使 用 名 称 - 值 元 组 格 式 将 属 性 及 其 值 传 递 给 入 口 点 。采 用 这 样 的 格 式 表 示 , 将 按 属 性 的 名 称 来 解 析 属 性 及 其 值 , 而 不 是 按 它 们 在ArgList 属 性 中 的 位 置 来 解 析 。ArgList 中 的 V51 属 性 的 一 般 元 组 格 式 是 : 标 量 属 性 格 式对 于 “ 标 量 ” 属 性 , 无 论 是 字 符 串 、 整 型 还 是 布 尔 型 , 格 式 均 为 : 1 例 如 :DiskGroupName 1 mydg向 量 属 性 格 式对 于 “ 向 量 ” 属 性 , 无 论 是 字 符 串 还 是 整 型 , 格 式 均 为 : 例 如 :MyVector 3 aa cc ddMyEmptyVector 0键 列 表 属 性 格 式对 于 字 符 串 “ 键 列 表 ” 属 性 , 该 格 式 为 : 例 如 :DiskAttr 4 hdisk3 hdisk4 hdisk5 hdisk6DiskAttr 0关 联 属 性 格 式对 于 关 联 属 性 , 无 论 是 字 符 串 还 是 整 型 , 格 式 均 为 : 例 如 :MyAssoc 4 key1 val1 key2 val2MyAssoc 0


使 用 5.0 之 前 版 本 的 VCS 代 理使 用 5.0 之 前 版 本 的 VCS 代 理 并 将 其 注 册 为 V51 或 更 高 版 本177V40 和 V51 中 的 示 例 脚 本请 注 意 下 面 的 比 较 。V40ResName=$1Attr1=$2Attr2=$3VCSHOME="${VCS_HOME:-/opt/VRTSvcs}". $VCSHOME/bin/ag_i18n_inc.sh;VCSAG_SET_ENVS $ ResName;V51ResName=$1; shift;."../ag_i18n_inc.sh";VCSAG_SET_ENVS $ ResName;VCSAG_GET_ATTR_VALUE "Attr1" -1 1 "$@";attr1_value=${VCSAG_ATTR_VALUE};VCSAG_GET_ATTR_VALUE "Attr2" -1 1 "$@";attr2_value=${VCSAG_ATTR_VALUE};在 脚 本 入 口 点 中 引 用 ag_i18n_inc 模 块在 入 口 点 中 , 您 需 要 引 用 ag_i18n_inc 模 块 。 以 下 示 例 假 定 该 代 理 安 装 在 目 录/opt/VRTSvcs/bin/type 下 。对 于 Perl 中 的 入 口 点 :...$ResName = shitf;use ag_i18n_inc;VCSAG_SET_ENVS ($ResName);...对 于 Shell 中 的 入 口 点 :...ResName = $1; shift;. "../ag_i18n_inc.sh";VCSAG_SET_ENVS $ ResName;


178 使 用 5.0 之 前 版 本 的 VCS 代 理使 用 4.0 之 前 版 本 的 VCS 代 理 的 准 则使 用 4.0 之 前 版 本 的 VCS 代 理 的 准 则该 代 理 框 架 支 持 所 有 VCS 代 理 , 其 方 法 是 , 使 所 有 VCS 代 理 能 够 与 引 擎 就 有 关 资源 类 型 的 定 义 、 为 资 源 属 性 配 置 的 值 以 及 它 们 使 用 的 入 口 点 等 进 行 通 信 。更 改 VCS 4.0 和 VCS 5.0 版 本 附 带 的 代 理 框 架 , 会 影 响 借 助 4.0 之 前 版 本 的 VCS代 理 框 架 <strong>开</strong> <strong>发</strong> 的 代 理 的 使 用 方 式 。 可 以 对 任 何 4.0 之 前 版 本 的 VCS 代 理 进 行 修 改以 使 用 VCS 4.0 及 更 高 版 本 的 代 理 框 架 , 这 样 就 可 以 使 用 新 入 口 点 ; 但 是 这 不 是必 需 的 。请 注 意 以 下 准 则 :■■■如 果 4.0 之 前 版 本 的 VCS 代 理 是 以 脚 本 形 式 严 格 实 现 的 , 那 么 就 可 以 在 UNIX上 使 用 VCS 4.0 及 更 高 版 本 的 Script<strong>Agent</strong>。 如 里 需 要 , 可 以 直 接 使 用 VCS4.0 及 更 高 版 本 的 action 和 info 入 口 点 。如 果 4.0 之 前 版 本 的 VCS 代 理 是 使 用 C++ 入 口 点 实 现 的 , 且 <strong>开</strong> <strong>发</strong> <strong>人</strong> <strong>员</strong> 不 打 算实 现 action 或 info 入 口 点 , 就 可 以 使 用 该 代 理 。 VCS 4.0 及 更 高 版 本 的 代理 框 架 假 定 所 有 4.0 之 前 版 本 的 VCS 代 理 是 3.5 版 本 。如 果 4.0 之 前 版 本 的 VCS 代 理 是 使 用 C++ 入 口 点 实 现 的 , 并 且 您 “ 打 算 ” 实现 action 或 info 入 口 点 , 请 执 行 下 列 操 作 :■ 将 action 或 info 入 口 点 (C++ 的 或 基 于 脚 本 的 ) 添 加 到 该 代 理 。■ 使 用 采 用 参 数 V40 的 API VCSAgInitEntryPointStruct 将 该 代 理 注 册 为VCS 4.0 代 理 。 使 用 VCSAgValidateAndSetEntryPoint API 注 册 C++ 入口 点 。■ 重 新 编 译 该 代 理 。注 : 在 4.0 及 更 高 版 本 的 代 理 框 架 上 <strong>开</strong> <strong>发</strong> 的 代 理 与 2.0 或 3.5 等 4.0 之 前 版 本 的 框架 不 兼 容 。


使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息1794.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息4.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息 将 自 动 转 换 为 VCS 4.0 及 更 高 版 本 的 消 息格 式 。请 参 见 第 95 页 的 第 5 章 ,“ 日 志 记 录 代 理 消 息 ” 。日 志 标 记 (4.0 之 前 版 本 的 VCS) 到 日 志 严 重 程 度 (VCS 4.0) 的 映 射对 于 代 理 , VCS 4.0 及 更 高 版 本 的 入 口 点 消 息 的 严 重 程 度 级 别 , 与 4.0 之 前 版 本 的VCS 入 口 点 消 息 标 记 之 间 有 一 个 对 应 关 系 , 如 下 表 中 所 示 :日 志 标 记 (4.0 之 前 版 本 的 VCS) 日 志 严 重 程 度 (VCS 4.0 及 更 高 版 本 )TAG_ATAG_BTAG_CTAG_DTAG_ETAG_F 到 TAG_ZVCS_CRITICALVCS_ERRORVCS_WARNINGVCS_NOTEVCS_INFORMATIONVCS_DBG1 到 VCS_DBG21


180 使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS 代 理 中 的 日 志 消 息VCS 4.0 及 更 高 版 本 如 何 显 示 4.0 之 前 版 本 的 VCS 消 息在 下 面 的 示 例 中 , 显 示 了 一 条 使 用 VCS 3.5 代 理 编 写 的 消 息 , 分 别 给 出 了 它 在 VCS3.5 中 的 显 示 格 式 和 在 VCS 4.0 及 更 高 版 本 中 的 显 示 格 式 。 注 意 , 当 VCS 4.0 或 更高 版 本 显 示 4.0 之 前 版 本 的 VCS 代 理 的 消 息 时 , 会 在 消 息 的 唯 一 消 息 标 识 符 部 分中 包 含 一 个 类 别 ID 10000。 VCS 4.0 中 引 入 了 类 别 ID。■ 4.0 之 前 版 本 的 VCS 消 息 输 出 :TAG_B 2003/12/08 15:42:30VCS:141549:Mount:nj_batches:monitor:Mount resource will not goonline because FsckOpt is incomplete■VCS 4.0 及 更 高 版 本 所 显 示 的 4.0 之 前 版 本 的 VCS 消 息2003/12/15 12:39:32 VCS ERROR V-16-10000-141549Mount:nj_batches:monitor:Mount resource will not go onlinebecause FsckOpt is incomplete将 4.0 之 前 版 本 的 VCS API 与 VCS 4.0 日 志 记 录 宏 进 行 比 较本 <strong>指</strong> <strong>南</strong> 介 绍 了 C++ 代 理 和 基 于 脚 本 的 代 理 的 日 志 记 录 宏 。请 参 见 第 95 页 的 第 5 章 ,“ 日 志 记 录 代 理 消 息 ” 。为 了 进 行 比 较 , 接 下 来 的 示 例 会 显 示 使 用 C++ 编 写 的 一 个 消 息 对 , 此 消 息 对 分 别使 用 4.0 之 前 版 本 的 VCS API 和 VCS 4.0 宏 进 行 了 格 式 设 置 。■4.0 之 前 版 本 的 VCS API:sprintf(msg,"VCS:140003:FileOnOff:%s:online:The value for PathName attributeis not specified", res_name);VCSAgLogI18NMsg(TAG_C, msg, 140003,res_name, NULL, NULL, NULL, LOG_DEFAULT);VCSAgLogI18NConsoleMsg(TAG_C, msg, 140003, res_name,NULL,NULL,NULL,LOG_DEFAULT);■ VCS 4.0 宏 :VCSAG_LOG_MSG(VCS_WARNING, 14003, VCS_DEFAULT_FLAGS,"The value for PathName attribute is not specified");VCSAG_CONSOLE_LOG_MSG(VCS_WARNING, 14003, VCS_DEFAULT_FLAGS,"The value for PathName attribute is not specified");


使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message API1814.0 之 前 版 本 的 VCS Message APIVCSAgLogConsoleMsg新 版 本 中 保 留 了 本 节 中 介 绍 的 消 息 API, 这 样 , VCS 4.0 及 更 高 版 本 就 能 够 使 用 在2.0 和 3.5 代 理 框 架 上 <strong>开</strong> <strong>发</strong> 的 代 理 。voidVCSAgLogConsoleMsg(int tag, const char *message, int flags);此 基 元 请 求 VCS 代 理 框 架 将 message 写 入 代 理 日 志 文 件UNIX: $VCS_LOG/log/resource_type_A.log.该 message 不 得 超 过 4096 字 节 。 超 出 4096 字 节 的 消 息 将 被 裁 截 。tag 可 以 是 从 TAG_A 到 TAG_Z 的 任 何 值 。 默 认 情 况 下 , 标 记 A 到 E 处 于 启 用状 态 。 若 要 启 用 其 他 标 记 , 请 使 用 halog 命 令 。 flags 可 以 是 LOG_NONE、LOG_TIMESTAMP ( 输 出 日 期 和 时 间 )、 LOG_NEWLINE ( 输 出 一 个 新 行 ) 和LOG_TAG ( 输 出 标 记 ) 中 的 零 个 或 多 个 。 可 从 任 何 入 口 点 调 用 此 基 元 。例 如 :#include "VCSAgApi.h"...VCSAgLogConsoleMsg(TAG_A, "Getting low on disk space",LOG_TAG|LOG_TIMESTAMP);...


182 使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message APIVCSAgLogI18NMsgvoidVCSAgLogI18NMsg(int tag, const char *msg,int msg_id, const char *arg1_string, const char*arg2_string,const char *arg3_string, const char *arg4_string, intflags);此 基 元 请 求 VCS 代 理 框 架 将 一 个 具 有 一 个 消 息 ID 和 四 个 字 符 串 参 数 的 国 际 化message 写 入 到 代 理 日 志 文 件UNIX: $VCS_LOG/log/resource_type_A.log该 message 不 得 超 过 4096 字 节 。 超 出 4096 字 节 的 消 息 将 被 裁 截 。 所 有 参 数 字 符串 组 合 到 一 起 的 大 小 不 得 超 过 4096 字 节 。 如 果 参 数 字 符 串 总 计 超 过 4096 字 节 ,则 每 个 参 数 只 接 受 4096 字 节 大 小 的 部 分 , 若 其 超 出 该 允 许 的 部 分 , 将 被 裁 截 。tag 可 以 是 从 TAG_A 到 TAG_Z 的 任 何 值 。 默 认 情 况 下 , 标 记 A 到 H 处 于 启 用状 态 。 若 要 启 用 其 他 标 记 , 请 修 改 相 应 资 源 类 型 的 LogTags 属 性 。 flags 可 以是 LOG_NONE、 LOG_TIMESTAMP ( 输 出 日 期 和 时 间 )、 LOG_NEWLINE ( 输 出一 个 新 行 ) 和 LOG_TAG ( 输 出 标 记 ) 中 的 零 个 或 多 个 。 可 从 任 何 入 口 点 调 用 此基 元 。例 如 :#include "VCSAgApi.h"...char buffer[256];sprintf(buffer, "VCS:2015001:IP:%s:monitor:Device %s address%s", res_name, device, address);VCSAgLogI18NConsoleMsg(TAG_B, buffer, 2015001, res_name, device,address, NULL, LOG_TAG|LOG_TIMESTAMP|LOG_NEWLINE);


使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message API183VCSAgLogI18NMsgExvoidVCSAgLogI18NMsgEx(int tag, const char *msg,int msg_id, const char *arg1_string, const char*arg2_string,const char *arg3_string, const char *arg4_string,const char *arg5_string, const char *arg6_string, intflags);此 基 元 请 求 VCS 代 理 框 架 将 一 个 具 有 一 个 消 息 ID 和 六 个 字 符 串 参 数 的 国 际 化message 写 入 到 代 理 日 志 文 件UNIX: $VCS_LOG/log/resource_type_A.log该 message 不 得 超 过 4096 字 节 。 超 出 4096 字 节 的 消 息 将 被 裁 截 。 所 有 参 数 字 符串 组 合 到 一 起 的 大 小 不 得 超 过 4096 字 节 。 如 果 参 数 字 符 串 总 计 超 过 4096 字 节 ,则 每 个 参 数 只 接 受 4096 字 节 大 小 的 部 分 , 若 其 超 出 该 允 许 的 部 分 , 将 被 裁 截 。tag 可 以 是 从 TAG_A 到 TAG_Z 的 任 何 值 。 默 认 情 况 下 , 标 记 A 到 H 处 于 启 用状 态 。 若 要 启 用 其 他 标 记 , 请 修 改 相 应 资 源 类 型 的 LogTags 属 性 。 flags 可 以是 LOG_NONE、 LOG_TIMESTAMP ( 输 出 日 期 和 时 间 )、 LOG_NEWLINE ( 输 出一 个 新 行 ) 和 LOG_TAG ( 输 出 标 记 ) 中 的 零 个 或 多 个 。 可 从 任 何 入 口 点 调 用 此基 元 。例 如 :#include "VCSAgApi.h"...char buffer[256];sprintf(buffer, "VCS:2015004:Oracle:%s:%s:During scan forprocess %s ioctl failed with return code %s, errno = %s",res_name, ep_name, proc_name, ret_buf, err_buf);VCSAgLogI18NConsoleMsgEx(TAG_A, buffer, 2015004, res_name,ep_name, proc_name, ret_buf, err_buf, NULL, flags);


184 使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message APIVCSAgLogI18NConsoleMsgvoidVCSAgLogI18NConsoleMsg(int tag,const char *msg, int msg_id, const char *arg1_string,const char *arg2_string, const char *arg3_string,const char *arg4_string, int flags);此 基 元 请 求 VCS 代 理 框 架 将 一 个 具 有 一 个 消 息 ID 和 四 个 字 符 串 参 数 的 国 际 化message 写 入 到 代 理 日 志 文 件UNIX: $VCS_LOG/log/resource_type_A.log该 message 不 得 超 过 4096 字 节 。 超 出 4096 字 节 的 消 息 将 被 裁 截 。 所 有 参 数 字 符串 组 合 到 一 起 的 大 小 不 得 超 过 4096 字 节 。 如 果 参 数 字 符 串 总 计 超 过 4096 字 节 ,则 每 个 参 数 只 接 受 4096 字 节 大 小 的 部 分 , 若 其 超 出 该 允 许 的 部 分 , 将 被 裁 截 。tag 可 以 是 从 TAG_A 到 TAG_Z 的 任 何 值 。 默 认 情 况 下 , 标 记 A 到 E 处 于 启 用状 态 。 若 要 启 用 其 他 标 记 , 请 使 用 halog 命 令 。 flags 可 以 是 LOG_NONE、LOG_TIMESTAMP ( 输 出 日 期 和 时 间 )、 LOG_NEWLINE ( 输 出 一 个 新 行 ) 和LOG_TAG ( 输 出 标 记 ) 中 的 零 个 或 多 个 。 可 从 任 何 入 口 点 调 用 此 基 元 。例 如 :#include "VCSAgApi.h"...char buffer[256];sprintf(buffer, "VCS:2015002:IP:%s:monitor:Device %s address%s", res_name, device, address);VCSAgLogI18NConsoleMsg(TAG_B, buffer, 2015002, res_name, device,address, NULL, LOG_TAG|LOG_TIMESTAMP|LOG_NEWLINE);


使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message API185VCSAgLogI18NConsoleMsgExvoidVCSAgLogI18NConsoleMsgEx(int tag,const char *msg, int msg_id, const char *arg1_string,const char *arg2_string, const char *arg3_string,const char *arg4_string, const char *arg5_string,const char *arg6_string, int flags);此 基 元 请 求 VCS 代 理 框 架 将 一 个 具 有 一 个 消 息 ID 和 六 个 字 符 串 参 数 的 国 际 化message 写 入 到 代 理 日 志 文 件UNIX: $VCS_LOG/log/resource_type_A.log该 message 不 得 超 过 4096 字 节 。 超 出 4096 字 节 的 消 息 将 被 裁 截 。 所 有 参 数 字 符串 组 合 到 一 起 的 大 小 不 得 超 过 4096 字 节 。 如 果 参 数 字 符 串 总 计 超 过 4096 字 节 ,则 每 个 参 数 只 接 受 4096 字 节 大 小 的 部 分 , 若 其 超 出 该 允 许 的 部 分 , 将 被 裁 截 。tag 可 以 是 从 TAG_A 到 TAG_Z 的 任 何 值 。 默 认 情 况 下 , 标 记 A 到 E 处 于 启 用状 态 。 若 要 启 用 其 他 标 记 , 请 使 用 halog 命 令 。 flags 可 以 是 LOG_NONE、LOG_TIMESTAMP ( 输 出 日 期 和 时 间 )、 LOG_NEWLINE ( 输 出 一 个 新 行 ) 和LOG_TAG ( 输 出 标 记 ) 中 的 零 个 或 多 个 。 可 从 任 何 入 口 点 调 用 此 基 元 。例 如 :#include "VCSAgApi.h"......char buffer[256];sprintf(buffer, "VCS:2015003:Oracle:%s:%s:During scan forprocess %s ioctl failed with return code %s, errno = %s",res_name, ep_name, proc_name, ret_buf, err_buf);VCSAgLogI18NConsoleMsgEx(TAG_A, buffer, 2015003, res_name,ep_name, proc_name, ret_buf, err_buf, NULL, flags);


186 使 用 5.0 之 前 版 本 的 VCS 代 理4.0 之 前 版 本 的 VCS Message API


索 引AAction 145Action 入 口 点脚 本 入 口 点 89支 持 的 操 作 147<strong>Agent</strong>Class 参 数 137<strong>Agent</strong>Priority 参 数 137<strong>Agent</strong>ReplyTimeout 参 数 138ArgList 参 数 138ArgList 引 用 属 性 138attr_changed 入 口 点 33C++ 语 法 62脚 本 语 法 89AttrChangedTimeout 参 数 138Bbmcgen 实 用 程 序 171bmcread 实 用 程 序 171本 地 属 性 20标 量 属 性 维 数 19布 尔 型 属 性 类 型 19Cclean 的 enum 类 型VCSAgCleanMonitorHung 30VCSAgCleanOfflineIneffective 30VCSAgCleanOnlineHung 30VCSAgCleanOnlineIneffective 30VCSAgCleanUnexpectedOffline 30clean 入 口 点 30C++ 语 法 59脚 本 语 法 89CleanTimeout 参 数 139close 入 口 点 34C++ 语 法 64脚 本 语 法 90CloseTimeout 参 数 139ConfInterval 参 数 140参 数action 145<strong>Agent</strong>Class 137<strong>Agent</strong>Priority 137<strong>Agent</strong>ReplyTimeout 138ArgList 138AttrChangedTimeout 138CleanTimeout 139CloseTimeout 139ConfInterval 140FaultOnMonitorTimeouts 140FireDrill 141InfoTimeout 141LogDbg 142LogFileSize 142ManageFaults 142MonitorLevel 143MonitorStatsParam 143MonitorTimeout 143OfflineMonitorInterval 144OfflineTimeout 144OnlineRetryLimit 144OnlineTimeout 144OnlineWaitLimit 145OpenTimeout 145RegList 145RestartLimit 146ScriptClass 146ScriptPriority 146ToleranceLimit 147持 久 性 资 源 类 型 18D代 理 框 架多 线 程 48库 , C++ 36描 述 17日 志 记 录 API 98使 用 4.0 之 前 版 本 的 代 理 178代 理 消 息格 式 化 96在 VCSAG_LOG_MSG 中 正 常 108


188 索 引E二 进 制 消 息 目 录 (BMC) 文 件从 SMC 文 件 转 换 171更 新 173显 示 内 容 171FFaultOnMonitorTimeouts 参 数 140FireDrill 参 数 141G关 联 属 性 维 数 20Iinfo 入 口 点 27C++ 语 法 53脚 本 示 例 90InfoTimeout 参 数 141J基 于 脚 本 的 日 志 记 录 函 数 105基 元定 义 67VCSAgGetCookie 71VCSAgLogI18NMsg 182, 184, 185VCSAgLogI18NMsgEx 183VCSAgLogMsg 181VCSAgRegister 69VCSAgRegisterEPStruct 67VCSAgSetCookie 67VCSAgSetCookie2 67VCSAgSnprintf 72VCSAgStrlcat 72VCSAgUnregister 70键 列 表 属 性 维 数 20监 视 入 口 点 27C++ 语 法 52, 53脚 本 语 法 88LLogDbg 参 数 142LogFileSize 参 数 142MManageFaults 参 数 142MonitorLevel 参 数 143MonitorStatsParam 参 数 143MonitorTimeout 参 数 143Ooffline 入 口 点 29C++ 语 法 58脚 本 语 法 88OfflineMonitorInterval 参 数 144OfflineTimeout 参 数 144online 入 口 点 29C++ 语 法 57脚 本 语 法 88OnlineRetryLimit 参 数 144OnlineTimeout 参 数 144OnlineWaitLimit 参 数 145OnOff 资 源 类 型 18OnOnly 资 源 类 型 18open 入 口 点 33C++ 语 法 64脚 本 语 法 90OpenTimeout 参 数 145Operations 参 数 145P配 置 语 言本 地 属 性 和 全 局 属 性 20Q全 局 属 性 20RRegList 参 数 145resourceclosing ( 状 态 转 换 图 ) 158持 久 性 类 型 18fault ( 状 态 转 换 图 ) 155, 156monitoring ( 状 态 转 换 图 ) 157offlining ( 状 态 转 换 图 ) 154onlining ( 状 态 转 换 图 ) 153OnOff 类 型 18OnOnly 类 型 18opening ( 状 态 转 换 图 ) 151稳 定 状 态 ( 状 态 转 换 图 ) 152RestartLimit 参 数 146日 志 记 录 APIC++ 98


索 引189脚 本 入 口 点 106日 志 类 别 101入 口 点attr_changed 33clean 30close 34define 17info 27monitor 27offline 29online 29open 33shutdown 34示 例 结 构 37SScript<strong>Agent</strong> 116, 178ScriptClass 参 数 146ScriptPriority 参 数 146shutdown 入 口 点 34C++ 语 法 66脚 本 语 法 90设 置 代 理 消 息 的 格 式 96时 间 戳 消 息 字 段 96使 用 VCSAG_LOG_INIT 初 始 化 函 数 101属 性全 局 和 本 地 20属 性 类 型布 尔 型 19字 符 串 19属 性 维 数标 量 19关 联 20keylist 20向 量 19TToleranceLimit 参 数 147调 试 消 息C++ 入 口 点 99Perl 脚 本 入 口 点 109Shell 脚 本 入 口 点 109调 试 消 息 严 重 程 度 级 别 99UUMI ( 唯 一 消 息 标 识 符 ) 97VVCSAG_CONSOLE_LOG_MSG 日 志 记 录 宏 98VCSAG_LOG_INIT 初 始 化 函 数 101VCSAG_LOG_MSG 脚 本 日 志 记 录 函 数 105VCSAG_LOG_MSG 日 志 记 录 宏 98VCSAG_LOGDBG_MSG 脚 本 日 志 记 录 函 数 105VCSAG_LOGDBG_MSG 日 志 记 录 宏 98VCSAG_RES_LOG_MSG 日 志 记 录 宏 98VCSAG_SET_ENVS 脚 本 日 志 记 录 函 数 105VCSAgGetCookie 基 元 71VCSAgLogI18NMsg 基 元 182, 184, 185VCSAgLogI18NMsgEx 基 元 183VCSAgLogMsg 基 元 181VCSAgRegister 基 元 69VCSAgRegisterEPStruct 基 元 67VCSAgSetCookie 基 元 67VCSAgSetCookie2 基 元 67VCSAgSnprintf 基 元 72VCSAgStartup 入 口 点 , C++ 语 法 51VCSAgStrlcat 基 元 72VCSAgValidateAndSetEntryPoint 78VCSAgUnregister 基 元 70X向 量 属 性 维 数 19消 息 的 类 别 ID 106消 息 文 本 格 式 96, 97Y严 重 程 度 宏 100严 重 程 度 消 息 字 段 97有 意 脱 机 18源 消 息 目 录 (SMC) 文 件创 建 168转 换 为 BMC 文 件 168Z助 记 键 消 息 字 段 96状 态 转 换 图打 <strong>开</strong> 资 源 151关 闭 资 源 158监 视 持 久 性 资 源 157使 资 源 联 机 153使 资 源 脱 机 154资 源 出 现 故 障 ( 未 自 动 重 新 启 动 ) 155资 源 出 现 故 障 ( 自 动 重 新 启 动 ) 156资 源 处 于 稳 定 状 态 152字 符 串 属 性 类 型 19


190 索 引

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!