Update On Wed Apr 17 20:28:23 CEST 2024

This commit is contained in:
github-action[bot]
2024-04-17 20:28:24 +02:00
parent 19bc947a74
commit bb1225587c
74 changed files with 3053 additions and 2007 deletions
+1
View File
@@ -619,3 +619,4 @@ Update On Sat Apr 13 20:24:55 CEST 2024
Update On Mon Apr 15 01:03:26 CEST 2024
Update On Mon Apr 15 20:26:48 CEST 2024
Update On Tue Apr 16 20:28:30 CEST 2024
Update On Wed Apr 17 20:28:12 CEST 2024
+2 -2
View File
@@ -6,8 +6,8 @@ After=network.target NetworkManager.service systemd-networkd.service iwd.service
Type=simple
LimitNPROC=500
LimitNOFILE=1000000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE
Restart=always
ExecStartPre=/usr/bin/sleep 2s
ExecStart=/usr/bin/mihomo -d /etc/mihomo
+1 -1
View File
@@ -194,7 +194,7 @@ jobs:
cat > mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/DEBIAN/control <<EOF
Package: mihomo
Version: 1.18.2-${VERSION}
Version: 1.18.4-${VERSION}
Section:
Priority: extra
Architecture: ${ARCH}
+11 -8
View File
@@ -91,10 +91,11 @@ type Inbound struct {
// Controller config
type Controller struct {
ExternalController string `json:"-"`
ExternalControllerTLS string `json:"-"`
ExternalUI string `json:"-"`
Secret string `json:"-"`
ExternalController string `json:"-"`
ExternalControllerTLS string `json:"-"`
ExternalControllerUnix string `json:"-"`
ExternalUI string `json:"-"`
Secret string `json:"-"`
}
// NTP config
@@ -304,6 +305,7 @@ type RawConfig struct {
LogLevel log.LogLevel `yaml:"log-level" json:"log-level"`
IPv6 bool `yaml:"ipv6" json:"ipv6"`
ExternalController string `yaml:"external-controller"`
ExternalControllerUnix string `yaml:"external-controller-unix"`
ExternalControllerTLS string `yaml:"external-controller-tls"`
ExternalUI string `yaml:"external-ui"`
ExternalUIURL string `yaml:"external-ui-url" json:"external-ui-url"`
@@ -678,10 +680,11 @@ func parseGeneral(cfg *RawConfig) (*General, error) {
InboundMPTCP: cfg.InboundMPTCP,
},
Controller: Controller{
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,
Secret: cfg.Secret,
ExternalControllerTLS: cfg.ExternalControllerTLS,
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,
Secret: cfg.Secret,
ExternalControllerUnix: cfg.ExternalControllerUnix,
ExternalControllerTLS: cfg.ExternalControllerTLS,
},
UnifiedDelay: cfg.UnifiedDelay,
Mode: cfg.Mode,
+5 -1
View File
@@ -58,6 +58,11 @@ external-controller: 0.0.0.0:9093 # RESTful API 监听地址
external-controller-tls: 0.0.0.0:9443 # RESTful API HTTPS 监听地址,需要配置 tls 部分配置文件
# secret: "123456" # `Authorization:Bearer ${secret}`
# RESTful API Unix socket 监听地址( windows版本大于17063也可以使用,即大于等于1803/RS4版本即可使用 )
# !!!注意: 从Unix socket访问api接口不会验证secret, 如果开启请自行保证安全问题 !!!
# 测试方法: curl -v --unix-socket "mihomo.sock" http://localhost/
external-controller-unix: mihomo.sock
# tcp-concurrent: true # TCP 并发连接所有 IP, 将使用最快握手的 TCP
# 配置 WEB UI 目录,使用 http://{{external-controller}}/ui 访问
@@ -249,7 +254,6 @@ dns:
# - 'tcp://1.1.1.1#ProxyGroupName' # 指定 DNS 过代理查询,ProxyGroupName 为策略组名或节点名,过代理配置优先于配置出口网卡,当找不到策略组或节点名则设置为出口网卡
# 专用于节点域名解析的 DNS 服务器,非必要配置项
# 配置服务器若查询失败将使用 nameserver,非并发查询
# proxy-server-nameserver:
# - https://dns.google/dns-query
# - tls://one.one.one.one
+10
View File
@@ -21,6 +21,12 @@ func WithExternalController(externalController string) Option {
}
}
func WithExternalControllerUnix(externalControllerUnix string) Option {
return func(cfg *config.Config) {
cfg.General.ExternalControllerUnix = externalControllerUnix
}
}
func WithSecret(secret string) Option {
return func(cfg *config.Config) {
cfg.General.Secret = secret
@@ -47,6 +53,10 @@ func Parse(options ...Option) error {
cfg.General.Secret, cfg.TLS.Certificate, cfg.TLS.PrivateKey, cfg.General.LogLevel == log.DEBUG)
}
if cfg.General.ExternalControllerUnix != "" {
go route.StartUnix(cfg.General.ExternalControllerUnix, cfg.General.LogLevel == log.DEBUG)
}
executor.ApplyConfig(cfg, true)
return nil
}
+52 -13
View File
@@ -7,8 +7,11 @@ import (
"encoding/json"
"net"
"net/http"
"os"
"path/filepath"
"runtime/debug"
"strings"
"syscall"
"time"
"github.com/metacubex/mihomo/adapter/inbound"
@@ -47,15 +50,7 @@ func SetUIPath(path string) {
uiPath = C.Path.Resolve(path)
}
func Start(addr string, tlsAddr string, secret string,
certificat, privateKey string, isDebug bool) {
if serverAddr != "" {
return
}
serverAddr = addr
serverSecret = secret
func router(isDebug bool, withAuth bool) *chi.Mux {
r := chi.NewRouter()
corsM := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
@@ -77,7 +72,9 @@ func Start(addr string, tlsAddr string, secret string,
}())
}
r.Group(func(r chi.Router) {
r.Use(authentication)
if withAuth {
r.Use(authentication)
}
r.Get("/", hello)
r.Get("/logs", getLogs)
r.Get("/traffic", traffic)
@@ -107,10 +104,21 @@ func Start(addr string, tlsAddr string, secret string,
})
})
}
return r
}
func Start(addr string, tlsAddr string, secret string,
certificate, privateKey string, isDebug bool) {
if serverAddr != "" {
return
}
serverAddr = addr
serverSecret = secret
if len(tlsAddr) > 0 {
go func() {
c, err := CN.ParseCert(certificat, privateKey, C.Path)
c, err := CN.ParseCert(certificate, privateKey, C.Path)
if err != nil {
log.Errorln("External controller tls listen error: %s", err)
return
@@ -125,7 +133,7 @@ func Start(addr string, tlsAddr string, secret string,
serverAddr = l.Addr().String()
log.Infoln("RESTful API tls listening at: %s", serverAddr)
tlsServe := &http.Server{
Handler: r,
Handler: router(isDebug, true),
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{c},
},
@@ -144,12 +152,43 @@ func Start(addr string, tlsAddr string, secret string,
serverAddr = l.Addr().String()
log.Infoln("RESTful API listening at: %s", serverAddr)
if err = http.Serve(l, r); err != nil {
if err = http.Serve(l, router(isDebug, true)); err != nil {
log.Errorln("External controller serve error: %s", err)
}
}
func StartUnix(addr string, isDebug bool) {
dir := filepath.Dir(addr)
if _, err := os.Stat(dir); os.IsNotExist(err) {
if err := os.MkdirAll(dir, 0o755); err != nil {
log.Errorln("External controller unix listen error: %s", err)
return
}
}
// https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
//
// Note: As mentioned above in the security section, when a socket binds a socket to a valid pathname address,
// a socket file is created within the filesystem. On Linux, the application is expected to unlink
// (see the notes section in the man page for AF_UNIX) before any other socket can be bound to the same address.
// The same applies to Windows unix sockets, except that, DeleteFile (or any other file delete API)
// should be used to delete the socket file prior to calling bind with the same path.
_ = syscall.Unlink(addr)
l, err := inbound.Listen("unix", addr)
if err != nil {
log.Errorln("External controller unix listen error: %s", err)
return
}
serverAddr = l.Addr().String()
log.Infoln("RESTful API unix listening at: %s", serverAddr)
if err = http.Serve(l, router(isDebug, false)); err != nil {
log.Errorln("External controller unix serve error: %s", err)
}
}
func setPrivateNetworkAccess(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" {
+15 -10
View File
@@ -23,16 +23,17 @@ import (
)
var (
version bool
testConfig bool
geodataMode bool
homeDir string
configFile string
externalUI string
externalController string
secret string
updateGeoMux sync.Mutex
updatingGeo = false
version bool
testConfig bool
geodataMode bool
homeDir string
configFile string
externalUI string
externalController string
externalControllerUnix string
secret string
updateGeoMux sync.Mutex
updatingGeo = false
)
func init() {
@@ -40,6 +41,7 @@ func init() {
flag.StringVar(&configFile, "f", os.Getenv("CLASH_CONFIG_FILE"), "specify configuration file")
flag.StringVar(&externalUI, "ext-ui", os.Getenv("CLASH_OVERRIDE_EXTERNAL_UI_DIR"), "override external ui directory")
flag.StringVar(&externalController, "ext-ctl", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER"), "override external controller address")
flag.StringVar(&externalControllerUnix, "ext-ctl-unix", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER_UNIX"), "override external controller unix address")
flag.StringVar(&secret, "secret", os.Getenv("CLASH_OVERRIDE_SECRET"), "override secret for RESTful API")
flag.BoolVar(&geodataMode, "m", false, "set geodata mode")
flag.BoolVar(&version, "v", false, "show current version of mihomo")
@@ -102,6 +104,9 @@ func main() {
if externalController != "" {
options = append(options, hub.WithExternalController(externalController))
}
if externalControllerUnix != "" {
options = append(options, hub.WithExternalControllerUnix(externalControllerUnix))
}
if secret != "" {
options = append(options, hub.WithSecret(secret))
}
+4 -4
View File
@@ -5008,18 +5008,18 @@ dependencies = [
[[package]]
name = "serde"
version = "1.0.197"
version = "1.0.198"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.197"
version = "1.0.198"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
dependencies = [
"proc-macro2",
"quote",
@@ -1,6 +1,10 @@
import useSWR from "swr";
import { clash } from "../service/clash";
/**
* useClash with swr.
* Data from tauri backend.
*/
export const useClash = () => {
const { setConfigs, setProxies, deleteConnections, ...api } = clash();
@@ -1,17 +1,22 @@
import useSWR from "swr";
import { nyanpasuConfig, VergeConfig } from "@/service";
import { getNyanpasuConfig, patchNyanpasuConfig, VergeConfig } from "@/service";
/**
* useNyanpasu with swr.
* Data from tauri backend.
*/
export const useNyanpasu = (options?: {
onUpdate?: (data?: VergeConfig) => void;
onError?: (error: any) => void;
}) => {
const { data, error, mutate } = useSWR<VergeConfig>("nyanpasuConfig", () =>
nyanpasuConfig.get(),
const { data, error, mutate } = useSWR<VergeConfig>(
"nyanpasuConfig",
getNyanpasuConfig,
);
const setNyanpasuConfig = async (payload: Partial<VergeConfig>) => {
try {
await nyanpasuConfig.set(payload);
await patchNyanpasuConfig(payload);
const result = await mutate();
@@ -1,14 +1,12 @@
import { invoke } from "@tauri-apps/api/tauri";
import { ClashInfo, VergeConfig } from "./types";
export const nyanpasuConfig = {
get: async () => {
return await invoke<VergeConfig>("get_verge_config");
},
export const getNyanpasuConfig = async () => {
return await invoke<VergeConfig>("get_verge_config");
};
set: async (payload: VergeConfig) => {
return await invoke<void>("patch_verge_config", { payload });
},
export const patchNyanpasuConfig = async (payload: VergeConfig) => {
return await invoke<void>("patch_verge_config", { payload });
};
export const getClashInfo = async () => {
@@ -14,8 +14,9 @@
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"declaration": true,
"composite": true,
"paths": {
"@/*": ["./*"],
},
@@ -41,28 +41,22 @@ export const useCustomTheme = () => {
const [mode, setMode] = useRecoilState(atomThemeMode);
appWindow.onThemeChanged((e) => {
setMode(e.payload);
});
useEffect(() => {
const themeMode = ["light", "dark", "system"].includes(
nyanpasuConfig?.theme_mode,
)
? nyanpasuConfig?.theme_mode
: "light";
const handleThemeChange = (mode: "light" | "dark" | "system") => {
if (mode !== "system") {
setMode(themeMode);
return;
}
if (nyanpasuConfig?.theme_mode === "system") {
appWindow.theme().then((m) => m && setMode(m));
};
const unlisten = appWindow.onThemeChanged((e) => {
handleThemeChange(e.payload);
});
return;
}
return () => {
unlisten.then((fn) => fn());
};
if (nyanpasuConfig?.theme_mode) {
setMode(nyanpasuConfig?.theme_mode);
} else {
setMode("light");
}
}, [nyanpasuConfig?.theme_mode]);
const theme = useMemo(() => {
@@ -22,4 +22,5 @@
},
},
"include": ["./src"],
"references": [{ "path": "../interface/tsconfig.json" }],
}
@@ -0,0 +1,29 @@
import { ReactNode } from "react";
import { ErrorBoundary, FallbackProps } from "react-error-boundary";
function ErrorFallback({ error }: FallbackProps) {
return (
<div role="alert" style={{ padding: 16 }}>
<h4>Something went wrong:(</h4>
<pre>{error.message}</pre>
<details title="Error Stack">
<summary>Error Stack</summary>
<pre>{error.stack}</pre>
</details>
</div>
);
}
interface Props {
children?: ReactNode;
}
export const BaseErrorBoundary = (props: Props) => {
return (
<ErrorBoundary FallbackComponent={ErrorFallback}>
{props.children}
</ErrorBoundary>
);
};
@@ -0,0 +1,58 @@
import { ReactNode, FC, CSSProperties, memo } from "react";
import Typography from "@mui/material/Typography";
import { BaseErrorBoundary } from "./baseErrorBoundary";
import "./style.scss";
interface Props {
title?: ReactNode;
header?: ReactNode;
contentStyle?: CSSProperties;
sectionStyle?: CSSProperties;
full?: boolean;
children?: ReactNode;
}
const Header: FC<{ title?: ReactNode; header?: ReactNode }> = memo(
function Header({
title,
header,
}: {
title?: ReactNode;
header?: ReactNode;
}) {
return (
<header style={{ userSelect: "none" }} data-windrag>
<Typography variant="h4" component="h1" fontWeight={500} data-windrag>
{title}
</Typography>
{header}
</header>
);
},
);
export const BasePage: FC<Props> = ({
title,
header,
contentStyle,
sectionStyle,
full,
children,
}) => {
return (
<BaseErrorBoundary>
<div className="MDYBasePage" data-windrag>
<Header title={title} header={header} />
<div className={`MDYBasePage-container ${full ? "no-padding" : ""}`}>
<section style={sectionStyle}>
<div className="MDYBasePage-content" style={contentStyle}>
{children}
</div>
</section>
</div>
</div>
</BaseErrorBoundary>
);
};
@@ -0,0 +1,50 @@
.MDYBasePage {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
> header {
box-sizing: border-box;
display: flex;
flex: 0 0 64px;
align-items: center;
justify-content: space-between;
width: 100%;
margin: 0 auto;
}
.MDYBasePage-container {
height: 100%;
overflow: hidden;
border-radius: var(--border-radius);
> section {
position: relative;
box-sizing: border-box;
flex: 1 1 100%;
width: 100%;
height: 100%;
overflow: auto;
background-color: var(--background-color);
scrollbar-gutter: stable;
.MDYBasePage-content {
width: calc(100% - 28px * 2);
padding: 28px;
margin: 0 auto;
}
}
&.no-padding {
> section {
overflow: visible;
.MDYBasePage-content {
width: 100%;
padding: 0;
}
}
}
}
}
@@ -0,0 +1 @@
export * from "./basePage";
@@ -1,9 +1,11 @@
import createTheme from "@mui/material/styles/createTheme";
import createPalette from "@mui/material/styles/createPalette";
import {
argbFromHex,
hexFromArgb,
themeFromSourceColor,
} from "@material/material-color-utilities";
import { MuiButton, MuiButtonGroup, MuiPaper } from "./themeComponents";
interface ThemeSchema {
primary_color: string;
@@ -25,27 +27,32 @@ export const createMDYTheme = (
argbFromHex(themeSchema.primary_color),
);
return createTheme({
palette: {
mode,
primary: {
main: hexFromArgb(materialColor.schemes[mode].primary),
},
secondary: {
main: hexFromArgb(materialColor.schemes[mode].secondary),
},
error: {
main: hexFromArgb(materialColor.schemes[mode].error),
},
text: {
primary: hexFromArgb(materialColor.schemes[mode].onPrimaryContainer),
secondary: hexFromArgb(
materialColor.schemes[mode].onSecondaryContainer,
),
},
const palette = createPalette({
mode,
primary: {
main: hexFromArgb(materialColor.schemes[mode].primary),
},
secondary: {
main: hexFromArgb(materialColor.schemes[mode].secondary),
},
error: {
main: hexFromArgb(materialColor.schemes[mode].error),
},
text: {
primary: hexFromArgb(materialColor.schemes[mode].onPrimaryContainer),
secondary: hexFromArgb(materialColor.schemes[mode].onSecondaryContainer),
},
});
return createTheme({
palette,
typography: {
fontFamily: themeSchema?.font_family,
},
components: {
MuiButton,
MuiButtonGroup,
MuiPaper,
},
});
};
@@ -1 +1,2 @@
export * from "./createTheme";
export * from "./components";
@@ -0,0 +1,10 @@
import { Theme } from "@mui/material";
import { Components } from "@mui/material/styles/components";
export const MuiButton: Components<Theme>["MuiButton"] = {
styleOverrides: {
root: {
borderRadius: "48px",
},
},
};
@@ -0,0 +1,42 @@
import { Theme } from "@mui/material";
import { Components } from "@mui/material/styles/components";
export const MuiButtonGroup: Components<Theme>["MuiButtonGroup"] = {
styleOverrides: {
grouped: {
fontWeight: 700,
},
firstButton: {
borderTopLeftRadius: 48,
borderBottomLeftRadius: 48,
"&.MuiButton-sizeSmall": {
paddingLeft: "14px",
},
"&.MuiButton-sizeMedium": {
paddingLeft: "20px",
},
"&.MuiButton-sizeLarge": {
paddingLeft: "26px",
},
},
lastButton: {
borderTopRightRadius: 48,
borderBottomRightRadius: 48,
"&.MuiButton-sizeSmall": {
paddingRight: "14px",
},
"&.MuiButton-sizeMedium": {
paddingRight: "20px",
},
"&.MuiButton-sizeLarge": {
paddingRight: "26px",
},
},
},
};
@@ -0,0 +1,12 @@
import { Theme } from "@mui/material";
import { Components } from "@mui/material/styles/components";
export const MuiPaper: Components<Theme>["MuiPaper"] = {
defaultProps: {
sx: {
borderRadius: 6,
padding: 1,
elevation: 2,
},
},
};
@@ -0,0 +1,3 @@
export * from "./MuiButton";
export * from "./MuiButtonGroup";
export * from "./MuiPaper";
+7 -1
View File
@@ -5,6 +5,12 @@
"module": "index.ts",
"dependencies": {
"@material/material-color-utilities": "0.2.7",
"@mui/material": "5.15.15"
"@mui/material": "5.15.15",
"@types/react": "18.2.79",
"react": "18.2.0",
"react-error-boundary": "4.0.13"
},
"devDependencies": {
"sass": "1.75.0"
}
}
+2 -1
View File
@@ -14,8 +14,9 @@
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"declaration": true,
"composite": true,
"paths": {
"@/*": ["./*"],
},
+13
View File
@@ -295,6 +295,19 @@ importers:
'@mui/material':
specifier: 5.15.15
version: 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.2.0)
'@types/react':
specifier: 18.2.79
version: 18.2.79
react:
specifier: 18.2.0
version: 18.2.0
react-error-boundary:
specifier: 4.0.13
version: 4.0.13(react@18.2.0)
devDependencies:
sass:
specifier: 1.75.0
version: 1.75.0
scripts:
dependencies:
+1 -1
View File
@@ -49,7 +49,7 @@ jobs:
- uses: pnpm/action-setup@v3
name: Install pnpm
with:
version: 8
version: 9
run_install: false
- name: Pnpm install and check
+1 -1
View File
@@ -46,7 +46,7 @@ jobs:
- uses: pnpm/action-setup@v3
name: Install pnpm
with:
version: 8
version: 9
run_install: false
- name: Pnpm install and check
+2 -1
View File
@@ -32,7 +32,8 @@
"dayjs": "1.11.5",
"i18next": "^23.7.16",
"lodash-es": "^4.17.21",
"monaco-editor": "^0.34.1",
"monaco-editor": "^0.47.0",
"monaco-yaml": "^5.1.1",
"nanoid": "^5.0.4",
"react": "^18.2.0",
"react-dom": "^18.2.0",
+2259 -1747
View File
File diff suppressed because it is too large Load Diff
+10 -10
View File
@@ -14,25 +14,25 @@ rules:
pub const ITEM_MERGE: &str = "# Merge Template for clash verge
# The `Merge` format used to enhance profile
prepend-rules:
prepend-rules: []
prepend-rule-providers:
prepend-rule-providers: {}
prepend-proxies:
prepend-proxies: []
prepend-proxy-providers:
prepend-proxy-providers: {}
prepend-proxy-groups:
prepend-proxy-groups: []
append-rules:
append-rules: []
append-rule-providers:
append-rule-providers: {}
append-proxies:
append-proxies: []
append-proxy-providers:
append-proxy-providers: {}
append-proxy-groups:
append-proxy-groups: []
";
/// enhanced profile
@@ -3,8 +3,8 @@ import { forwardRef, useImperativeHandle, useState } from "react";
import { useLockFn } from "ahooks";
import { Box, Button, Snackbar } from "@mui/material";
import { deleteConnection } from "@/services/api";
import { truncateStr } from "@/utils/truncate-str";
import parseTraffic from "@/utils/parse-traffic";
import { t } from "i18next";
export interface ConnectionDetailRef {
open: (detail: IConnectionsItem) => void;
@@ -69,7 +69,9 @@ const InnerConnectionDetail = ({ data, onClose }: InnerProps) => {
{ label: "Rule", value: rule },
{
label: "Process",
value: truncateStr(metadata.process || metadata.processPath),
value: `${metadata.process}${
metadata.processPath ? `(${metadata.processPath})` : ""
}`,
},
{ label: "Time", value: dayjs(data.start).fromNow() },
{ label: "Source", value: `${metadata.sourceIP}:${metadata.sourcePort}` },
@@ -96,7 +98,7 @@ const InnerConnectionDetail = ({ data, onClose }: InnerProps) => {
onClose?.();
}}
>
Close
{t("Close")}
</Button>
</Box>
</Box>
@@ -12,23 +12,39 @@ import {
import { atomThemeMode } from "@/services/states";
import { readProfileFile, saveProfileFile } from "@/services/cmds";
import { Notice } from "@/components/base";
import { nanoid } from "nanoid";
import "monaco-editor/esm/vs/basic-languages/javascript/javascript.contribution.js";
import "monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution.js";
import "monaco-editor/esm/vs/editor/contrib/folding/browser/folding.js";
import * as monaco from "monaco-editor";
import { editor } from "monaco-editor/esm/vs/editor/editor.api";
import { configureMonacoYaml } from "monaco-yaml";
interface Props {
uid: string;
open: boolean;
mode: "yaml" | "javascript";
language: "yaml" | "javascript";
schema?: "clash" | "merge";
onClose: () => void;
onChange?: () => void;
}
export const EditorViewer = (props: Props) => {
const { uid, open, mode, onClose, onChange } = props;
// yaml worker
configureMonacoYaml(monaco, {
validate: true,
enableSchemaRequest: true,
schemas: [
{
uri: "https://fastly.jsdelivr.net/gh/dongchengjie/meta-json-schema@main/schemas/meta-json-schema.json",
fileMatch: ["**/*.clash.yaml"],
},
{
uri: "https://fastly.jsdelivr.net/gh/dongchengjie/meta-json-schema@main/schemas/clash-verge-merge-json-schema.json",
fileMatch: ["**/*.merge.yaml"],
},
],
});
export const EditorViewer = (props: Props) => {
const { uid, open, language, schema, onClose, onChange } = props;
const { t } = useTranslation();
const editorRef = useRef<any>();
const instanceRef = useRef<editor.IStandaloneCodeEditor | null>(null);
@@ -41,13 +57,21 @@ export const EditorViewer = (props: Props) => {
const dom = editorRef.current;
if (!dom) return;
if (instanceRef.current) instanceRef.current.dispose();
const uri = monaco.Uri.parse(`${nanoid()}.${schema}.${language}`);
const model = monaco.editor.createModel(data, language, uri);
instanceRef.current = editor.create(editorRef.current, {
value: data,
language: mode,
model: model,
language: language,
theme: themeMode === "light" ? "vs" : "vs-dark",
minimap: { enabled: false },
minimap: { enabled: dom.clientWidth >= 1000 }, // 超过一定宽度显示minimap滚动条
quickSuggestions: {
strings: true, // 字符串类型的建议
comments: true, // 注释类型的建议
other: true, // 其他类型的建议
},
});
});
@@ -77,8 +101,10 @@ export const EditorViewer = (props: Props) => {
<Dialog open={open} onClose={onClose} maxWidth="xl" fullWidth>
<DialogTitle>{t("Edit File")}</DialogTitle>
<DialogContent sx={{ width: "95%", pb: 1, userSelect: "text" }}>
<div style={{ width: "100%", height: "500px" }} ref={editorRef} />
<DialogContent
sx={{ width: "95%", height: "100vh", pb: 1, userSelect: "text" }}
>
<div style={{ width: "100%", height: "100%" }} ref={editorRef} />
</DialogContent>
<DialogActions>
@@ -386,7 +386,8 @@ export const ProfileItem = (props: Props) => {
<EditorViewer
uid={uid}
open={fileOpen}
mode="yaml"
language="yaml"
schema="clash"
onClose={() => setFileOpen(false)}
/>
<ConfirmViewer
@@ -235,7 +235,8 @@ export const ProfileMore = (props: Props) => {
<EditorViewer
uid={uid}
open={fileOpen}
mode={type === "merge" ? "yaml" : "javascript"}
language={type === "merge" ? "yaml" : "javascript"}
schema={type === "merge" ? "merge" : undefined}
onClose={() => setFileOpen(false)}
/>
<ConfirmViewer
+1
View File
@@ -29,6 +29,7 @@
"New": "New",
"Create Profile": "Create Profile",
"Choose File": "Choose File",
"Close": "Close",
"Close All": "Close All",
"Home": "Home",
"Select": "Select",
+1
View File
@@ -29,6 +29,7 @@
"New": "Новый",
"Create Profile": "Создать профиль",
"Choose File": "Выбрать файл",
"Close": "Закрыть",
"Close All": "Закрыть всё",
"Home": "Главная",
"Select": "Выбрать",
+1
View File
@@ -29,6 +29,7 @@
"New": "新建",
"Create Profile": "新建订阅",
"Choose File": "选择文件",
"Close": "关闭",
"Close All": "关闭全部",
"Home": "首页",
"Select": "使用",
+6 -1
View File
@@ -38,7 +38,12 @@ const ConnectionsPage = () => {
const isTableLayout = setting.layout === "table";
const orderOpts: Record<string, OrderFunc> = {
Default: (list) => list,
Default: (list) =>
list.sort(
(a, b) =>
new Date(b.start || "0").getTime()! -
new Date(a.start || "0").getTime()!
),
"Upload Speed": (list) => list.sort((a, b) => b.curUpload! - a.curUpload!),
"Download Speed": (list) =>
list.sort((a, b) => b.curDownload! - a.curDownload!),
+10 -2
View File
@@ -2,7 +2,7 @@ import { defineConfig } from "vite";
import path from "path";
import svgr from "vite-plugin-svgr";
import react from "@vitejs/plugin-react";
import monaco from "vite-plugin-monaco-editor";
import monacoEditor from "vite-plugin-monaco-editor";
// https://vitejs.dev/config/
export default defineConfig({
@@ -11,7 +11,15 @@ export default defineConfig({
plugins: [
svgr(),
react(),
monaco({ languageWorkers: ["editorWorkerService", "typescript"] }),
monacoEditor({
languageWorkers: ["editorWorkerService", "typescript"],
customWorkers: [
{
label: "yaml",
entry: "monaco-yaml/yaml.worker",
},
],
}),
],
build: {
outDir: "../dist",
+12 -4
View File
@@ -21,7 +21,15 @@ jobs:
permissions:
issues: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Generate GitHub Auth Token
# https://github.com/tibdex/github-app-token
id: generate_token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.GH_APP_ID }}
private_key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Generate release changelogs
uses: daeuniverse/changelogs-generator-action@main
@@ -30,7 +38,7 @@ jobs:
# https://github.com/daeuniverse/changelogs-generator-action
previousRelease: ${{ inputs.previous_release_tag }}
futureRelease: ${{ inputs.future_release_tag }}
token: ${{ secrets.GH_TOKEN }}
token: ${{ steps.generate_token.outputs.token }}
- name: Print outputs
shell: bash
@@ -41,9 +49,9 @@ jobs:
if: ${{ inputs.dry_run == 'false' }}
uses: dacbd/create-issue-action@main
with:
token: ${{ secrets.GH_TOKEN }}
token: ${{ steps.generate_token.outputs.token }}
title: '[Release Changelogs] ${{ inputs.future_release_tag }}'
labels: automated-issue,release
assignees: "yqlbu,mzz2017,kunish"
assignees: "sumire88,mzz2017"
body: |
${{ steps.changelog.outputs.changelogs }}
+23 -2
View File
@@ -12,7 +12,8 @@ curl --silent "https://api.github.com/repos/juicity/juicity/releases" | jq -r '.
<!-- BEGIN NEW TOC ENTRY -->
- [v0.4.0 (Latest)](#v040-latest)
- [v0.4.1 (Latest)](#v041-latest)
- [v0.4.0](#v040)
- [v0.3.0](#v030)
- [v0.2.1](#v021)
- [v0.2.0](#v020)
@@ -22,7 +23,27 @@ curl --silent "https://api.github.com/repos/juicity/juicity/releases" | jq -r '.
- [v0.1.0](#v010)
<!-- BEGIN NEW CHANGELOGS -->
### v0.4.0 (Latest)
### v0.4.1 (Latest)
> Release date: 2024/04/16
#### Features
- feat/chore: support to forward to v2ray-plugin nodes in [#145](https://github.com/juicity/juicity/pull/145) by (@mzz2017)
#### Bug Fixes
- fix: add allow_insecore=1 when cert need to pin in [#146](https://github.com/juicity/juicity/pull/146) by (@mzz2017)
#### Others
- chore(changelogs): release-v0.4.0rc1 -> release-v0.4.0 in [#149](https://github.com/juicity/juicity/pull/149) by (@sumire88)
- chore: upgrade quic-go to 0.42.0 and utls to 1.6.4 in [#155](https://github.com/juicity/juicity/pull/155) by (@mzz2017)
- ci(generate-changelogs): update workflow logic in [#156](https://github.com/juicity/juicity/pull/156) by (@sumire88)
**Full Changelog**: https://github.com/juicity/juicity/compare/v0.4.0...v0.4.1
### v0.4.0
> Release date: 2024/02/02
-9
View File
@@ -33,14 +33,6 @@ var (
TimeFormat: time.DateTime,
})
versionCmd = &cobra.Command{
Use: "version",
Short: "Print out version info",
Run: func(cmd *cobra.Command, args []string) {
shared.PrintVersion(cgoEnabled)
},
}
runCmd = &cobra.Command{
Use: "run",
Short: "To run juicity-client in the foreground.",
@@ -177,7 +169,6 @@ func init() {
// cmds
rootCmd.AddCommand(runCmd)
rootCmd.AddCommand(versionCmd)
shared.InitArgumentsFlags(runCmd)
}
+1 -11
View File
@@ -12,19 +12,9 @@ func multiline(parts ...string) string {
return strings.Join(parts, "\n")
}
func PrintVersion(cgoEnabled int) {
fmt.Print(multiline(
fmt.Sprintf("juicity-client version %v", config.Version),
fmt.Sprintf("go runtime %v %v/%v", runtime.Version(), runtime.GOOS, runtime.GOARCH),
fmt.Sprintf("CGO_ENABLED: %v\n", cgoEnabled),
"Copyright (c) 2023 juicity",
"License GNU AGPLv3 <https://github.com/juicity/juicity/blob/main/LICENSE>",
))
}
func GetVersion(cgoEnabled int) string {
return multiline(
fmt.Sprintf("juicity-client version %v", config.Version),
fmt.Sprintf(config.Version),
fmt.Sprintf("go runtime %v %v/%v", runtime.Version(), runtime.GOOS, runtime.GOARCH),
fmt.Sprintf("CGO_ENABLED: %v", cgoEnabled),
"Copyright (c) 2023 juicity",
-9
View File
@@ -22,14 +22,6 @@ var (
TimeFormat: time.DateTime,
})
versionCmd = &cobra.Command{
Use: "version",
Short: "Print out version info",
Run: func(cmd *cobra.Command, args []string) {
shared.PrintVersion(cgoEnabled)
},
}
runCmd = &cobra.Command{
Use: "run",
Short: "To run juicity-server in the foreground.",
@@ -110,7 +102,6 @@ func init() {
// cmds
rootCmd.AddCommand(runCmd)
rootCmd.AddCommand(versionCmd)
// flags
shared.InitArgumentsFlags(runCmd)
+78 -5
View File
@@ -605,6 +605,7 @@ CONFIG_BASE_SMALL=0
# CONFIG_BAYCOM_SER_FDX is not set
# CONFIG_BAYCOM_SER_HDX is not set
# CONFIG_BCACHE is not set
# CONFIG_BCM2712_MIP is not set
# CONFIG_BCM47XX is not set
# CONFIG_BCM54140_PHY is not set
# CONFIG_BCM63XX is not set
@@ -1036,6 +1037,8 @@ CONFIG_CMDLINE=""
# CONFIG_COMMON_CLK_PWM is not set
# CONFIG_COMMON_CLK_PXA is not set
# CONFIG_COMMON_CLK_QCOM is not set
# CONFIG_COMMON_CLK_RP1 is not set
# CONFIG_COMMON_CLK_RP1_SDIO is not set
# CONFIG_COMMON_CLK_RS9_PCIE is not set
# CONFIG_COMMON_CLK_SI514 is not set
# CONFIG_COMMON_CLK_SI5341 is not set
@@ -1147,7 +1150,6 @@ CONFIG_CRYPTO_ALGAPI2=y
# CONFIG_CRYPTO_AUTHENC is not set
# CONFIG_CRYPTO_BLAKE2B is not set
# CONFIG_CRYPTO_BLAKE2B_NEON is not set
# CONFIG_CRYPTO_BLAKE2S is not set
# CONFIG_CRYPTO_BLAKE2S_ARM is not set
# CONFIG_CRYPTO_BLAKE2S_X86 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
@@ -1480,6 +1482,7 @@ CONFIG_DEVPORT=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_DEVTMPFS is not set
# CONFIG_DEVTMPFS_MOUNT is not set
# CONFIG_DEVTMPFS_SAFE is not set
# CONFIG_DEV_DAX is not set
# CONFIG_DGAP is not set
# CONFIG_DGNC is not set
@@ -1725,6 +1728,9 @@ CONFIG_DQL=y
# CONFIG_DRM_RCAR_USE_LVDS is not set
# CONFIG_DRM_RCAR_USE_MIPI_DSI is not set
# CONFIG_DRM_ROCKCHIP is not set
# CONFIG_DRM_RP1_DPI is not set
# CONFIG_DRM_RP1_DSI is not set
# CONFIG_DRM_RP1_VEC is not set
# CONFIG_DRM_SII902X is not set
# CONFIG_DRM_SII9234 is not set
# CONFIG_DRM_SIL_SII8620 is not set
@@ -1750,6 +1756,7 @@ CONFIG_DQL=y
# CONFIG_DRM_TOSHIBA_TC358775 is not set
# CONFIG_DRM_TVE200 is not set
# CONFIG_DRM_UDL is not set
# CONFIG_DRM_V3D is not set
# CONFIG_DRM_VBOXVIDEO is not set
# CONFIG_DRM_VC4_HDMI_CEC is not set
# CONFIG_DRM_VGEM is not set
@@ -1775,6 +1782,7 @@ CONFIG_DUMMY_CONSOLE_ROWS=25
# CONFIG_DVB_ATBM8830 is not set
# CONFIG_DVB_AU8522_DTV is not set
# CONFIG_DVB_AU8522_V4L is not set
# CONFIG_DVB_B2C2_FLEXCOP_PCI is not set
# CONFIG_DVB_B2C2_FLEXCOP_USB is not set
# CONFIG_DVB_BCM3510 is not set
# CONFIG_DVB_CORE is not set
@@ -1789,6 +1797,7 @@ CONFIG_DUMMY_CONSOLE_ROWS=25
# CONFIG_DVB_CXD2820R is not set
# CONFIG_DVB_CXD2841ER is not set
# CONFIG_DVB_CXD2880 is not set
# CONFIG_DVB_DDBRIDGE is not set
# CONFIG_DVB_DEMUX_SECTION_LOSS_LOG is not set
# CONFIG_DVB_DIB3000MB is not set
# CONFIG_DVB_DIB3000MC is not set
@@ -1835,12 +1844,17 @@ CONFIG_DVB_MAX_ADAPTERS=16
# CONFIG_DVB_MXL5XX is not set
# CONFIG_DVB_MXL692 is not set
# CONFIG_DVB_NET is not set
# CONFIG_DVB_NETUP_UNIDVB is not set
# CONFIG_DVB_NGENE is not set
# CONFIG_DVB_NXT200X is not set
# CONFIG_DVB_NXT6000 is not set
# CONFIG_DVB_OR51132 is not set
# CONFIG_DVB_OR51211 is not set
# CONFIG_DVB_PLATFORM_DRIVERS is not set
# CONFIG_DVB_PLL is not set
# CONFIG_DVB_PLUTO2 is not set
# CONFIG_DVB_PT1 is not set
# CONFIG_DVB_PT3 is not set
# CONFIG_DVB_RTL2830 is not set
# CONFIG_DVB_RTL2832 is not set
# CONFIG_DVB_RTL2832_SDR is not set
@@ -2076,6 +2090,7 @@ CONFIG_FB_NOTIFY=y
# CONFIG_FB_PXA is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_RPISENSE is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_S3 is not set
# CONFIG_FB_SAVAGE is not set
@@ -2166,6 +2181,7 @@ CONFIG_FLAT_NODE_MEM_MAP=y
# CONFIG_FORCE_NR_CPUS is not set
CONFIG_FORTIFY_SOURCE=y
# CONFIG_FPGA is not set
# CONFIG_FPROBE is not set
# CONFIG_FRAMEBUFFER_CONSOLE is not set
# CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER is not set
# CONFIG_FRAMEBUFFER_CONSOLE_LEGACY_ACCELERATION is not set
@@ -2174,6 +2190,7 @@ CONFIG_FORTIFY_SOURCE=y
# CONFIG_FRONTSWAP is not set
# CONFIG_FSCACHE is not set
# CONFIG_FSI is not set
# CONFIG_FSL_DPAA2_SWITCH is not set
# CONFIG_FSL_EDMA is not set
# CONFIG_FSL_ENETC is not set
# CONFIG_FSL_ENETC_IERB is not set
@@ -2276,6 +2293,7 @@ CONFIG_GPIOLIB_FASTPATH_LIMIT=512
# CONFIG_GPIO_AMDPT is not set
# CONFIG_GPIO_AMD_FCH is not set
# CONFIG_GPIO_BCM_KONA is not set
# CONFIG_GPIO_BRCMSTB is not set
# CONFIG_GPIO_BT8XX is not set
# CONFIG_GPIO_CADENCE is not set
# CONFIG_GPIO_CASCADE is not set
@@ -2746,6 +2764,7 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2
# CONFIG_IMGPDC_WDT is not set
# CONFIG_IMG_MDC_DMA is not set
# CONFIG_IMX7D_ADC is not set
# CONFIG_IMX8QXP_ADC is not set
# CONFIG_IMX_IPUV3_CORE is not set
# CONFIG_IMX_THERMAL is not set
# CONFIG_INA2XX_ADC is not set
@@ -2816,6 +2835,7 @@ CONFIG_INOTIFY_USER=y
# CONFIG_INPUT_GPIO_ROTARY_ENCODER is not set
# CONFIG_INPUT_GPIO_TILT_POLLED is not set
# CONFIG_INPUT_GPIO_VIBRA is not set
# CONFIG_INPUT_IBM_PANEL is not set
# CONFIG_INPUT_IDEAPAD_SLIDEBAR is not set
# CONFIG_INPUT_IMS_PCU is not set
# CONFIG_INPUT_IQS269A is not set
@@ -2844,6 +2864,7 @@ CONFIG_INPUT_MISC=y
# CONFIG_INPUT_POWERMATE is not set
# CONFIG_INPUT_PWM_BEEPER is not set
# CONFIG_INPUT_PWM_VIBRA is not set
# CONFIG_INPUT_RASPBERRYPI_BUTTON is not set
# CONFIG_INPUT_REGULATOR_HAPTIC is not set
# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set
# CONFIG_INPUT_SPARSEKMAP is not set
@@ -3600,6 +3621,7 @@ CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
# CONFIG_MFD_PM8921_CORE is not set
# CONFIG_MFD_PM8XXX is not set
# CONFIG_MFD_QCOM_PM8008 is not set
# CONFIG_MFD_RASPBERRYPI_POE_HAT is not set
# CONFIG_MFD_RC5T583 is not set
# CONFIG_MFD_RDC321X is not set
# CONFIG_MFD_RETU is not set
@@ -3609,6 +3631,8 @@ CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
# CONFIG_MFD_ROHM_BD71828 is not set
# CONFIG_MFD_ROHM_BD718XX is not set
# CONFIG_MFD_ROHM_BD957XMUF is not set
# CONFIG_MFD_RP1 is not set
# CONFIG_MFD_RPISENSE_CORE is not set
# CONFIG_MFD_RSMU_I2C is not set
# CONFIG_MFD_RSMU_SPI is not set
# CONFIG_MFD_RT4831 is not set
@@ -3721,6 +3745,7 @@ CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y
# CONFIG_MLX5_CORE is not set
# CONFIG_MLX5_EN_MACSEC is not set
# CONFIG_MLX5_SF is not set
# CONFIG_MLX5_VFIO_PCI is not set
# CONFIG_MLX90614 is not set
# CONFIG_MLX90632 is not set
# CONFIG_MLXFW is not set
@@ -4002,6 +4027,7 @@ CONFIG_MTD_SPLIT_FIRMWARE_NAME="firmware"
# CONFIG_MTD_SPLIT_LZMA_FW is not set
# CONFIG_MTD_SPLIT_MINOR_FW is not set
# CONFIG_MTD_SPLIT_SEAMA_FW is not set
# CONFIG_MTD_SPLIT_SEIL_FW is not set
CONFIG_MTD_SPLIT_SQUASHFS_ROOT=y
CONFIG_MTD_SPLIT_SUPPORT=y
# CONFIG_MTD_SPLIT_TPLINK_FW is not set
@@ -4272,15 +4298,12 @@ CONFIG_NET_IPGRE_BROADCAST=y
CONFIG_NET_RX_BUSY_POLL=y
# CONFIG_NET_SB1000 is not set
CONFIG_NET_SCHED=y
# CONFIG_NET_SCH_ATM is not set
# CONFIG_NET_SCH_CAKE is not set
# CONFIG_NET_SCH_CBQ is not set
# CONFIG_NET_SCH_CBS is not set
# CONFIG_NET_SCH_CHOKE is not set
# CONFIG_NET_SCH_CODEL is not set
CONFIG_NET_SCH_DEFAULT=y
# CONFIG_NET_SCH_DRR is not set
# CONFIG_NET_SCH_DSMARK is not set
# CONFIG_NET_SCH_ETF is not set
# CONFIG_NET_SCH_ETS is not set
CONFIG_NET_SCH_FIFO=y
@@ -4337,7 +4360,7 @@ CONFIG_NET_VENDOR_CHELSIO=y
CONFIG_NET_VENDOR_CIRRUS=y
CONFIG_NET_VENDOR_CISCO=y
CONFIG_NET_VENDOR_CORTINA=y
# CONFIG_NET_VENDOR_DAVICOM is not set
CONFIG_NET_VENDOR_DAVICOM=y
CONFIG_NET_VENDOR_DEC=y
CONFIG_NET_VENDOR_DLINK=y
CONFIG_NET_VENDOR_EMULEX=y
@@ -4402,6 +4425,7 @@ CONFIG_NEW_LEDS=y
# CONFIG_NFC is not set
# CONFIG_NFP is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V2 is not set
# CONFIG_NFSD_V2_ACL is not set
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V3_ACL is not set
@@ -4813,6 +4837,7 @@ CONFIG_PCI_SYSCALL=y
# CONFIG_PCNET32 is not set
# CONFIG_PCPU_DEV_REFCNT is not set
# CONFIG_PCSPKR_PLATFORM is not set
# CONFIG_PCS_MTK_USXGMII is not set
# CONFIG_PCS_XPCS is not set
# CONFIG_PD6729 is not set
# CONFIG_PDA_POWER is not set
@@ -4826,7 +4851,9 @@ CONFIG_PCI_SYSCALL=y
# CONFIG_PHANTOM is not set
# CONFIG_PHONET is not set
# CONFIG_PHYLIB is not set
# CONFIG_PHYLIB_LEDS is not set
# CONFIG_PHYS_ADDR_T_64BIT is not set
# CONFIG_PHY_BRCM_USB is not set
# CONFIG_PHY_CADENCE_DP is not set
# CONFIG_PHY_CADENCE_DPHY is not set
# CONFIG_PHY_CADENCE_DPHY_RX is not set
@@ -4845,6 +4872,7 @@ CONFIG_PCI_SYSCALL=y
# CONFIG_PHY_MIXEL_MIPI_DPHY is not set
# CONFIG_PHY_MTK_HDMI is not set
# CONFIG_PHY_MTK_MIPI_DSI is not set
# CONFIG_PHY_MTK_XFI_TPHY is not set
# CONFIG_PHY_MVEBU_CP110_UTMI is not set
# CONFIG_PHY_OCELOT_SERDES is not set
# CONFIG_PHY_PISTACHIO_USB is not set
@@ -4863,6 +4891,7 @@ CONFIG_PINCONF=y
# CONFIG_PINCTRL is not set
# CONFIG_PINCTRL_AMD is not set
# CONFIG_PINCTRL_AXP209 is not set
# CONFIG_PINCTRL_BCM2712 is not set
# CONFIG_PINCTRL_CEDARFORK is not set
# CONFIG_PINCTRL_CY8C95X0 is not set
# CONFIG_PINCTRL_EXYNOS is not set
@@ -4883,6 +4912,7 @@ CONFIG_PINCONF=y
# CONFIG_PINCTRL_MTK_V2 is not set
# CONFIG_PINCTRL_OCELOT is not set
# CONFIG_PINCTRL_PISTACHIO is not set
# CONFIG_PINCTRL_RP1 is not set
# CONFIG_PINCTRL_SC7280 is not set
# CONFIG_PINCTRL_SC8180X is not set
# CONFIG_PINCTRL_SDX55 is not set
@@ -5041,6 +5071,7 @@ CONFIG_PSTORE_DEFAULT_KMSG_BYTES=10240
# CONFIG_PWM_MEDIATEK is not set
# CONFIG_PWM_PCA9685 is not set
# CONFIG_PWM_RASPBERRYPI_POE is not set
# CONFIG_PWM_RP1 is not set
# CONFIG_PWM_XILINX is not set
CONFIG_PWRSEQ_EMMC=y
# CONFIG_PWRSEQ_SD8787 is not set
@@ -5115,6 +5146,7 @@ CONFIG_RANDOM_TRUST_CPU=y
# CONFIG_RANDSTRUCT_NONE is not set
# CONFIG_RAPIDIO is not set
# CONFIG_RAS is not set
# CONFIG_RASPBERRYPI_GPIOMEM is not set
# CONFIG_RBTREE_TEST is not set
# CONFIG_RCU_BOOST is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=60
@@ -5239,6 +5271,7 @@ CONFIG_REISERFS_FS_XATTR=y
# CONFIG_RENESAS_PHY is not set
# CONFIG_RESET_ATH79 is not set
# CONFIG_RESET_BERLIN is not set
# CONFIG_RESET_BRCMSTB is not set
# CONFIG_RESET_BRCMSTB_RESCAL is not set
# CONFIG_RESET_CONTROLLER is not set
# CONFIG_RESET_IMX7 is not set
@@ -5770,6 +5803,7 @@ CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_SENSORS_Q54SJ108A2 is not set
# CONFIG_SENSORS_RM3100_I2C is not set
# CONFIG_SENSORS_RM3100_SPI is not set
# CONFIG_SENSORS_RP1_ADC is not set
# CONFIG_SENSORS_SBRMI is not set
# CONFIG_SENSORS_SBTSI is not set
# CONFIG_SENSORS_SCH5627 is not set
@@ -6012,6 +6046,7 @@ CONFIG_SLUB_CPU_PARTIAL=y
# CONFIG_SND_AZT2320 is not set
# CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BCD2000 is not set
# CONFIG_SND_BCM2835 is not set
# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set
# CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set
@@ -6476,6 +6511,7 @@ CONFIG_SND_X86=y
# CONFIG_SPI_AX88796C is not set
# CONFIG_SPI_AXI_SPI_ENGINE is not set
# CONFIG_SPI_BCM2835 is not set
# CONFIG_SPI_BCM63XX_HSSPI is not set
# CONFIG_SPI_BCM_QSPI is not set
# CONFIG_SPI_BITBANG is not set
# CONFIG_SPI_BUTTERFLY is not set
@@ -6584,6 +6620,7 @@ CONFIG_STDBINUTILS=y
# CONFIG_STMMAC_PCI is not set
# CONFIG_STMMAC_PLATFORM is not set
# CONFIG_STMMAC_SELFTESTS is not set
# CONFIG_STMPE_ADC is not set
# CONFIG_STM_DUMMY is not set
# CONFIG_STM_SOURCE_CONSOLE is not set
CONFIG_STP=y
@@ -6984,6 +7021,8 @@ CONFIG_TRAD_SIGNALS=y
# CONFIG_TRIM_UNUSED_KSYMS is not set
# CONFIG_TRUSTED_FOUNDATIONS is not set
# CONFIG_TRUSTED_KEYS is not set
# CONFIG_TRUSTED_KEYS_CAAM is not set
# CONFIG_TRUSTED_KEYS_TEE is not set
# CONFIG_TRUSTED_KEYS_TPM is not set
# CONFIG_TSL2583 is not set
# CONFIG_TSL2591 is not set
@@ -7035,6 +7074,7 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
# CONFIG_UFS_FS is not set
# CONFIG_UHID is not set
CONFIG_UID16=y
# CONFIG_UIMAGE_FIT_BLK is not set
# CONFIG_UIO is not set
# CONFIG_ULTRA is not set
# CONFIG_ULTRIX_PARTITION is not set
@@ -7078,6 +7118,9 @@ CONFIG_USB_BELKIN=y
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_CDNS3 is not set
# CONFIG_USB_CDNS3_IMX is not set
# CONFIG_USB_CDNS3_PCI_WRAP is not set
# CONFIG_USB_CDNSP_PCI is not set
# CONFIG_USB_CDNS_SUPPORT is not set
# CONFIG_USB_CHAOSKEY is not set
# CONFIG_USB_CHIPIDEA is not set
@@ -7460,6 +7503,8 @@ CONFIG_VDSO=y
# CONFIG_VF610_DAC is not set
# CONFIG_VFAT_FS is not set
# CONFIG_VFIO is not set
# CONFIG_VFIO_FSL_MC is not set
# CONFIG_VFIO_PLATFORM is not set
# CONFIG_VGASTATE is not set
# CONFIG_VGA_ARB is not set
# CONFIG_VGA_CONSOLE is not set
@@ -7489,25 +7534,34 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_AK881X is not set
# CONFIG_VIDEO_AM437X_VPFE is not set
# CONFIG_VIDEO_AR0521 is not set
# CONFIG_VIDEO_ARDUCAM_64MP is not set
# CONFIG_VIDEO_ARDUCAM_PIVARIETY is not set
# CONFIG_VIDEO_ASPEED is not set
# CONFIG_VIDEO_ATMEL_ISC is not set
# CONFIG_VIDEO_ATMEL_ISI is not set
# CONFIG_VIDEO_AU0828 is not set
# CONFIG_VIDEO_BCM2835 is not set
# CONFIG_VIDEO_BCM2835_UNICAM is not set
# CONFIG_VIDEO_BT819 is not set
# CONFIG_VIDEO_BT848 is not set
# CONFIG_VIDEO_BT856 is not set
# CONFIG_VIDEO_BT866 is not set
# CONFIG_VIDEO_BU64754 is not set
# CONFIG_VIDEO_CADENCE is not set
# CONFIG_VIDEO_CADENCE_CSI2RX is not set
# CONFIG_VIDEO_CADENCE_CSI2TX is not set
# CONFIG_VIDEO_CAFE_CCIC is not set
# CONFIG_VIDEO_CAMERA_SENSOR is not set
# CONFIG_VIDEO_CCS is not set
# CONFIG_VIDEO_COBALT is not set
# CONFIG_VIDEO_CODA is not set
# CONFIG_VIDEO_CODEC_BCM2835 is not set
# CONFIG_VIDEO_CS3308 is not set
# CONFIG_VIDEO_CS5345 is not set
# CONFIG_VIDEO_CS53L32A is not set
# CONFIG_VIDEO_CX231XX is not set
# CONFIG_VIDEO_CX2341X is not set
# CONFIG_VIDEO_CX25821 is not set
# CONFIG_VIDEO_CX25840 is not set
# CONFIG_VIDEO_CX88 is not set
# CONFIG_VIDEO_DEV is not set
@@ -7534,17 +7588,22 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_IMX258 is not set
# CONFIG_VIDEO_IMX274 is not set
# CONFIG_VIDEO_IMX290 is not set
# CONFIG_VIDEO_IMX296 is not set
# CONFIG_VIDEO_IMX319 is not set
# CONFIG_VIDEO_IMX334 is not set
# CONFIG_VIDEO_IMX335 is not set
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX477 is not set
# CONFIG_VIDEO_IMX519 is not set
# CONFIG_VIDEO_IMX708 is not set
# CONFIG_VIDEO_IMX8_JPEG is not set
# CONFIG_VIDEO_IMX_MIPI_CSIS is not set
# CONFIG_VIDEO_IMX_PXP is not set
# CONFIG_VIDEO_IRS1125 is not set
# CONFIG_VIDEO_IR_I2C is not set
# CONFIG_VIDEO_ISL7998X is not set
# CONFIG_VIDEO_ISP_BCM2835 is not set
# CONFIG_VIDEO_IVTV is not set
# CONFIG_VIDEO_KS0127 is not set
# CONFIG_VIDEO_LM3560 is not set
@@ -7587,6 +7646,7 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_OV5675 is not set
# CONFIG_VIDEO_OV5693 is not set
# CONFIG_VIDEO_OV5695 is not set
# CONFIG_VIDEO_OV64A40 is not set
# CONFIG_VIDEO_OV6650 is not set
# CONFIG_VIDEO_OV7251 is not set
# CONFIG_VIDEO_OV7640 is not set
@@ -7601,9 +7661,15 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_OV9650 is not set
# CONFIG_VIDEO_OV9734 is not set
# CONFIG_VIDEO_PVRUSB2 is not set
# CONFIG_VIDEO_RASPBERRYPI_PISP_BE is not set
# CONFIG_VIDEO_RCAR_CSI2 is not set
# CONFIG_VIDEO_RCAR_ISP is not set
# CONFIG_VIDEO_RCAR_VIN is not set
# CONFIG_VIDEO_RDACM20 is not set
# CONFIG_VIDEO_RDACM21 is not set
# CONFIG_VIDEO_RJ54N1 is not set
# CONFIG_VIDEO_ROCKCHIP_ISP1 is not set
# CONFIG_VIDEO_RP1_CFE is not set
# CONFIG_VIDEO_S5C73M3 is not set
# CONFIG_VIDEO_S5K4ECGX is not set
# CONFIG_VIDEO_S5K5BAF is not set
@@ -7615,14 +7681,19 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_SAA711X is not set
# CONFIG_VIDEO_SAA7127 is not set
# CONFIG_VIDEO_SAA7134 is not set
# CONFIG_VIDEO_SAA7164 is not set
# CONFIG_VIDEO_SAA717X is not set
# CONFIG_VIDEO_SAA7185 is not set
# CONFIG_VIDEO_SH_MOBILE_CEU is not set
# CONFIG_VIDEO_SMIAPP is not set
# CONFIG_VIDEO_SOLO6X10 is not set
# CONFIG_VIDEO_SONY_BTF_MPX is not set
# CONFIG_VIDEO_SR030PC30 is not set
# CONFIG_VIDEO_STK1160_COMMON is not set
# CONFIG_VIDEO_ST_MIPID02 is not set
# CONFIG_VIDEO_SUN4I_CSI is not set
# CONFIG_VIDEO_SUN6I_CSI is not set
# CONFIG_VIDEO_SUN8I_A83T_MIPI_CSI2 is not set
# CONFIG_VIDEO_TC358743 is not set
# CONFIG_VIDEO_TDA1997X is not set
# CONFIG_VIDEO_TDA7432 is not set
@@ -7639,6 +7710,8 @@ CONFIG_VHOST_MENU=y
# CONFIG_VIDEO_TVP5150 is not set
# CONFIG_VIDEO_TVP7002 is not set
# CONFIG_VIDEO_TW2804 is not set
# CONFIG_VIDEO_TW5864 is not set
# CONFIG_VIDEO_TW68 is not set
# CONFIG_VIDEO_TW9903 is not set
# CONFIG_VIDEO_TW9906 is not set
# CONFIG_VIDEO_TW9910 is not set
+8 -5
View File
@@ -5355,6 +5355,7 @@ CONFIG_RCU_TORTURE_TEST_SLOW_INIT_DELAY=3
# CONFIG_REGULATOR_PV88080 is not set
# CONFIG_REGULATOR_PV88090 is not set
# CONFIG_REGULATOR_PWM is not set
# CONFIG_REGULATOR_QCOM_REFGEN is not set
# CONFIG_REGULATOR_RAA215300 is not set
# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set
# CONFIG_REGULATOR_RT4801 is not set
@@ -6759,6 +6760,7 @@ CONFIG_SSB_POSSIBLE=y
# CONFIG_SSB_SDIOHOST is not set
# CONFIG_SSB_SILENT is not set
# CONFIG_SSFDC is not set
# CONFIG_SSIF_IPMI_BMC is not set
# CONFIG_STACKPROTECTOR is not set
# CONFIG_STACKPROTECTOR_PER_TASK is not set
# CONFIG_STACKPROTECTOR_STRONG is not set
@@ -7227,6 +7229,7 @@ CONFIG_TTY=y
# CONFIG_TYPEC_TCPM is not set
# CONFIG_TYPEC_UCSI is not set
# CONFIG_TYPHOON is not set
# CONFIG_UACCE is not set
# CONFIG_UACCESS_WITH_MEMCPY is not set
# CONFIG_UBIFS_ATIME_SUPPORT is not set
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
@@ -8002,15 +8005,15 @@ CONFIG_WATCHDOG_OPEN_TIMEOUT=0
# CONFIG_WDAT_WDT is not set
# CONFIG_WDTPCI is not set
# CONFIG_WERROR is not set
# CONFIG_WEXT_CORE is not set
# CONFIG_WEXT_PRIV is not set
# CONFIG_WEXT_PROC is not set
# CONFIG_WEXT_SPY is not set
CONFIG_WEXT_CORE=y
CONFIG_WEXT_PRIV=y
CONFIG_WEXT_PROC=y
CONFIG_WEXT_SPY=y
CONFIG_WILINK_PLATFORM_DATA=y
# CONFIG_WIMAX is not set
# CONFIG_WIREGUARD is not set
CONFIG_WIRELESS=y
# CONFIG_WIRELESS_EXT is not set
CONFIG_WIRELESS_EXT=y
# CONFIG_WIRELESS_WDS is not set
# CONFIG_WIZNET_W5100 is not set
# CONFIG_WIZNET_W5300 is not set
+2 -2
View File
@@ -6,8 +6,8 @@ After=network.target NetworkManager.service systemd-networkd.service iwd.service
Type=simple
LimitNPROC=500
LimitNOFILE=1000000
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE
Restart=always
ExecStartPre=/usr/bin/sleep 2s
ExecStart=/usr/bin/mihomo -d /etc/mihomo
+1 -1
View File
@@ -194,7 +194,7 @@ jobs:
cat > mihomo-${{matrix.jobs.goos}}-${{matrix.jobs.output}}-${VERSION}/DEBIAN/control <<EOF
Package: mihomo
Version: 1.18.2-${VERSION}
Version: 1.18.4-${VERSION}
Section:
Priority: extra
Architecture: ${ARCH}
+11 -8
View File
@@ -91,10 +91,11 @@ type Inbound struct {
// Controller config
type Controller struct {
ExternalController string `json:"-"`
ExternalControllerTLS string `json:"-"`
ExternalUI string `json:"-"`
Secret string `json:"-"`
ExternalController string `json:"-"`
ExternalControllerTLS string `json:"-"`
ExternalControllerUnix string `json:"-"`
ExternalUI string `json:"-"`
Secret string `json:"-"`
}
// NTP config
@@ -304,6 +305,7 @@ type RawConfig struct {
LogLevel log.LogLevel `yaml:"log-level" json:"log-level"`
IPv6 bool `yaml:"ipv6" json:"ipv6"`
ExternalController string `yaml:"external-controller"`
ExternalControllerUnix string `yaml:"external-controller-unix"`
ExternalControllerTLS string `yaml:"external-controller-tls"`
ExternalUI string `yaml:"external-ui"`
ExternalUIURL string `yaml:"external-ui-url" json:"external-ui-url"`
@@ -678,10 +680,11 @@ func parseGeneral(cfg *RawConfig) (*General, error) {
InboundMPTCP: cfg.InboundMPTCP,
},
Controller: Controller{
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,
Secret: cfg.Secret,
ExternalControllerTLS: cfg.ExternalControllerTLS,
ExternalController: cfg.ExternalController,
ExternalUI: cfg.ExternalUI,
Secret: cfg.Secret,
ExternalControllerUnix: cfg.ExternalControllerUnix,
ExternalControllerTLS: cfg.ExternalControllerTLS,
},
UnifiedDelay: cfg.UnifiedDelay,
Mode: cfg.Mode,
+5 -1
View File
@@ -58,6 +58,11 @@ external-controller: 0.0.0.0:9093 # RESTful API 监听地址
external-controller-tls: 0.0.0.0:9443 # RESTful API HTTPS 监听地址,需要配置 tls 部分配置文件
# secret: "123456" # `Authorization:Bearer ${secret}`
# RESTful API Unix socket 监听地址( windows版本大于17063也可以使用,即大于等于1803/RS4版本即可使用 )
# !!!注意: 从Unix socket访问api接口不会验证secret, 如果开启请自行保证安全问题 !!!
# 测试方法: curl -v --unix-socket "mihomo.sock" http://localhost/
external-controller-unix: mihomo.sock
# tcp-concurrent: true # TCP 并发连接所有 IP, 将使用最快握手的 TCP
# 配置 WEB UI 目录,使用 http://{{external-controller}}/ui 访问
@@ -249,7 +254,6 @@ dns:
# - 'tcp://1.1.1.1#ProxyGroupName' # 指定 DNS 过代理查询,ProxyGroupName 为策略组名或节点名,过代理配置优先于配置出口网卡,当找不到策略组或节点名则设置为出口网卡
# 专用于节点域名解析的 DNS 服务器,非必要配置项
# 配置服务器若查询失败将使用 nameserver,非并发查询
# proxy-server-nameserver:
# - https://dns.google/dns-query
# - tls://one.one.one.one
+10
View File
@@ -21,6 +21,12 @@ func WithExternalController(externalController string) Option {
}
}
func WithExternalControllerUnix(externalControllerUnix string) Option {
return func(cfg *config.Config) {
cfg.General.ExternalControllerUnix = externalControllerUnix
}
}
func WithSecret(secret string) Option {
return func(cfg *config.Config) {
cfg.General.Secret = secret
@@ -47,6 +53,10 @@ func Parse(options ...Option) error {
cfg.General.Secret, cfg.TLS.Certificate, cfg.TLS.PrivateKey, cfg.General.LogLevel == log.DEBUG)
}
if cfg.General.ExternalControllerUnix != "" {
go route.StartUnix(cfg.General.ExternalControllerUnix, cfg.General.LogLevel == log.DEBUG)
}
executor.ApplyConfig(cfg, true)
return nil
}
+52 -13
View File
@@ -7,8 +7,11 @@ import (
"encoding/json"
"net"
"net/http"
"os"
"path/filepath"
"runtime/debug"
"strings"
"syscall"
"time"
"github.com/metacubex/mihomo/adapter/inbound"
@@ -47,15 +50,7 @@ func SetUIPath(path string) {
uiPath = C.Path.Resolve(path)
}
func Start(addr string, tlsAddr string, secret string,
certificat, privateKey string, isDebug bool) {
if serverAddr != "" {
return
}
serverAddr = addr
serverSecret = secret
func router(isDebug bool, withAuth bool) *chi.Mux {
r := chi.NewRouter()
corsM := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
@@ -77,7 +72,9 @@ func Start(addr string, tlsAddr string, secret string,
}())
}
r.Group(func(r chi.Router) {
r.Use(authentication)
if withAuth {
r.Use(authentication)
}
r.Get("/", hello)
r.Get("/logs", getLogs)
r.Get("/traffic", traffic)
@@ -107,10 +104,21 @@ func Start(addr string, tlsAddr string, secret string,
})
})
}
return r
}
func Start(addr string, tlsAddr string, secret string,
certificate, privateKey string, isDebug bool) {
if serverAddr != "" {
return
}
serverAddr = addr
serverSecret = secret
if len(tlsAddr) > 0 {
go func() {
c, err := CN.ParseCert(certificat, privateKey, C.Path)
c, err := CN.ParseCert(certificate, privateKey, C.Path)
if err != nil {
log.Errorln("External controller tls listen error: %s", err)
return
@@ -125,7 +133,7 @@ func Start(addr string, tlsAddr string, secret string,
serverAddr = l.Addr().String()
log.Infoln("RESTful API tls listening at: %s", serverAddr)
tlsServe := &http.Server{
Handler: r,
Handler: router(isDebug, true),
TLSConfig: &tls.Config{
Certificates: []tls.Certificate{c},
},
@@ -144,12 +152,43 @@ func Start(addr string, tlsAddr string, secret string,
serverAddr = l.Addr().String()
log.Infoln("RESTful API listening at: %s", serverAddr)
if err = http.Serve(l, r); err != nil {
if err = http.Serve(l, router(isDebug, true)); err != nil {
log.Errorln("External controller serve error: %s", err)
}
}
func StartUnix(addr string, isDebug bool) {
dir := filepath.Dir(addr)
if _, err := os.Stat(dir); os.IsNotExist(err) {
if err := os.MkdirAll(dir, 0o755); err != nil {
log.Errorln("External controller unix listen error: %s", err)
return
}
}
// https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/
//
// Note: As mentioned above in the security section, when a socket binds a socket to a valid pathname address,
// a socket file is created within the filesystem. On Linux, the application is expected to unlink
// (see the notes section in the man page for AF_UNIX) before any other socket can be bound to the same address.
// The same applies to Windows unix sockets, except that, DeleteFile (or any other file delete API)
// should be used to delete the socket file prior to calling bind with the same path.
_ = syscall.Unlink(addr)
l, err := inbound.Listen("unix", addr)
if err != nil {
log.Errorln("External controller unix listen error: %s", err)
return
}
serverAddr = l.Addr().String()
log.Infoln("RESTful API unix listening at: %s", serverAddr)
if err = http.Serve(l, router(isDebug, false)); err != nil {
log.Errorln("External controller unix serve error: %s", err)
}
}
func setPrivateNetworkAccess(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodOptions && r.Header.Get("Access-Control-Request-Method") != "" {
+15 -10
View File
@@ -23,16 +23,17 @@ import (
)
var (
version bool
testConfig bool
geodataMode bool
homeDir string
configFile string
externalUI string
externalController string
secret string
updateGeoMux sync.Mutex
updatingGeo = false
version bool
testConfig bool
geodataMode bool
homeDir string
configFile string
externalUI string
externalController string
externalControllerUnix string
secret string
updateGeoMux sync.Mutex
updatingGeo = false
)
func init() {
@@ -40,6 +41,7 @@ func init() {
flag.StringVar(&configFile, "f", os.Getenv("CLASH_CONFIG_FILE"), "specify configuration file")
flag.StringVar(&externalUI, "ext-ui", os.Getenv("CLASH_OVERRIDE_EXTERNAL_UI_DIR"), "override external ui directory")
flag.StringVar(&externalController, "ext-ctl", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER"), "override external controller address")
flag.StringVar(&externalControllerUnix, "ext-ctl-unix", os.Getenv("CLASH_OVERRIDE_EXTERNAL_CONTROLLER_UNIX"), "override external controller unix address")
flag.StringVar(&secret, "secret", os.Getenv("CLASH_OVERRIDE_SECRET"), "override secret for RESTful API")
flag.BoolVar(&geodataMode, "m", false, "set geodata mode")
flag.BoolVar(&version, "v", false, "show current version of mihomo")
@@ -102,6 +104,9 @@ func main() {
if externalController != "" {
options = append(options, hub.WithExternalController(externalController))
}
if externalControllerUnix != "" {
options = append(options, hub.WithExternalControllerUnix(externalControllerUnix))
}
if secret != "" {
options = append(options, hub.WithSecret(secret))
}
File diff suppressed because one or more lines are too long
@@ -3280,6 +3280,7 @@ span[data-tooltip] .label {
.cbi-tooltip {
position: absolute;
z-index: 1000;
top: -1000px;
left: -1000px;
padding: 2px 5px;
transition: opacity .25s ease-out;
+2 -2
View File
@@ -21,13 +21,13 @@ define Download/geoip
HASH:=d4a2e3666139dc98b76f1b0bc7db6b9dd9b35a5d2b0aecb5943e4211c1ebd026
endef
GEOSITE_VER:=20240410101316
GEOSITE_VER:=20240416175239
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:=e74d3da9d4db57fba399f9093ffabbc6630a7cf10965ebcde07725a0f00e24d7
HASH:=2fab74f2b2d47c9c3bdc3031a8a2b4ec32f60fcf43009e525376be852d8bce0a
endef
GEOSITE_IRAN_VER:=202404150255
+3 -3
View File
@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: suyu Discord
url: https://discord.com/invite/suyu
about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed.
- name: suyu chat
url: https://chat.suyu.dev/
about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed.
+3 -3
View File
@@ -1,5 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: suyu Discord
url: https://discord.com/invite/suyu
about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu Discord linked here. Piracy is not allowed.
- name: suyu chat
url: https://chat.suyu.dev/
about: If you are experiencing an issue with suyu, and you need tech support, or if you have a general question, try asking in the official suyu chat linked here. Piracy is not allowed.
+5 -3
View File
@@ -7,7 +7,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
**Note**: We do not support or condone piracy in any form. In order to use suyu, you'll need keys from your real Switch system, and games which you have legally obtained and paid for. We do not intend to make money or profit from this project.
We're in need of developers. Please join our chat below if you want to contribute!
This repo is based on Yuzu EA 4176.
This repo was based on Yuzu EA 4176 but the code is being rewritten from the ground up for legal and performance reasons.
Support the original suyu developer team [here](https://discord.gg/ajz5hdrZ)
<hr />
@@ -19,9 +21,9 @@ This repo is based on Yuzu EA 4176.
<br>
</h1>
<h4 align="center"><b>suyu</b> is the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu.
<h4 align="center"><b>suyu</b> was the continuation of the world's most popular, open-source, Nintendo Switch emulator, yuzu.
<br>
It is written in C++ with portability in mind, and we're actively working on builds for Windows, Linux and Android.
It is written in C++ (C# possibly required soon) with portability in mind, and we're actively working on builds for Windows, Linux and Android along with a custom OS called [suyuos](https://git.suyu.dev/suyu/suyu-os).
</h4>
<p align="center">
@@ -5,7 +5,11 @@ import android.os.Bundle
import android.text.TextUtils
import android.view.View
import androidx.activity.viewModels
import androidx.preference.*
import androidx.preference.CheckBoxPreference
import androidx.preference.EditTextPreference
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequest
import androidx.work.multiprocess.RemoteWorkManager
@@ -173,13 +177,11 @@ class SettingsActivity : BaseActivity() {
override fun onStart() {
super.onStart()
initSharedPreference()
updateMode(settingsStorage.decodeString(AppConfig.PREF_MODE, "VPN"))
localDns?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_LOCAL_DNS_ENABLED, false)
fakeDns?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_FAKE_DNS_ENABLED, false)
localDnsPort?.summary = settingsStorage.decodeString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS)
vpnDns?.summary = settingsStorage.decodeString(AppConfig.PREF_VPN_DNS)?: settingsStorage.decodeString(AppConfig.PREF_REMOTE_DNS)?: AppConfig.DNS_VPN
vpnDns?.summary = settingsStorage.decodeString(AppConfig.PREF_VPN_DNS, AppConfig.DNS_VPN)
updateMux(settingsStorage.getBoolean(AppConfig.PREF_MUX_ENABLED, false))
mux?.isChecked = settingsStorage.getBoolean(AppConfig.PREF_MUX_ENABLED, false)
@@ -200,11 +202,35 @@ class SettingsActivity : BaseActivity() {
httpPort?.summary = settingsStorage.decodeString(AppConfig.PREF_HTTP_PORT, AppConfig.PORT_HTTP)
remoteDns?.summary = settingsStorage.decodeString(AppConfig.PREF_REMOTE_DNS, AppConfig.DNS_PROXY)
domesticDns?.summary = settingsStorage.decodeString(AppConfig.PREF_DOMESTIC_DNS, AppConfig.DNS_DIRECT)
initSharedPreference()
}
private fun initSharedPreference() {
listOf(
localDnsPort,
vpnDns,
muxConcurrency,
muxXudpConcurrency,
fragmentLength,
fragmentInterval,
autoUpdateInterval,
socksPort,
httpPort,
remoteDns,
domesticDns
).forEach { key ->
key?.text = key?.summary.toString()
}
listOf(
AppConfig.PREF_SNIFFING_ENABLED,
).forEach { key ->
findPreference<CheckBoxPreference>(key)?.isChecked =
settingsStorage.decodeBool(key, true)
}
listOf(
AppConfig.PREF_BYPASS_APPS,
AppConfig.PREF_SPEED_ENABLED,
AppConfig.PREF_CONFIRM_REMOVE,
@@ -148,9 +148,7 @@ object Utils {
}
fun getVpnDnsServers(): List<String> {
val vpnDns = settingsStorage?.decodeString(AppConfig.PREF_VPN_DNS)
?: settingsStorage?.decodeString(AppConfig.PREF_REMOTE_DNS)
?: AppConfig.DNS_VPN
val vpnDns = settingsStorage?.decodeString(AppConfig.PREF_VPN_DNS)?:AppConfig.DNS_VPN
return vpnDns.split(",").filter { isPureIpAddress(it) }
// allow empty, in that case dns will use system default
}
@@ -175,9 +175,9 @@
<string name="title_about">О приложении</string>
<string name="title_source_code">Исходный код</string>
<string name="title_tg_channel">Telegram-канал</string>
<string name="title_configuration_backup">Backup configuration</string>
<string name="summary_configuration_backup">Storage location: [%s], The backup will be cleared after uninstalling the app or clearing the storage</string>
<string name="title_configuration_restore">Restore configuration</string>
<string name="title_configuration_backup">Резервирование</string>
<string name="summary_configuration_backup">Путь: [%s]. Резервная копия будет стёрта при удалении приложения или очистке хранилища.</string>
<string name="title_configuration_restore">Восстановление</string>
<string name="title_pref_promotion">Содействие</string>
<string name="summary_pref_promotion">Содействие, нажмите для получения подробной информации (пожертвование может быть удалено)</string>
@@ -222,6 +222,7 @@ func UClient(c net.Conn, config *Config, ctx context.Context, dest net.Destinati
if resp, err = client.Do(req); err != nil {
break
}
defer resp.Body.Close()
req.Header.Set("Referer", req.URL.String())
if body, err = io.ReadAll(resp.Body); err != nil {
break
+8 -8
View File
@@ -21,10 +21,10 @@ commands:
steps:
- run:
command: |
curl -L -O https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.4/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04.tar.xz
tar -C third_party -xvf clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04.tar.xz \
clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/lib/clang/16/include \
clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/{clang,clang++,clang-16,ld.lld,lld,llvm-ar,llvm-ranlib}
curl -L -O https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz
tar -C third_party -xvf clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz \
clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/lib/clang/17/include \
clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/{clang,clang++,clang-17,ld.lld,lld,llvm-ar,llvm-ranlib}
rm -f *.xz
download-toolchain-gcc:
@@ -71,8 +71,8 @@ commands:
steps:
- run:
command: |
export "CC=$PWD/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang"
export "CXX=$PWD/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang++"
export "CC=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang"
export "CXX=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang++"
mkdir build
cd build
cmake -G Ninja -DGUI=on -DBUILD_TESTS=on -DBORINGSSL_BUILD_TESTS=on -DCMAKE_BUILD_TYPE=Release -DUSE_TCMALLOC=on ..
@@ -91,8 +91,8 @@ commands:
steps:
- run:
command: |
export "CC=$PWD/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang"
export "CXX=$PWD/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang++"
export "CC=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang"
export "CXX=$PWD/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang++"
mkdir build
cd build
cmake -G Ninja -DGUI=on -DBUILD_TESTS=on -DBORINGSSL_BUILD_TESTS=on -DCMAKE_BUILD_TYPE=Release -DUSE_LIBCXX=off -DUSE_TCMALLOC=on ..
+17 -17
View File
@@ -158,8 +158,8 @@ jobs:
uses: actions/cache@v4
with:
path: |
third_party/llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64
key: ${{ runner.os }}-mingw64-third_party-llvm-20230614-ucrt
third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64
key: ${{ runner.os }}-mingw64-third_party-llvm-20231128-ucrt
- name: Cache mingw64 curl
id: curl-cache
uses: actions/cache@v4
@@ -195,8 +195,8 @@ jobs:
if: ${{ steps.mingw-cache.outputs.cache-hit != 'true' }}
run: |
pushd third_party
curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20230614/llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64.tar.xz
tar -xf llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64.tar.xz
curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64.tar.xz
tar -xf llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64.tar.xz
rm -vf llvm-mingw-*.xz
popd
- name: "Download dependency: curl"
@@ -212,7 +212,7 @@ jobs:
- name: Build
run: |
./tools/build --variant gui --arch ${{ matrix.arch }} --system mingw -build-test \
--clang-path $PWD/third_party/llvm-mingw-20230614-ucrt-ubuntu-20.04-x86_64 -no-packaging
--clang-path $PWD/third_party/llvm-mingw-20231128-ucrt-ubuntu-20.04-x86_64 -no-packaging
- name: Populate depedencies (Tests-i686)
if: ${{ matrix.arch == 'i686' }}
run: |
@@ -262,13 +262,13 @@ jobs:
# unshallow must come first otherwise submodule may be get unshallowed
git fetch --tags --unshallow
git submodule update --init --depth 1
- name: Cache clang (v16.0.4)
id: clang16-cache
- name: Cache clang (v17.0.6)
id: clang17-cache
uses: actions/cache@v4
with:
path: |
third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04
key: ${{ runner.os }}-toolchain-clang16-v${{ env.CACHE_EPOCH }}
third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04
key: ${{ runner.os }}-toolchain-clang17-v${{ env.CACHE_EPOCH }}
- name: Cache golang
uses: actions/cache@v4
with:
@@ -286,13 +286,13 @@ jobs:
run: |
sudo sed -i 's/azure.archive.ubuntu.com/azure.archive.ubuntu.com/g' /etc/apt/sources.list
sudo apt-get update -qq
- name: "Install dependency: clang 16"
if: ${{ steps.clang16-cache.outputs.cache-hit != 'true' }}
- name: "Install dependency: clang 17"
if: ${{ steps.clang17-cache.outputs.cache-hit != 'true' }}
run: |
curl -L -O https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.4/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04.tar.xz
tar -C third_party -xvf clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04.tar.xz \
clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/lib/clang/16/include \
clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/{clang,clang++,clang-16,ld.lld,lld,llvm-ar,llvm-ranlib}
curl -L -O https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz
tar -C third_party -xvf clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz \
clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/lib/clang/17/include \
clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/{clang,clang++,clang-17,ld.lld,lld,llvm-ar,llvm-ranlib}
rm -f *.xz
- name: Populate depedencies
run: |
@@ -303,8 +303,8 @@ jobs:
- name: Set build options
run: |
if [ "${{ matrix.compiler }}" = "clang" ]; then
echo "CC=${{ github.workspace }}/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang" >> $GITHUB_ENV
echo "CXX=${{ github.workspace }}/third_party/clang+llvm-16.0.4-x86_64-linux-gnu-ubuntu-22.04/bin/clang++" >> $GITHUB_ENV
echo "CC=${{ github.workspace }}/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang" >> $GITHUB_ENV
echo "CXX=${{ github.workspace }}/third_party/clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04/bin/clang++" >> $GITHUB_ENV
fi
if [ "${{ matrix.cxxruntime }}" = "libc++" ]; then
echo build_opts="${{ env.build_opts }} -use-libcxx=1" >> $GITHUB_ENV
+5 -5
View File
@@ -73,8 +73,8 @@ jobs:
uses: actions/cache@v4
with:
path: |
third_party/llvm-mingw-20230614-${{ matrix.variant }}-ubuntu-20.04-x86_64
key: ${{ runner.os }}-mingw64-third_party-llvm-20230614-${{ matrix.variant }}
third_party/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64
key: ${{ runner.os }}-mingw64-third_party-llvm-20231128-${{ matrix.variant }}
- name: Cache mingw64 curl
id: curl-cache
uses: actions/cache@v4
@@ -110,8 +110,8 @@ jobs:
if: ${{ steps.mingw-cache.outputs.cache-hit != 'true' }}
run: |
pushd third_party
curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20230614/llvm-mingw-20230614-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz
tar -xf llvm-mingw-20230614-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz
curl -L -O https://github.com/mstorsjo/llvm-mingw/releases/download/20231128/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz
tar -xf llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64.tar.xz
rm -vf llvm-mingw-*.xz
popd
- name: "Download dependency: curl"
@@ -144,7 +144,7 @@ jobs:
export LC_ALL=en_US.UTF-8
./tools/build --variant gui --arch ${{ matrix.arch }} --system mingw \
-build-test -build-benchmark \
-mingw-dir $PWD/third_party/llvm-mingw-20230614-${{ matrix.variant }}-ubuntu-20.04-x86_64 \
-mingw-dir $PWD/third_party/llvm-mingw-20231128-${{ matrix.variant }}-ubuntu-20.04-x86_64 \
${{ env.BUILD_OPTIONS }}
- name: Populate depedencies (Tests-i686)
if: ${{ matrix.arch == 'i686' }}
+4 -4
View File
@@ -43,7 +43,7 @@ cd yass
* Choose `Add LLVM to System Path`.
Notes: please make sure you have [LLVM][llvm-win64] (16.0 or above).
Notes: please make sure you have [LLVM][llvm-win64] (17.0 or above).
5. Run `x64 Native Tools Command Prompt for VS 2019 (or 2022)` in Start Menu.
@@ -180,7 +180,7 @@ sudo apt-get install -y \
libgtk-3-dev
```
Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (16.0 or above) and [CMake] (3.13 or above).
Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (17.0 or above) and [CMake] (3.13 or above).
For [GCC], cmake argument `-DUSE_LIBCXX=off` should be passed to disable libc++ build under gcc.
@@ -225,7 +225,7 @@ sudo yum install -y \
golang
```
Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (16.0 or above) and [CMake] (3.13 or above).
Notes: please make sure you have [GCC] (7.1 or above) or [Clang] (17.0 or above) and [CMake] (3.13 or above).
For [GCC], cmake argument `-DUSE_LIBCXX=off` should be passed to disable libc++ build under gcc.
@@ -264,7 +264,7 @@ so you can install latest [Clang]:
```
pkg install llvm17-lite
```
Notes: please make sure you have [Clang] (16.0 or above) and [CMake] (3.13 or above).
Notes: please make sure you have [Clang] (17.0 or above) and [CMake] (3.13 or above).
2. Install required dependencies:
```
+1 -1
View File
@@ -444,7 +444,7 @@ option(USE_OLD_SYSTEMD_SERVICE "Install with old systemd service files" OFF)
option(USE_QUICHE "Build with quiche support" ON)
option(USE_IOURING "Build with io uring support" OFF)
option(ENABLE_FORTIFY "Enable build with Fortify Source" ON)
option(ENABLE_FORTIFY "Enable build with Fortify Source (linux only)" OFF)
option(ENABLE_LTO "Enable build with LTO" ON)
option(ENABLE_LLD "Enable build with LLD" ON)
option(ENABLE_GOLD "Enable build with GOLD" ON)
+4
View File
@@ -22,6 +22,10 @@
#include "ios/YassAppDelegate.h"
#include "version.h"
// In iOS, main binary doesn't link to cli_worker which contains pType symbol.
// we need add it manully.
const ProgramType pType = YASS_CLIENT_SLAVE;
int main(int argc, const char** argv) {
SetExecutablePath(argv[0]);
std::string exec_path;
+1 -1
View File
@@ -59,7 +59,7 @@ foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "-stdlib=libc++" "" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
set(libcxx_CR "834e97d73f13a166af65952fb681071eec87a2c4")
set(libcxx_CR "e3b94d0e5b86883fd77696bf10dc33ba250ba99b")
# Fixed libc++ configuration macros are in
# buildtools/third_party/libc++/__config_site. This config only has defines
# that vary depending on gn args, and non-define flags.
+20 -1
View File
@@ -495,8 +495,23 @@ func getLLVMVersion() string {
return llvm_version
}
func getMinGWLLVMVersion(mingwDir string) string {
entries, err := ioutil.ReadDir(filepath.Join(mingwDir, "lib", "clang"))
if err != nil {
glog.Fatalf("%v", err)
}
var llvm_version string
for _, entry := range entries {
llvm_version = entry.Name()
}
if llvm_version == "" {
glog.Fatalf("toolchain not found")
}
return llvm_version
}
func getAndFixMinGWLibunwind(mingwDir string) {
getAndFixLibunwind(fmt.Sprintf("%s/lib/clang/16/lib/windows", mingwDir), "windows")
getAndFixLibunwind(fmt.Sprintf("%s/lib/clang/%s/lib/windows", mingwDir, getMinGWLLVMVersion(mingwDir)), "windows")
}
func getAndFixAndroidLibunwind(ndkDir string) {
@@ -967,6 +982,7 @@ func buildStageGenerateBuildScript() {
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DGCC_TARGET=%s%d", androidAbiTarget, androidApiLevel))
// FIXME patch llvm toolchain to find libunwind.a
getAndFixAndroidLibunwind(androidNdkDir)
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DENABLE_FORTIFY=on"))
}
if systemNameFlag == "harmony" {
@@ -985,6 +1001,7 @@ func buildStageGenerateBuildScript() {
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DOHOS_SDK_NATIVE=%s/native", harmonyNdkDir))
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DLLVM_SYSROOT=%s", clangPath))
getAndFixHarmonyLibunwind()
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DENABLE_FORTIFY=on"))
}
if systemNameFlag == "linux" && sysrootFlag != "" {
@@ -1012,6 +1029,7 @@ func buildStageGenerateBuildScript() {
if subsystem == "" {
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DUSE_TCMALLOC=on"))
}
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DENABLE_FORTIFY=on"))
}
if systemNameFlag == "freebsd" && sysrootFlag != "" {
@@ -1042,6 +1060,7 @@ func buildStageGenerateBuildScript() {
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DGCC_SYSROOT=%s", sysrootFlag))
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DGCC_SYSTEM_PROCESSOR=%s", llvmArch))
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DGCC_TARGET=%s", llvmTarget))
cmakeArgs = append(cmakeArgs, fmt.Sprintf("-DENABLE_FORTIFY=on"))
}
cmakeCmd := append([]string{"cmake", ".."}, cmakeArgs...)
if noConfigureFlag {