From ebb4f8bdd22d3827d7aed5d4d306004236332f5f Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 14 Oct 2024 22:14:55 +0200 Subject: [PATCH 01/14] Update dependencies --- central_backend/Cargo.lock | 352 +++++++++++++++++-------------------- central_backend/Cargo.toml | 12 +- 2 files changed, 164 insertions(+), 200 deletions(-) diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index 8b78cd3..74ea000 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -330,9 +330,9 @@ dependencies = [ [[package]] name = "actix_derive" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" +checksum = "b6ac1e58cded18cb28ddc17143c4dea5345b3ad575e14f32f66e4054a56eb271" dependencies = [ "proc-macro2", "quote", @@ -341,18 +341,18 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" [[package]] name = "aead" @@ -524,23 +524,23 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -630,9 +630,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "bytestring" @@ -645,12 +645,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.10" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e8aabfac534be767c909e0690571677d49f41bd8465ae876fe043d52ba5292" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -728,9 +729,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -738,9 +739,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -814,9 +815,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1052,15 +1053,15 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "flate2" -version = "1.0.31" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide", @@ -1098,9 +1099,9 @@ dependencies = [ [[package]] name = "fs4" -version = "0.9.1" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c6b3bd49c37d2aa3f3f2220233b29a7cd23f79d1fe70e5337d25fb390793de" +checksum = "ec6fcfb3c0c1d71612528825042261419d5dade9678c39a781e05b63677d9b32" dependencies = [ "rustix", "windows-sys 0.52.0", @@ -1108,9 +1109,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1123,9 +1124,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1133,15 +1134,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1150,15 +1151,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -1167,21 +1168,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1230,9 +1231,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "h2" @@ -1255,9 +1256,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -1274,9 +1275,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] name = "heck" @@ -1361,9 +1362,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1386,7 +1387,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", "http-body", "httparse", @@ -1399,9 +1400,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", @@ -1432,9 +1433,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.7" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -1445,16 +1446,15 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1497,9 +1497,9 @@ checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" [[package]] name = "indexmap" -version = "2.3.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", "hashbrown", @@ -1516,9 +1516,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -1554,9 +1554,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1613,9 +1613,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libredox" @@ -1700,18 +1700,18 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "adler", + "adler2", ] [[package]] name = "mio" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", @@ -1773,18 +1773,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -1887,26 +1887,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1921,9 +1901,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polyval" @@ -1968,18 +1948,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -2016,9 +1996,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags", ] @@ -2036,9 +2016,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", @@ -2048,9 +2028,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", @@ -2065,22 +2045,22 @@ checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.5", + "h2 0.4.6", "http 1.1.0", "http-body", "http-body-util", @@ -2169,18 +2149,18 @@ checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags", "errno", @@ -2191,9 +2171,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "once_cell", "rustls-pki-types", @@ -2204,25 +2184,24 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -2231,9 +2210,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -2252,11 +2231,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2280,9 +2259,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -2387,6 +2366,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -2453,9 +2438,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.74" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -2494,9 +2479,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -2518,18 +2503,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -2623,11 +2608,10 @@ dependencies = [ [[package]] name = "tokio-openssl" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffab79df67727f6acf57f1ff743091873c24c579b1e2ce4d8f53e47ded4d63d" +checksum = "59df6849caa43bb7567f9a36f863c447d95a11d5903c9cc334ba32576a27eadd" dependencies = [ - "futures-util", "openssl", "openssl-sys", "tokio", @@ -2646,9 +2630,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -2667,32 +2651,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" - [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2737,30 +2700,30 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode-xid" @@ -2856,19 +2819,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -2881,9 +2845,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -2893,9 +2857,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2903,9 +2867,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -2916,15 +2880,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/central_backend/Cargo.toml b/central_backend/Cargo.toml index d5afc00..5d025ab 100644 --- a/central_backend/Cargo.toml +++ b/central_backend/Cargo.toml @@ -7,16 +7,16 @@ edition = "2021" log = "0.4.22" env_logger = "0.11.5" lazy_static = "1.5.0" -clap = { version = "4.5.18", features = ["derive", "env"] } +clap = { version = "4.5.20", features = ["derive", "env"] } anyhow = "1.0.89" -thiserror = "1.0.63" +thiserror = "1.0.64" openssl = { version = "0.10.66" } openssl-sys = "0.9.102" -libc = "0.2.158" +libc = "0.2.159" foreign-types-shared = "0.1.1" asn1 = "0.17" actix-web = { version = "4", features = ["openssl"] } -futures = "0.3.30" +futures = "0.3.31" serde = { version = "1.0.210", features = ["derive"] } reqwest = { version = "0.12.7", features = ["json"] } serde_json = "1.0.128" @@ -27,7 +27,7 @@ actix-session = { version = "0.10.1", features = ["cookie-session"] } actix-cors = "0.7.0" actix-multipart = { version ="0.7.2", features = ["derive"] } actix-remote-ip = "0.1.0" -futures-util = "0.3.30" +futures-util = "0.3.31" uuid = { version = "1.10.0", features = ["v4", "serde"] } semver = { version = "1.0.23", features = ["serde"] } lazy-regex = "3.3.0" @@ -40,4 +40,4 @@ prettytable-rs = "0.10.0" chrono = "0.4.38" serde_yml = "0.0.12" bincode = "=2.0.0-rc.3" -fs4 = { version = "0.9", features = ["sync"] } \ No newline at end of file +fs4 = { version = "0.10.0", features = ["sync"] } From 8a2ac0c434f240106027729d0f310c62ea8c6a49 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 14 Oct 2024 20:42:20 +0000 Subject: [PATCH 02/14] Enable CI (#4) Reviewed-on: https://gitea.communiquons.org/pierre/SolarEnergy/pulls/4 --- .drone.yml | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .drone.yml diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..149b1f4 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,70 @@ +--- +kind: pipeline +type: docker +name: default + +steps: + - name: web_build + image: node:21 + volumes: + - name: web_app + path: /tmp/web_build + commands: + - cd central_frontend + - npm install + - npm run build + - mv dist /tmp/web_build + + - name: backend_check + image: rust + volumes: + - name: rust_registry + path: /usr/local/cargo/registry + commands: + - rustup component add clippy + - cd central_backend + - cargo clippy -- -D warnings + - cargo test + + - name: custom_consumption_check + image: rust + volumes: + - name: rust_registry + path: /usr/local/cargo/registry + commands: + - rustup component add clippy + - cd custom_consumption + - cargo clippy -- -D warnings + - cargo test + depends_on: + - backend_check + + - name: backend_compile + image: rust + volumes: + - name: rust_registry + path: /usr/local/cargo/registry + - name: web_app + path: /tmp/web_build + depends_on: + - backend_check + - web_build + commands: + - cd central_backend + - mv /tmp/web_build/dist static + - cargo build --release + - ls -lah target/release/central_backend + + - name: esp32_compile + image: espressif/idf:v5.2.2 # FIXME : upgrade to 5.3.1 + commands: + - cd esp32_device + - /opt/esp/entrypoint.sh idf.py build + - ls -lah build/main.bin + + +volumes: + - name: rust_registry + temp: {} + - name: web_app + temp: {} \ No newline at end of file From e1b5f2f28263463f8dbfcd5b6b3ac5da2073e4e6 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 14 Oct 2024 20:43:29 +0000 Subject: [PATCH 03/14] Configure Renovate (#1) Enable Renovate for the project --- renovate.json | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 renovate.json diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..be43013 --- /dev/null +++ b/renovate.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "packageRules": [ + { + "matchUpdateTypes": ["major", "minor", "patch"], + "automerge": true + } + ] +} \ No newline at end of file From 16b03f0a050dfb350ed56bcf2556ccb7653e22be Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Mon, 14 Oct 2024 23:07:06 +0200 Subject: [PATCH 04/14] Add documentation to setup dev env --- docs/SETUP_DEV.md | 106 ++++++++++++++++++++++++++++++++ docs/img/custom_consumption.png | Bin 0 -> 6770 bytes docs/img/esp_mapping.png | Bin 0 -> 67400 bytes 3 files changed, 106 insertions(+) create mode 100644 docs/SETUP_DEV.md create mode 100644 docs/img/custom_consumption.png create mode 100644 docs/img/esp_mapping.png diff --git a/docs/SETUP_DEV.md b/docs/SETUP_DEV.md new file mode 100644 index 0000000..36f39a8 --- /dev/null +++ b/docs/SETUP_DEV.md @@ -0,0 +1,106 @@ +# Setup development environment + +## Backend +To build the backend, you will need to install: + +* Rust: https://www.rust-lang.org/ +* An IDE with Rust support. I would definitly recommend [RustRover](https://www.jetbrains.com/rust/) (the tool from IntelliJ). + +Check if your environment is working using the following command: + +```bash +cargo fmt && cargo clippy && cargo run -- --help +``` + +For development, the following flags might prove being useful: +* `--unsecure-disable-login`: Disable authentication on all web API endpoints +* `--hostname`: Change public server hostname, if you want to expose your test instance to network device, such as an ESP32 + +## Custom consumption +Same requirements as for the backend. This tool spawns a gui that allows to set arbitrary consumption values: + +![Custom consumption](img/custom_consumption.png) + + +To use it, first launch this tool: + +```bash +cd custom_consumption +cargo run +``` + +Set a custom value to force file creation (in the UI). + +Then launch central backend (in another terminal): + +```bash +cd central_backend +cargo fmt && cargo clippy && RUST_LOG=debug cargo run -- file +``` + + +## Central frontend +The frontend has been built using [NodeJS](https://nodejs.org/en), [Vite](https://vite.dev/) and [MUI](https://mui.com/). + +Launch it using this command: + +```bash +cd central_frontend +npm run dev +``` + +## Python device +This component has been built using ... Python. Waw! + +You will need to install this dependency, first: +```bash +apt install python3-jwt +``` + + +Run the client: + +```bash +cd python_device +python3 -m src.main + +# Get CLI help +python3 -m src.main --help +``` + + +Reformat code: + +```bash +black src/*.py +``` + +## ESP32 device +The ESP32 device is in reality a [Wt32-Eth01](https://en.wireless-tag.com/product-item-2.html) device. Use the following mapping to setup dev env: + +![ESP mapping](img/esp_mapping.png) + +You can use a [CP2102](https://fr.aliexpress.com/item/4000120687489.html) to flash the ESP32. + +I recommend to use VSCode with the following extensions: +* [ESP-IDF](https://marketplace.visualstudio.com/items?itemName=espressif.esp-idf-extension) +* [C/C++](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) +* [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + +To build the project, use this command (in an ESP-IDF terminal): + +```bash +idf.py build +``` + +To flash the ESP32, use this one: + +```bash +idf.py flash +``` + +To capture logs from device, use either `cu` or the following command: + +``` +idf.py monitor +``` \ No newline at end of file diff --git a/docs/img/custom_consumption.png b/docs/img/custom_consumption.png new file mode 100644 index 0000000000000000000000000000000000000000..96e0d4deedfa33b46bb5ded164a149becd4839ff GIT binary patch literal 6770 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 x100IQ9>G|1qtcyMvinz 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 literal 0 HcmV?d00001 From 8e1c2bc8bd943d556696a73701ee4ce3da11ae19 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Oct 2024 00:27:54 +0000 Subject: [PATCH 05/14] Update Rust crate clap to v4.5.20 --- custom_consumption/Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/custom_consumption/Cargo.lock b/custom_consumption/Cargo.lock index cff5c7f..a588bb1 100644 --- a/custom_consumption/Cargo.lock +++ b/custom_consumption/Cargo.lock @@ -697,9 +697,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -707,9 +707,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -1729,7 +1729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.48.5", ] [[package]] From 26bb6647b25d17fe6452ad8a0ac9c5d488adb9f3 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Oct 2024 00:28:02 +0000 Subject: [PATCH 06/14] Update dependency vite to v5.4.9 --- central_frontend/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/central_frontend/package-lock.json b/central_frontend/package-lock.json index 41a832b..29b3bd8 100644 --- a/central_frontend/package-lock.json +++ b/central_frontend/package-lock.json @@ -4431,9 +4431,9 @@ } }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", "dev": true, "license": "MIT", "dependencies": { From f8bcb6351372e50d1a9ef46bac4887469c14a2b5 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Oct 2024 22:29:26 +0200 Subject: [PATCH 07/14] Add license --- LICENSE | 675 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..53d1f3d --- /dev/null +++ b/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + From 540d10bf786f0ef3bd0f1ef47c7c8195bee4c103 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Oct 2024 22:48:26 +0200 Subject: [PATCH 08/14] Add README and start to work on build for prod guide --- README.md | 18 ++++++++++++++++- docs/SETUP_PROD.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 docs/SETUP_PROD.md diff --git a/README.md b/README.md index 73c49eb..c195a3e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,18 @@ # SolarEnergy -WIP project +A project to optimize solar energy production and consumption. It connect to a current meter to decides whether some appliances controlled by relays shall be turned on or not, based on criterias such as: +* Minimal uptime +* Minimal downtime +* Daily minimal runtime +* Estimated consumption +* Dependencies, conflicts + +## Components +* [`central_backend`](./central_backend): The core component that connects all the other one and make the decisions to turn on or off devices +* [`central_frontend`](./central_frontend): Web UI to configure the devices and monitor them +* [`custom_consumtion`](./custom_consumption): Development tool used to test different production values +* [`esp32_device`](./esp32_device/): The code installed in the MCU that controls relays (Wt32-Eth01 devices) +* [`python_device`](./python_device/): An alternative to the esp32 to control relays. Not production ready. + +## Documentation +* [Setup for development](./docs/SETUP_DEV.md) guide +* [Setup for production](./docs/SETUP_PROD.md) guide \ No newline at end of file diff --git a/docs/SETUP_PROD.md b/docs/SETUP_PROD.md new file mode 100644 index 0000000..ba86d92 --- /dev/null +++ b/docs/SETUP_PROD.md @@ -0,0 +1,48 @@ +# Configure project for production + +## Create production build + +### Central +The production release of central backend and frontend can be realised on a computer which has NodeJS and Rust installed by executing the following command at the root of the project: + +```bash +make +``` + +The backend will be available at this location: + +``` +central_backend/target/release/central_backend +``` + +### Python device +The Python device isn't production ready yet. + + +### ESP32 device + +#### Flashing the device directly +Use the following commands to flash a device (inside ESP-IDF environnment): + +```bash +idf.py build +idf.py flash +``` + + +#### Getting an OTA update +Use the following command to build an OTA update: + +```bash +idf.py build +``` + +The OTA update is then located in `build/main.bin` + + +## Pre-requisites +* A server running a recent Linux (Debian / Ubuntu preferred) with `central` as hostname +* DHCP configured on the network + +## Configure server +TODO \ No newline at end of file From 20abc120b58c32387448aa725754ad18c2f5ba2b Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Tue, 15 Oct 2024 22:49:33 +0200 Subject: [PATCH 09/14] Remove default README --- central_frontend/README.md | 30 ------------------------------ 1 file changed, 30 deletions(-) delete mode 100644 central_frontend/README.md diff --git a/central_frontend/README.md b/central_frontend/README.md deleted file mode 100644 index 0d6babe..0000000 --- a/central_frontend/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# React + TypeScript + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: - -- Configure the top-level `parserOptions` property like this: - -```js -export default { - // other rules... - parserOptions: { - ecmaVersion: 'latest', - sourceType: 'module', - project: ['./tsconfig.json', './tsconfig.node.json'], - tsconfigRootDir: __dirname, - }, -} -``` - -- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` -- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list From e151b50efa48f101115d434ee8425cad936a1328 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 16 Oct 2024 00:28:18 +0000 Subject: [PATCH 10/14] Update dependency @mui/icons-material to v6.1.4 --- central_frontend/package-lock.json | 72 +++++++++++++++--------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/central_frontend/package-lock.json b/central_frontend/package-lock.json index 29b3bd8..d2da5d1 100644 --- a/central_frontend/package-lock.json +++ b/central_frontend/package-lock.json @@ -1153,9 +1153,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.3.tgz", - "integrity": "sha512-ajMUgdfhTb++rwqj134Cq9f4SRN8oXUqMRnY72YBnXiXai3olJLLqETheRlq3MM8wCKrbq7g6j7iWL1VvP44VQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.4.tgz", + "integrity": "sha512-jCRsB9NDJJatVCHvwWSTfYUzuTQ7E0Km6tAQWz2Md1SLHIbVj5visC9yHbf/Cv2IDcG6XdHRv3e7Bt1rIburNw==", "license": "MIT", "funding": { "type": "opencollective", @@ -1163,12 +1163,12 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.3.tgz", - "integrity": "sha512-QBQCCIMSAv6IkArTg4Hg8q2sJRhHOci8oPAlkHWFlt2ghBdy3EqyLbIELLE/bhpqhX+E/ZkPYGIUQCd5/L0owA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.4.tgz", + "integrity": "sha512-nhXBNSP3WkY0pz8dg25VIYIXJkhdRLRKZtD50f9OuHVQ1eh8b+enmvaZQF0o5M8cs1sR6wQHwZYwG34qDZeG0g==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6" + "@babel/runtime": "^7.25.7" }, "engines": { "node": ">=14.0.0" @@ -1178,7 +1178,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.3", + "@mui/material": "^6.1.4", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -1189,16 +1189,16 @@ } }, "node_modules/@mui/material": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.3.tgz", - "integrity": "sha512-loV5MBoMKLrK80JeWINmQ1A4eWoLv51O2dBPLJ260IAhupkB3Wol8lEQTEvvR2vO3o6xRHuXe1WaQEP6N3riqg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.4.tgz", + "integrity": "sha512-mIVdjzDYU4U/XYzf8pPEz3zDZFS4Wbyr0cjfgeGiT/s60EvtEresXXQy8XUA0bpJDJjgic1Hl5AIRcqWDyi2eg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/core-downloads-tracker": "^6.1.3", - "@mui/system": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/core-downloads-tracker": "^6.1.4", + "@mui/system": "^6.1.4", "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.3", + "@mui/utils": "^6.1.4", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -1217,7 +1217,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.3", + "@mui/material-pigment-css": "^6.1.4", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1238,13 +1238,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.3.tgz", - "integrity": "sha512-XK5OYCM0x7gxWb/WBEySstBmn+dE3YKX7U7jeBRLm6vHU5fGUd7GiJWRirpivHjOK9mRH6E1MPIVd+ze5vguKQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.4.tgz", + "integrity": "sha512-FPa+W5BSrRM/1QI5Gf/GwJinJ2WsrKPpJB6xMmmXMXSUIp31YioIVT04i28DQUXFFB3yZY12ukcZi51iLvPljw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/utils": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.4", "prop-types": "^15.8.1" }, "engines": { @@ -1265,12 +1265,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.3.tgz", - "integrity": "sha512-i4yh9m+eMZE3cNERpDhVr6Wn73Yz6C7MH0eE2zZvw8d7EFkIJlCQNZd1xxGZqarD2DDq2qWHcjIOucWGhxACtA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.4.tgz", + "integrity": "sha512-D+aiIDtJsU9OVJ7dgayhCDABJHT7jTlnz1FKyxa5mNVHsxjjeG1M4OpLsRQvx4dcvJfDywnU2cE+nFm4Ln2aFQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", + "@babel/runtime": "^7.25.7", "@emotion/cache": "^11.13.1", "@emotion/serialize": "^1.3.2", "@emotion/sheet": "^1.4.0", @@ -1299,16 +1299,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.3.tgz", - "integrity": "sha512-ILaD9UsLTBLjMcep3OumJMXh1PYr7aqnkHm/L47bH46+YmSL1zWAX6tWG8swEQROzW2GvYluEMp5FreoxOOC6w==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.4.tgz", + "integrity": "sha512-lCveY/UtDhYwMg1WnLc3wEEuGymLi6YI79VOwFV9zfZT5Et+XEw/e1It26fiKwUZ+mB1+v1iTYMpJnwnsrn2aQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", - "@mui/private-theming": "^6.1.3", - "@mui/styled-engine": "^6.1.3", + "@babel/runtime": "^7.25.7", + "@mui/private-theming": "^6.1.4", + "@mui/styled-engine": "^6.1.4", "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.3", + "@mui/utils": "^6.1.4", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1353,12 +1353,12 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.3.tgz", - "integrity": "sha512-4JBpLkjprlKjN10DGb1aiy/ii9TKbQ601uSHtAmYFAS879QZgAD7vRnv/YBE4iBbc7NXzFgbQMCOFrupXWekIA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz", + "integrity": "sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.6", + "@babel/runtime": "^7.25.7", "@mui/types": "^7.2.18", "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", From 9fd87b6452962eae240e1ce7d2a4ef3a741275d4 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 17 Oct 2024 00:28:19 +0000 Subject: [PATCH 11/14] Update Rust crate openssl to v0.10.68 --- central_backend/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index 74ea000..6ffe906 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -1794,9 +1794,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags", "cfg-if", @@ -1826,9 +1826,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", From a2acbb53b06ef6a4e555c61c505120f89702df6f Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Thu, 17 Oct 2024 00:28:24 +0000 Subject: [PATCH 12/14] Update Rust crate openssl-sys to v0.9.104 --- central_backend/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index 74ea000..fdad0e5 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -1826,9 +1826,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", From 6528de4a9e669769e23d43c918102dc013b82946 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Fri, 18 Oct 2024 00:28:57 +0000 Subject: [PATCH 13/14] Update Rust crate libc to v0.2.161 --- central_backend/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index 6ffe906..61390d4 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -1613,9 +1613,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libredox" From 2c300109a32d05b49d1d35b2ad4465e45da791a9 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Fri, 18 Oct 2024 00:29:00 +0000 Subject: [PATCH 14/14] Update Rust crate serde_json to v1.0.129 --- central_backend/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/central_backend/Cargo.lock b/central_backend/Cargo.lock index 61390d4..24072ca 100644 --- a/central_backend/Cargo.lock +++ b/central_backend/Cargo.lock @@ -2298,9 +2298,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" dependencies = [ "itoa", "memchr",