From 79eabe4e4cab612fec0930cf8de1a2c46ce34987 Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 17:40:36 +0800 Subject: [PATCH 1/8] feat: add local IP address retrieval and update console address default --- Cargo.lock | 216 +++++++++++++++++++++++---------------- Cargo.toml | 6 +- rustfs/Cargo.toml | 1 + rustfs/src/config/mod.rs | 2 +- rustfs/src/console.rs | 45 +++++--- rustfs/src/main.rs | 53 +++++++--- rustfs/src/utils.rs | 10 ++ 7 files changed, 214 insertions(+), 119 deletions(-) create mode 100644 rustfs/src/utils.rs diff --git a/Cargo.lock b/Cargo.lock index f73fb046d..d80f28300 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -525,9 +525,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" dependencies = [ "serde", ] @@ -631,21 +631,20 @@ dependencies = [ [[package]] name = "bzip2" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b89e7c29231c673a61a46e722602bcd138298f6b9e81e71119693534585f5c" +checksum = "49ecfb22d906f800d4fe833b6282cf4dc1c298f5057ca0b5445e5c209735ca47" dependencies = [ "bzip2-sys", ] [[package]] name = "bzip2-sys" -version = "0.1.12+1.0.8" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ebc2f1a417f01e1da30ef264ee86ae31d2dcd2d603ea283d3c244a883ca2a9" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" dependencies = [ "cc", - "libc", "pkg-config", ] @@ -655,7 +654,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cairo-sys-rs", "glib", "libc", @@ -676,9 +675,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.15" +version = "1.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c736e259eea577f443d5c86c304f9f4ae0295c43f3ba05c21f1d66b5f06001af" +checksum = "be714c154be609ec7f5dad223a33bf1482fff90472de28f7362806e6d4832b8c" dependencies = [ "jobserver", "libc", @@ -803,9 +802,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92b7b18d71fad5313a1e320fa9897994228ce274b60faa4d694fe0ea89cd9e6d" +checksum = "027bb0d98429ae334a8698531da7077bdf906419543a35a55c2cb1b66437d767" dependencies = [ "clap_builder", "clap_derive", @@ -813,9 +812,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.30" +version = "4.5.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35db2071778a7344791a4fb4f95308b5673d219dee3ae348b86642574ecc90c" +checksum = "5589e0cba072e0f3d23791efac0fd8627b49c829c196a492e88168e6a669d863" dependencies = [ "anstream", "anstyle", @@ -863,7 +862,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block", "cocoa-foundation 0.2.0", "core-foundation 0.10.0", @@ -893,7 +892,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block", "core-foundation 0.10.0", "core-graphics-types 0.2.0", @@ -950,9 +949,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.10.0-rc.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ff6be19477a1bd5441f382916a89bc2a0b2c35db6d41e0f6e8538bf6d6463f" +checksum = "1cb3c4a0d3776f7535c32793be81d6d5fec0d48ac70955d9834e643aa249a52f" [[package]] name = "const-serialize" @@ -1081,7 +1080,7 @@ version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-graphics-types 0.2.0", "foreign-types", @@ -1105,7 +1104,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "libc", ] @@ -1152,6 +1151,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crc64fast-nvme" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3" +dependencies = [ + "crc", +] + [[package]] name = "crossbeam-channel" version = "0.5.14" @@ -2036,9 +2044,9 @@ dependencies = [ [[package]] name = "either" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "b7914353092ddf589ad78f25c5c1c21b7f80b0ff8621e7c814c3485b5306da9d" [[package]] name = "encoding_rs" @@ -2187,9 +2195,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.35" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" dependencies = [ "crc32fast", "miniz_oxide", @@ -2567,7 +2575,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "futures-channel", "futures-core", "futures-executor", @@ -2620,7 +2628,7 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b436093d1598b05e3b7fddc097b2bad32763f53a1beb25ab6f9718c6a60acd09" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cocoa 0.25.0", "crossbeam-channel", "keyboard-types", @@ -3386,16 +3394,16 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "serde", "unicode-segmentation", ] [[package]] name = "keyring" -version = "3.6.1" +version = "3.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f8fe839464d4e4b37d756d7e910063696af79a7e877282cb1825e4ec5f10833" +checksum = "1961983669d57bdfe6c0f3ef8e4c229b5ef751afcc7d87e4271d2f71f6ccfa8b" dependencies = [ "byteorder", "dbus-secret-service", @@ -3456,9 +3464,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.169" +version = "0.2.170" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" +checksum = "875b3680cb2f8f71bdcf9a30f38d48282f5d3c95cbf9b3fa57269bb5d5c06828" [[package]] name = "libdbus-sys" @@ -3501,7 +3509,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "libc", ] @@ -3532,9 +3540,21 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "local-ip-address" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3669cf5561f8d27e8fc84cc15e58350e70f557d4d65f70e3154e54cd2f8e1782" +dependencies = [ + "libc", + "neli", + "thiserror 1.0.69", + "windows-sys 0.59.0", +] [[package]] name = "lock" @@ -3827,7 +3847,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "jni-sys", "log", "ndk-sys", @@ -3851,6 +3871,31 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "neli" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9" +dependencies = [ + "byteorder", + "libc", + "log", + "neli-proc-macros", +] + +[[package]] +name = "neli-proc-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe" +dependencies = [ + "either", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", +] + [[package]] name = "netif" version = "0.1.6" @@ -3873,7 +3918,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cfg-if", "cfg_aliases", "libc", @@ -4092,7 +4137,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4108,7 +4153,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5906f93257178e2f7ae069efb89fbd6ee94f0592740b5f8a1512ca498814d0fb" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "objc2 0.6.0", "objc2-core-foundation", "objc2-foundation 0.3.0", @@ -4120,7 +4165,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4132,7 +4177,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daeaf60f25471d26948a1c2f840e3f7d86f4109e3af4e8e4b5cd70c39690d925" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "objc2 0.6.0", ] @@ -4142,7 +4187,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dca602628b65356b6513290a21a6405b4d4027b8b250f0b98dddbb28b7de02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "objc2-core-foundation", ] @@ -4170,7 +4215,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.5.1", "dispatch", "libc", @@ -4183,7 +4228,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.6.0", "objc2 0.6.0", "objc2-core-foundation", @@ -4195,7 +4240,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4207,7 +4252,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4960,8 +5005,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ "rand_chacha 0.9.0", - "rand_core 0.9.1", - "zerocopy 0.8.20", + "rand_core 0.9.3", + "zerocopy 0.8.21", ] [[package]] @@ -4991,7 +5036,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core 0.9.1", + "rand_core 0.9.3", ] [[package]] @@ -5014,12 +5059,11 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.9.1" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88e0da7a2c97baa202165137c158d0a2e824ac465d13d81046727b34cb247d3" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom 0.3.1", - "zerocopy 0.8.20", ] [[package]] @@ -5083,7 +5127,7 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82b568323e98e49e2a0899dcee453dd679fae22d69adf9b11dd508d1549b7e2f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -5265,9 +5309,9 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34b5020fcdea098ef7d95e9f89ec15952123a4a039badd09fabebe9e963e839" +checksum = "da5349ae27d3887ca812fb375b45a4fbb36d8d12d2df394968cd86e35683fe73" dependencies = [ "cc", "cfg-if", @@ -5301,9 +5345,9 @@ dependencies = [ [[package]] name = "rust-embed" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0" +checksum = "0b3aba5104622db5c9fc61098de54708feb732e7763d7faa2fa625899f00bf6f" dependencies = [ "rust-embed-impl", "rust-embed-utils", @@ -5312,9 +5356,9 @@ dependencies = [ [[package]] name = "rust-embed-impl" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478" +checksum = "1f198c73be048d2c5aa8e12f7960ad08443e56fd39cc26336719fdb4ea0ebaae" dependencies = [ "proc-macro2", "quote", @@ -5326,9 +5370,9 @@ dependencies = [ [[package]] name = "rust-embed-utils" -version = "8.5.0" +version = "8.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d" +checksum = "5a2fcdc9f40c8dc2922842ca9add611ad19f332227fc651d015881ad1552bd9a" dependencies = [ "sha2 0.10.8", "walkdir", @@ -5386,6 +5430,7 @@ dependencies = [ "iam", "jsonwebtoken", "lazy_static", + "local-ip-address", "lock", "log", "madmin", @@ -5448,7 +5493,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -5514,7 +5559,6 @@ checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "s3s" version = "0.11.0-dev" -source = "git+https://github.com/Nugine/s3s.git?rev=ab139f72fe768fb9d8cecfe36269451da1ca9779#ab139f72fe768fb9d8cecfe36269451da1ca9779" dependencies = [ "arrayvec", "async-trait", @@ -5525,6 +5569,7 @@ dependencies = [ "chrono", "crc32c", "crc32fast", + "crc64fast-nvme", "digest 0.11.0-pre.9", "futures", "hex-simd", @@ -5561,7 +5606,6 @@ dependencies = [ [[package]] name = "s3s-policy" version = "0.11.0-dev" -source = "git+https://github.com/Nugine/s3s.git?rev=ab139f72fe768fb9d8cecfe36269451da1ca9779#ab139f72fe768fb9d8cecfe36269451da1ca9779" dependencies = [ "indexmap 2.7.1", "serde", @@ -5596,7 +5640,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -5609,7 +5653,7 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.10.0", "core-foundation-sys", "libc", @@ -6179,7 +6223,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6213,7 +6257,7 @@ version = "0.30.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6682a07cf5bab0b8a2bd20d0a542917ab928b5edb75ebd4eda6b05cbaab872da" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "cocoa 0.26.0", "core-foundation 0.10.0", "core-graphics 0.24.0", @@ -6467,9 +6511,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ "rustls", "tokio", @@ -6658,7 +6702,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "bytes", "http", "pin-project-lite", @@ -6942,9 +6986,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d59ca99a559661b96bf898d8fce28ed87935fd2bea9f05983c1464dd6c71b1" +checksum = "e0f540e3240398cce6128b64ba83fdbdd86129c16a3aa1a3a252efd66eb3d587" dependencies = [ "getrandom 0.3.1", "rand 0.9.0", @@ -6954,9 +6998,9 @@ dependencies = [ [[package]] name = "uuid-macro-internal" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be57878a5f7e409a1a82be6691922b11e59687a168205b1f21b087c4acdd194" +checksum = "9521621447c21497fac206ffe6e9f642f977c4f82eeba9201055f64884d9cb01" dependencies = [ "proc-macro2", "quote", @@ -7153,7 +7197,7 @@ version = "0.31.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "rustix", "wayland-backend", "wayland-scanner", @@ -7165,7 +7209,7 @@ version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7687,7 +7731,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.8.0", + "bitflags 2.9.0", ] [[package]] @@ -7938,11 +7982,11 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c" +checksum = "dcf01143b2dd5d134f11f545cf9f1431b13b749695cb33bcce051e7568f99478" dependencies = [ - "zerocopy-derive 0.8.20", + "zerocopy-derive 0.8.21", ] [[package]] @@ -7958,9 +8002,9 @@ dependencies = [ [[package]] name = "zerocopy-derive" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700" +checksum = "712c8386f4f4299382c9abee219bee7084f78fb939d88b6840fcc1320d5f6da2" dependencies = [ "proc-macro2", "quote", @@ -7969,18 +8013,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index b111d405e..a092a687c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -127,4 +127,8 @@ inherits = "dev" [profile.release] opt-level = 3 # Optimization Level (0-3) lto = true # Optimize when linking -codegen-units = 1 # Reduce code generation units to improve optimization \ No newline at end of file +codegen-units = 1 # Reduce code generation units to improve optimization + +[patch."https://github.com/Nugine/s3s.git"] +s3s = { path = "s3s/crates/s3s" } +s3s-policy = { path = "s3s/crates/s3s-policy" } \ No newline at end of file diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index 4097167a7..0c7d7ebbc 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -74,6 +74,7 @@ jsonwebtoken = "9.3.0" tower-http = { version = "0.6.2", features = ["cors"] } mime_guess = "2.0.5" rust-embed = { version = "8.5.0", features = ["interpolate-folder-path"] } +local-ip-address = "0.6.3" [build-dependencies] prost-build.workspace = true diff --git a/rustfs/src/config/mod.rs b/rustfs/src/config/mod.rs index 663dd03e9..cd8f238fd 100644 --- a/rustfs/src/config/mod.rs +++ b/rustfs/src/config/mod.rs @@ -60,6 +60,6 @@ pub struct Opt { #[arg(long, default_value_t = false, env = "RUSTFS_CONSOLE_ENABLE")] pub console_enable: bool, - #[arg(long, default_value_t = format!("127.0.0.1:{}", 0), env = "RUSTFS_CONSOLE_ADDRESS")] + #[arg(long, default_value_t = format!("127.0.0.1:{}", 9002), env = "RUSTFS_CONSOLE_ADDRESS")] pub console_address: String, } diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index 282adbf78..f4e9bb750 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -6,11 +6,13 @@ use axum::{ Router, }; -use const_str::concat; use mime_guess::from_path; use rust_embed::RustEmbed; use serde::Serialize; use shadow_rs::shadow; +use tracing::info; +use std::net::Ipv4Addr; +use std::sync::OnceLock; shadow!(build); @@ -103,19 +105,27 @@ struct License { url: String, } -#[allow(clippy::const_is_empty)] -async fn config_handler(axum::extract::Extension(fs_addr): axum::extract::Extension) -> impl IntoResponse { - let ver = { - if !build::TAG.is_empty() { - build::TAG - } else if !build::SHORT_COMMIT.is_empty() { - concat!("@", build::SHORT_COMMIT) - } else { - build::PKG_VERSION - } - }; +static CONSOLE_CONFIG: OnceLock = OnceLock::new(); - let cfg = Config::new(&fs_addr, ver, build::COMMIT_DATE_3339).to_json(); +fn initialize_config(fs_addr: &str) { + CONSOLE_CONFIG.get_or_init(|| { + let ver = { + if !build::TAG.is_empty() { + build::TAG.to_string() + } else if !build::SHORT_COMMIT.is_empty() { + format!("@{}", build::SHORT_COMMIT) + } else { + build::PKG_VERSION.to_string() + } + }; + + Config::new(fs_addr, ver.as_str(), build::COMMIT_DATE_3339) + }); +} + +#[allow(clippy::const_is_empty)] +async fn config_handler() -> impl IntoResponse { + let cfg = CONSOLE_CONFIG.get().unwrap().to_json(); Response::builder() .header("content-type", "application/json") @@ -124,15 +134,18 @@ async fn config_handler(axum::extract::Extension(fs_addr): axum::extract::Extens .unwrap() } -pub async fn start_static_file_server(addrs: &str, fs_addr: &str) { +pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, server_port: u16) { + let srv_addr = format!("http://{}:{}", local_ip, server_port); + initialize_config(&srv_addr); // 创建路由 let app = Router::new() - .route("/config.json", get(config_handler).layer(axum::extract::Extension(fs_addr.to_owned()))) + .route("/config.json", get(config_handler)) .nest_service("/", get(static_handler)); let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); + let local_addr = listener.local_addr().unwrap(); - println!("console running on: http://{} with s3 api {}", listener.local_addr().unwrap(), fs_addr); + info!("console running on: http://{}:{} with s3 api {}", local_ip, local_addr.port(), srv_addr); axum::serve(listener, app).await.unwrap(); } diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index cfa1a9786..ae1b61734 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -5,6 +5,7 @@ mod console; mod grpc; mod service; mod storage; +mod utils; use crate::auth::IAMAuth; use clap::Parser; use common::{ @@ -42,13 +43,17 @@ use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt}; fn setup_tracing() { use tracing_subscriber::EnvFilter; - let env_filter = EnvFilter::from_default_env(); + let env_filter = EnvFilter::try_from_default_env() + .unwrap_or_else(|_| EnvFilter::new("info")); let enable_color = std::io::stdout().is_terminal(); let subscriber = fmt() - .pretty() + // .pretty() .with_env_filter(env_filter) .with_ansi(enable_color) + // Remove file and line number information from log output + .with_file(false) + .with_line_number(false) .finish() .with(ErrorLayer::default()); @@ -100,13 +105,39 @@ async fn run(opt: config::Opt) -> Result<()> { let listener = TcpListener::bind(server_address.clone()).await?; //获取监听地址 let local_addr: SocketAddr = listener.local_addr()?; + let local_ip = utils::get_local_ip().ok_or(local_addr.ip()).unwrap(); // 用于rpc let (endpoint_pools, setup_type) = EndpointServerPools::from_volumes(server_address.clone().as_str(), opt.volumes.clone()) .map_err(|err| Error::from_string(err.to_string()))?; + // Print RustFS-style logging for pool formatting for (i, eps) in endpoint_pools.as_ref().iter().enumerate() { - debug!( + info!( + "Formatting {}st pool, {} set(s), {} drives per set.", + i + 1, eps.set_count, eps.drives_per_set + ); + + // Add warning for host with multiple drives in a set (similar to RustFS) + if eps.drives_per_set > 1 { + warn!( + "WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable." + ); + } + } + + // Print RustFS-style server information + info!("RustFS Object Storage Server"); + + // Detailed endpoint information (showing all API endpoints) + let api_endpoints = format!("http://{}:{}", local_ip, server_port); + let localhost_endpoint = format!("http://127.0.0.1:{}", server_port); + info!("API: {} {}", api_endpoints, localhost_endpoint); + info!(" RootUser: {}", opt.access_key); + info!(" RootPass: {}", opt.secret_key); + + for (i, eps) in endpoint_pools.as_ref().iter().enumerate() { + info!( "created endpoints {}, set_count:{}, drives_per_set: {}, cmd: {:?}", i, eps.set_count, eps.drives_per_set, eps.cmd_line ); @@ -131,6 +162,7 @@ async fn run(opt: config::Opt) -> Result<()> { //显示info信息 info!("authentication is enabled {}, {}", &opt.access_key, &opt.secret_key); + b.set_auth(IAMAuth::new(opt.access_key, opt.secret_key)); b.set_access(store.clone()); @@ -173,11 +205,10 @@ async fn run(opt: config::Opt) -> Result<()> { let http_server = ConnBuilder::new(TokioExecutor::new()); let mut ctrl_c = std::pin::pin!(tokio::signal::ctrl_c()); let graceful = hyper_util::server::graceful::GracefulShutdown::new(); - println!("server is running at http://{local_addr}"); loop { let (socket, _) = tokio::select! { - res = listener.accept() => { + res = listener.accept() => { match res { Ok(conn) => conn, Err(err) => { @@ -234,18 +265,10 @@ async fn run(opt: config::Opt) -> Result<()> { // init auto heal init_auto_heal().await; - info!("server was started"); - if opt.console_enable { - info!("console is enabled"); + debug!("console is enabled"); tokio::spawn(async move { - let ep = if !opt.server_domains.is_empty() { - format!("http://{}", opt.server_domains[0].clone()) - } else { - format!("http://127.0.0.1:{}", server_port) - }; - - console::start_static_file_server(&opt.console_address, &ep).await; + console::start_static_file_server(&opt.console_address, local_ip, server_port).await; }); } diff --git a/rustfs/src/utils.rs b/rustfs/src/utils.rs new file mode 100644 index 000000000..0ac4ab7a0 --- /dev/null +++ b/rustfs/src/utils.rs @@ -0,0 +1,10 @@ +use local_ip_address; +use std::net::IpAddr; + +pub(crate) fn get_local_ip() -> Option { + match local_ip_address::local_ip() { + Ok(IpAddr::V4(ip)) => Some(ip), + Err(_) => None, + Ok(IpAddr::V6(_)) => todo!() + } +} \ No newline at end of file From 7e59bfa8776de64795bb4fb6d9e6b69ca35fcdc8 Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 18:53:48 +0800 Subject: [PATCH 2/8] feat: add chrono dependency and enhance console configuration with documentation and version info --- Cargo.lock | 1 + rustfs/Cargo.toml | 1 + rustfs/src/console.rs | 36 ++++++++++++++++++++++++++++-------- rustfs/src/main.rs | 37 +++++++++++++++++++++++++++++++------ 4 files changed, 61 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d80f28300..7f70e83c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5414,6 +5414,7 @@ dependencies = [ "atoi", "axum", "bytes", + "chrono", "clap", "common", "const-str", diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index 0c7d7ebbc..b6fa08d15 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -75,6 +75,7 @@ tower-http = { version = "0.6.2", features = ["cors"] } mime_guess = "2.0.5" rust-embed = { version = "8.5.0", features = ["interpolate-folder-path"] } local-ip-address = "0.6.3" +chrono = "0.4" [build-dependencies] prost-build.workspace = true diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index f4e9bb750..6c7d64bdb 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -48,11 +48,12 @@ async fn static_handler(uri: axum::http::Uri) -> impl IntoResponse { } #[derive(Debug, Serialize)] -struct Config { +pub(crate) struct Config { api: Api, s3: S3, release: Release, license: License, + doc: String } impl Config { @@ -73,12 +74,30 @@ impl Config { name: "Apache-2.0".to_string(), url: "https://www.apache.org/licenses/LICENSE-2.0".to_string(), }, + doc: "https://rustfs.com/docs/".to_string() } } fn to_json(&self) -> String { serde_json::to_string(self).unwrap_or_default() } + + pub(crate) fn version(&self) -> String { + format!( + "RELEASE.{} (rust {} {})", + self.release.date.clone(), + build::RUST_VERSION, + build::BUILD_TARGET + ) + } + + pub(crate) fn license(&self) -> String { + format!("{} {}", self.license.name.clone(), self.license.url.clone()) + } + + pub(crate) fn doc(&self) -> String { + self.doc.clone() + } } #[derive(Debug, Serialize)] @@ -105,9 +124,9 @@ struct License { url: String, } -static CONSOLE_CONFIG: OnceLock = OnceLock::new(); +pub(crate) static CONSOLE_CONFIG: OnceLock = OnceLock::new(); -fn initialize_config(fs_addr: &str) { +pub(crate) fn init_console_cfg(fs_addr: &str) { CONSOLE_CONFIG.get_or_init(|| { let ver = { if !build::TAG.is_empty() { @@ -134,9 +153,7 @@ async fn config_handler() -> impl IntoResponse { .unwrap() } -pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, server_port: u16) { - let srv_addr = format!("http://{}:{}", local_ip, server_port); - initialize_config(&srv_addr); +pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, access_key: &str, secret_key: &str) { // 创建路由 let app = Router::new() .route("/config.json", get(config_handler)) @@ -145,7 +162,10 @@ pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, server_po let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); let local_addr = listener.local_addr().unwrap(); - info!("console running on: http://{}:{} with s3 api {}", local_ip, local_addr.port(), srv_addr); - + info!("WebUI: http://{}:{} http://127.0.0.1:{}", + local_ip, local_addr.port(), local_addr.port()); + info!(" RootUser: {}", access_key); + info!(" RootPass: {}", secret_key); + axum::serve(listener, app).await.unwrap(); } diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index ae1b61734..3c2d121c5 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -7,11 +7,13 @@ mod service; mod storage; mod utils; use crate::auth::IAMAuth; +use crate::console::{init_console_cfg, CONSOLE_CONFIG}; use clap::Parser; use common::{ error::{Error, Result}, globals::set_global_addr, }; +use config::{DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY}; use ecstore::heal::background_heal_ops::init_auto_heal; use ecstore::utils::net::{self, get_available_port}; use ecstore::{ @@ -37,6 +39,7 @@ use tokio::net::TcpListener; use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; use tracing::{debug, error, info, warn}; +use chrono::Datelike; use tracing_error::ErrorLayer; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt}; @@ -69,6 +72,16 @@ fn check_auth(req: Request<()>) -> Result, Status> { } } +fn print_server_info() { + let cfg = CONSOLE_CONFIG.get().unwrap(); + let current_year = chrono::Utc::now().year(); + info!("RustFS Object Storage Server"); + info!("Copyright: 2024-{} RustFS, Inc", current_year); + info!("License: {}", cfg.license()); + info!("Version: {}", cfg.version()); + info!("Docs: {}", cfg.doc()) +} + fn main() -> Result<()> { //解析获得到的参数 let opt = config::Opt::parse(); @@ -133,8 +146,8 @@ async fn run(opt: config::Opt) -> Result<()> { let api_endpoints = format!("http://{}:{}", local_ip, server_port); let localhost_endpoint = format!("http://127.0.0.1:{}", server_port); info!("API: {} {}", api_endpoints, localhost_endpoint); - info!(" RootUser: {}", opt.access_key); - info!(" RootPass: {}", opt.secret_key); + info!(" RootUser: {}", opt.access_key.clone()); + info!(" RootPass: {}", opt.secret_key.clone()); for (i, eps) in endpoint_pools.as_ref().iter().enumerate() { info!( @@ -160,10 +173,12 @@ async fn run(opt: config::Opt) -> Result<()> { // let mut b = S3ServiceBuilder::new(storage::ecfs::FS::new(server_address.clone(), endpoint_pools).await?); let mut b = S3ServiceBuilder::new(store.clone()); + let access_key = opt.access_key.clone(); + let secret_key = opt.secret_key.clone(); //显示info信息 - info!("authentication is enabled {}, {}", &opt.access_key, &opt.secret_key); + debug!("authentication is enabled {}, {}", &access_key, &secret_key); - b.set_auth(IAMAuth::new(opt.access_key, opt.secret_key)); + b.set_auth(IAMAuth::new(access_key, secret_key)); b.set_access(store.clone()); @@ -251,7 +266,7 @@ async fn run(opt: config::Opt) -> Result<()> { error!("ECStore init faild {:?}", &err); Error::from_string(err.to_string()) })?; - warn!(" init store success!"); + debug!("init store success!"); init_iam_sys(store.clone()).await.unwrap(); @@ -265,10 +280,20 @@ async fn run(opt: config::Opt) -> Result<()> { // init auto heal init_auto_heal().await; + let srv_addr = format!("http://{}:{}", local_ip, server_port); + init_console_cfg(&srv_addr); + print_server_info(); + if DEFAULT_ACCESS_KEY.eq(&opt.access_key) && DEFAULT_SECRET_KEY.eq(&opt.secret_key) { + warn!("Detected default credentials '{}:{}', we recommend that you change these values with 'RUSTFS_ACCESS_KEY' and 'RUSTFS_SECRET_KEY' environment variables", DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY); + } + if opt.console_enable { debug!("console is enabled"); + let access_key = opt.access_key.clone(); + let secret_key = opt.secret_key.clone(); + let console_address = opt.console_address.clone(); tokio::spawn(async move { - console::start_static_file_server(&opt.console_address, local_ip, server_port).await; + console::start_static_file_server(&console_address, local_ip, &access_key, &secret_key).await; }); } From 145bb6ac7c466d4a15976ffcf2553ad05a451875 Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 19:43:47 +0800 Subject: [PATCH 3/8] feat: add proc-macro support for timed logging and update console output --- Cargo.lock | 4 ++++ rustfs/Cargo.toml | 10 ++++++++++ rustfs/src/console.rs | 9 +++++---- rustfs/src/macro/mod.rs | 39 +++++++++++++++++++++++++++++++++++++++ rustfs/src/main.rs | 33 +++++++++++++++++++-------------- 5 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 rustfs/src/macro/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 7f70e83c0..ab06299a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5440,11 +5440,13 @@ dependencies = [ "mime_guess", "netif", "pin-project-lite", + "proc-macro2", "prost", "prost-build", "prost-types", "protobuf", "protos", + "quote", "rmp-serde", "rust-embed", "s3s", @@ -5452,6 +5454,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "shadow-rs", + "syn 2.0.98", "time", "tokio", "tokio-stream", @@ -5565,6 +5568,7 @@ dependencies = [ "async-trait", "atoi", "base64-simd", + "block-buffer 0.11.0-rc.3", "bytes", "bytestring", "chrono", diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index b6fa08d15..7e7159388 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -11,6 +11,12 @@ rust-version.workspace = true name = "rustfs" path = "src/main.rs" +# 添加proc-macro库声明 +[lib] +name = "rustfs_macro" +path = "src/macro/mod.rs" +proc-macro = true + [lints] workspace = true @@ -76,6 +82,10 @@ mime_guess = "2.0.5" rust-embed = { version = "8.5.0", features = ["interpolate-folder-path"] } local-ip-address = "0.6.3" chrono = "0.4" +# 添加proc-macro所需依赖 +proc-macro2 = "1.0" +quote = "1.0" +syn = { version = "2.0", features = ["full"] } [build-dependencies] prost-build.workspace = true diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index 6c7d64bdb..e9654e85d 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -8,6 +8,7 @@ use axum::{ use mime_guess::from_path; use rust_embed::RustEmbed; +use rustfs_macro::timed_println; use serde::Serialize; use shadow_rs::shadow; use tracing::info; @@ -162,10 +163,10 @@ pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, access_ke let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); let local_addr = listener.local_addr().unwrap(); - info!("WebUI: http://{}:{} http://127.0.0.1:{}", - local_ip, local_addr.port(), local_addr.port()); - info!(" RootUser: {}", access_key); - info!(" RootPass: {}", secret_key); + timed_println!(format!("WebUI: http://{}:{} http://127.0.0.1:{}", + local_ip, local_addr.port(), local_addr.port())); + timed_println!(format!(" RootUser: {}", access_key)); + timed_println!(format!(" RootPass: {}", secret_key)); axum::serve(listener, app).await.unwrap(); } diff --git a/rustfs/src/macro/mod.rs b/rustfs/src/macro/mod.rs new file mode 100644 index 000000000..691224873 --- /dev/null +++ b/rustfs/src/macro/mod.rs @@ -0,0 +1,39 @@ +use proc_macro::TokenStream; +use quote::{quote, ToTokens}; +use syn::{parse_macro_input, Expr, LitStr}; + +#[proc_macro] +pub fn timed_println(input: TokenStream) -> TokenStream { + // 解析输入 + let expr = parse_macro_input!(input as Expr); + + // 生成带有时间戳的打印代码 + let expanded = quote! { + { + let now = chrono::Utc::now(); + let timestamp = now.format("%Y-%m-%dT%H:%M:%S.%6fZ"); + println!("{} rustfs: {}", timestamp, #expr); + } + }; + + TokenStream::from(expanded) +} + + +#[proc_macro] +pub fn timed_println_str(input: TokenStream) -> TokenStream { + // 尝试将输入解析为字符串字面量 + let input_str = parse_macro_input!(input as LitStr); + let str_value = input_str.value(); + + // 生成带有时间戳的打印代码 + let expanded = quote! { + { + let now = chrono::Utc::now(); + let timestamp = now.format("%Y-%m-%dT%H:%M:%S.%6fZ"); + println!("{} rustfs: {}", timestamp, #str_value); + } + }; + + TokenStream::from(expanded) +} \ No newline at end of file diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 3c2d121c5..d5e43aa70 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -6,6 +6,11 @@ mod grpc; mod service; mod storage; mod utils; + +// 导入过程宏 +extern crate rustfs_macro; +use rustfs_macro::timed_println; + use crate::auth::IAMAuth; use crate::console::{init_console_cfg, CONSOLE_CONFIG}; use clap::Parser; @@ -75,11 +80,13 @@ fn check_auth(req: Request<()>) -> Result, Status> { fn print_server_info() { let cfg = CONSOLE_CONFIG.get().unwrap(); let current_year = chrono::Utc::now().year(); - info!("RustFS Object Storage Server"); - info!("Copyright: 2024-{} RustFS, Inc", current_year); - info!("License: {}", cfg.license()); - info!("Version: {}", cfg.version()); - info!("Docs: {}", cfg.doc()) + + // 使用过程宏打印服务器信息 + timed_println!("RustFS Object Storage Server"); + timed_println!(format!("Copyright: 2024-{} RustFS, Inc", current_year)); + timed_println!(format!("License: {}", cfg.license())); + timed_println!(format!("Version: {}", cfg.version())); + timed_println!(format!("Docs: {}", cfg.doc())); } fn main() -> Result<()> { @@ -139,15 +146,15 @@ async fn run(opt: config::Opt) -> Result<()> { } } - // Print RustFS-style server information - info!("RustFS Object Storage Server"); - // Detailed endpoint information (showing all API endpoints) let api_endpoints = format!("http://{}:{}", local_ip, server_port); let localhost_endpoint = format!("http://127.0.0.1:{}", server_port); - info!("API: {} {}", api_endpoints, localhost_endpoint); - info!(" RootUser: {}", opt.access_key.clone()); - info!(" RootPass: {}", opt.secret_key.clone()); + timed_println!(format!("API: {} {}", api_endpoints, localhost_endpoint)); + timed_println!(format!(" RootUser: {}", opt.access_key.clone())); + timed_println!(format!(" RootPass: {}", opt.secret_key.clone())); + if DEFAULT_ACCESS_KEY.eq(&opt.access_key) && DEFAULT_SECRET_KEY.eq(&opt.secret_key) { + warn!("Detected default credentials '{}:{}', we recommend that you change these values with 'RUSTFS_ACCESS_KEY' and 'RUSTFS_SECRET_KEY' environment variables", DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY); + } for (i, eps) in endpoint_pools.as_ref().iter().enumerate() { info!( @@ -283,9 +290,7 @@ async fn run(opt: config::Opt) -> Result<()> { let srv_addr = format!("http://{}:{}", local_ip, server_port); init_console_cfg(&srv_addr); print_server_info(); - if DEFAULT_ACCESS_KEY.eq(&opt.access_key) && DEFAULT_SECRET_KEY.eq(&opt.secret_key) { - warn!("Detected default credentials '{}:{}', we recommend that you change these values with 'RUSTFS_ACCESS_KEY' and 'RUSTFS_SECRET_KEY' environment variables", DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY); - } + if opt.console_enable { debug!("console is enabled"); From 6660b048a1b92e8e401767b3ab892b2fd6f23150 Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 20:01:48 +0800 Subject: [PATCH 4/8] refactor: remove unused dependencies and update s3s source references --- Cargo.lock | 13 ++----------- Cargo.toml | 4 ---- rustfs/src/console.rs | 1 - rustfs/src/macro/mod.rs | 2 +- 4 files changed, 3 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c85b971c..9e2e534d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1151,15 +1151,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "crc64fast-nvme" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4955638f00a809894c947f85a024020a20815b65a5eea633798ea7924edab2b3" -dependencies = [ - "crc", -] - [[package]] name = "crossbeam-channel" version = "0.5.14" @@ -5563,18 +5554,17 @@ checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd" [[package]] name = "s3s" version = "0.11.0-dev" +source = "git+https://github.com/Nugine/s3s.git?rev=ab139f72fe768fb9d8cecfe36269451da1ca9779#ab139f72fe768fb9d8cecfe36269451da1ca9779" dependencies = [ "arrayvec", "async-trait", "atoi", "base64-simd", - "block-buffer 0.11.0-rc.3", "bytes", "bytestring", "chrono", "crc32c", "crc32fast", - "crc64fast-nvme", "digest 0.11.0-pre.9", "futures", "hex-simd", @@ -5611,6 +5601,7 @@ dependencies = [ [[package]] name = "s3s-policy" version = "0.11.0-dev" +source = "git+https://github.com/Nugine/s3s.git?rev=ab139f72fe768fb9d8cecfe36269451da1ca9779#ab139f72fe768fb9d8cecfe36269451da1ca9779" dependencies = [ "indexmap 2.7.1", "serde", diff --git a/Cargo.toml b/Cargo.toml index 64774f099..4f2c7fbda 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -128,7 +128,3 @@ inherits = "dev" opt-level = 3 # Optimization Level (0-3) lto = true # Optimize when linking codegen-units = 1 # Reduce code generation units to improve optimization - -[patch."https://github.com/Nugine/s3s.git"] -s3s = { path = "s3s/crates/s3s" } -s3s-policy = { path = "s3s/crates/s3s-policy" } \ No newline at end of file diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index e9654e85d..161d6725b 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -11,7 +11,6 @@ use rust_embed::RustEmbed; use rustfs_macro::timed_println; use serde::Serialize; use shadow_rs::shadow; -use tracing::info; use std::net::Ipv4Addr; use std::sync::OnceLock; diff --git a/rustfs/src/macro/mod.rs b/rustfs/src/macro/mod.rs index 691224873..fe08915f9 100644 --- a/rustfs/src/macro/mod.rs +++ b/rustfs/src/macro/mod.rs @@ -1,5 +1,5 @@ use proc_macro::TokenStream; -use quote::{quote, ToTokens}; +use quote::quote; use syn::{parse_macro_input, Expr, LitStr}; #[proc_macro] From f2929fd2eebee5111792a58d260f35282e13f38a Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 20:06:45 +0800 Subject: [PATCH 5/8] style: format code for consistency and readability --- rustfs/src/console.rs | 14 +++++++++----- rustfs/src/macro/mod.rs | 11 +++++------ rustfs/src/main.rs | 18 ++++++++---------- rustfs/src/utils.rs | 4 ++-- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index 161d6725b..f6a28b491 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -53,7 +53,7 @@ pub(crate) struct Config { s3: S3, release: Release, license: License, - doc: String + doc: String, } impl Config { @@ -74,7 +74,7 @@ impl Config { name: "Apache-2.0".to_string(), url: "https://www.apache.org/licenses/LICENSE-2.0".to_string(), }, - doc: "https://rustfs.com/docs/".to_string() + doc: "https://rustfs.com/docs/".to_string(), } } @@ -162,10 +162,14 @@ pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, access_ke let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); let local_addr = listener.local_addr().unwrap(); - timed_println!(format!("WebUI: http://{}:{} http://127.0.0.1:{}", - local_ip, local_addr.port(), local_addr.port())); + timed_println!(format!( + "WebUI: http://{}:{} http://127.0.0.1:{}", + local_ip, + local_addr.port(), + local_addr.port() + )); timed_println!(format!(" RootUser: {}", access_key)); timed_println!(format!(" RootPass: {}", secret_key)); - + axum::serve(listener, app).await.unwrap(); } diff --git a/rustfs/src/macro/mod.rs b/rustfs/src/macro/mod.rs index fe08915f9..21f6da521 100644 --- a/rustfs/src/macro/mod.rs +++ b/rustfs/src/macro/mod.rs @@ -6,7 +6,7 @@ use syn::{parse_macro_input, Expr, LitStr}; pub fn timed_println(input: TokenStream) -> TokenStream { // 解析输入 let expr = parse_macro_input!(input as Expr); - + // 生成带有时间戳的打印代码 let expanded = quote! { { @@ -15,17 +15,16 @@ pub fn timed_println(input: TokenStream) -> TokenStream { println!("{} rustfs: {}", timestamp, #expr); } }; - + TokenStream::from(expanded) } - #[proc_macro] pub fn timed_println_str(input: TokenStream) -> TokenStream { // 尝试将输入解析为字符串字面量 let input_str = parse_macro_input!(input as LitStr); let str_value = input_str.value(); - + // 生成带有时间戳的打印代码 let expanded = quote! { { @@ -34,6 +33,6 @@ pub fn timed_println_str(input: TokenStream) -> TokenStream { println!("{} rustfs: {}", timestamp, #str_value); } }; - + TokenStream::from(expanded) -} \ No newline at end of file +} diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index d5e43aa70..d97866daa 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -13,6 +13,7 @@ use rustfs_macro::timed_println; use crate::auth::IAMAuth; use crate::console::{init_console_cfg, CONSOLE_CONFIG}; +use chrono::Datelike; use clap::Parser; use common::{ error::{Error, Result}, @@ -44,15 +45,13 @@ use tokio::net::TcpListener; use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; use tracing::{debug, error, info, warn}; -use chrono::Datelike; use tracing_error::ErrorLayer; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt}; fn setup_tracing() { use tracing_subscriber::EnvFilter; - let env_filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new("info")); + let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); let enable_color = std::io::stdout().is_terminal(); let subscriber = fmt() @@ -80,7 +79,7 @@ fn check_auth(req: Request<()>) -> Result, Status> { fn print_server_info() { let cfg = CONSOLE_CONFIG.get().unwrap(); let current_year = chrono::Utc::now().year(); - + // 使用过程宏打印服务器信息 timed_println!("RustFS Object Storage Server"); timed_println!(format!("Copyright: 2024-{} RustFS, Inc", current_year)); @@ -135,14 +134,14 @@ async fn run(opt: config::Opt) -> Result<()> { for (i, eps) in endpoint_pools.as_ref().iter().enumerate() { info!( "Formatting {}st pool, {} set(s), {} drives per set.", - i + 1, eps.set_count, eps.drives_per_set + i + 1, + eps.set_count, + eps.drives_per_set ); - + // Add warning for host with multiple drives in a set (similar to RustFS) if eps.drives_per_set > 1 { - warn!( - "WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable." - ); + warn!("WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable."); } } @@ -291,7 +290,6 @@ async fn run(opt: config::Opt) -> Result<()> { init_console_cfg(&srv_addr); print_server_info(); - if opt.console_enable { debug!("console is enabled"); let access_key = opt.access_key.clone(); diff --git a/rustfs/src/utils.rs b/rustfs/src/utils.rs index 0ac4ab7a0..24afba86a 100644 --- a/rustfs/src/utils.rs +++ b/rustfs/src/utils.rs @@ -5,6 +5,6 @@ pub(crate) fn get_local_ip() -> Option { match local_ip_address::local_ip() { Ok(IpAddr::V4(ip)) => Some(ip), Err(_) => None, - Ok(IpAddr::V6(_)) => todo!() + Ok(IpAddr::V6(_)) => todo!(), } -} \ No newline at end of file +} From cdd7a6d753eda041027b3d07ebe56c6dc191533d Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 21:48:43 +0800 Subject: [PATCH 6/8] feat: enhance tracing setup with pretty formatting and enable file/line number logging --- rustfs/src/main.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index d97866daa..1b7a23932 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -10,11 +10,12 @@ mod utils; // 导入过程宏 extern crate rustfs_macro; use rustfs_macro::timed_println; +use tracing::Level; use crate::auth::IAMAuth; use crate::console::{init_console_cfg, CONSOLE_CONFIG}; use chrono::Datelike; -use clap::Parser; +use clap::{builder, Parser}; use common::{ error::{Error, Result}, globals::set_global_addr, @@ -46,7 +47,7 @@ use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; use tracing::{debug, error, info, warn}; use tracing_error::ErrorLayer; -use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt}; +use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, Layer}; fn setup_tracing() { use tracing_subscriber::EnvFilter; @@ -54,13 +55,13 @@ fn setup_tracing() { let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")); let enable_color = std::io::stdout().is_terminal(); - let subscriber = fmt() - // .pretty() + let subscriber = tracing_subscriber::fmt::fmt() + .pretty() .with_env_filter(env_filter) .with_ansi(enable_color) // Remove file and line number information from log output - .with_file(false) - .with_line_number(false) + .with_file(true) + .with_line_number(true) .finish() .with(ErrorLayer::default()); From c10d723c6d752942eb4bc62a9f38b4c69bcfce5a Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 22:27:15 +0800 Subject: [PATCH 7/8] refactor: remove proc-macro support and replace timed_println with tracing info logs --- Cargo.lock | 3 --- rustfs/Cargo.toml | 10 ---------- rustfs/src/console.rs | 10 +++++----- rustfs/src/macro/mod.rs | 38 -------------------------------------- rustfs/src/main.rs | 30 ++++++++++++------------------ 5 files changed, 17 insertions(+), 74 deletions(-) delete mode 100644 rustfs/src/macro/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 9e2e534d2..c8cae648d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5431,13 +5431,11 @@ dependencies = [ "mime_guess", "netif", "pin-project-lite", - "proc-macro2", "prost", "prost-build", "prost-types", "protobuf", "protos", - "quote", "rmp-serde", "rust-embed", "s3s", @@ -5445,7 +5443,6 @@ dependencies = [ "serde_json", "serde_urlencoded", "shadow-rs", - "syn 2.0.98", "time", "tokio", "tokio-stream", diff --git a/rustfs/Cargo.toml b/rustfs/Cargo.toml index 8ba8809cd..eb5182abc 100644 --- a/rustfs/Cargo.toml +++ b/rustfs/Cargo.toml @@ -11,12 +11,6 @@ rust-version.workspace = true name = "rustfs" path = "src/main.rs" -# 添加proc-macro库声明 -[lib] -name = "rustfs_macro" -path = "src/macro/mod.rs" -proc-macro = true - [lints] workspace = true @@ -82,10 +76,6 @@ mime_guess = "2.0.5" rust-embed = { version = "8.6.0", features = ["interpolate-folder-path"] } local-ip-address = "0.6.3" chrono = "0.4" -# 添加proc-macro所需依赖 -proc-macro2 = "1.0" -quote = "1.0" -syn = { version = "2.0", features = ["full"] } [build-dependencies] prost-build.workspace = true diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index f6a28b491..c586a4615 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -8,11 +8,11 @@ use axum::{ use mime_guess::from_path; use rust_embed::RustEmbed; -use rustfs_macro::timed_println; use serde::Serialize; use shadow_rs::shadow; use std::net::Ipv4Addr; use std::sync::OnceLock; +use tracing::info; shadow!(build); @@ -162,14 +162,14 @@ pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, access_ke let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); let local_addr = listener.local_addr().unwrap(); - timed_println!(format!( + info!( "WebUI: http://{}:{} http://127.0.0.1:{}", local_ip, local_addr.port(), local_addr.port() - )); - timed_println!(format!(" RootUser: {}", access_key)); - timed_println!(format!(" RootPass: {}", secret_key)); + ); + info!(" RootUser: {}", access_key); + info!(" RootPass: {}", secret_key); axum::serve(listener, app).await.unwrap(); } diff --git a/rustfs/src/macro/mod.rs b/rustfs/src/macro/mod.rs deleted file mode 100644 index 21f6da521..000000000 --- a/rustfs/src/macro/mod.rs +++ /dev/null @@ -1,38 +0,0 @@ -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, Expr, LitStr}; - -#[proc_macro] -pub fn timed_println(input: TokenStream) -> TokenStream { - // 解析输入 - let expr = parse_macro_input!(input as Expr); - - // 生成带有时间戳的打印代码 - let expanded = quote! { - { - let now = chrono::Utc::now(); - let timestamp = now.format("%Y-%m-%dT%H:%M:%S.%6fZ"); - println!("{} rustfs: {}", timestamp, #expr); - } - }; - - TokenStream::from(expanded) -} - -#[proc_macro] -pub fn timed_println_str(input: TokenStream) -> TokenStream { - // 尝试将输入解析为字符串字面量 - let input_str = parse_macro_input!(input as LitStr); - let str_value = input_str.value(); - - // 生成带有时间戳的打印代码 - let expanded = quote! { - { - let now = chrono::Utc::now(); - let timestamp = now.format("%Y-%m-%dT%H:%M:%S.%6fZ"); - println!("{} rustfs: {}", timestamp, #str_value); - } - }; - - TokenStream::from(expanded) -} diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 1b7a23932..070cf4776 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -7,15 +7,10 @@ mod service; mod storage; mod utils; -// 导入过程宏 -extern crate rustfs_macro; -use rustfs_macro::timed_println; -use tracing::Level; - use crate::auth::IAMAuth; use crate::console::{init_console_cfg, CONSOLE_CONFIG}; use chrono::Datelike; -use clap::{builder, Parser}; +use clap::Parser; use common::{ error::{Error, Result}, globals::set_global_addr, @@ -45,7 +40,7 @@ use std::{io::IsTerminal, net::SocketAddr}; use tokio::net::TcpListener; use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; -use tracing::{debug, error, info, warn}; +use tracing::{debug, error, info, warn, event, span}; use tracing_error::ErrorLayer; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, Layer}; @@ -59,7 +54,6 @@ fn setup_tracing() { .pretty() .with_env_filter(env_filter) .with_ansi(enable_color) - // Remove file and line number information from log output .with_file(true) .with_line_number(true) .finish() @@ -81,12 +75,12 @@ fn print_server_info() { let cfg = CONSOLE_CONFIG.get().unwrap(); let current_year = chrono::Utc::now().year(); - // 使用过程宏打印服务器信息 - timed_println!("RustFS Object Storage Server"); - timed_println!(format!("Copyright: 2024-{} RustFS, Inc", current_year)); - timed_println!(format!("License: {}", cfg.license())); - timed_println!(format!("Version: {}", cfg.version())); - timed_println!(format!("Docs: {}", cfg.doc())); + // 使用自定义宏打印服务器信息 + info!("RustFS Object Storage Server"); + info!("Copyright: 2024-{} RustFS, Inc", current_year); + info!("License: {}", cfg.license()); + info!("Version: {}", cfg.version()); + info!("Docs: {}", cfg.doc()); } fn main() -> Result<()> { @@ -149,9 +143,9 @@ async fn run(opt: config::Opt) -> Result<()> { // Detailed endpoint information (showing all API endpoints) let api_endpoints = format!("http://{}:{}", local_ip, server_port); let localhost_endpoint = format!("http://127.0.0.1:{}", server_port); - timed_println!(format!("API: {} {}", api_endpoints, localhost_endpoint)); - timed_println!(format!(" RootUser: {}", opt.access_key.clone())); - timed_println!(format!(" RootPass: {}", opt.secret_key.clone())); + info!("API: {} {}", api_endpoints, localhost_endpoint); + info!(" RootUser: {}", opt.access_key.clone()); + info!(" RootPass: {}", opt.secret_key.clone()); if DEFAULT_ACCESS_KEY.eq(&opt.access_key) && DEFAULT_SECRET_KEY.eq(&opt.secret_key) { warn!("Detected default credentials '{}:{}', we recommend that you change these values with 'RUSTFS_ACCESS_KEY' and 'RUSTFS_SECRET_KEY' environment variables", DEFAULT_ACCESS_KEY, DEFAULT_SECRET_KEY); } @@ -191,7 +185,7 @@ async fn run(opt: config::Opt) -> Result<()> { b.set_route(admin::make_admin_route()?); - if !opt.server_domains.is_empty() { + if (!opt.server_domains.is_empty()) { info!("virtual-hosted-style requests are enabled use domain_name {:?}", &opt.server_domains); b.set_host(MultiDomain::new(&opt.server_domains)?); } From aa4bff263b1e7bba0f686af0ada3d2d3fdcea568 Mon Sep 17 00:00:00 2001 From: DamonXue Date: Sun, 2 Mar 2025 22:29:11 +0800 Subject: [PATCH 8/8] refactor: simplify logging statements in console.rs and main.rs --- rustfs/src/console.rs | 7 +------ rustfs/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/rustfs/src/console.rs b/rustfs/src/console.rs index c586a4615..81c109d03 100644 --- a/rustfs/src/console.rs +++ b/rustfs/src/console.rs @@ -162,12 +162,7 @@ pub async fn start_static_file_server(addrs: &str, local_ip: Ipv4Addr, access_ke let listener = tokio::net::TcpListener::bind(addrs).await.unwrap(); let local_addr = listener.local_addr().unwrap(); - info!( - "WebUI: http://{}:{} http://127.0.0.1:{}", - local_ip, - local_addr.port(), - local_addr.port() - ); + info!("WebUI: http://{}:{} http://127.0.0.1:{}", local_ip, local_addr.port(), local_addr.port()); info!(" RootUser: {}", access_key); info!(" RootPass: {}", secret_key); diff --git a/rustfs/src/main.rs b/rustfs/src/main.rs index 070cf4776..1d98c8e8e 100644 --- a/rustfs/src/main.rs +++ b/rustfs/src/main.rs @@ -40,7 +40,7 @@ use std::{io::IsTerminal, net::SocketAddr}; use tokio::net::TcpListener; use tonic::{metadata::MetadataValue, Request, Status}; use tower_http::cors::CorsLayer; -use tracing::{debug, error, info, warn, event, span}; +use tracing::{debug, error, event, info, span, warn}; use tracing_error::ErrorLayer; use tracing_subscriber::{fmt, layer::SubscriberExt, util::SubscriberInitExt, Layer};