Skip to content

API: Add ListRule() for routing#5569

Merged
RPRX merged 5 commits intoXTLS:mainfrom
IAMouMeng:main
Jan 23, 2026
Merged

API: Add ListRule() for routing#5569
RPRX merged 5 commits intoXTLS:mainfrom
IAMouMeng:main

Conversation

@IAMouMeng
Copy link
Contributor

The original router interface does not support obtaining the rule list. A new ListRule has been added, which can obtain the ruleTag List. The returned information is as follows

[tag:"ruleA" ruleTag:"Block_xxx_com" tag:"ruleB" ruleTag:"OutToA"]

@IAMouMeng IAMouMeng changed the title grpc api add ListRule() Add grpc api ListRule() support Jan 19, 2026
@Fangliding
Copy link
Member

新增api需要像 #3189 一样提供 xray api 命令作为调用示范以及便捷使用

@IAMouMeng
Copy link
Contributor Author

IAMouMeng commented Jan 19, 2026

It has been added and tested successfully

virtual-machine:~/xray# ./xray api
xray api provides tools to manipulate Xray via its API.

Usage:

        xray api <command> [arguments]

The commands are:

        restartlogger          Restart the logger
        stats                  Retrieve statistics
        statsquery             Query statistics
        statssys               Retrieve system statistics
        bi                     Retrieve balancer information
        bo                     Override balancer
        adi                    Add inbounds
        ado                    Add outbounds
        rmi                    Remove inbounds
        rmo                    Remove outbounds
        lsi                    List inbounds
        lso                    List outbounds
        adu                    Add users to inbounds
        rmu                    Remove users from inbounds
        inbounduser            Retrieve inbound user(s)
        inboundusercount       Retrieve inbound user count
        adrules                Add routing rules
        rmrules                Remove routing rules by ruleTag
        lsrules                List routing rules
        sib                    Block connections by source IP
        statsonline            Retrieve the online session count for a user
        statsonlineiplist      Retrieve a user's online IP addresses and access times
        statsgetallonlineusers Retrieve array of all online users

Use "xray help api <command>" for more information about a command.
virtual-machine:~/xray# ./xray api lsrules
{
    "rules": [
        {
            "ruleTag": "BlockIP",
            "tag": "blackhole"
        },
        {
            "tag": "direct"
        }
    ]
}

@majorcheng
Copy link

除了list rules,能modify rules吗

@IAMouMeng
Copy link
Contributor Author

IAMouMeng commented Jan 22, 2026

modify rules

编辑规则 可以通过AddRule方法 ShouldAppend 为 false 即可

	routerConfig := conf.RouterConfig{
		RuleList: ruleList,
	}

	config, err := routerConfig.Build()
	if err != nil {
		return
	}
	_, err = x.routerService.AddRule(ctx, &routingService.AddRuleRequest{
		Config:       serial.ToTypedMessage(config),
		ShouldAppend: false,
	})

@IAMouMeng
Copy link
Contributor Author

新增api需要像 #3189 一样提供 xray api 命令作为调用示范以及便捷使用

已经实现 提交上去了

@majorcheng
Copy link

这个好 ,经常需要调整rules但是不想重启xray

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

为啥新增的 command 不像 adrules 和 rmrules 一样叫 lsrules 而是 lsr?应当先保持一致

@IAMouMeng
Copy link
Contributor Author

IAMouMeng commented Jan 23, 2026 via email

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

为啥不参照另外两个,改一下,半个小时后要发版了

@IAMouMeng
Copy link
Contributor Author

为啥不参照另外两个,改一下,半个小时后要发版了

已修正

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

List Rules 需要参考另外两个改为 List routing rules

还有这个不止能列出带 ruleTag 的吧

@IAMouMeng
Copy link
Contributor Author

List Rules 需要参考另外两个改为 List routing rules

还有这个不止能列出带 ruleTag 的吧

ListRule最终会走到下面的方法

func (r *Router) ListRule() []routing.Route {
	r.mu.Lock()
	defer r.mu.Unlock()
	ruleList := make([]routing.Route, 0)
	for _, rule := range r.rules {
		ruleList = append(ruleList, &Route{
			outboundTag: rule.Tag,
			ruleTag:     rule.RuleTag,
		})
	}
	return ruleList
}

type Route struct {
	routing.Context
	outboundGroupTags []string
	outboundTag       string
	ruleTag           string
}

如果需要获取其他的信息需要改动的地方比较多

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

我的意思是 ruleTag 为空的也会列出吧,看起来会

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

Long 也需要改为 List routing rules in Xray.,然后更新一下 #5569 (comment)

@IAMouMeng IAMouMeng changed the title Add grpc api ListRule() support List routing rules in Xray. Jan 23, 2026
@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

啊这,不是改 PR title,我是指 description

@IAMouMeng
Copy link
Contributor Author

啊这,不是改 PR title,我是指 description

哦不好意思我刚没太理解你说的long是什么意思哈哈

@RPRX RPRX changed the title List routing rules in Xray. API: Add ListRule() for routing Jan 23, 2026
@IAMouMeng
Copy link
Contributor Author

啊这,不是改 PR title,我是指 description

稍等 先别合并 我推错了个文件上去

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

尽快

@IAMouMeng
Copy link
Contributor Author

尽快

可以了

@RPRX RPRX merged commit 59dc2ce into XTLS:main Jan 23, 2026
@majorcheng
Copy link

默认只列了outboundTag, balancerTag是不是也考虑一下

@RPRX
Copy link
Member

RPRX commented Jan 23, 2026

默认只列了outboundTag, balancerTag是不是也考虑一下

这下以后稳定版本真的不想合 new feature 了

nebulabox added a commit to nebulabox/Xray-core that referenced this pull request Jan 28, 2026
* commit 'f6a7e939231e5ec6b167628bf730dc70a3c36707': (90 commits)
  VMess inbound: Optimize replay filter (XTLS#5562)
  Bump github.com/pires/go-proxyproto from 0.9.1 to 0.9.2 (XTLS#5614)
  TUN inbound: Add iOS support (XTLS#5612)
  Geodat: Reduce peak memory usage (XTLS#5581)
  Bump github.com/pires/go-proxyproto from 0.9.0 to 0.9.1 (XTLS#5608)
  Hysteria transport: Support range & random for `interval` in `udphop` as well (XTLS#5603)
  TUN inbound: Enhance Darwin interface support (XTLS#5598)
  XUDP client: Initialize Global ID's BaseKey correctly (XTLS#5602)
  TUN inbound: Disable RACK/TLP recovery to fix connection stalls (XTLS#5600)
  v26.1.23
  common/errors/feature_errors.go: Add PrintNonRemovalDeprecatedFeatureWarning() (XTLS#5567)
  API: Add ListRule() for routing (XTLS#5569)
  Log config: More flexible `maskAddress` (XTLS#5570)
  Bump github.com/miekg/dns from 1.1.70 to 1.1.72 (XTLS#5590)
  Bump github.com/cloudflare/circl from 1.6.2 to 1.6.3 (XTLS#5589)
  Hysteria transport: Fix speedtest issue (XTLS#5587)
  README.md: Add fancyss to Asuswrt-Merlin Clients
  Router: Fix panic in ProcessNameMatcher when source IPs are empty (XTLS#5574)
  README.md: Update links for PassWall & PassWall 2 (XTLS#5572)
  Tests: Reduce RAM usage (XTLS#5577)
  ...

# Conflicts:
#	core/core.go
@Meo597
Copy link
Collaborator

Meo597 commented Feb 2, 2026

@Fangliding 这个东西的场景是啥?

仅命令行控制
还是下游面板会把 xray 中一些代码当 lib 然后 rpc?
我能不能重构这块东西

@Fangliding
Copy link
Member

GRPC API啊 遵循proto文件就可以调用 核心给个命令只是快速调用

@Meo597
Copy link
Collaborator

Meo597 commented Feb 2, 2026

我看 addrule 是前年加的
我搞 break change 可以吗?

我想把两个 matcher 全部移到 common/geomatcher 里
这样 core 在 conf 阶段把 geosite:xxx geoip:xxx 原样传到 core
直接解决内存峰值问题

不想费劲再去兼容原来的,以前这个也不科学
因为需要 web 面板自己去读自己的 geodat

@Meo597
Copy link
Collaborator

Meo597 commented Feb 2, 2026

这样子重构后,还可以很方便地搞 geodat 热重载了

@Fangliding
Copy link
Member

我也觉得现在这样有点反人类 geocode进core是个好主意 就是会显得geodat格式有点小丑 如果能避免 #5505 这样的改动就太好了(aiya 已经合了 不会又revert吧)

@Meo597
Copy link
Collaborator

Meo597 commented Feb 2, 2026

我直接 revert 了才开始改的

大概是这样:

  1. conf/grpc 都是直传 str 到 core,接受 domain:xxxx geosite:xxx 所以配置文件一切不变,但 api 会 break
  2. core 里是单例的 mphmatcher (geoipmatcher 已经是单例的了)
  3. dns router (未来的 blockqtype65 啥的) 都可以用它,运行时内存就省下了
  4. mph 自己负责加载并解析 geosite: 这样几行代码就能热重载
  5. 为了兼容 dns 并且进一步加快 mph 的速度 mph 我改造成返回 codeids,这样路由不必遇到个规则就重复判断一次,直接 bitmask 就行

@Meo597
Copy link
Collaborator

Meo597 commented Feb 2, 2026

没什么问题的话暂时就这么干了,我感觉很科学
api 的问题等下游有反对的再看情况弄兼容层

@RPRX
Copy link
Member

RPRX commented Feb 2, 2026

我想把配置文件 proto 扔了,想把 gRPC 扔了改成 RESTful

@RPRX
Copy link
Member

RPRX commented Feb 2, 2026

v2ray 过度追求没用的设计模式,Xray 已经清掉很多了,不过这个 proto 是真的难搞

@IAMouMeng
Copy link
Contributor Author

IAMouMeng commented Feb 3, 2026 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

Comments