Active、数据库节点管理

June 24, 2022About 21 min

Active、数据库节点管理

active,stream,kafka节点建立 SDK类名:/resource/ActiveNode

-------未激活节点-----

URL

/未激活节点

Method

GET

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则

未激活节点列表

SDK方法名:listInactiveNodes

URL

//active/node/inactive_list

Method

GET

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  totalNumber总数20
  messageString
  info_listArray列表5
    node_nameString节点名称@name
    addressStringip地址127.0.0.1
    data_portString端口号26804
    versionString版本7.2.0.32472
    osString操作系统centos6.5
    cache_dirString缓存目录/var/i2data/cache/
    ipctokenString@guid
    registeredBoolean是否被注册过false
    node_uuidString节点uuid@guid
    log_dirString日志目录/var/i2data/log/
    web_uuidString底层需要参数@guid
    phy_typeNumber操作系统类型2
    statusString类型状态inactive

激活

SDK方法名:activeNode

URL

//active/node

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
addressStringip 地址@ip
node_nameString节点名@name
data_portString数据端口26804
cache_dirString数据缓存目录/var/i2data/cache/
ipctokenString@guid
log_dirString日志目录/var/i2data/log/
registeredNumber是否已注册过,1:已注册 0:未注册,已注册则表明要修改,否则为激活0-1
commentString备注string
web_uuidString底层需要的参数@guid
node_typeString1110001000
portObject节点类型
  iarelayString
  iamskString
  iasyncString
maintenanceNumber维护模式0
phy_typeString物理机类型
biz_grp_listArray分组的uuid

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString操作成功
  uuidString@uuid

节点状态

SDK方法名:listNodeStatus

URL

//active/node/status

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidsArray["@guid","@guid"]

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString
  info_listArray
    uuidString节点uuidEF5863A9-BA50-4BE6-81B6-8E1C3A006327
    statusString离线:OFFLINEONLINE
    versionString版本7.2.0.32522
    osString操作系统CentOS release 6.5 (Final)
    process_statusObject进程状态
      iabackString离线:off 备端节点on
      iarelayString离线:off 中继节点on
      iaworkString离线:off 源端节点on
      iatrackString离线:offoff
      iaconsumeString消费节点on
      iamaskString脱敏节点
      iascriptString

---------机器节点-------

URL

/机器节点

Method

GET

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则

节点列表(搜索)

SDK方法名:listNodes

URL

//active/node

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
pageNumber请求的页,默认为第一页1
limitNumber每页请求数量,默认为1010
nodetypeString获取指定类型(源端、备端)的节点,为空是表示不分类型@pick{"name","source","backup"]}
search_fieldString字段名
order_byString排序方式 desc asc
sortString@pick{'name',address}
search_valueString数据库要搜索的值

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString[0] 操作成功。
  info_listArray
    usernameStringadmin
    user_uuidString1BCFCAA3-E3C8-3E28-BDC5-BE36FDC2B5DC
    node_uuidString节点uuidEF5863A9-BA50-4BE6-81B6-8E1C3A006327
    web_uuidString00000000-0000-0000-0000-000000000000
    node_nameString节点名称mask_node
    addressStringip 地址172.20.5.25
    data_portNumber端口26804
    log_dirString日志缓存/u01/i2data/log/
    cache_dirString缓存地址/u01/i2data/cache/
    commentNull备注
    node_typeString节点类型11010000
    ipctokenString底层传上的值A5426C57-A27A-4941-A731-F56902D00BBD
    sample_intervalString采样间隔2
    phy_typeString物理类型2
    create_timeNumber创建时间1587956895
    portString端口类型{"iawork":"","iatrack":"","iaback":"","iarelay":"","iamask":"","iaload":"","iamsg":"","sqlserver":"","iagauss":""}
    is_biz_adminNumber1
    can_delNumber操作的权限1
    can_opNumber1
    can_upNumber1
    biz_grp_listArray
  totalNumber1

获取单个详细信息

SDK方法名:descriptNode

URL

//active/node/:uuid([A-F0-9-]+)

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
registeredNumber是否为已注册节点 0:不是 1:是10-1
uuidString31424826-A97D-4085-81AE-FD64EC58B6CE1

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString
  active_nodeObject
    node_nameString节点名称@name
    node_uuidString节点uuid@guid
    addressString数据库ip@ip
    data_portString端口号26804
    os_typeStringcentos6.5
    cache_dirString缓存目录/var/i2data/cache/
    log_dirString日志目录/var/i2data/log/
    ipctokenString底层需要的值D1AD0D6D-5622-41DA-BA47-8AACA6A5854E
    node_typeString节点类型10000111
    portObject端口号
      iaworkString
      iabackString
      iarelayString
      iatrackString
      iamaskString
      ialoadString
      iamsgString6666
      iagaussString567
      sqlserverString888
    regNumber1
    web_uuidString底层需要@guid

状态信息

SDK方法名:descriptNodeDebugInfo

URL

//active/node/debug_info

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
uuidString41D1C1E8-60AE-4853-9694-5599560EEB0F
last_timeNumber

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString[0]操作成功
  debug_nodeArraytab2调试信息用
    conn_bkString链接信息链接信息bk
    conn_wkString链接信息wk
    thd_bkString线程信息
    thd_wkString
    conf_bkString配置信息
    conf_wkString
    obj_bkString对象信息
    obj_wkString
    relay_dbString中继信息中继信息db
    relay_tokBooleanfalsefalse
  cpu_useageArrayCPU占用charts用[
0.460829496383667,
0.921658992767334,
0.46296295523643494,
0.9174311757087708
]
  cpu_useage_infoArray右边实时CPU占用方框用["0.55","0.55"]
  memory_useageArray内存占用charts用[
20.145530700683594,
20.145530700683594,
20.145530700683594,
20.145530700683594
]
  memory_useage_infoArray暂时废弃,没有用1-10
  network_useage_infoArray右边实时输入输出方框用[{name:"total", recv: "2087", send: "1300"},{name:"eth3", recv: "1087", send: "300"},{name:"eth4", recv: "10", send: "400"}]
  network_useage_netsendArray网络发送数据charts用,2个用一个图[
1741,
7052,
1848,
2021
]
  network_useage_netrecvArray网络接收数据charts用,2个用一个图[
1154,
5545,
1249,
1489
]
  timeArray["2018/11/09 10:40:06","2018/11/10 10:41:06","2018/11/11 10:42:06","2018/11/12 10:43:06","2018/11/13 10:44:06","2018/11/14 10:45:06","2018/11/15 10:46:06"][1605175400,1605175450,1605175500]
  process_statusObject进程的返回信息
    iaworkStringok
    iabackStringignore
    iarelayStringbad
    iatrackStringbad
    iaconsumeStringbad

修改节点

SDK方法名:modifyNode

URL

//active/node

Method

PUT

Request

名称类型必选简介Mock初始值Mock规则
node_nameString节点名@name
addressString数据库ip192.168.12.199
iptokenString底层所需值780B4F1B-6FB9-46C4-98AC-02A8DF4A1C76
data_portString端口26804
cache_dirString缓存目录/var/i2data/cache/
log_dirString日志目录/var/i2data/log/
node_uuidString节点uuid31424826-A97D-4085-81AE-FD64EC58B6CE1
registeredNumber1
commentString备注string
web_uuidString@guid
portObject端口
  iarelayString26806
  iamaskString26808
  iasyncString26803
maintenanceNumber维护模式0
node_typeString1111010000
phy_typeString物理机类型 vm:22
os_typeString操作系统类型 linux:0 window:1 (未激活节点会提供此数据)0
biz_grp_listArray分组uuid

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString操作成功
  uuidString@uuid

删除节点

SDK方法名:deleteNode

URL

//active/node

Method

DELETE

Request

名称类型必选简介Mock初始值Mock规则
uuidsArray["@guid","@guid"]
forceNumber0

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber2
  messageStringDelete success
  success_listArray
    messageStringuu
    node_uuidStringyy
    node_nameStringgg
    codeString0
  fail_listArray
    messageStringyy
    node_uuidStringyy
    node_nameStringtt
    codeString0

节点升级

SDK方法名:upgradeNode

URL

//active/node/upgrade

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidsArray["@guid"]

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString操作成功

维护模式切换

SDK方法名:switchMaintenance

URL

//active/node/maintenance

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidStringbBae9dCA-f6cc-BA66-bF59-8DFc395eD094
switchNumber维护模式0关,1开0

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString操作成功

--------数据库节点------

URL

/数据库节点

Method

GET

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则

数据库健康信息(已废弃)

SDK方法名:describeDbHealthInfo

URL

//active/db/health_info

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
uuidString数据库节点uuid@guid

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  infoObject
    connectString连接状态127.0.0.1 connect ok
    tablespaceString表空间占用
    asm_diskStringasm 磁盘占用
    headroomStringheadroom 值Date_Time Headroom 2019/05/16 17:14:14 11671.695902
    lock_dbString锁定表
    graghArray锁定信息
      cloudArray
        spendString1000
      txnArray
        scn_timeString
        irpString
        urpString
        drpString
        qmiString
        txnString
      log_thdArray
        idString
        scn_timeString

数据库列表

SDK方法名:listDbs

URL

//active/db

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
pageNumber1
limitNumber10
search_fieldString用于搜索的键
db_name: 库节点名称
ip:数据库ip,
server_name:服务名 /数据库名
db_name
search_valueString用于搜索的值
roleString数据库节点的角色: 源端节点1; 备端节点:2 ,不传默认为全部
directionString''
db_typeString数据库类型:
oracle
kafka
mysql
postgres
vertica
greenplum
ipString数据库IP
portString数据库端口
service_nameString数据库名或服务名

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString[0] 操作成功。
  info_listArray
    node_nameString节点名称node26
    node_typeString节点类型00010000
    node_ipString节点ip172.20.5.26
    usernameString用户名admin
    user_uuidString用户uuid1BCFCAA3-E3C8-3E28-BDC5-BE36FDC2B5DC
    db_uuidString数据库节点uuid0792EC0B-B84A-FA60-1ED5-B33B0B1591F8
    db_nameString数据库名称123123123
    node_uuidString节点uuidB1A3F55A-027E-4B49-A4FA-D9ED9807ACBF
    db_typeString节点类型sqlserver
    deploy_modeString单机模式single
    log_read_typeString日志读取方式file
    file_open_typeString文件打开方式normal
    db_encryedNumber1
    db_modeStringnormal
    is_biz_adminNumber操作权限1
    can_delNumber1
    can_opNumber1
    can_upNumber1
    uuidString@guid
  totalNumber9

测试数据库连接

SDK方法名:checkDbLink

URL

//active/db/db_check1

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
db_nameString数据库名@name
node_uuidString节点uuid778553A7-9A06-4F05-AB40-8BD59F353D62
db_typeString数据库类型oracle
file_open_typeString文件打开方式DIRECT
deploy_modeString部署方式single
log_read_typeString日志读取方式file
configObject
  usernameString用户名@name
  passwordString密码i2
  server_nameString服务名orcl
  portNumber1521
  log_readObject
    os_authNumber1
    asm_instanceString
    asm_usernameString
    asm_portNumber1521
    asm_passwordString12323131
  filter_sessionNumber1
  relayObject中继节点
    enableNumber1
    relay_node_uuidString
  remote_file_agentObject远程文件代理
    enableNumber1
    portNumber1
    compressStringnone
  db_listArray多个ip配置放此处
    ipString@ip
    threadString1
    disableString1
  broker_serverArraykafka配置
    ipString@ip
    portNumber8080
  charsetString字符
  kafka_auth_typeStringnone
  kerberos_keytab_pathString
  kerberos_principalString
  kerberos_service_nameStringkafka
  kudu_impalaObjectkudu 连接模式
    impala_server_ipString@ip
    impala_server_portString21050
    impala_auth_typeString
    default_databaseString
    impala_client_keytab_pathString
    impala_client_krb_principalString
    impala_server_krbhost_fqdnString
    impala_server_krbrealmString
    impala_server_krbservice_nameString
  db_schemaStringoracle
db_uuidString数据库uuid6C4AEF37-6496-6DCD-E085-DD640001E4EC
node_typeString1110001000
db_modeStringnormal

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringconnect success

数据库状态

SDK方法名:listDbStatus

URL

//active/db/status

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidsArray@guid

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString
  statusArray2
    db_uuidString0792EC0B-B84A-FA60-1ED5-B33B0B1591F8
    statusStringONLINE, OFFLINEONLINE
    versionString7.2.0.32522
    uuidString@guid

新建数据库节点

SDK方法名:createDb

URL

//active/db

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
db_uuidString数据库节点的uuid,为空的话,则表明是创建,不为空则为修改@guid
db_nameString@name
node_uuidString@guid
db_typeString数据库类型:
oracle
kafka
mysql
postgres
vertica
greenplum
oracle
file_open_typeStringnormal:普通方式,DIRECT:DIRECT0
deploy_modeStringoracle:部署方式:single:单机 cluster:集群0
log_read_typeStringfile
configObject
  usernameStringoracle@name
  passwordStringoracle
  server_nameStringoracle
  portNumberoracle1
  relayObjectoracle
    enableNumber是否有中继节点1
    relay_node_uuidString中继节点uuid
  log_readObjectoracle
    os_authNumberasm|asm_device: 是否os认证 1:认证 0:不认证1
    asm_instanceStringasm|asm_device: asm 实例
    asm_usernameStringasm|asm_device: ASM用户名
    asm_portNumberasm|asm_device: asm 端口号1
    asm_passwordString12323131
  filter_sessionNumber1:过滤 0:不过滤1
  remote_file_agentObjectoracle:远程文件代理
    enableNumber是否启用1
    portNumber端口1
    compressString压缩类型:no(不压缩) lzo,zipno
  db_listArrayoracle
    ipString
    threadString
    disableNumber00-1
  producer_hostStringkafka: Producer 主机@ip
  producer_portNumberkafka: Producer 端口1
  broker_serverArraykafka | qianbase
    portNumber1
    ipString端口@ip
  authenticationStringkafka: none,Kerberos,username 认证方式none
  principalStringkafka
  keytabfileStringkafka
  kafka_auth_typeStringnone sasl_gssapi sasl_plain(用户名和密码) sasl_authentication(sasl 认证) ssl
  kerberos_keytab_pathStringprincipal
  kerberos_principalStringkeytab路径
  kerberos_service_nameStringkafka 服务名
  sasl_plain_userString用户名
  sasl_plain_passString密码
  sqlserverObject
    ipString
    portNumber
    usrString
    pwdString
    dbString
    dacportString
  user_managmentArray用户管理(数据库goldendb,hana)
    userString
    passwdString
    default_dbString默认数据库
    cred_uuidString凭据uuid
    cred_loginNumber
  db_ipString
  modelNumber
  sniffString
  roleArraysource,target
    sourceNumber0: 不选中0
    targetNumber1:选中1
  login_urlString登陆url
  conn_pool_maxNumber
  instance_nameString数据库实例名(暂时只有informix存在此值)
  database_nameString数据库名(暂时只有informix存在此值)
  jksStringssl 格式认证书认证
  kerberos_keytab_authStringkerberos 添加用户
  user_oceanbaseString管理用户(oceanbase)
db_modeStringnormal,cdb,pdb
cdbString@guid
biz_grp_listArray

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringoperate success
  uuidString@uuid

修改数据库节点

SDK方法名:modifyDb

URL

//active/db/:uuid([A-F0-9-]+)

Method

PUT

Request

名称类型必选简介Mock初始值Mock规则
db_nameString数据库名@name
db_uuidString数据库uuidA0A0526D-6503-5C2A-E3D8-7D85813967F1
db_typeString数据库类型oracle
node_uuidString机器节点uuid0596a77C-64Fd-cAf2-DB9c-cAaeBD56eD88
file_open_typeString文件打开方式0
deploy_modeString0
log_read_typeString日志读取方式file
random_strString
configObject
  usernameString用户名@name
  passwordString密码
  server_nameString服务名
  portNumber端口1
  log_readObjectasm 实例
    os_authNumber1
    asm_instanceString
    asm_usernameString
    asm_portNumber1
    asm_passwordString12323131
  filter_sessionNumber会话过滤1
  relayObject中继
    enableNumber1
    relay_node_uuidString
  remote_file_agentObject远程文件代理
    enableNumber1
    portNumber1
    compressStringno
  db_listArray集群/多ip
    ipString
    threadString
  broker_serverArraykafka
    ipString@ip
    portNumber1
  conn_pool_maxNumber连接池最大连接数
  instance_nameString数据库实例名(暂时只有informix存在此值)
  database_nameString数据库名(暂时只有informix存在此值)
cdbString@guid

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringoperate success
  uuidString@uuid

表空间查询接口

SDK方法名:describeDbSpace

URL

//active/db/space_query

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
uuidStringA0A0526D-6503-5C2A-E3D8-7D85813967F1

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringoperate success

删除数据库

SDK方法名:deleteDb

URL

//active/db

Method

DELETE

Request

名称类型必选简介Mock初始值Mock规则
uuidsArray["A0A0526D-6503-5C2A-E3D8-7D85813967F1"]
forceNumber0不强制 1强制删除0

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber-1
  messageStringDelete success
  success_listArray
    codeNumber0
    messageString
    db_nameString@name
    db_uuidString@uuid
  fail_listArray
    codeNumber-1
    messageString
    db_uuidString@uuid
    db_nameString@name

批量导入

SDK方法名:batchCreateDbs

URL

//active/db/batch

Method

POST

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString[0]操作成功。

获取单个数据库节点信息

SDK方法名:describeDb

URL

//active/db/:uuid([A-F0-9-]+)

Method

GET

Request

名称类型必选简介Mock初始值Mock规则

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageString[0] success
  active_dbObject
    usernameStringadmin
    idString4
    create_timeString1560328411
    db_uuidString3E2EBF85-7261-3FA2-9A6C-23AC0C2174E8
    random_strString1B826A2D-7373-C3A7-0695-ADB854EC08BA
    user_uuidString1BCFCAA3-E3C8-3E28-BDC5-BE36FDC2B5DC
    db_nameStringdb31
    node_uuidString3E2EBF85-8261-3FA2-9A6C-23AC0C2174E8
    db_typeStringoracle
    file_open_typeStringnormal
    deploy_modeStringsingle
    log_read_typeStringasm
    configObject
      usernameStringroot
      passwordStringxxxxxx
      server_nameStringserver1
      portNumber1
      log_readObject
        os_authNumber1
        asm_instanceString
        asm_usernameString
        asm_portNumber1
        asm_passwordString12323131
      filter_sessionNumber1
      relayObject
        enableNumber1
        relay_nodeuuidString
      remote_file_agentObject
        enableNumber1
        portNumber1
        compressStringnone
      db_listArray
        ipString
        threadString
      broker_serverArray
        ipString8.8.4.4
        portNumber1
      kafka_auth_typeStringsasl_plain
    db_modeStringpdb
    cdbString@uuid
    uuidString@uuid

测试数据库连接(新格式)

SDK方法名:checkDbLink

URL

//active/db/db_check

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidString机器节点uuid6C4AEF37-6496-6DCD-E085-DD640001E4EC
typeStringoracle
confArray4
  idArray数据库标识[1,2,3,4]+1
  nameArray数据库实例名,数据库名、数据库服务名 ... ...["kfk","oracle","kfk","kudu"]+1
  ipString172.20.5.116
  portString1521
  authArray["none","pass","kerberos"]+1
  passObject
    userArray["i2","i2",null,null]+1
    passArray["i2","i2",null,null]+1
  kerberosObject
    principalArray["",null,"",""]+1
    keytabArray["",null,"",""]+1
  impalaObject
    ipArray["",null,null,""]+1
    portArray["",null,null,""]+1
    nameArray["",null,null,""]+1
    authArray["kerberos",null,null,"kerberos"]+1
    kerberosObject
      realmArray["",null,null,""]+1
      nameArray["",null,null,""]+1
      hostArray["",null,null,""]+1
      principalArray["",null,null,""]+1
      keytabArray["",null,null,""]+1
  modelNumber只有在elasticsearch,oceanbase类型时传值,其余类型不传这个参数
elasticsearch 0对应HTTP,1对应HTTPS
oceanbase 0对应Oracle,1对应MySQL
["0","1"]+1
  sniffNumber只有在elasticsearch类型时传值,其余类型不传这个参数
0对应否,1对应是
["0","1"]+1
jsonverObject

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject2
  messageString
  codeNumber0
  resultArray
    stateNumber0
    idString0

重新生成

SDK方法名:rebuildActiveNode;

URL

//active/node/rebuild

Method

POST

Request

名称类型必选简介Mock初始值Mock规则
uuidString33333-xxxxx-222222

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringoperate success

刷新

SDK方法名:refresgActiveNode;

URL

//active/node/refresh

Method

GET

Request

名称类型必选简介Mock初始值Mock规则
uuidString日志规则的uuidxxxxxxxxx

Response

名称类型必选简介Mock初始值Mock规则
retNumber200
msgString
dataObject
  codeNumber0
  messageStringoperate success
  log_nameString2021-4-13_4-44-33.zip
Last update: 11/18/2022, 3:56:21 PM
Contributors: ganl