Update On Mon Oct 27 19:43:27 CET 2025

This commit is contained in:
github-action[bot]
2025-10-27 19:43:27 +01:00
parent 527412c703
commit 521877b2c5
49 changed files with 534 additions and 931 deletions
+1
View File
@@ -1163,3 +1163,4 @@ Update On Thu Oct 23 20:39:01 CEST 2025
Update On Fri Oct 24 20:39:40 CEST 2025
Update On Sat Oct 25 20:37:45 CEST 2025
Update On Sun Oct 26 19:35:56 CET 2025
Update On Mon Oct 27 19:43:18 CET 2025
+1 -1
View File
@@ -39,7 +39,7 @@ import (
"github.com/metacubex/mihomo/listener/inner"
"github.com/metacubex/mihomo/listener/tproxy"
"github.com/metacubex/mihomo/log"
"github.com/metacubex/mihomo/ntp"
"github.com/metacubex/mihomo/ntp/ntp"
"github.com/metacubex/mihomo/tunnel"
)
@@ -3,18 +3,18 @@ package ntp
import (
"context"
"sync"
"sync/atomic"
"time"
"github.com/metacubex/mihomo/component/dialer"
"github.com/metacubex/mihomo/component/proxydialer"
"github.com/metacubex/mihomo/log"
mihomoNtp "github.com/metacubex/mihomo/ntp"
M "github.com/metacubex/sing/common/metadata"
"github.com/metacubex/sing/common/ntp"
)
var globalSrv atomic.Pointer[Service]
var globalSrv *Service
var globalMu sync.Mutex
type Service struct {
@@ -23,21 +23,20 @@ type Service struct {
ticker *time.Ticker
ctx context.Context
cancel context.CancelFunc
offset atomic.Int64 // [time.Duration]
syncSystemTime bool
}
func ReCreateNTPService(server string, interval time.Duration, dialerProxy string, syncSystemTime bool) {
globalMu.Lock()
defer globalMu.Unlock()
if service := globalSrv.Swap(nil); service != nil {
service.Stop()
if globalSrv != nil {
globalSrv.Stop()
}
if server == "" || interval <= 0 {
return
}
ctx, cancel := context.WithCancel(context.Background())
service := &Service{
globalSrv = &Service{
server: M.ParseSocksaddr(server),
dialer: proxydialer.NewByNameSingDialer(dialerProxy, dialer.NewDialer()),
ticker: time.NewTicker(interval * time.Minute),
@@ -45,8 +44,7 @@ func ReCreateNTPService(server string, interval time.Duration, dialerProxy strin
cancel: cancel,
syncSystemTime: syncSystemTime,
}
service.Start()
globalSrv.Store(service)
globalSrv.Start()
}
func (srv *Service) Start() {
@@ -59,10 +57,6 @@ func (srv *Service) Stop() {
srv.cancel()
}
func (srv *Service) Offset() time.Duration {
return time.Duration(srv.offset.Load())
}
func (srv *Service) update() error {
var response *ntp.Response
var err error
@@ -80,7 +74,7 @@ func (srv *Service) update() error {
} else if offset < time.Duration(0) {
log.Infoln("System clock is behind NTP time by %s", -offset)
}
srv.offset.Store(int64(offset))
mihomoNtp.SetOffset(offset)
if srv.syncSystemTime {
timeNow := response.Time
syncErr := setSystemTime(timeNow)
@@ -97,7 +91,7 @@ func (srv *Service) update() error {
}
func (srv *Service) loopUpdate() {
defer srv.offset.Store(0)
defer mihomoNtp.SetOffset(0)
defer srv.ticker.Stop()
for {
err := srv.update()
@@ -111,13 +105,3 @@ func (srv *Service) loopUpdate() {
}
}
}
func Now() time.Time {
now := time.Now()
if service := globalSrv.Load(); service != nil {
if offset := service.Offset(); offset.Abs() > 0 {
now = now.Add(offset)
}
}
return now
}
+28
View File
@@ -0,0 +1,28 @@
// Package ntp provide time.Now
//
// DON'T import other package in mihomo to keep minimal internal dependencies
package ntp
import (
"time"
"sync/atomic"
)
var _offset atomic.Int64 // [time.Duration]
func SetOffset(offset time.Duration) {
_offset.Store(int64(offset))
}
func GetOffset() time.Duration {
return time.Duration(_offset.Load())
}
func Now() time.Time {
now := time.Now()
if offset := GetOffset(); offset != 0 {
now = now.Add(offset)
}
return now
}
+1 -1
View File
@@ -34,7 +34,7 @@ func ConvertToMrs(buf []byte, behavior P.RuleBehavior, format P.RuleFormat, w io
}
var encoder *zstd.Encoder
encoder, err = zstd.NewWriter(w, zstd.WithEncoderLevel(zstd.SpeedBestCompression))
encoder, err = zstd.NewWriter(w)
if err != nil {
return err
}
+86 -86
View File
@@ -365,7 +365,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -531,7 +531,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -566,7 +566,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -615,7 +615,7 @@ checksum = "99e1aca718ea7b89985790c94aad72d77533063fe00bc497bb79a7c2dae6a661"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -860,7 +860,7 @@ dependencies = [
"regex",
"rustc-hash 1.1.0",
"shlex",
"syn 2.0.107",
"syn 2.0.108",
"which 4.4.2",
]
@@ -1058,7 +1058,7 @@ checksum = "9fd3f870829131332587f607a7ff909f1af5fc523fd1b192db55fbbdf52e8d3c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"synstructure",
]
@@ -1196,7 +1196,7 @@ checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -1488,7 +1488,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -1722,7 +1722,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d"
dependencies = [
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2003,7 +2003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2013,7 +2013,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501"
dependencies = [
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2054,7 +2054,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2065,7 +2065,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2156,7 +2156,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2177,7 +2177,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2187,7 +2187,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2200,7 +2200,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustc_version",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2355,7 +2355,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2387,7 +2387,7 @@ checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2685,7 +2685,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2706,7 +2706,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2777,7 +2777,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -2898,7 +2898,7 @@ checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -3055,7 +3055,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -3205,7 +3205,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -3511,7 +3511,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -3773,7 +3773,7 @@ dependencies = [
"proc-macro-error",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -4302,7 +4302,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -4404,7 +4404,7 @@ dependencies = [
"proc-macro2",
"quote",
"sha2 0.10.9",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -4421,7 +4421,7 @@ dependencies = [
"serde",
"serde_json",
"sha2 0.10.9",
"syn 2.0.107",
"syn 2.0.108",
"url",
]
@@ -4519,7 +4519,7 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -5122,7 +5122,7 @@ checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -5632,7 +5632,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -5694,7 +5694,7 @@ dependencies = [
"proc-macro-crate 3.3.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -5763,7 +5763,7 @@ version = "0.1.0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -6419,7 +6419,7 @@ checksum = "05bbaa5b6b98826bb62b164406f703bee72c5287af9986f9c863fa8ea992b476"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -6461,7 +6461,7 @@ dependencies = [
"phf 0.13.1",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -6721,7 +6721,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -6869,7 +6869,7 @@ dependencies = [
"phf_shared 0.11.3",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"unicase",
]
@@ -6883,7 +6883,7 @@ dependencies = [
"phf_shared 0.13.1",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -6946,7 +6946,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -7124,7 +7124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -7187,9 +7187,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
[[package]]
name = "proc-macro2"
version = "1.0.101"
version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
@@ -7210,7 +7210,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b"
dependencies = [
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -7608,7 +7608,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -7817,7 +7817,7 @@ dependencies = [
"serde",
"serde_json",
"serde_yaml",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8025,7 +8025,7 @@ dependencies = [
"proc-macro2",
"quote",
"serde_derive_internals",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8169,7 +8169,7 @@ checksum = "d6185cf75117e20e62b1ff867b9518577271e58abe0037c40bb4794969355ab0"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8180,7 +8180,7 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8215,7 +8215,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8277,7 +8277,7 @@ dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8325,7 +8325,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8717,7 +8717,7 @@ dependencies = [
"Inflector",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8841,7 +8841,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -8884,9 +8884,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.107"
version = "2.0.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917"
dependencies = [
"proc-macro2",
"quote",
@@ -8910,7 +8910,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9032,7 +9032,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9152,7 +9152,7 @@ dependencies = [
"serde",
"serde_json",
"sha2 0.10.9",
"syn 2.0.107",
"syn 2.0.108",
"tauri-utils",
"thiserror 2.0.17",
"time",
@@ -9170,7 +9170,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"tauri-codegen",
"tauri-utils",
]
@@ -9476,7 +9476,7 @@ dependencies = [
"heck 0.5.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9645,7 +9645,7 @@ checksum = "451b374529930d7601b1eef8d32bc79ae870b6079b069401709c2a8bf9e75f36"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9691,7 +9691,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9702,7 +9702,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -9859,7 +9859,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -10082,7 +10082,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -10174,7 +10174,7 @@ version = "0.2.5"
source = "git+https://github.com/Frando/tracing-test.git?rev=e81ec65#e81ec655a5ec5c4351104628b1b1ba694f80a1dc"
dependencies = [
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -10680,7 +10680,7 @@ dependencies = [
"log",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"wasm-bindgen-shared",
]
@@ -10715,7 +10715,7 @@ checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -10997,7 +10997,7 @@ checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -11414,7 +11414,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -11425,7 +11425,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -11436,7 +11436,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -11447,7 +11447,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -12229,7 +12229,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"synstructure",
]
@@ -12241,7 +12241,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"synstructure",
]
@@ -12297,7 +12297,7 @@ checksum = "dc6821851fa840b708b4cbbaf6241868cabc85a2dc22f426361b0292bfc0b836"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"zbus-lockstep",
"zbus_xml",
"zvariant",
@@ -12312,7 +12312,7 @@ dependencies = [
"proc-macro-crate 3.3.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"zbus_names",
"zvariant",
"zvariant_utils",
@@ -12360,7 +12360,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -12380,7 +12380,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"synstructure",
]
@@ -12401,7 +12401,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -12445,7 +12445,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -12456,7 +12456,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
]
[[package]]
@@ -12601,7 +12601,7 @@ dependencies = [
"proc-macro-crate 3.3.0",
"proc-macro2",
"quote",
"syn 2.0.107",
"syn 2.0.108",
"zvariant_utils",
]
@@ -12614,6 +12614,6 @@ dependencies = [
"proc-macro2",
"quote",
"serde",
"syn 2.0.107",
"syn 2.0.108",
"winnow 0.7.13",
]
@@ -13,7 +13,7 @@
"dependencies": {
"@tanstack/react-query": "5.90.5",
"@tauri-apps/api": "2.8.0",
"ahooks": "3.9.5",
"ahooks": "3.9.6",
"dayjs": "1.11.18",
"lodash-es": "4.17.21",
"ofetch": "1.4.1",
@@ -26,7 +26,7 @@
"@tanstack/router-zod-adapter": "1.81.5",
"@tauri-apps/api": "2.8.0",
"@types/json-schema": "7.0.15",
"ahooks": "3.9.5",
"ahooks": "3.9.6",
"allotment": "1.20.4",
"country-code-emoji": "2.3.0",
"country-emoji": "1.5.6",
@@ -59,9 +59,9 @@
"@iconify/json": "2.2.400",
"@monaco-editor/react": "4.7.0",
"@tanstack/react-query": "5.90.5",
"@tanstack/react-router": "1.133.13",
"@tanstack/react-router-devtools": "1.133.13",
"@tanstack/router-plugin": "1.133.13",
"@tanstack/react-router": "1.133.32",
"@tanstack/react-router-devtools": "1.133.32",
"@tanstack/router-plugin": "1.133.32",
"@tauri-apps/plugin-clipboard-manager": "2.3.0",
"@tauri-apps/plugin-dialog": "2.4.0",
"@tauri-apps/plugin-fs": "2.4.2",
+1 -1
View File
@@ -21,7 +21,7 @@
"@types/d3": "7.4.3",
"@types/react": "19.2.2",
"@vitejs/plugin-react": "5.0.4",
"ahooks": "3.9.5",
"ahooks": "3.9.6",
"d3": "7.9.0",
"framer-motion": "12.23.24",
"react": "19.2.0",
+2 -2
View File
@@ -2,7 +2,7 @@
"manifest_version": 1,
"latest": {
"mihomo": "v1.19.15",
"mihomo_alpha": "alpha-90f47a6",
"mihomo_alpha": "alpha-9ed9c3d",
"clash_rs": "v0.9.1",
"clash_premium": "2023-09-05-gdcc8d87",
"clash_rs_alpha": "0.9.1-alpha+sha.fc9ebc5"
@@ -69,5 +69,5 @@
"linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf"
}
},
"updated_at": "2025-10-25T22:20:57.739Z"
"updated_at": "2025-10-26T22:21:09.443Z"
}
+65 -72
View File
@@ -185,8 +185,8 @@ importers:
specifier: 2.8.0
version: 2.8.0
ahooks:
specifier: 3.9.5
version: 3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
specifier: 3.9.6
version: 3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
dayjs:
specifier: 1.11.18
version: 1.11.18
@@ -253,7 +253,7 @@ importers:
version: 4.1.14
'@tanstack/router-zod-adapter':
specifier: 1.81.5
version: 1.81.5(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)
version: 1.81.5(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)
'@tauri-apps/api':
specifier: 2.8.0
version: 2.8.0
@@ -261,8 +261,8 @@ importers:
specifier: 7.0.15
version: 7.0.15
ahooks:
specifier: 3.9.5
version: 3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
specifier: 3.9.6
version: 3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
allotment:
specifier: 1.20.4
version: 1.20.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
@@ -355,14 +355,14 @@ importers:
specifier: 5.90.5
version: 5.90.5(react@19.2.0)
'@tanstack/react-router':
specifier: 1.133.13
version: 1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
specifier: 1.133.32
version: 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/react-router-devtools':
specifier: 1.133.13
version: 1.133.13(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.13)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)
specifier: 1.133.32
version: 1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)
'@tanstack/router-plugin':
specifier: 1.133.13
version: 1.133.13(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))
specifier: 1.133.32
version: 1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))
'@tauri-apps/plugin-clipboard-manager':
specifier: 2.3.0
version: 2.3.0
@@ -493,8 +493,8 @@ importers:
specifier: 5.0.4
version: 5.0.4(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))
ahooks:
specifier: 3.9.5
version: 3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
specifier: 3.9.6
version: 3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
d3:
specifier: 7.9.0
version: 7.9.0
@@ -1304,10 +1304,6 @@ packages:
resolution: {integrity: sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==}
engines: {node: '>=6.9.0'}
'@babel/runtime@7.28.2':
resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==}
engines: {node: '>=6.9.0'}
'@babel/runtime@7.28.3':
resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==}
engines: {node: '>=6.9.0'}
@@ -3092,8 +3088,8 @@ packages:
'@tailwindcss/postcss@4.1.14':
resolution: {integrity: sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg==}
'@tanstack/history@1.133.3':
resolution: {integrity: sha512-zFQnGdX0S4g5xRuS+95iiEXM+qlGvYG7ksmOKx7LaMv60lDWa0imR8/24WwXXvBWJT1KnwVdZcjvhCwz9IiJCw==}
'@tanstack/history@1.133.28':
resolution: {integrity: sha512-B7+x7eP2FFvi3fgd3rNH9o/Eixt+pp0zCIdGhnQbAJjFrlwIKGjGnwyJjhWJ5fMQlGks/E2LdDTqEV4W9Plx7g==}
engines: {node: '>=12'}
'@tanstack/match-sorter-utils@8.19.4':
@@ -3108,16 +3104,16 @@ packages:
peerDependencies:
react: ^18 || ^19
'@tanstack/react-router-devtools@1.133.13':
resolution: {integrity: sha512-Bc7jap95WD32U0KSuPDZOehujwycNE8cUoroQ8/A2FIugTV6msxW7/fm1Dny7MzVv2lc8VgRIykFGt1vveZgVA==}
'@tanstack/react-router-devtools@1.133.32':
resolution: {integrity: sha512-dd0PzcAjzaDY9rPq9zoiItit3PKDVAekLgMLtNyXneyYrTXqPDSZwSge/l+cB0V1QcuAq6w+qx3LyFd3+zK40g==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/react-router': ^1.133.13
'@tanstack/react-router': ^1.133.32
react: '>=18.0.0 || >=19.0.0'
react-dom: '>=18.0.0 || >=19.0.0'
'@tanstack/react-router@1.133.13':
resolution: {integrity: sha512-mVAj70mPOH/a60Hjlha3gHEWLFuE4kHeKau/AL5Xp6e5GtNk1JTRwN4sJ9QlSyLcClOUUtGfED1FoLj0D2W0Eg==}
'@tanstack/react-router@1.133.32':
resolution: {integrity: sha512-UqakhaFJ+r5S+b4/AvLux70Hk+1MpmwfKwbdV7vuM2bVRUSztM8xtcttVpzZwRV45Ls8YsStY58prEVdCpvkNg==}
engines: {node: '>=12'}
peerDependencies:
react: '>=18.0.0 || >=19.0.0'
@@ -3142,15 +3138,15 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
'@tanstack/router-core@1.133.13':
resolution: {integrity: sha512-zZptdlS/wSkqozb07Y3zX5gas2OapJdjEG6/Id0e/twNefVdR4EY2TK/mgvyhHtKIpCxIcnZz/3opypgeQi9bg==}
'@tanstack/router-core@1.133.28':
resolution: {integrity: sha512-HErb1X9F+u4VzguJKafX1p5fSnNnfo7aK8Xxh5cICFMShPBxt9i1K45nUbQaRkf45N1tg4gJ3l8mlmwWRm9WWA==}
engines: {node: '>=12'}
'@tanstack/router-devtools-core@1.133.13':
resolution: {integrity: sha512-NyXZws0sVeB6+410fa2fopitFAbEqKMhGZw1ojI4bp3DyVwL6l9cnIRHw6qew3gRUVa3SBn00puJ++LfZSYc7w==}
'@tanstack/router-devtools-core@1.133.28':
resolution: {integrity: sha512-V4wwfVV9dGJ+OoEkAvVF6LWyST+s6MMSt+N73453lNbIbzQrODu5xdVr5svnzsuH3Kt5Fms5dMBlvb77gRcn4w==}
engines: {node: '>=12'}
peerDependencies:
'@tanstack/router-core': ^1.133.13
'@tanstack/router-core': ^1.133.28
csstype: ^3.0.10
solid-js: '>=1.9.5'
tiny-invariant: ^1.3.3
@@ -3158,18 +3154,18 @@ packages:
csstype:
optional: true
'@tanstack/router-generator@1.133.13':
resolution: {integrity: sha512-W5locmcYSz0dY+KEOIFijUeOdQEzjCxY+uT9ExY/YeQcOBcBFIk9/UnBkE6wRLCPOBb1gfURjPNc9rI93HGrOA==}
'@tanstack/router-generator@1.133.29':
resolution: {integrity: sha512-Nngp1i7ch22qqLkjsQwoyos8mawL5bG2GjHg8IMOzFbMR+dVQfh9gSkpkhUbLMv8TMb8Na31tyR0/tDr+E/NCA==}
engines: {node: '>=12'}
'@tanstack/router-plugin@1.133.13':
resolution: {integrity: sha512-R5cbCwdw5chQhgaVERE2JlPpGWcER4FuVkRGDbLaW/rpawIskJCjkAbhqyfgXPF8VsEUOs9+7FK6ocODnqM/qA==}
'@tanstack/router-plugin@1.133.32':
resolution: {integrity: sha512-4YtRrGs5nq/sZmwwT/jmS1LiucEevsWjxzTEilHRBtjeMgFbrhnQ7jBHHRPym71C40W/9tEgzcQS3dGq5LC5+g==}
engines: {node: '>=12'}
peerDependencies:
'@rsbuild/core': '>=1.0.2'
'@tanstack/react-router': ^1.133.13
'@tanstack/react-router': ^1.133.32
vite: '>=5.0.0 || >=6.0.0 || >=7.0.0'
vite-plugin-solid: ^2.11.8
vite-plugin-solid: ^2.11.10
webpack: '>=5.92.0'
peerDependenciesMeta:
'@rsbuild/core':
@@ -3183,8 +3179,8 @@ packages:
webpack:
optional: true
'@tanstack/router-utils@1.133.3':
resolution: {integrity: sha512-miPFlt0aG6ID5VDolYuRXgLS7cofvbZGMvHwf2Wmyxjo6GLp/kxxpkQrfM4T1I5cwjwYZZAQmdUKbVHwFZz9sQ==}
'@tanstack/router-utils@1.133.19':
resolution: {integrity: sha512-WEp5D2gPxvlLDRXwD/fV7RXjYtqaqJNXKB/L6OyZEbT+9BG/Ib2d7oG9GSUZNNMGPGYAlhBUOi3xutySsk6rxA==}
engines: {node: '>=12'}
'@tanstack/router-zod-adapter@1.81.5':
@@ -3204,8 +3200,8 @@ packages:
'@tanstack/virtual-core@3.13.9':
resolution: {integrity: sha512-3jztt0jpaoJO5TARe2WIHC1UQC3VMLAFUW5mmMo0yrkwtDB2AQP0+sh10BVUpWrnvHjSLvzFizydtEGLCJKFoQ==}
'@tanstack/virtual-file-routes@1.133.3':
resolution: {integrity: sha512-6d2AP9hAjEi8mcIew2RkxBX+wClH1xedhfaYhs8fUiX+V2Cedk7RBD9E9ww2z6BGUYD8Es4fS0OIrzXZWHKGhw==}
'@tanstack/virtual-file-routes@1.133.19':
resolution: {integrity: sha512-IKwZENsK7owmW1Lm5FhuHegY/SyQ8KqtL/7mTSnzoKJgfzhrrf9qwKB1rmkKkt+svUuy/Zw3uVEpZtUzQruWtA==}
engines: {node: '>=12'}
'@taplo/core@0.2.0':
@@ -3831,9 +3827,8 @@ packages:
resolution: {integrity: sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==}
engines: {node: '>=12.0'}
ahooks@3.9.5:
resolution: {integrity: sha512-TrjXie49Q8HuHKTa84Fm9A+famMDAG1+7a9S9Gq6RQ0h90Jgqmiq3CkObuRjWT/C4d6nRZCw35Y2k2fmybb5eA==}
engines: {node: '>=18'}
ahooks@3.9.6:
resolution: {integrity: sha512-Mr7f05swd5SmKlR9SZo5U6M0LsL4ErweLzpdgXjA1JPmnZ78Vr6wzx0jUtvoxrcqGKYnX0Yjc02iEASVxHFPjQ==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -9716,8 +9711,6 @@ snapshots:
'@babel/runtime@7.27.6': {}
'@babel/runtime@7.28.2': {}
'@babel/runtime@7.28.3': {}
'@babel/runtime@7.28.4': {}
@@ -11434,7 +11427,7 @@ snapshots:
postcss: 8.5.6
tailwindcss: 4.1.14
'@tanstack/history@1.133.3': {}
'@tanstack/history@1.133.28': {}
'@tanstack/match-sorter-utils@8.19.4':
dependencies:
@@ -11447,10 +11440,10 @@ snapshots:
'@tanstack/query-core': 5.90.5
react: 19.2.0
'@tanstack/react-router-devtools@1.133.13(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.13)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)':
'@tanstack/react-router-devtools@1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)':
dependencies:
'@tanstack/react-router': 1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/router-devtools-core': 1.133.13(@tanstack/router-core@1.133.13)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)
'@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/router-devtools-core': 1.133.28(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
vite: 7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -11471,11 +11464,11 @@ snapshots:
- tsx
- yaml
'@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
'@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)':
dependencies:
'@tanstack/history': 1.133.3
'@tanstack/history': 1.133.28
'@tanstack/react-store': 0.7.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/router-core': 1.133.13
'@tanstack/router-core': 1.133.28
isbot: 5.1.28
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
@@ -11501,9 +11494,9 @@ snapshots:
react: 19.2.0
react-dom: 19.2.0(react@19.2.0)
'@tanstack/router-core@1.133.13':
'@tanstack/router-core@1.133.28':
dependencies:
'@tanstack/history': 1.133.3
'@tanstack/history': 1.133.28
'@tanstack/store': 0.7.0
cookie-es: 2.0.0
seroval: 1.3.2
@@ -11511,9 +11504,9 @@ snapshots:
tiny-invariant: 1.3.3
tiny-warning: 1.0.3
'@tanstack/router-devtools-core@1.133.13(@tanstack/router-core@1.133.13)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)':
'@tanstack/router-devtools-core@1.133.28(@tanstack/router-core@1.133.28)(@types/node@24.8.1)(csstype@3.1.3)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(solid-js@1.9.5)(stylus@0.62.0)(terser@5.36.0)(tiny-invariant@1.3.3)(tsx@4.20.6)(yaml@2.8.1)':
dependencies:
'@tanstack/router-core': 1.133.13
'@tanstack/router-core': 1.133.28
clsx: 2.1.1
goober: 2.1.16(csstype@3.1.3)
solid-js: 1.9.5
@@ -11534,11 +11527,11 @@ snapshots:
- tsx
- yaml
'@tanstack/router-generator@1.133.13':
'@tanstack/router-generator@1.133.29':
dependencies:
'@tanstack/router-core': 1.133.13
'@tanstack/router-utils': 1.133.3
'@tanstack/virtual-file-routes': 1.133.3
'@tanstack/router-core': 1.133.28
'@tanstack/router-utils': 1.133.19
'@tanstack/virtual-file-routes': 1.133.19
prettier: 3.6.2
recast: 0.23.11
source-map: 0.7.4
@@ -11547,7 +11540,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-plugin@1.133.13(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))':
'@tanstack/router-plugin@1.133.32(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1))':
dependencies:
'@babel/core': 7.28.4
'@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4)
@@ -11555,21 +11548,21 @@ snapshots:
'@babel/template': 7.27.2
'@babel/traverse': 7.28.4
'@babel/types': 7.28.4
'@tanstack/router-core': 1.133.13
'@tanstack/router-generator': 1.133.13
'@tanstack/router-utils': 1.133.3
'@tanstack/virtual-file-routes': 1.133.3
'@tanstack/router-core': 1.133.28
'@tanstack/router-generator': 1.133.29
'@tanstack/router-utils': 1.133.19
'@tanstack/virtual-file-routes': 1.133.19
babel-dead-code-elimination: 1.0.10
chokidar: 3.6.0
unplugin: 2.3.10
zod: 3.25.76
optionalDependencies:
'@tanstack/react-router': 1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
vite: 7.1.10(@types/node@24.8.1)(jiti@2.6.0)(less@4.2.0)(lightningcss@1.30.1)(sass-embedded@1.93.2)(sass@1.93.2)(stylus@0.62.0)(terser@5.36.0)(tsx@4.20.6)(yaml@2.8.1)
transitivePeerDependencies:
- supports-color
'@tanstack/router-utils@1.133.3':
'@tanstack/router-utils@1.133.19':
dependencies:
'@babel/core': 7.28.4
'@babel/generator': 7.28.3
@@ -11582,9 +11575,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)':
'@tanstack/router-zod-adapter@1.81.5(@tanstack/react-router@1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(zod@4.1.12)':
dependencies:
'@tanstack/react-router': 1.133.13(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
'@tanstack/react-router': 1.133.32(react-dom@19.2.0(react@19.2.0))(react@19.2.0)
zod: 4.1.12
'@tanstack/store@0.7.0': {}
@@ -11593,7 +11586,7 @@ snapshots:
'@tanstack/virtual-core@3.13.9': {}
'@tanstack/virtual-file-routes@1.133.3': {}
'@tanstack/virtual-file-routes@1.133.19': {}
'@taplo/core@0.2.0': {}
@@ -12283,9 +12276,9 @@ snapshots:
adm-zip@0.5.16: {}
ahooks@3.9.5(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
ahooks@3.9.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0):
dependencies:
'@babel/runtime': 7.28.2
'@babel/runtime': 7.28.4
'@types/js-cookie': 3.0.6
dayjs: 1.11.18
intersection-observer: 0.12.2
@@ -12524,7 +12517,7 @@ snapshots:
babel-plugin-macros@3.1.0:
dependencies:
'@babel/runtime': 7.28.2
'@babel/runtime': 7.28.4
cosmiconfig: 7.1.0
resolve: 1.22.8
@@ -1,67 +0,0 @@
From d64c732dfc9edcd57feb693c23162117737e426b Mon Sep 17 00:00:00 2001
From: Philipp Zabel <p.zabel@pengutronix.de>
Date: Mon, 2 Jan 2023 18:29:34 +0100
Subject: [PATCH] net: rfkill: gpio: add DT support
Allow probing rfkill-gpio via device tree. This hooks up the already
existing support that was started in commit 262c91ee5e52 ("net:
rfkill: gpio: prepare for DT and ACPI support") via the "rfkill-gpio"
compatible, with the "name" and "type" properties renamed to "label"
and "radio-type", respectively, in the device tree case.
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Link: https://lore.kernel.org/r/20230102-rfkill-gpio-dt-v2-2-d1b83758c16d@pengutronix.de
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
net/rfkill/rfkill-gpio.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
--- a/net/rfkill/rfkill-gpio.c
+++ b/net/rfkill/rfkill-gpio.c
@@ -79,6 +79,8 @@ static int rfkill_gpio_probe(struct plat
{
struct rfkill_gpio_data *rfkill;
struct gpio_desc *gpio;
+ const char *name_property;
+ const char *type_property;
const char *type_name;
int ret;
@@ -86,8 +88,15 @@ static int rfkill_gpio_probe(struct plat
if (!rfkill)
return -ENOMEM;
- device_property_read_string(&pdev->dev, "name", &rfkill->name);
- device_property_read_string(&pdev->dev, "type", &type_name);
+ if (dev_of_node(&pdev->dev)) {
+ name_property = "label";
+ type_property = "radio-type";
+ } else {
+ name_property = "name";
+ type_property = "type";
+ }
+ device_property_read_string(&pdev->dev, name_property, &rfkill->name);
+ device_property_read_string(&pdev->dev, type_property, &type_name);
if (!rfkill->name)
rfkill->name = dev_name(&pdev->dev);
@@ -169,12 +178,19 @@ static const struct acpi_device_id rfkil
MODULE_DEVICE_TABLE(acpi, rfkill_acpi_match);
#endif
+static const struct of_device_id rfkill_of_match[] __maybe_unused = {
+ { .compatible = "rfkill-gpio", },
+ { },
+};
+MODULE_DEVICE_TABLE(of, rfkill_of_match);
+
static struct platform_driver rfkill_gpio_driver = {
.probe = rfkill_gpio_probe,
.remove = rfkill_gpio_remove,
.driver = {
.name = "rfkill_gpio",
.acpi_match_table = ACPI_PTR(rfkill_acpi_match),
+ .of_match_table = of_match_ptr(rfkill_of_match),
},
};
@@ -1,10 +0,0 @@
--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi
@@ -514,6 +514,7 @@
num-lanes = <2>;
vpcie0v9-supply = <&vcca0v9_s3>;
vpcie1v8-supply = <&vcca1v8_s3>;
+ bus-scan-delay-ms = <1000>;
status = "okay";
};
@@ -1,96 +0,0 @@
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4967,6 +4967,14 @@
nomsi Do not use MSI for native PCIe PME signaling (this makes
all PCIe root ports use INTx for all services).
+ pcie_rockchip_host.bus_scan_delay= [PCIE] Delay in ms before
+ scanning PCIe bus in Rockchip PCIe host driver. Some PCIe
+ cards seem to need delays that can be several hundred ms.
+ If set to greater than or equal to 0 this parameter will
+ override delay that can be set in device tree.
+ Values less than 0 mean that this parameter is ignored.
+ default=-1
+
pcmv= [HW,PCMCIA] BadgePAD 4
pd_ignore_unused
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -32,10 +32,14 @@
#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/regmap.h>
+#include <linux/moduleparam.h>
#include "../pci.h"
#include "pcie-rockchip.h"
+static int bus_scan_delay = -1;
+module_param_named(bus_scan_delay, bus_scan_delay, int, S_IRUGO);
+
static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip)
{
u32 status;
@@ -933,6 +937,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct pci_host_bridge *bridge;
int err;
+ u32 delay = 0;
if (!dev->of_node)
return -ENODEV;
@@ -982,6 +987,26 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
bridge->sysdata = rockchip;
bridge->ops = &rockchip_pcie_ops;
+ /* Checking if bus scan delay was given from command line and prefer
+ * that over the value in device tree (which defaults to 0 if not set).
+ */
+ if (bus_scan_delay >= 0) {
+ delay = bus_scan_delay;
+ dev_info(dev, "wait %u ms (from command-line) before bus scan\n", delay);
+ } else {
+ delay = rockchip->bus_scan_delay;
+ dev_info(dev, "wait %u ms (from device tree) before bus scan\n", delay);
+ }
+ /* Workaround for some devices crashing on pci_host_probe / pci_scan_root_bus_bridge
+ * calls: sleep a bit before bus scan. Call trace gets to rockchip_pcie_rd_conf when
+ * trying to read vendor id (pci_bus_generic_read_dev_vendor_id is in call stack)
+ * before panicing. I have no idea why this works or what causes the panic. I just
+ * found this hack by luck when trying to "make it break differently if possible".
+ */
+ if (delay > 0) {
+ msleep(delay);
+ }
+
err = rockchip_pcie_setup_irq(rockchip);
if (err)
goto err_remove_irq_domain;
--- a/drivers/pci/controller/pcie-rockchip.c
+++ b/drivers/pci/controller/pcie-rockchip.c
@@ -102,6 +102,12 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
return dev_err_probe(dev, rockchip->num_clks,
"failed to get clocks\n");
+ err = of_property_read_u32(node, "bus-scan-delay-ms", &rockchip->bus_scan_delay);
+ if (err) {
+ dev_info(dev, "no bus scan delay, default to 0 ms\n");
+ rockchip->bus_scan_delay = 0;
+ }
+
return 0;
}
EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt);
--- a/drivers/pci/controller/pcie-rockchip.h
+++ b/drivers/pci/controller/pcie-rockchip.h
@@ -351,6 +351,8 @@ struct rockchip_pcie {
phys_addr_t msg_bus_addr;
bool is_rc;
struct resource *mem_res;
+ /* Bus scan delay is a workaround for some pcie devices causing crashes */
+ u32 bus_scan_delay;
};
static u32 rockchip_pcie_read(struct rockchip_pcie *rockchip, u32 reg)
@@ -1,10 +0,0 @@
--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi
@@ -514,6 +514,7 @@
num-lanes = <2>;
vpcie0v9-supply = <&vcca0v9_s3>;
vpcie1v8-supply = <&vcca1v8_s3>;
+ bus-scan-delay-ms = <1000>;
status = "okay";
};
@@ -1,96 +0,0 @@
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4967,6 +4967,14 @@
nomsi Do not use MSI for native PCIe PME signaling (this makes
all PCIe root ports use INTx for all services).
+ pcie_rockchip_host.bus_scan_delay= [PCIE] Delay in ms before
+ scanning PCIe bus in Rockchip PCIe host driver. Some PCIe
+ cards seem to need delays that can be several hundred ms.
+ If set to greater than or equal to 0 this parameter will
+ override delay that can be set in device tree.
+ Values less than 0 mean that this parameter is ignored.
+ default=-1
+
pcmv= [HW,PCMCIA] BadgePAD 4
pd_ignore_unused
--- a/drivers/pci/controller/pcie-rockchip-host.c
+++ b/drivers/pci/controller/pcie-rockchip-host.c
@@ -32,10 +32,14 @@
#include <linux/platform_device.h>
#include <linux/reset.h>
#include <linux/regmap.h>
+#include <linux/moduleparam.h>
#include "../pci.h"
#include "pcie-rockchip.h"
+static int bus_scan_delay = -1;
+module_param_named(bus_scan_delay, bus_scan_delay, int, S_IRUGO);
+
static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip)
{
u32 status;
@@ -933,6 +937,7 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct pci_host_bridge *bridge;
int err;
+ u32 delay = 0;
if (!dev->of_node)
return -ENODEV;
@@ -982,6 +987,26 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
bridge->sysdata = rockchip;
bridge->ops = &rockchip_pcie_ops;
+ /* Checking if bus scan delay was given from command line and prefer
+ * that over the value in device tree (which defaults to 0 if not set).
+ */
+ if (bus_scan_delay >= 0) {
+ delay = bus_scan_delay;
+ dev_info(dev, "wait %u ms (from command-line) before bus scan\n", delay);
+ } else {
+ delay = rockchip->bus_scan_delay;
+ dev_info(dev, "wait %u ms (from device tree) before bus scan\n", delay);
+ }
+ /* Workaround for some devices crashing on pci_host_probe / pci_scan_root_bus_bridge
+ * calls: sleep a bit before bus scan. Call trace gets to rockchip_pcie_rd_conf when
+ * trying to read vendor id (pci_bus_generic_read_dev_vendor_id is in call stack)
+ * before panicing. I have no idea why this works or what causes the panic. I just
+ * found this hack by luck when trying to "make it break differently if possible".
+ */
+ if (delay > 0) {
+ msleep(delay);
+ }
+
err = rockchip_pcie_setup_irq(rockchip);
if (err)
goto err_remove_irq_domain;
--- a/drivers/pci/controller/pcie-rockchip.c
+++ b/drivers/pci/controller/pcie-rockchip.c
@@ -102,6 +102,12 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
return dev_err_probe(dev, rockchip->num_clks,
"failed to get clocks\n");
+ err = of_property_read_u32(node, "bus-scan-delay-ms", &rockchip->bus_scan_delay);
+ if (err) {
+ dev_info(dev, "no bus scan delay, default to 0 ms\n");
+ rockchip->bus_scan_delay = 0;
+ }
+
return 0;
}
EXPORT_SYMBOL_GPL(rockchip_pcie_parse_dt);
--- a/drivers/pci/controller/pcie-rockchip.h
+++ b/drivers/pci/controller/pcie-rockchip.h
@@ -351,6 +351,8 @@ struct rockchip_pcie {
phys_addr_t msg_bus_addr;
bool is_rc;
struct resource *mem_res;
+ /* Bus scan delay is a workaround for some pcie devices causing crashes */
+ u32 bus_scan_delay;
};
static u32 rockchip_pcie_read(struct rockchip_pcie *rockchip, u32 reg)
+170 -163
View File
@@ -34,6 +34,11 @@ PROJECT_NAME=$(shell basename "${ROOT}")
# Use `tools/bump_version.sh` script to change all those files at one shot.
VERSION="3.21.0"
# With .ONESHELL, each recipe is executed in a single shell instance.
# This allows `cd` to affect subsequent commands in the same recipe.
# .ONESHELL is supported in GNU Make version 3.82 and later.
.ONESHELL:
# Build binaries and installation packages.
.PHONY: build
build: bin deb rpm
@@ -82,16 +87,15 @@ client-android: client-android-arm64
# Build Android arm64 client.
.PHONY: client-android-arm64
client-android-arm64:
if [ ! -z $$(command -v gcc) ]; then\
mkdir -p release/android/arm64;\
env GOOS=android GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/android/arm64/mieru cmd/mieru/mieru.go;\
cd release/android/arm64;\
sha256sum mieru > mieru_${VERSION}_android_arm64.sha256.txt;\
tar -zcvf mieru_${VERSION}_android_arm64.tar.gz mieru;\
sha256sum mieru_${VERSION}_android_arm64.tar.gz > mieru_${VERSION}_android_arm64.tar.gz.sha256.txt;\
cd "${ROOT}";\
mv release/android/arm64/mieru_${VERSION}_android_arm64.tar.gz release/;\
mv release/android/arm64/mieru_${VERSION}_android_arm64.tar.gz.sha256.txt release/;\
if [ ! -z $$(command -v gcc) ]; then
mkdir -p release/android/arm64
env GOOS=android GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/android/arm64/mieru cmd/mieru/mieru.go
cd release/android/arm64
sha256sum mieru > mieru_${VERSION}_android_arm64.sha256.txt
tar -zcvf mieru_${VERSION}_android_arm64.tar.gz mieru
sha256sum mieru_${VERSION}_android_arm64.tar.gz > mieru_${VERSION}_android_arm64.tar.gz.sha256.txt
mv mieru_${VERSION}_android_arm64.tar.gz ../../
mv mieru_${VERSION}_android_arm64.tar.gz.sha256.txt ../../
fi
# Build linux clients.
@@ -103,48 +107,48 @@ client-linux: client-linux-amd64 client-linux-arm64 client-linux-armv7 client-li
client-linux-amd64:
mkdir -p release/linux/amd64
env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/amd64/mieru cmd/mieru/mieru.go
cd release/linux/amd64;\
sha256sum mieru > mieru_${VERSION}_linux_amd64.sha256.txt;\
tar -zcvf mieru_${VERSION}_linux_amd64.tar.gz mieru;\
sha256sum mieru_${VERSION}_linux_amd64.tar.gz > mieru_${VERSION}_linux_amd64.tar.gz.sha256.txt
mv release/linux/amd64/mieru_${VERSION}_linux_amd64.tar.gz release/
mv release/linux/amd64/mieru_${VERSION}_linux_amd64.tar.gz.sha256.txt release/
cd release/linux/amd64
sha256sum mieru > mieru_${VERSION}_linux_amd64.sha256.txt
tar -zcvf mieru_${VERSION}_linux_amd64.tar.gz mieru
sha256sum mieru_${VERSION}_linux_amd64.tar.gz > mieru_${VERSION}_linux_amd64.tar.gz.sha256.txt
mv mieru_${VERSION}_linux_amd64.tar.gz ../../
mv mieru_${VERSION}_linux_amd64.tar.gz.sha256.txt ../../
# Build linux arm64 client.
.PHONY: client-linux-arm64
client-linux-arm64:
mkdir -p release/linux/arm64
env GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/arm64/mieru cmd/mieru/mieru.go
cd release/linux/arm64;\
sha256sum mieru > mieru_${VERSION}_linux_arm64.sha256.txt;\
tar -zcvf mieru_${VERSION}_linux_arm64.tar.gz mieru;\
sha256sum mieru_${VERSION}_linux_arm64.tar.gz > mieru_${VERSION}_linux_arm64.tar.gz.sha256.txt
mv release/linux/arm64/mieru_${VERSION}_linux_arm64.tar.gz release/
mv release/linux/arm64/mieru_${VERSION}_linux_arm64.tar.gz.sha256.txt release/
cd release/linux/arm64
sha256sum mieru > mieru_${VERSION}_linux_arm64.sha256.txt
tar -zcvf mieru_${VERSION}_linux_arm64.tar.gz mieru
sha256sum mieru_${VERSION}_linux_arm64.tar.gz > mieru_${VERSION}_linux_arm64.tar.gz.sha256.txt
mv mieru_${VERSION}_linux_arm64.tar.gz ../../
mv mieru_${VERSION}_linux_arm64.tar.gz.sha256.txt ../../
# Build linux armv7 client.
.PHONY: client-linux-armv7
client-linux-armv7:
mkdir -p release/linux/armv7
env GOOS=linux GOARCH=arm GOARM=7 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/armv7/mieru cmd/mieru/mieru.go
cd release/linux/armv7;\
sha256sum mieru > mieru_${VERSION}_linux_armv7.sha256.txt;\
tar -zcvf mieru_${VERSION}_linux_armv7.tar.gz mieru;\
sha256sum mieru_${VERSION}_linux_armv7.tar.gz > mieru_${VERSION}_linux_armv7.tar.gz.sha256.txt
mv release/linux/armv7/mieru_${VERSION}_linux_armv7.tar.gz release/
mv release/linux/armv7/mieru_${VERSION}_linux_armv7.tar.gz.sha256.txt release/
cd release/linux/armv7
sha256sum mieru > mieru_${VERSION}_linux_armv7.sha256.txt
tar -zcvf mieru_${VERSION}_linux_armv7.tar.gz mieru
sha256sum mieru_${VERSION}_linux_armv7.tar.gz > mieru_${VERSION}_linux_armv7.tar.gz.sha256.txt
mv mieru_${VERSION}_linux_armv7.tar.gz ../../
mv mieru_${VERSION}_linux_armv7.tar.gz.sha256.txt ../../
# Build linux riscv64 client.
.PHONY: client-linux-riscv64
client-linux-riscv64:
mkdir -p release/linux/riscv64
env GOOS=linux GOARCH=riscv64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/riscv64/mieru cmd/mieru/mieru.go
cd release/linux/riscv64;\
sha256sum mieru > mieru_${VERSION}_linux_riscv64.sha256.txt;\
tar -zcvf mieru_${VERSION}_linux_riscv64.tar.gz mieru;\
sha256sum mieru_${VERSION}_linux_riscv64.tar.gz > mieru_${VERSION}_linux_riscv64.tar.gz.sha256.txt
mv release/linux/riscv64/mieru_${VERSION}_linux_riscv64.tar.gz release/
mv release/linux/riscv64/mieru_${VERSION}_linux_riscv64.tar.gz.sha256.txt release/
cd release/linux/riscv64
sha256sum mieru > mieru_${VERSION}_linux_riscv64.sha256.txt
tar -zcvf mieru_${VERSION}_linux_riscv64.tar.gz mieru
sha256sum mieru_${VERSION}_linux_riscv64.tar.gz > mieru_${VERSION}_linux_riscv64.tar.gz.sha256.txt
mv mieru_${VERSION}_linux_riscv64.tar.gz ../../
mv mieru_${VERSION}_linux_riscv64.tar.gz.sha256.txt ../../
# Build MacOS clients.
.PHONY: client-mac
@@ -155,24 +159,24 @@ client-mac: client-mac-amd64 client-mac-arm64
client-mac-amd64:
mkdir -p release/macos/amd64
env GOOS=darwin GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/macos/amd64/mieru cmd/mieru/mieru.go
cd release/macos/amd64;\
sha256sum mieru > mieru_${VERSION}_macos_amd64.sha256.txt;\
tar -zcvf mieru_${VERSION}_macos_amd64.tar.gz mieru;\
sha256sum mieru_${VERSION}_macos_amd64.tar.gz > mieru_${VERSION}_macos_amd64.tar.gz.sha256.txt
mv release/macos/amd64/mieru_${VERSION}_macos_amd64.tar.gz release/
mv release/macos/amd64/mieru_${VERSION}_macos_amd64.tar.gz.sha256.txt release/
cd release/macos/amd64
sha256sum mieru > mieru_${VERSION}_macos_amd64.sha256.txt
tar -zcvf mieru_${VERSION}_macos_amd64.tar.gz mieru
sha256sum mieru_${VERSION}_macos_amd64.tar.gz > mieru_${VERSION}_macos_amd64.tar.gz.sha256.txt
mv mieru_${VERSION}_macos_amd64.tar.gz ../../
mv mieru_${VERSION}_macos_amd64.tar.gz.sha256.txt ../../
# Build MacOS arm64 client.
.PHONY: client-mac-arm64
client-mac-arm64:
mkdir -p release/macos/arm64
env GOOS=darwin GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/macos/arm64/mieru cmd/mieru/mieru.go
cd release/macos/arm64;\
sha256sum mieru > mieru_${VERSION}_macos_arm64.sha256.txt;\
tar -zcvf mieru_${VERSION}_macos_arm64.tar.gz mieru;\
sha256sum mieru_${VERSION}_macos_arm64.tar.gz > mieru_${VERSION}_macos_arm64.tar.gz.sha256.txt
mv release/macos/arm64/mieru_${VERSION}_macos_arm64.tar.gz release/
mv release/macos/arm64/mieru_${VERSION}_macos_arm64.tar.gz.sha256.txt release/
cd release/macos/arm64
sha256sum mieru > mieru_${VERSION}_macos_arm64.sha256.txt
tar -zcvf mieru_${VERSION}_macos_arm64.tar.gz mieru
sha256sum mieru_${VERSION}_macos_arm64.tar.gz > mieru_${VERSION}_macos_arm64.tar.gz.sha256.txt
mv mieru_${VERSION}_macos_arm64.tar.gz ../../
mv mieru_${VERSION}_macos_arm64.tar.gz.sha256.txt ../../
# Build windows clients.
.PHONY: client-windows
@@ -183,24 +187,24 @@ client-windows: client-windows-x86 client-windows-amd64
client-windows-x86:
mkdir -p release/windows/386
env GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/windows/386/mieru.exe cmd/mieru/mieru.go
cd release/windows/386;\
sha256sum mieru.exe > mieru_${VERSION}_windows_x86.exe.sha256.txt;\
zip -r mieru_${VERSION}_windows_x86.zip mieru.exe;\
sha256sum mieru_${VERSION}_windows_x86.zip > mieru_${VERSION}_windows_x86.zip.sha256.txt
mv release/windows/386/mieru_${VERSION}_windows_x86.zip release/
mv release/windows/386/mieru_${VERSION}_windows_x86.zip.sha256.txt release/
cd release/windows/386
sha256sum mieru.exe > mieru_${VERSION}_windows_x86.exe.sha256.txt
zip -r mieru_${VERSION}_windows_x86.zip mieru.exe
sha256sum mieru_${VERSION}_windows_x86.zip > mieru_${VERSION}_windows_x86.zip.sha256.txt
mv mieru_${VERSION}_windows_x86.zip ../../
mv mieru_${VERSION}_windows_x86.zip.sha256.txt ../../
# Build windows amd64 client.
.PHONY: client-windows-amd64
client-windows-amd64:
mkdir -p release/windows/amd64
env GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/windows/amd64/mieru.exe cmd/mieru/mieru.go
cd release/windows/amd64;\
sha256sum mieru.exe > mieru_${VERSION}_windows_amd64.exe.sha256.txt;\
zip -r mieru_${VERSION}_windows_amd64.zip mieru.exe;\
sha256sum mieru_${VERSION}_windows_amd64.zip > mieru_${VERSION}_windows_amd64.zip.sha256.txt
mv release/windows/amd64/mieru_${VERSION}_windows_amd64.zip release/
mv release/windows/amd64/mieru_${VERSION}_windows_amd64.zip.sha256.txt release/
cd release/windows/amd64
sha256sum mieru.exe > mieru_${VERSION}_windows_amd64.exe.sha256.txt
zip -r mieru_${VERSION}_windows_amd64.zip mieru.exe
sha256sum mieru_${VERSION}_windows_amd64.zip > mieru_${VERSION}_windows_amd64.zip.sha256.txt
mv mieru_${VERSION}_windows_amd64.zip ../../
mv mieru_${VERSION}_windows_amd64.zip.sha256.txt ../../
# Build linux servers.
.PHONY: server-linux
@@ -211,24 +215,24 @@ server-linux: server-linux-amd64 server-linux-arm64
server-linux-amd64:
mkdir -p release/linux/amd64
env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/amd64/mita cmd/mita/mita.go
cd release/linux/amd64;\
sha256sum mita > mita_${VERSION}_linux_amd64.sha256.txt;\
tar -zcvf mita_${VERSION}_linux_amd64.tar.gz mita;\
sha256sum mita_${VERSION}_linux_amd64.tar.gz > mita_${VERSION}_linux_amd64.tar.gz.sha256.txt
mv release/linux/amd64/mita_${VERSION}_linux_amd64.tar.gz release/
mv release/linux/amd64/mita_${VERSION}_linux_amd64.tar.gz.sha256.txt release/
cd release/linux/amd64
sha256sum mita > mita_${VERSION}_linux_amd64.sha256.txt
tar -zcvf mita_${VERSION}_linux_amd64.tar.gz mita
sha256sum mita_${VERSION}_linux_amd64.tar.gz > mita_${VERSION}_linux_amd64.tar.gz.sha256.txt
mv mita_${VERSION}_linux_amd64.tar.gz ../../
mv mita_${VERSION}_linux_amd64.tar.gz.sha256.txt ../../
# Build linux arm64 server.
.PHONY: server-linux-arm64
server-linux-arm64:
mkdir -p release/linux/arm64
env GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o release/linux/arm64/mita cmd/mita/mita.go
cd release/linux/arm64;\
sha256sum mita > mita_${VERSION}_linux_arm64.sha256.txt;\
tar -zcvf mita_${VERSION}_linux_arm64.tar.gz mita;\
sha256sum mita_${VERSION}_linux_arm64.tar.gz > mita_${VERSION}_linux_arm64.tar.gz.sha256.txt
mv release/linux/arm64/mita_${VERSION}_linux_arm64.tar.gz release/
mv release/linux/arm64/mita_${VERSION}_linux_arm64.tar.gz.sha256.txt release/
cd release/linux/arm64
sha256sum mita > mita_${VERSION}_linux_arm64.sha256.txt
tar -zcvf mita_${VERSION}_linux_arm64.tar.gz mita
sha256sum mita_${VERSION}_linux_arm64.tar.gz > mita_${VERSION}_linux_arm64.tar.gz.sha256.txt
mv mita_${VERSION}_linux_arm64.tar.gz ../../
mv mita_${VERSION}_linux_arm64.tar.gz.sha256.txt ../../
# Build debian installation packages.
.PHONY: deb
@@ -237,61 +241,61 @@ deb: deb-client-amd64 deb-client-arm64 deb-server-amd64 deb-server-arm64
# Build debian client amd64 installation package.
.PHONY: deb-client-amd64
deb-client-amd64: client-linux-amd64
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then\
rm -rf build/package/mieru/amd64/debian/usr/bin;\
mkdir -p build/package/mieru/amd64/debian/usr/bin;\
cp release/linux/amd64/mieru build/package/mieru/amd64/debian/usr/bin/;\
cd build/package/mieru/amd64;\
fakeroot dpkg-deb -Zxz --build debian .;\
cd "${ROOT}";\
mv build/package/mieru/amd64/mieru_${VERSION}_amd64.deb release/;\
cd release;\
sha256sum mieru_${VERSION}_amd64.deb > mieru_${VERSION}_amd64.deb.sha256.txt;\
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then
rm -rf build/package/mieru/amd64/debian/usr/bin
mkdir -p build/package/mieru/amd64/debian/usr/bin
cp release/linux/amd64/mieru build/package/mieru/amd64/debian/usr/bin/
cd build/package/mieru/amd64
fakeroot dpkg-deb -Zxz --build debian .
cd "${ROOT}"
mv build/package/mieru/amd64/mieru_${VERSION}_amd64.deb release/
cd release
sha256sum mieru_${VERSION}_amd64.deb > mieru_${VERSION}_amd64.deb.sha256.txt
fi
# Build debian client arm64 installation package.
.PHONY: deb-client-arm64
deb-client-arm64: client-linux-arm64
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then\
rm -rf build/package/mieru/arm64/debian/usr/bin;\
mkdir -p build/package/mieru/arm64/debian/usr/bin;\
cp release/linux/arm64/mieru build/package/mieru/arm64/debian/usr/bin/;\
cd build/package/mieru/arm64;\
fakeroot dpkg-deb -Zxz --build debian .;\
cd "${ROOT}";\
mv build/package/mieru/arm64/mieru_${VERSION}_arm64.deb release/;\
cd release;\
sha256sum mieru_${VERSION}_arm64.deb > mieru_${VERSION}_arm64.deb.sha256.txt;\
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then
rm -rf build/package/mieru/arm64/debian/usr/bin
mkdir -p build/package/mieru/arm64/debian/usr/bin
cp release/linux/arm64/mieru build/package/mieru/arm64/debian/usr/bin/
cd build/package/mieru/arm64
fakeroot dpkg-deb -Zxz --build debian .
cd "${ROOT}"
mv build/package/mieru/arm64/mieru_${VERSION}_arm64.deb release/
cd release
sha256sum mieru_${VERSION}_arm64.deb > mieru_${VERSION}_arm64.deb.sha256.txt
fi
# Build debian server amd64 installation package.
.PHONY: deb-server-amd64
deb-server-amd64: server-linux-amd64
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then\
rm -rf build/package/mita/amd64/debian/usr/bin;\
mkdir -p build/package/mita/amd64/debian/usr/bin;\
cp release/linux/amd64/mita build/package/mita/amd64/debian/usr/bin/;\
cd build/package/mita/amd64;\
fakeroot dpkg-deb -Zxz --build debian .;\
cd "${ROOT}";\
mv build/package/mita/amd64/mita_${VERSION}_amd64.deb release/;\
cd release;\
sha256sum mita_${VERSION}_amd64.deb > mita_${VERSION}_amd64.deb.sha256.txt;\
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then
rm -rf build/package/mita/amd64/debian/usr/bin
mkdir -p build/package/mita/amd64/debian/usr/bin
cp release/linux/amd64/mita build/package/mita/amd64/debian/usr/bin/
cd build/package/mita/amd64
fakeroot dpkg-deb -Zxz --build debian .
cd "${ROOT}"
mv build/package/mita/amd64/mita_${VERSION}_amd64.deb release/
cd release
sha256sum mita_${VERSION}_amd64.deb > mita_${VERSION}_amd64.deb.sha256.txt
fi
# Build debian server arm64 installation package.
.PHONY: deb-server-arm64
deb-server-arm64: server-linux-arm64
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then\
rm -rf build/package/mita/arm64/debian/usr/bin;\
mkdir -p build/package/mita/arm64/debian/usr/bin;\
cp release/linux/arm64/mita build/package/mita/arm64/debian/usr/bin/;\
cd build/package/mita/arm64;\
fakeroot dpkg-deb -Zxz --build debian .;\
cd "${ROOT}";\
mv build/package/mita/arm64/mita_${VERSION}_arm64.deb release/;\
cd release;\
sha256sum mita_${VERSION}_arm64.deb > mita_${VERSION}_arm64.deb.sha256.txt;\
if [ ! -z $$(command -v dpkg-deb) ] && [ ! -z $$(command -v fakeroot) ]; then
rm -rf build/package/mita/arm64/debian/usr/bin
mkdir -p build/package/mita/arm64/debian/usr/bin
cp release/linux/arm64/mita build/package/mita/arm64/debian/usr/bin/
cd build/package/mita/arm64
fakeroot dpkg-deb -Zxz --build debian .
cd "${ROOT}"
mv build/package/mita/arm64/mita_${VERSION}_arm64.deb release/
cd release
sha256sum mita_${VERSION}_arm64.deb > mita_${VERSION}_arm64.deb.sha256.txt
fi
# Build RPM installation packages.
@@ -301,57 +305,57 @@ rpm: rpm-client-amd64 rpm-client-arm64 rpm-server-amd64 rpm-server-arm64
# Build RPM client amd64 installation package.
.PHONY: rpm-client-amd64
rpm-client-amd64: client-linux-amd64
if [ ! -z $$(command -v rpmbuild) ]; then\
rm -rf build/package/mieru/amd64/rpm/mieru;\
cp release/linux/amd64/mieru build/package/mieru/amd64/rpm/;\
cd build/package/mieru/amd64/rpm;\
rpmbuild -bb --target x86_64 --build-in-place --define "_topdir $$(pwd)" mieru.spec;\
cd "${ROOT}";\
mv build/package/mieru/amd64/rpm/RPMS/x86_64/mieru-${VERSION}-1.x86_64.rpm release/;\
cd release;\
sha256sum mieru-${VERSION}-1.x86_64.rpm > mieru-${VERSION}-1.x86_64.rpm.sha256.txt;\
if [ ! -z $$(command -v rpmbuild) ]; then
rm -rf build/package/mieru/amd64/rpm/mieru
cp release/linux/amd64/mieru build/package/mieru/amd64/rpm/
cd build/package/mieru/amd64/rpm
rpmbuild -bb --target x86_64 --build-in-place --define "_topdir $$(pwd)" mieru.spec
cd "${ROOT}"
mv build/package/mieru/amd64/rpm/RPMS/x86_64/mieru-${VERSION}-1.x86_64.rpm release/
cd release
sha256sum mieru-${VERSION}-1.x86_64.rpm > mieru-${VERSION}-1.x86_64.rpm.sha256.txt
fi
# Build RPM client arm64 installation package.
.PHONY: rpm-client-arm64
rpm-client-arm64: client-linux-arm64
if [ ! -z $$(command -v rpmbuild) ]; then\
rm -rf build/package/mieru/arm64/rpm/mieru;\
cp release/linux/arm64/mieru build/package/mieru/arm64/rpm/;\
cd build/package/mieru/arm64/rpm;\
rpmbuild -bb --target aarch64 --build-in-place --define "_topdir $$(pwd)" mieru.spec;\
cd "${ROOT}";\
mv build/package/mieru/arm64/rpm/RPMS/aarch64/mieru-${VERSION}-1.aarch64.rpm release/;\
cd release;\
sha256sum mieru-${VERSION}-1.aarch64.rpm > mieru-${VERSION}-1.aarch64.rpm.sha256.txt;\
if [ ! -z $$(command -v rpmbuild) ]; then
rm -rf build/package/mieru/arm64/rpm/mieru
cp release/linux/arm64/mieru build/package/mieru/arm64/rpm/
cd build/package/mieru/arm64/rpm
rpmbuild -bb --target aarch64 --build-in-place --define "_topdir $$(pwd)" mieru.spec
cd "${ROOT}"
mv build/package/mieru/arm64/rpm/RPMS/aarch64/mieru-${VERSION}-1.aarch64.rpm release/
cd release
sha256sum mieru-${VERSION}-1.aarch64.rpm > mieru-${VERSION}-1.aarch64.rpm.sha256.txt
fi
# Build RPM server amd64 installation package.
.PHONY: rpm-server-amd64
rpm-server-amd64: server-linux-amd64
if [ ! -z $$(command -v rpmbuild) ]; then\
rm -rf build/package/mita/amd64/rpm/mita;\
cp release/linux/amd64/mita build/package/mita/amd64/rpm/;\
cd build/package/mita/amd64/rpm;\
rpmbuild -bb --target x86_64 --build-in-place --define "_topdir $$(pwd)" mita.spec;\
cd "${ROOT}";\
mv build/package/mita/amd64/rpm/RPMS/x86_64/mita-${VERSION}-1.x86_64.rpm release/;\
cd release;\
sha256sum mita-${VERSION}-1.x86_64.rpm > mita-${VERSION}-1.x86_64.rpm.sha256.txt;\
if [ ! -z $$(command -v rpmbuild) ]; then
rm -rf build/package/mita/amd64/rpm/mita
cp release/linux/amd64/mita build/package/mita/amd64/rpm/
cd build/package/mita/amd64/rpm
rpmbuild -bb --target x86_64 --build-in-place --define "_topdir $$(pwd)" mita.spec
cd "${ROOT}"
mv build/package/mita/amd64/rpm/RPMS/x86_64/mita-${VERSION}-1.x86_64.rpm release/
cd release
sha256sum mita-${VERSION}-1.x86_64.rpm > mita-${VERSION}-1.x86_64.rpm.sha256.txt
fi
# Build RPM server arm64 installation package.
.PHONY: rpm-server-arm64
rpm-server-arm64: server-linux-arm64
if [ ! -z $$(command -v rpmbuild) ]; then\
rm -rf build/package/mita/arm64/rpm/mita;\
cp release/linux/arm64/mita build/package/mita/arm64/rpm/;\
cd build/package/mita/arm64/rpm;\
rpmbuild -bb --target aarch64 --build-in-place --define "_topdir $$(pwd)" mita.spec;\
cd "${ROOT}";\
mv build/package/mita/arm64/rpm/RPMS/aarch64/mita-${VERSION}-1.aarch64.rpm release/;\
cd release;\
sha256sum mita-${VERSION}-1.aarch64.rpm > mita-${VERSION}-1.aarch64.rpm.sha256.txt;\
if [ ! -z $$(command -v rpmbuild) ]; then
rm -rf build/package/mita/arm64/rpm/mita
cp release/linux/arm64/mita build/package/mita/arm64/rpm/
cd build/package/mita/arm64/rpm
rpmbuild -bb --target aarch64 --build-in-place --define "_topdir $$(pwd)" mita.spec
cd "${ROOT}"
mv build/package/mita/arm64/rpm/RPMS/aarch64/mita-${VERSION}-1.aarch64.rpm release/
cd release
sha256sum mita-${VERSION}-1.aarch64.rpm > mita-${VERSION}-1.aarch64.rpm.sha256.txt
fi
# Build binaries used in integration tests.
@@ -370,18 +374,18 @@ test-binary:
# Build a docker image to run integration tests.
.PHONY: test-container
test-container: test-binary
if [ ! -z $$(command -v docker) ]; then\
docker build -t mieru_httptest:${SHORT_SHA} -f test/deploy/httptest/Dockerfile .;\
docker build -t mieru_proxychain:${SHORT_SHA} -f test/deploy/proxychain/Dockerfile .;\
if [ ! -z $$(command -v docker) ]; then
docker build -t mieru_httptest:${SHORT_SHA} -f test/deploy/httptest/Dockerfile .
docker build -t mieru_proxychain:${SHORT_SHA} -f test/deploy/proxychain/Dockerfile .
fi
rm -f exampleapiclient mieru mieru2 mita mita2 httpserver sockshttpclient socksudpclient udpserver
# Run docker integration tests.
.PHONY: run-container-test
run-container-test: test-container
if [ ! -z $$(command -v docker) ]; then\
docker run mieru_httptest:${SHORT_SHA};\
docker run mieru_proxychain:${SHORT_SHA};\
if [ ! -z $$(command -v docker) ]; then
docker run mieru_httptest:${SHORT_SHA}
docker run mieru_proxychain:${SHORT_SHA}
fi
# Generate source code from protobuf.
@@ -396,19 +400,19 @@ endif
.PHONY: protobuf
protobuf:
# Download location: https://github.com/protocolbuffers/protobuf/releases
if [ ! -x "${ROOT}/tools/build/protoc" ]; then\
curl -o "${ROOT}/tools/build/protoc" https://raw.githubusercontent.com/enfein/buildtools/main/protoc/22.3/linux_${PROTOC_ARCH}/bin/protoc;\
chmod 755 "${ROOT}/tools/build/protoc";\
if [ ! -x "${ROOT}/tools/build/protoc" ]; then
curl -o "${ROOT}/tools/build/protoc" https://raw.githubusercontent.com/enfein/buildtools/main/protoc/22.3/linux_${PROTOC_ARCH}/bin/protoc
chmod 755 "${ROOT}/tools/build/protoc"
fi
# Download location: https://github.com/protocolbuffers/protobuf-go/releases
if [ ! -x "${ROOT}/tools/build/protoc-gen-go" ]; then\
curl -o "${ROOT}/tools/build/protoc-gen-go" https://raw.githubusercontent.com/enfein/buildtools/main/protoc-gen-go/1.30.0/linux_${PROTOC_ARCH}/protoc-gen-go;\
chmod 755 "${ROOT}/tools/build/protoc-gen-go";\
if [ ! -x "${ROOT}/tools/build/protoc-gen-go" ]; then
curl -o "${ROOT}/tools/build/protoc-gen-go" https://raw.githubusercontent.com/enfein/buildtools/main/protoc-gen-go/1.30.0/linux_${PROTOC_ARCH}/protoc-gen-go
chmod 755 "${ROOT}/tools/build/protoc-gen-go"
fi
# Download location: https://github.com/grpc/grpc-go/releases
if [ ! -x "${ROOT}/tools/build/protoc-gen-go-grpc" ]; then\
curl -o "${ROOT}/tools/build/protoc-gen-go-grpc" https://raw.githubusercontent.com/enfein/buildtools/main/protoc-gen-go-grpc/1.3.0/linux_${PROTOC_ARCH}/protoc-gen-go-grpc;\
chmod 755 "${ROOT}/tools/build/protoc-gen-go-grpc";\
if [ ! -x "${ROOT}/tools/build/protoc-gen-go-grpc" ]; then
curl -o "${ROOT}/tools/build/protoc-gen-go-grpc" https://raw.githubusercontent.com/enfein/buildtools/main/protoc-gen-go-grpc/1.3.0/linux_${PROTOC_ARCH}/protoc-gen-go-grpc
chmod 755 "${ROOT}/tools/build/protoc-gen-go-grpc"
fi
PATH=${PATH}:"${ROOT}/tools/build" ${ROOT}/tools/build/protoc -I="${ROOT}/pkg" \
@@ -434,8 +438,11 @@ protobuf:
# Package source code.
.PHONY: src
src: clean
cd ..; tar --exclude="${PROJECT_NAME}/.git" -zcvf source.tar.gz "${PROJECT_NAME}"; zip -r source.zip "${PROJECT_NAME}" -x \*.git\*
mkdir -p release; mv ../source.tar.gz release; mv ../source.zip release
(cd ..; tar --exclude="${PROJECT_NAME}/.git" -zcvf source.tar.gz "${PROJECT_NAME}")
(cd ..; zip -r source.zip "${PROJECT_NAME}" -x "${PROJECT_NAME}/.git/*")
mkdir -p release
mv ../source.tar.gz release
mv ../source.zip release
# Clean all the files outside the git repository.
.PHONY: clean
+3 -1
View File
@@ -145,7 +145,9 @@ func (mc *mieruClient) DialContext(ctx context.Context, addr net.Addr) (net.Conn
return nil, fmt.Errorf("unsupported network type %s", netAddrSpec.Network())
}
req.DstAddr = netAddrSpec.AddrSpec
return internal.NewEarlyConn(conn, req), nil
earlyConn := internal.NewEarlyConn(conn)
earlyConn.SetRequest(req)
return earlyConn, nil
}
_, err = internal.PostDialHandshake(conn, netAddrSpec)
return conn, err
+51 -22
View File
@@ -18,43 +18,61 @@ package internal
import (
"bytes"
"fmt"
"io"
"net"
"sync"
"sync/atomic"
"time"
"github.com/enfein/mieru/v3/apis/constant"
"github.com/enfein/mieru/v3/apis/model"
)
// Socks5Writer is an interface for socks5 objects that can be written to a writer.
type Socks5Writer interface {
WriteToSocks5(writer io.Writer) error
}
var _ Socks5Writer = (*model.Request)(nil)
var _ Socks5Writer = (*model.Response)(nil)
// EarlyConn implements net.Conn interface.
// When the Write() method on the net.Conn is called for the first time,
// it performs the initial handshake and writes the request to the server.
// it performs the initial handshake and writes
// the request or response to the peer.
type EarlyConn struct {
net.Conn
object Socks5Writer
request atomic.Pointer[model.Request]
response atomic.Pointer[model.Response]
peerResponse atomic.Pointer[model.Response]
handshakeOnce sync.Once
handshakeErr error
handshaked chan struct{}
}
// NewEarlyConn creates a new EarlyConn.
func NewEarlyConn(conn net.Conn, object Socks5Writer) *EarlyConn {
func NewEarlyConn(conn net.Conn) *EarlyConn {
return &EarlyConn{
Conn: conn,
object: object,
handshaked: make(chan struct{}),
}
}
func (c *EarlyConn) SetRequest(request *model.Request) {
if c.response.Load() != nil {
panic("can't set request when response is not empty")
}
select {
case <-c.handshaked:
panic("can't set request when handshake already done")
default:
c.request.Store(request)
}
}
func (c *EarlyConn) SetResponse(response *model.Response) {
if c.request.Load() != nil {
panic("can't set response when request is not empty")
}
select {
case <-c.handshaked:
panic("can't set response when handshake already done")
default:
c.response.Store(response)
}
}
// Read will block until a message is received or an error occurs.
// It waits for the handshake to complete.
func (c *EarlyConn) Read(b []byte) (n int, err error) {
@@ -103,10 +121,26 @@ func (c *EarlyConn) NeedHandshake() bool {
}
}
// PeerResponse returns the response from the peer.
// It returns nil if the handshake has not been performed yet.
func (c *EarlyConn) PeerResponse() *model.Response {
return c.peerResponse.Load()
}
func (c *EarlyConn) doHandshakeAndWrite(b []byte) error {
var buf bytes.Buffer
if err := c.object.WriteToSocks5(&buf); err != nil {
return err
request := c.request.Load()
response := c.response.Load()
if request != nil {
if err := request.WriteToSocks5(&buf); err != nil {
return err
}
} else if response != nil {
if err := response.WriteToSocks5(&buf); err != nil {
return err
}
} else {
return fmt.Errorf("no request or response set")
}
if len(b) > 0 {
buf.Write(b)
@@ -116,8 +150,7 @@ func (c *EarlyConn) doHandshakeAndWrite(b []byte) error {
}
// If this is a request, read the response.
switch c.object.(type) {
case *model.Request:
if request != nil {
c.Conn.SetReadDeadline(time.Now().Add(10 * time.Second))
defer c.Conn.SetReadDeadline(time.Time{})
@@ -128,11 +161,7 @@ func (c *EarlyConn) doHandshakeAndWrite(b []byte) error {
if resp.Reply != constant.Socks5ReplySuccess {
return fmt.Errorf("server returned socks5 error code %d", resp.Reply)
}
case *model.Response:
// No need to read anything.
default:
return fmt.Errorf("unsupported object type for EarlyConn: %T", c.object)
c.peerResponse.Store(&resp)
}
return nil
}
+4 -2
View File
@@ -78,7 +78,8 @@ func TestEarlyConn_Request(t *testing.T) {
Port: 80,
},
}
conn := internal.NewEarlyConn(clientConn, req)
conn := internal.NewEarlyConn(clientConn)
conn.SetRequest(req)
defer conn.Close()
// The first write triggers the handshake.
@@ -143,7 +144,8 @@ func TestEarlyConn_Response(t *testing.T) {
Port: 1080,
},
}
conn := internal.NewEarlyConn(clientConn, resp)
conn := internal.NewEarlyConn(clientConn)
conn.SetResponse(resp)
defer conn.Close()
// The first write triggers sending the response.
+1 -1
View File
@@ -39,7 +39,7 @@ import (
"github.com/metacubex/mihomo/listener/inner"
"github.com/metacubex/mihomo/listener/tproxy"
"github.com/metacubex/mihomo/log"
"github.com/metacubex/mihomo/ntp"
"github.com/metacubex/mihomo/ntp/ntp"
"github.com/metacubex/mihomo/tunnel"
)
@@ -3,18 +3,18 @@ package ntp
import (
"context"
"sync"
"sync/atomic"
"time"
"github.com/metacubex/mihomo/component/dialer"
"github.com/metacubex/mihomo/component/proxydialer"
"github.com/metacubex/mihomo/log"
mihomoNtp "github.com/metacubex/mihomo/ntp"
M "github.com/metacubex/sing/common/metadata"
"github.com/metacubex/sing/common/ntp"
)
var globalSrv atomic.Pointer[Service]
var globalSrv *Service
var globalMu sync.Mutex
type Service struct {
@@ -23,21 +23,20 @@ type Service struct {
ticker *time.Ticker
ctx context.Context
cancel context.CancelFunc
offset atomic.Int64 // [time.Duration]
syncSystemTime bool
}
func ReCreateNTPService(server string, interval time.Duration, dialerProxy string, syncSystemTime bool) {
globalMu.Lock()
defer globalMu.Unlock()
if service := globalSrv.Swap(nil); service != nil {
service.Stop()
if globalSrv != nil {
globalSrv.Stop()
}
if server == "" || interval <= 0 {
return
}
ctx, cancel := context.WithCancel(context.Background())
service := &Service{
globalSrv = &Service{
server: M.ParseSocksaddr(server),
dialer: proxydialer.NewByNameSingDialer(dialerProxy, dialer.NewDialer()),
ticker: time.NewTicker(interval * time.Minute),
@@ -45,8 +44,7 @@ func ReCreateNTPService(server string, interval time.Duration, dialerProxy strin
cancel: cancel,
syncSystemTime: syncSystemTime,
}
service.Start()
globalSrv.Store(service)
globalSrv.Start()
}
func (srv *Service) Start() {
@@ -59,10 +57,6 @@ func (srv *Service) Stop() {
srv.cancel()
}
func (srv *Service) Offset() time.Duration {
return time.Duration(srv.offset.Load())
}
func (srv *Service) update() error {
var response *ntp.Response
var err error
@@ -80,7 +74,7 @@ func (srv *Service) update() error {
} else if offset < time.Duration(0) {
log.Infoln("System clock is behind NTP time by %s", -offset)
}
srv.offset.Store(int64(offset))
mihomoNtp.SetOffset(offset)
if srv.syncSystemTime {
timeNow := response.Time
syncErr := setSystemTime(timeNow)
@@ -97,7 +91,7 @@ func (srv *Service) update() error {
}
func (srv *Service) loopUpdate() {
defer srv.offset.Store(0)
defer mihomoNtp.SetOffset(0)
defer srv.ticker.Stop()
for {
err := srv.update()
@@ -111,13 +105,3 @@ func (srv *Service) loopUpdate() {
}
}
}
func Now() time.Time {
now := time.Now()
if service := globalSrv.Load(); service != nil {
if offset := service.Offset(); offset.Abs() > 0 {
now = now.Add(offset)
}
}
return now
}
+28
View File
@@ -0,0 +1,28 @@
// Package ntp provide time.Now
//
// DON'T import other package in mihomo to keep minimal internal dependencies
package ntp
import (
"time"
"sync/atomic"
)
var _offset atomic.Int64 // [time.Duration]
func SetOffset(offset time.Duration) {
_offset.Store(int64(offset))
}
func GetOffset() time.Duration {
return time.Duration(_offset.Load())
}
func Now() time.Time {
now := time.Now()
if offset := GetOffset(); offset != 0 {
now = now.Add(offset)
}
return now
}
+1 -1
View File
@@ -34,7 +34,7 @@ func ConvertToMrs(buf []byte, behavior P.RuleBehavior, format P.RuleFormat, w io
}
var encoder *zstd.Encoder
encoder, err = zstd.NewWriter(w, zstd.WithEncoderLevel(zstd.SpeedBestCompression))
encoder, err = zstd.NewWriter(w)
if err != nil {
return err
}
@@ -1,213 +0,0 @@
name: Update Third-Party Resources
on:
schedule:
- cron: '30 0 */3 * *'
workflow_dispatch:
jobs:
update-resources:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
with:
fetch-depth: 1
ref: dev
- name: Set up environment
run: |
sudo apt-get update
sudo apt-get -y install curl wget unzip git jq coreutils
- name: Set file paths
run: |
echo "CHNR_PATH=luci-app-openclash/root/etc/openclash/china_ip_route.ipset" >> $GITHUB_ENV
echo "CHNR6_PATH=luci-app-openclash/root/etc/openclash/china_ip6_route.ipset" >> $GITHUB_ENV
echo "YACD_PATH=luci-app-openclash/root/usr/share/openclash/ui/yacd" >> $GITHUB_ENV
echo "ZASHBOARD_PATH=luci-app-openclash/root/usr/share/openclash/ui/zashboard" >> $GITHUB_ENV
echo "METACUBEXD_PATH=luci-app-openclash/root/usr/share/openclash/ui/metacubexd" >> $GITHUB_ENV
echo "GEOSITE_PATH=luci-app-openclash/root/etc/openclash/GeoSite.dat" >> $GITHUB_ENV
echo "COUNTRY_MMDB_PATH=luci-app-openclash/root/etc/openclash/Country.mmdb" >> $GITHUB_ENV
- name: Update China IP Route Files
id: chnr
run: |
mkdir -p tmp
echo "Downloading China IP Route files..."
curl -sSL https://ispip.clang.cn/all_cn.txt -o tmp/china_ip_route.ipset
mkdir -p $(dirname $CHNR_PATH)
UPDATED=0
if [ -f "$CHNR_PATH" ]; then
if ! cmp -s tmp/china_ip_route.ipset "$CHNR_PATH"; then
echo "China IP Route list has been updated, replacing old version."
cp tmp/china_ip_route.ipset "$CHNR_PATH"
UPDATED=1
else
echo "China IP Route list is up to date."
fi
else
echo "China IP Route list file doesn't exist, creating it."
cp tmp/china_ip_route.ipset "$CHNR_PATH"
UPDATED=1
fi
curl -sSL https://ispip.clang.cn/all_cn_ipv6.txt -o tmp/china_ip6_route.ipset
mkdir -p $(dirname $CHNR6_PATH)
UPDATED6=0
if [ -f "$CHNR6_PATH" ]; then
if ! cmp -s tmp/china_ip6_route.ipset "$CHNR6_PATH"; then
echo "China IP6 Route list has been updated, replacing old version."
cp tmp/china_ip6_route.ipset "$CHNR6_PATH"
UPDATED6=1
else
echo "China IP6 Route list is up to date."
fi
else
echo "China IP6 Route list file doesn't exist, creating it."
cp tmp/china_ip6_route.ipset "$CHNR6_PATH"
UPDATED6=1
fi
echo "updated=$UPDATED" >> $GITHUB_OUTPUT
echo "updated6=$UPDATED6" >> $GITHUB_OUTPUT
- name: Update MetaCubeXD UI
id: metacubexd
run: |
echo "Downloading latest MetaCubeXD UI zip from gh-pages branch..."
mkdir -p tmp/metacubexd_zip
curl -sSL https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip -o tmp/metacubexd.zip
unzip -q -o tmp/metacubexd.zip -d tmp/metacubexd_zip
METACUBEXD_UNZIP_PATH="tmp/metacubexd_zip/metacubexd-gh-pages"
mkdir -p "$METACUBEXD_PATH"
UPDATED=0
if [ -d "$METACUBEXD_PATH" ]; then
if diff -qr "$METACUBEXD_UNZIP_PATH"/ "$METACUBEXD_PATH"/ >/dev/null; then
echo "MetaCubeXD UI is up to date."
else
echo "MetaCubeXD UI has been updated, replacing old version."
rm -rf "$METACUBEXD_PATH"/*
cp -rf "$METACUBEXD_UNZIP_PATH"/* "$METACUBEXD_PATH"
UPDATED=1
fi
else
echo "MetaCubeXD UI directory doesn't exist, creating it."
mkdir -p "$METACUBEXD_PATH"
cp -rf "$METACUBEXD_UNZIP_PATH"/* "$METACUBEXD_PATH"
UPDATED=1
fi
echo "updated=$UPDATED" >> $GITHUB_OUTPUT
- name: Update Yacd UI
id: yacd
run: |
echo "Downloading latest Yacd UI zip from gh-pages branch..."
mkdir -p tmp/yacd_zip
curl -sSL https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip -o tmp/yacd.zip
unzip -q -o tmp/yacd.zip -d tmp/yacd_zip
YACD_UNZIP_PATH="tmp/yacd_zip/Yacd-meta-gh-pages"
mkdir -p "$YACD_PATH"
UPDATED=0
if [ -d "$YACD_PATH" ]; then
if diff -qr "$YACD_UNZIP_PATH"/ "$YACD_PATH"/ >/dev/null; then
echo "Yacd UI is up to date."
else
echo "Yacd UI has been updated, replacing old version."
rm -rf "$YACD_PATH"/*
cp -rf "$YACD_UNZIP_PATH"/* "$YACD_PATH"
UPDATED=1
fi
else
echo "Yacd UI directory doesn't exist, creating it."
mkdir -p "$YACD_PATH"
cp -rf "$YACD_UNZIP_PATH"/* "$YACD_PATH"
UPDATED=1
fi
echo "updated=$UPDATED" >> $GITHUB_OUTPUT
- name: Update ZashBoard UI
id: zashboard
run: |
echo "Downloading latest ZashBoard UI release zip..."
mkdir -p tmp/zashboard_zip
curl -sSL https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip -o tmp/zashboard.zip
unzip -q -o tmp/zashboard.zip -d tmp/zashboard_zip
mkdir -p "$ZASHBOARD_PATH"
UPDATED=0
if [ -d "$ZASHBOARD_PATH" ]; then
if diff -qr tmp/zashboard_zip/dist/ "$ZASHBOARD_PATH"/ >/dev/null; then
echo "ZashBoard UI is up to date."
else
echo "ZashBoard UI has been updated, replacing old version."
rm -rf "$ZASHBOARD_PATH"/*
cp -rf tmp/zashboard_zip/dist/* "$ZASHBOARD_PATH"
UPDATED=1
fi
else
echo "ZashBoard UI directory doesn't exist, creating it."
mkdir -p "$ZASHBOARD_PATH"
cp -rf tmp/zashboard_zip/dist/* "$ZASHBOARD_PATH"
UPDATED=1
fi
echo "updated=$UPDATED" >> $GITHUB_OUTPUT
- name: Update GeoSite files
id: geo
run: |
RULES_RELEASE=$(curl -s https://api.github.com/repos/Loyalsoldier/v2ray-rules-dat/releases/latest | jq -r '.tag_name')
echo "Latest v2ray-rules-dat version: $RULES_RELEASE"
curl -sSL "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/${RULES_RELEASE}/geosite.dat" -o tmp/GeoSite.dat
mkdir -p $(dirname "$GEOSITE_PATH")
UPDATED_GEOSITE=0
if [ -f "$GEOSITE_PATH" ]; then
if ! cmp -s tmp/GeoSite.dat "$GEOSITE_PATH"; then
echo "GeoSite.dat has been updated, replacing old version."
cp tmp/GeoSite.dat "$GEOSITE_PATH"
UPDATED_GEOSITE=1
else
echo "GeoSite.dat is up to date."
fi
else
echo "GeoSite.dat file doesn't exist, creating it."
cp tmp/GeoSite.dat "$GEOSITE_PATH"
UPDATED_GEOSITE=1
fi
echo "geosite=$UPDATED_GEOSITE" >> $GITHUB_OUTPUT
- name: Update Country.mmdb
id: mmdb
run: |
curl -sSL "https://github.com/alecthw/mmdb_china_ip_list/releases/latest/download/Country-lite.mmdb" -o tmp/Country.mmdb
mkdir -p $(dirname "$COUNTRY_MMDB_PATH")
UPDATED=0
if [ -f "$COUNTRY_MMDB_PATH" ]; then
if ! cmp -s tmp/Country.mmdb "$COUNTRY_MMDB_PATH"; then
echo "Country.mmdb has been updated, replacing old version."
cp tmp/Country.mmdb "$COUNTRY_MMDB_PATH"
UPDATED=1
else
echo "Country.mmdb is up to date."
fi
else
echo "Country.mmdb file doesn't exist, creating it."
cp tmp/Country.mmdb "$COUNTRY_MMDB_PATH"
UPDATED=1
fi
echo "updated=$UPDATED" >> $GITHUB_OUTPUT
- name: Commit changes
if: |
steps.chnr.outputs.updated == '1' ||
steps.chnr.outputs.updated6 == '1' ||
steps.metacubexd.outputs.updated == '1' ||
steps.yacd.outputs.updated == '1' ||
steps.zashboard.outputs.updated == '1' ||
steps.geo.outputs.geosite == '1' ||
steps.mmdb.outputs.updated == '1'
run: |
rm -rf tmp
git config user.name 'github-actions[bot]'
git config user.email 'github-actions[bot]@users.noreply.github.com'
git add .
UPDATE_MSG="Chore: update third-party resources"
git commit -m "$UPDATE_MSG"
git push
+1 -1
View File
@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openclash
PKG_VERSION:=0.47.022
PKG_VERSION:=0.47.024
PKG_MAINTAINER:=vernesong <https://github.com/vernesong/OpenClash>
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
@@ -651,10 +651,21 @@ do_run_file()
} >/dev/null 2>&1
container() {
[ -f "/proc/1/cgroup" ] && grep -qiE "(docker|containerd|lxc|podman|kubepods|container)" /proc/1/cgroup 2>/dev/null && return 0
[ -f "/proc/1/environ" ] && grep -qiE "(docker|containerd|lxc|podman|kubepods|container)" /proc/1/environ 2>/dev/null && return 0
[ -f "/.dockerenv" ] && return 0
env | grep -qiE "(docker|kubernetes|container)" && return 0
return 1
}
check_mod()
{
modprobe $1
if [ -z "$(lsmod |awk '{print $1}' |grep ^$1$)" ]; then
if container; then
return 0
fi
modprobe $1 2>/dev/null
if [ $? -ne 0 ]; then
LOG_OUT "Error:【$1】module not found, please check your system depends and try again!"
start_fail
fi
@@ -137,9 +137,6 @@ jobs:
rm -rf temp_resp
git clone -b master --single-branch https://github.com/openwrt/packages.git temp_resp
cd temp_resp
git checkout 2b99cd7d7637da0f152da378994f699aaf0dd44d
cd ..
echo "update golang version"
rm -rf feeds/packages/lang/golang
cp -r temp_resp/lang/golang feeds/packages/lang
@@ -147,6 +144,11 @@ jobs:
rm -rf feeds/packages/lang/rust
cp -r temp_resp/lang/rust feeds/packages/lang
rm -rf temp_resp
echo "update patch-kernel.sh"
git clone -b main --single-branch https://github.com/openwrt/openwrt.git temp_resp
cp -f temp_resp/scripts/patch-kernel.sh scripts/
rm -rf temp_resp
echo "Patch application completed"
#--------------------------------------end_patches--------------------------------------------
@@ -324,9 +326,6 @@ jobs:
rm -rf temp_resp
git clone -b master --single-branch https://github.com/openwrt/packages.git temp_resp
cd temp_resp
git checkout 2b99cd7d7637da0f152da378994f699aaf0dd44d
cd ..
echo "update golang version"
rm -rf feeds/packages/lang/golang
cp -r temp_resp/lang/golang feeds/packages/lang
@@ -335,6 +334,10 @@ jobs:
cp -r temp_resp/lang/rust feeds/packages/lang
rm -rf temp_resp
git clone -b main --single-branch https://github.com/openwrt/openwrt.git temp_resp
cp -f temp_resp/scripts/patch-kernel.sh scripts/
rm -rf temp_resp
echo "fixed rust host build error"
sed -i 's/--set=llvm\.download-ci-llvm=false/--set=llvm.download-ci-llvm=true/' feeds/packages/lang/rust/Makefile
grep -q -- '--ci false \\' feeds/packages/lang/rust/Makefile || sed -i '/x\.py \\/a \ --ci false \\' feeds/packages/lang/rust/Makefile
@@ -29,7 +29,6 @@ o = s:option(DynamicList, "chnroute_url", translate("China IPs(chnroute) Update
o:depends("geo2rule", false)
o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt", translate("gaoyifan/china-operator-ip/china"))
o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN"))
o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR"))
o:value("https://fastly.jsdelivr.net/gh/soffchen/GeoIP2-CN@release/CN-ip-cidr.txt", translate("soffchen/GeoIP2-CN"))
o:value("https://fastly.jsdelivr.net/gh/Hackl0us/GeoIP2-CN@release/CN-ip-cidr.txt", translate("Hackl0us/GeoIP2-CN"))
o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP_No_IPv6.txt", translate("ios_rule_script/ChinaMax_IP_No_IPv6"))
@@ -136,9 +136,6 @@ jobs:
rm -rf temp_resp
git clone -b master --single-branch https://github.com/openwrt/packages.git temp_resp
cd temp_resp
git checkout 2b99cd7d7637da0f152da378994f699aaf0dd44d
cd ..
echo "update golang version"
rm -rf feeds/packages/lang/golang
cp -r temp_resp/lang/golang feeds/packages/lang
@@ -147,6 +144,11 @@ jobs:
cp -r temp_resp/lang/rust feeds/packages/lang
rm -rf temp_resp
echo "update patch-kernel.sh"
git clone -b main --single-branch https://github.com/openwrt/openwrt.git temp_resp
cp -f temp_resp/scripts/patch-kernel.sh scripts/
rm -rf temp_resp
echo "Patch application completed"
#--------------------------------------end_patches--------------------------------------------
@@ -323,9 +325,6 @@ jobs:
rm -rf temp_resp
git clone -b master --single-branch https://github.com/openwrt/packages.git temp_resp
cd temp_resp
git checkout 2b99cd7d7637da0f152da378994f699aaf0dd44d
cd ..
echo "update golang version"
rm -rf feeds/packages/lang/golang
cp -r temp_resp/lang/golang feeds/packages/lang
@@ -333,6 +332,11 @@ jobs:
rm -rf feeds/packages/lang/rust
cp -r temp_resp/lang/rust feeds/packages/lang
rm -rf temp_resp
echo "update patch-kernel.sh"
git clone -b main --single-branch https://github.com/openwrt/openwrt.git temp_resp
cp -f temp_resp/scripts/patch-kernel.sh scripts/
rm -rf temp_resp
echo "fixed rust host build error"
sed -i 's/--set=llvm\.download-ci-llvm=false/--set=llvm.download-ci-llvm=true/' feeds/packages/lang/rust/Makefile
+2 -2
View File
@@ -1,3 +1,3 @@
VERSION_CODE=584
VERSION_NAME=1.12.11
VERSION_CODE=587
VERSION_NAME=1.12.12
GO_VERSION=go1.25.3
+8
View File
@@ -2,6 +2,14 @@
icon: material/alert-decagram
---
#### 1.13.0-alpha.27
* Fixes and improvements
#### 1.12.12
* Fixes and improvements
#### 1.13.0-alpha.26
* Update quic-go to v0.55.0
+1 -1
View File
@@ -29,7 +29,7 @@ require (
github.com/sagernet/gomobile v0.1.8
github.com/sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1
github.com/sagernet/quic-go v0.55.0-sing-box-mod.2
github.com/sagernet/sing v0.8.0-beta.5
github.com/sagernet/sing v0.8.0-beta.6
github.com/sagernet/sing-mux v0.3.3
github.com/sagernet/sing-quic v0.6.0-beta.4
github.com/sagernet/sing-shadowsocks v0.2.8
+2 -2
View File
@@ -163,8 +163,8 @@ github.com/sagernet/nftables v0.3.0-beta.4/go.mod h1:OQXAjvjNGGFxaTgVCSTRIhYB5/l
github.com/sagernet/quic-go v0.55.0-sing-box-mod.2 h1:I79gW4Xl5ciVARHfnp122lDAMhC0AwUCU765Q8Kxdfo=
github.com/sagernet/quic-go v0.55.0-sing-box-mod.2/go.mod h1:IE9naq7Kekj0rPAdWc0GLW1ENR7gAOQV9VRTDlKN8Bk=
github.com/sagernet/sing v0.6.9/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing v0.8.0-beta.5 h1:Cm4CnLQGNyG5Jl1U9pKWAjFUcbjchGGqn1xeXzfI5kw=
github.com/sagernet/sing v0.8.0-beta.5/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing v0.8.0-beta.6 h1:GXv1j1xWHihx6ptyOXh0yp4jUqJoNjCqD8d+AI9rnLU=
github.com/sagernet/sing v0.8.0-beta.6/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
github.com/sagernet/sing-mux v0.3.3 h1:YFgt9plMWzH994BMZLmyKL37PdIVaIilwP0Jg+EcLfw=
github.com/sagernet/sing-mux v0.3.3/go.mod h1:pht8iFY4c9Xltj7rhVd208npkNaeCxzyXCgulDPLUDA=
github.com/sagernet/sing-quic v0.6.0-beta.4 h1:2k/+Xrv/pjl7AYC7LD9tcB7y1lIgw04LjJjqTI8q5Xk=
+2 -1
View File
@@ -38,7 +38,8 @@ endef
define Host/Configure
$(PYTHON) $(HOST_BUILD_DIR)/build/gen.py \
--no-last-commit-position
--no-last-commit-position \
--allow-warnings
endef
define Host/Compile
+1 -1
View File
@@ -1,7 +1,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openclash
PKG_VERSION:=0.47.022
PKG_VERSION:=0.47.024
PKG_MAINTAINER:=vernesong <https://github.com/vernesong/OpenClash>
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
@@ -651,10 +651,21 @@ do_run_file()
} >/dev/null 2>&1
container() {
[ -f "/proc/1/cgroup" ] && grep -qiE "(docker|containerd|lxc|podman|kubepods|container)" /proc/1/cgroup 2>/dev/null && return 0
[ -f "/proc/1/environ" ] && grep -qiE "(docker|containerd|lxc|podman|kubepods|container)" /proc/1/environ 2>/dev/null && return 0
[ -f "/.dockerenv" ] && return 0
env | grep -qiE "(docker|kubernetes|container)" && return 0
return 1
}
check_mod()
{
modprobe $1
if [ -z "$(lsmod |awk '{print $1}' |grep ^$1$)" ]; then
if container; then
return 0
fi
modprobe $1 2>/dev/null
if [ $? -ne 0 ]; then
LOG_OUT "Error:【$1】module not found, please check your system depends and try again!"
start_fail
fi
@@ -29,7 +29,6 @@ o = s:option(DynamicList, "chnroute_url", translate("China IPs(chnroute) Update
o:depends("geo2rule", false)
o:value("https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt", translate("gaoyifan/china-operator-ip/china"))
o:value("https://ispip.clang.cn/all_cn.txt", translate("Clang.CN"))
o:value("https://ispip.clang.cn/all_cn_cidr.txt", translate("Clang.CN.CIDR"))
o:value("https://fastly.jsdelivr.net/gh/soffchen/GeoIP2-CN@release/CN-ip-cidr.txt", translate("soffchen/GeoIP2-CN"))
o:value("https://fastly.jsdelivr.net/gh/Hackl0us/GeoIP2-CN@release/CN-ip-cidr.txt", translate("Hackl0us/GeoIP2-CN"))
o:value("https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP_No_IPv6.txt", translate("ios_rule_script/ChinaMax_IP_No_IPv6"))
+2 -2
View File
@@ -5,12 +5,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box
PKG_VERSION:=1.12.11
PKG_VERSION:=1.12.12
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=14f5f106812b9e0c0c91432c1a6dd0b42d8bcd2fcf3789e4ceba0892967ac41e
PKG_HASH:=f08add81eab7e4d6091195179bb39fa3f64dbb0326feaa022994566b702d1245
PKG_LICENSE:=GPL-3.0-or-later
PKG_LICENSE_FILES:=LICENSE
+3 -3
View File
@@ -21,16 +21,16 @@ define Download/geoip
HASH:=c23ac8343e9796f8cc8b670c3aeb6df6d03d4e8914437a409961477f6b226098
endef
GEOSITE_VER:=20251026063608
GEOSITE_VER:=20251027071824
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=a8d4a7ae3b3fb1ece40eb3e5af8618fc7b86fe6f51eeda6efa08a390ed7de16c
HASH:=e31ccd49c4c2b28e83a8124f764f711fa4d444da71c8f74d14958ae991b1e1bb
endef
GEOSITE_IRAN_VER:=202510200041
GEOSITE_IRAN_VER:=202510270042
GEOSITE_IRAN_FILE:=iran.dat.$(GEOSITE_IRAN_VER)
define Download/geosite-ir
URL:=https://github.com/bootmortis/iran-hosted-domains/releases/download/$(GEOSITE_IRAN_VER)/
+3 -2
View File
@@ -8,6 +8,7 @@ from ..utils import (
try_get,
unified_timestamp,
)
from ..utils.traversal import traverse_obj
class URPlayIE(InfoExtractor):
@@ -25,7 +26,7 @@ class URPlayIE(InfoExtractor):
'upload_date': '20171214',
'series': 'UR Samtiden - Livet, universum och rymdens märkliga musik',
'duration': 2269,
'categories': ['Vetenskap & teknik'],
'categories': ['Kultur & historia'],
'tags': ['Kritiskt tänkande', 'Vetenskap', 'Vetenskaplig verksamhet'],
'episode': 'Om vetenskap, kritiskt tänkande och motstånd',
'age_limit': 15,
@@ -78,7 +79,7 @@ class URPlayIE(InfoExtractor):
webpage = self._download_webpage(url, video_id)
urplayer_data = self._search_nextjs_data(webpage, video_id, fatal=False) or {}
if urplayer_data:
urplayer_data = try_get(urplayer_data, lambda x: x['props']['pageProps']['program'], dict)
urplayer_data = traverse_obj(urplayer_data, ('props', 'pageProps', 'productData', {dict}))
if not urplayer_data:
raise ExtractorError('Unable to parse __NEXT_DATA__')
else: