@@ -148,6 +148,8 @@ struct SSConfig {
148148 plugin_opts : Option < String > ,
149149 #[ serde( skip_serializing_if = "Option::is_none" ) ]
150150 plugin_args : Option < Vec < String > > ,
151+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
152+ plugin_mode : Option < String > ,
151153
152154 #[ serde( skip_serializing_if = "Option::is_none" ) ]
153155 timeout : Option < u64 > ,
@@ -326,6 +328,8 @@ struct SSServerExtConfig {
326328 plugin_opts : Option < String > ,
327329 #[ serde( skip_serializing_if = "Option::is_none" ) ]
328330 plugin_args : Option < Vec < String > > ,
331+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
332+ plugin_mode : Option < String > ,
329333
330334 #[ serde( skip_serializing_if = "Option::is_none" ) ]
331335 timeout : Option < u64 > ,
@@ -1646,6 +1650,20 @@ impl Config {
16461650 plugin : p. clone ( ) ,
16471651 plugin_opts : config. plugin_opts . clone ( ) ,
16481652 plugin_args : config. plugin_args . clone ( ) . unwrap_or_default ( ) ,
1653+ plugin_mode : match config. plugin_mode {
1654+ None => Mode :: TcpOnly ,
1655+ Some ( ref mode) => match mode. parse :: < Mode > ( ) {
1656+ Ok ( m) => m,
1657+ Err ( ..) => {
1658+ let e = Error :: new (
1659+ ErrorKind :: Malformed ,
1660+ "malformed `plugin_mode`, must be one of `tcp_only`, `udp_only` and `tcp_and_udp`" ,
1661+ None ,
1662+ ) ;
1663+ return Err ( e) ;
1664+ }
1665+ } ,
1666+ } ,
16491667 } ;
16501668 nsvr. set_plugin ( plugin) ;
16511669 }
@@ -1773,6 +1791,20 @@ impl Config {
17731791 plugin : p,
17741792 plugin_opts : svr. plugin_opts ,
17751793 plugin_args : svr. plugin_args . unwrap_or_default ( ) ,
1794+ plugin_mode : match svr. plugin_mode {
1795+ None => Mode :: TcpOnly ,
1796+ Some ( ref mode) => match mode. parse :: < Mode > ( ) {
1797+ Ok ( m) => m,
1798+ Err ( ..) => {
1799+ let e = Error :: new (
1800+ ErrorKind :: Malformed ,
1801+ "malformed `plugin_mode`, must be one of `tcp_only`, `udp_only` and `tcp_and_udp`" ,
1802+ None ,
1803+ ) ;
1804+ return Err ( e) ;
1805+ }
1806+ } ,
1807+ } ,
17761808 } ;
17771809 nsvr. set_plugin ( plugin) ;
17781810 }
@@ -1889,6 +1921,20 @@ impl Config {
18891921 plugin : p,
18901922 plugin_opts : config. plugin_opts ,
18911923 plugin_args : config. plugin_args . unwrap_or_default ( ) ,
1924+ plugin_mode : match config. plugin_mode {
1925+ None => Mode :: TcpOnly ,
1926+ Some ( ref mode) => match mode. parse :: < Mode > ( ) {
1927+ Ok ( m) => m,
1928+ Err ( ..) => {
1929+ let e = Error :: new (
1930+ ErrorKind :: Malformed ,
1931+ "malformed `plugin_mode`, must be one of `tcp_only`, `udp_only` and `tcp_and_udp`" ,
1932+ None ,
1933+ ) ;
1934+ return Err ( e) ;
1935+ }
1936+ } ,
1937+ } ,
18921938 } ) ;
18931939 }
18941940 }
@@ -2461,6 +2507,13 @@ impl fmt::Display for Config {
24612507 Some ( p. plugin_args . clone ( ) )
24622508 }
24632509 } ) ;
2510+ jconf. plugin_mode = match svr. plugin ( ) {
2511+ None => None ,
2512+ Some ( p) => match p. plugin_mode {
2513+ Mode :: TcpOnly => None ,
2514+ _ => Some ( p. plugin_mode . to_string ( ) ) ,
2515+ } ,
2516+ } ;
24642517 jconf. timeout = svr. timeout ( ) . map ( |t| t. as_secs ( ) ) ;
24652518 jconf. mode = Some ( svr. mode ( ) . to_string ( ) ) ;
24662519
@@ -2510,6 +2563,13 @@ impl fmt::Display for Config {
25102563 Some ( p. plugin_args . clone ( ) )
25112564 }
25122565 } ) ,
2566+ plugin_mode : match svr. plugin ( ) {
2567+ None => None ,
2568+ Some ( p) => match p. plugin_mode {
2569+ Mode :: TcpOnly => None ,
2570+ _ => Some ( p. plugin_mode . to_string ( ) ) ,
2571+ } ,
2572+ } ,
25132573 timeout : svr. timeout ( ) . map ( |t| t. as_secs ( ) ) ,
25142574 remarks : svr. remarks ( ) . map ( ToOwned :: to_owned) ,
25152575 id : svr. id ( ) . map ( ToOwned :: to_owned) ,
0 commit comments