net-connector 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ff14cb75482326d5580fefe4341ab39d727c1bc0d35daa90ebf34f534dbf1d1
4
- data.tar.gz: eb6da5eca7eed4764f9dfa12e67708625d32cb597f206a2af1711047bcd1582c
3
+ metadata.gz: 53b48ed47fa1c111f914a4b8861a979d71424f299cad8334be8e158d131cd7d1
4
+ data.tar.gz: a4680a27142dc8660c2747c7dbd4afaf0aee2c97e86fc3d74da903b7b0c3223b
5
5
  SHA512:
6
- metadata.gz: 57c9e407fab11396ce830e35a54eddf0f5266864e76840407c7df691fa0ddf4e3f894c0e708a62f79c4e8ee2ba2236c04d3c503206e64d4d0892a1d17b74eb16
7
- data.tar.gz: bfeb19f27232509e79a96b1156342365ece7ecec96a66bd56207da48dcaf3db334940aab8d8966fb0028403aa50762b7d989da3618b892b952aa49bc43293825
6
+ metadata.gz: 0a9dcbcd74b6747c6cfc3920118aa9d8a89b3b26e92b3d9d1c212df9e189295f2ffe34b1c6b0bb82a6789fa7ede26dc60931f780cd0d621994065e3ebb7d11cb
7
+ data.tar.gz: 85fa8790b775b1d682f9284ab2b176d38ea9a1a7d12da5b39d9c432ecc3ef3501c47d7e65d41130884343d5b1d443485dca97ba133cdffcd6a63802d40bcf430
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # 更新记录
2
2
 
3
+ ## 0.11.1 - 2026-10-17
4
+
5
+ - 允许控制器操作租约的同一线程和 Fiber 在命令结束后关闭会话;关闭期间仍拒绝回调重入、其他线程和其他 Fiber,嵌套 AP 清理失败可在释放租约前隔离连接。
6
+
3
7
  ## 0.11.0 - 2026-10-17
4
8
 
5
9
  - 固定协议行分隔符,不再依赖宿主的 `$/`:并发 SSH 主机密钥冲突仍会拒绝,脚本、PAN-OS 配置、TFTP/保存证据及日志按设备行解析;标准输入凭据和隐藏密码只消费当前一行。
data/docs/architecture.md CHANGED
@@ -87,7 +87,7 @@ TFTP 内置策略的 `validate_options!` 是纯参数校验,执行于 H3C 源
87
87
 
88
88
  明确完成证据先生成最小回执,再执行路径提取、元数据钩子及事件记录。已完成步骤之后的清理错误同样保留回执;路径不可用时保留 nil,不把请求文件名冒充实际目标。`TftpCompletionError` 只含受控码、类型和回执,不带原始消息、输出或 cause。Fleet 仅信任库定义的精确错误类及匹配产物;第三方异常上的 receipt 字段和错误子类不能供应完成事实。已上传但收尾失败使用 reported_with_error/partial 分类。
89
89
 
90
- `Topology` 默认通过显式 `sync_interface_descriptions` 调用在同一连接与租约内完成发现到保存,调用方无须传递计划。独立规划/应用流程仍冻结计划并要求显式确认;两条路径共用写入前证据重验和命令核对。`ImmediateStrategy` 将即时生效设备的修改/退出视图、运行配置读回、保存拆开:读回未确认或有未识别接口块时停止,不发送保存。重验、下发、读回、保存及阶段间隙都持有原有会话租约;只有所属线程和 Fiber 能顺序执行脚本,其他调用、关闭请求和脚本回调重入均返回 `SessionBusy`。租约不隔离其他设备会话或管理员。
90
+ `Topology` 默认通过显式 `sync_interface_descriptions` 调用在同一连接与租约内完成发现到保存,调用方无须传递计划。独立规划/应用流程仍冻结计划并要求显式确认;两条路径共用写入前证据重验和命令核对。`ImmediateStrategy` 将即时生效设备的修改/退出视图、运行配置读回、保存拆开:读回未确认或有未识别接口块时停止,不发送保存。重验、下发、读回、保存及阶段间隙都持有原有会话租约;只有所属线程和 Fiber 能顺序执行脚本,其他线程或 Fiber 的调用、关闭请求和脚本回调重入均返回 `SessionBusy`。同一线程和 Fiber 可在命令结束后于租约内关闭异常的嵌套会话;关闭回调不能执行脚本或递归关闭,关闭期间仍保持原租约,标记清理后才交付取消。租约不隔离其他设备会话或管理员。
91
91
 
92
92
  ```mermaid
93
93
  flowchart LR
@@ -64,7 +64,7 @@ module Net
64
64
 
65
65
  # 锁覆盖完整操作而不是单次写入,保证批处理命令不会交错。
66
66
  def perform(phase, &)
67
- if @operation_owner == [Thread.current, Fiber.current] && !@performing
67
+ if @operation_owner == [Thread.current, Fiber.current] && !@performing && !@closing
68
68
  return perform_locked(phase, &)
69
69
  end
70
70
  with_session_lock(phase) { perform_locked(phase, &) }
@@ -91,9 +91,28 @@ module Net
91
91
  raise build_error(SessionBusy, "backup path ownership must be acquired before a session operation", phase: phase), cause: nil
92
92
  end
93
93
 
94
- # 独占关闭会话;已有操作占用时返回会话繁忙错误。
94
+ # 同一操作所有者可在命令结束后关闭借用会话,关闭回调及其他执行者仍不得重入。
95
95
  def close
96
- with_session_lock(:close, busy_message: "cannot close a session owned by another operation") { close_resources }
96
+ if @operation_owner == [Thread.current, Fiber.current] && !@performing && !@closing
97
+ failure = nil
98
+ begin
99
+ @closing = true
100
+ close_resources
101
+ rescue Exception => error # rubocop:disable Lint/RescueException -- 状态收尾的二次取消不能覆盖原始关闭故障。
102
+ failure = error
103
+ raise
104
+ ensure
105
+ begin
106
+ Thread.handle_interrupt(Exception => :never) { @closing = false }
107
+ rescue Exception => error # rubocop:disable Lint/RescueException -- 先清除重入标记,再交付原始取消或收尾取消。
108
+ Thread.handle_interrupt(Exception => :never) { @closing = false }
109
+ error = failure || error
110
+ raise error, cause: error.cause
111
+ end
112
+ end
113
+ else
114
+ with_session_lock(:close, busy_message: "cannot close a session owned by another operation") { close_resources }
115
+ end
97
116
  end
98
117
 
99
118
  # 执行特权认证,并更新提示符及特权状态。
@@ -3,6 +3,6 @@
3
3
  module Net
4
4
  module Connector
5
5
  # gemspec、CLI 与发布工具共用此版本,运行时读取不触发设备依赖加载。
6
- VERSION = "0.11.0"
6
+ VERSION = "0.11.1"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-connector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - net-connector contributors
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-10-16 00:00:00.000000000 Z
10
+ date: 2026-10-17 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: expect-pty