Compare commits
577 Commits
v2.1.0-rc.
...
1aef67368b
| Author | SHA1 | Date | |
|---|---|---|---|
| 1aef67368b | |||
| ba2a669be6 | |||
| fd721c5dc4 | |||
| 34070bba89 | |||
| 1b1fc0fc09 | |||
| 44a1547d2e | |||
| 439f9cce3d | |||
| 9aecec2d96 | |||
| 26fffdd3e8 | |||
| 7bf69ec350 | |||
| 49f884bb68 | |||
| a58fcc7f14 | |||
| 113b5e7258 | |||
| 5b337d4c65 | |||
| 0b80e82721 | |||
| 7e45fa9708 | |||
| aa92f3d401 | |||
| 692c92b0df | |||
| 51cb2c0b9a | |||
| 6e52474953 | |||
| 35db1cd0c4 | |||
| 739a1103f0 | |||
| bb8cbb49f5 | |||
| 3be29f5b73 | |||
| d944569fb2 | |||
| 3ca27ec566 | |||
| 779bfc762e | |||
| 54828600a8 | |||
| d5410b88a3 | |||
| e86d9fd29b | |||
| cbebcfae82 | |||
| 3dc16db278 | |||
| e81227e5f7 | |||
| fd83c263e1 | |||
| 9ca857c98e | |||
| afcba6b086 | |||
| ef50acc867 | |||
| f12833f36c | |||
| b26788819e | |||
| f905de7c42 | |||
| 8466a8850f | |||
| af8e2cddcb | |||
| 0089866142 | |||
| ca892c7f11 | |||
| 2a33000ace | |||
| bd8da9b987 | |||
| 5bd780ef07 | |||
| 25c445b889 | |||
| ca4111ac77 | |||
| 868e8ae124 | |||
| 51358c7110 | |||
| ad97741e1e | |||
| 5d281e0fd0 | |||
| c1a1242398 | |||
| 5000215973 | |||
| ceda21830f | |||
| b80b7b482c | |||
| 8e41f71e70 | |||
| 72286c865f | |||
| 2d435457e6 | |||
| cef1ff7067 | |||
| 393dc07de8 | |||
| 49f0425e56 | |||
| 7973e523c3 | |||
| c4326520cd | |||
| dfb9d78448 | |||
| 26714a836c | |||
| 59e2986080 | |||
| 65fc484fa4 | |||
| 253978bc5f | |||
| 4aad60f69d | |||
| 72f7aaf9e4 | |||
| d12b5f7b05 | |||
| a7239558bd | |||
| 9d3e4b8767 | |||
| cbb99c7b47 | |||
| dca0752189 | |||
| 760a1e4322 | |||
| 56bc78f63c | |||
| 60b89c5c08 | |||
| fa0f648a0b | |||
| 5592c663a4 | |||
| c847353baf | |||
| a140f59acb | |||
| b2eae73fb0 | |||
| a34dc8f1f8 | |||
| 92e2937a6b | |||
| 47757f69bd | |||
| b642294193 | |||
| 8075af364f | |||
| 3d7285063a | |||
| 232420621a | |||
| a0432be819 | |||
| 468093227d | |||
| 32facdc2ff | |||
| 3a719272cb | |||
| 9ce4c5a494 | |||
| 15cc7b0b87 | |||
| 6d152181d3 | |||
| 97082fa42c | |||
| becd137cf5 | |||
| 89fc0fb372 | |||
| 68d79c73cf | |||
| d0e9ed4181 | |||
| 535d2f85ca | |||
| 5ec20fbcbd | |||
| 0225fb8e5d | |||
| 035f830b71 | |||
| 7a1fb4a790 | |||
| 4939b05ca7 | |||
| 2e1f0c8f5f | |||
| d8ac596687 | |||
| 1f43ab3bcc | |||
| ef9fbf775c | |||
| d6ff728a4d | |||
| f6ea8f077b | |||
| 3e96764fc4 | |||
| 45b21ae0af | |||
| 490e49406f | |||
| 36e7d06b39 | |||
| b26b52fd2d | |||
| b35041f1f3 | |||
| bf7ba3991f | |||
| 30806c6ebd | |||
| 29af6e5b7c | |||
| cde0e92591 | |||
| 85b28f7ee3 | |||
| df24b99303 | |||
| d659a5e04d | |||
| 99c0246720 | |||
| c0dba76ecd | |||
| e37a375c18 | |||
| 6718eb374d | |||
| bba7f10703 | |||
| df947db055 | |||
| 256e873e7b | |||
| 34bc3b759e | |||
| 853aa2784c | |||
| 4011ab8080 | |||
| 07eaad7226 | |||
| c743d3c341 | |||
| 05a5645f4c | |||
| 7aa71fb202 | |||
| 6410faa5b4 | |||
| a3e578240b | |||
| dd492ff52d | |||
| e7b576bc45 | |||
| 7fcc40d0e1 | |||
| e6fc6093b2 | |||
| 73ee70a862 | |||
| b647053fb9 | |||
| d518e55a67 | |||
| fcd38db2ef | |||
| 89cd8c8fd0 | |||
| 88c7e7f192 | |||
| a00e77d554 | |||
| 05d5bd9fe5 | |||
| e14e7e96c7 | |||
| 4b8ac300c8 | |||
| ee9c5fffad | |||
| 55caf049b1 | |||
| 4bdaeaa30d | |||
| 7c58d9c569 | |||
| d6b2c1d81e | |||
| 4a2acf99a7 | |||
| 3567941139 | |||
| 50e7fb612c | |||
| 03dd9ee579 | |||
| 2a3c6f3522 | |||
| 2e46f2fead | |||
| b00b72d70f | |||
| 7dbaf9b8d9 | |||
| 6b463adbb9 | |||
| cb819d7da6 | |||
| 841ba37841 | |||
| 7cfefbc512 | |||
| 9ebba7252c | |||
| 835c56330a | |||
| 3e5c70e6b4 | |||
| 95b88b6ac6 | |||
| c1f39afaa3 | |||
| 1893f7204e | |||
| 4a062abfde | |||
| fb26aa04b6 | |||
| 7c538b471d | |||
| c4c1941fc8 | |||
| 0ce2be24a3 | |||
| 3cf60d0d26 | |||
| 7d33ee80d0 | |||
| 52ba2de51f | |||
| a1b8b57d34 | |||
| cf9e0a356c | |||
| e66b783df8 | |||
| b695200123 | |||
| a383fb405e | |||
| 1cebaf83e1 | |||
| 4976825bd6 | |||
| 098d172f40 | |||
| f4a3c52428 | |||
| 2d60b637ec | |||
| 79b16d9a34 | |||
| d69f2fd321 | |||
| 4015c1bb6e | |||
| 9f76f20ea8 | |||
| b399ff3291 | |||
| 4fafc17b90 | |||
| f1bb88624b | |||
| f950e3192f | |||
| bef2f078e0 | |||
| 218053a2be | |||
| baca904079 | |||
| b5175cb82b | |||
| 39888a1ebc | |||
| ffea22c71b | |||
| dd15bb2205 | |||
| 4b53b5544f | |||
| 24ca2d3531 | |||
| 5587e3430b | |||
| 0c36669fef | |||
| bbce86cb9d | |||
| ed3a45bfc6 | |||
| 144fd59c1c | |||
| bdc54d7115 | |||
| aa04371663 | |||
| 78ef412516 | |||
| 28f7f5cb14 | |||
| 624b92bc97 | |||
| ca799298f4 | |||
| 42b67a7b61 | |||
| 4de4386142 | |||
| 509eeca760 | |||
| 1cb9663776 | |||
| 26667fdcd6 | |||
| 681a3eec53 | |||
| 2a5df890f7 | |||
| ae0059591c | |||
| 8655becf1e | |||
| 2a3a0aa689 | |||
| ce417ec7c8 | |||
| 4e848a998e | |||
| d89f35775e | |||
| 88ebf72003 | |||
| 9437b175a2 | |||
| 302d73a078 | |||
| ba7c36e30e | |||
| b4da43c87f | |||
| f5e078ea3d | |||
| 8aba39c955 | |||
| 68a5f90715 | |||
| f3dfadddfa | |||
| f1ec1fd4a6 | |||
| cf59db9cee | |||
| e21fbe84ba | |||
| 1e4d675f76 | |||
| e02fe870e9 | |||
| 9ef9250c18 | |||
| 2e4b9d3787 | |||
| fd2b3c3239 | |||
| 6640394bd3 | |||
| 84cc726c4f | |||
| 5d99d21915 | |||
| 3b8636544a | |||
| 14ce60ab65 | |||
| 7506431b34 | |||
| 8621209eb3 | |||
| d1fe317fb9 | |||
| a5c47d3f22 | |||
| 267c272ce5 | |||
| 7a8ae32b85 | |||
| 921d404a5a | |||
| de6a7beb5e | |||
| 5a928208fd | |||
| 92fc163341 | |||
| ca1e03f3ea | |||
| de8c3ad603 | |||
| f7d56bdd48 | |||
| afc13b45f4 | |||
| 11d2c3c69e | |||
| 356521e176 | |||
| 468668e518 | |||
| e53dec7bab | |||
| 26cd6de110 | |||
| d1157ca261 | |||
| 0d49b49482 | |||
| 753820bd81 | |||
| 2a98e44a5c | |||
| 9650d3f56b | |||
| aff308f67d | |||
| be76d663b5 | |||
| 160863561f | |||
| de02fdb812 | |||
| 1dda98e337 | |||
| ccc6afdfa4 | |||
| 6b166551af | |||
| 90694f816f | |||
| 51636fbac3 | |||
| 3c7aa417a9 | |||
| 04d560739d | |||
| 2c1842f06c | |||
| aba487277c | |||
| 1b95d5dfed | |||
| 7590fc4f45 | |||
| a409408ac0 | |||
| b121c9778f | |||
| d452761ff9 | |||
| dbc5725779 | |||
| 8b6536c55b | |||
| c7318b0383 | |||
| 26fa85e421 | |||
| 939742a991 | |||
| 6ab7386a79 | |||
| a750cdc3cb | |||
| 2f8af0fb08 | |||
| 7a9802ccb7 | |||
| d356d04bf5 | |||
| c99c4988ff | |||
| 6c564eb98b | |||
| 786d8634cf | |||
| 70b5204a9f | |||
| 1d70309a16 | |||
| b2aba8c447 | |||
| 8757b47b35 | |||
| b1a7632536 | |||
| 97c73d5358 | |||
| bb3f05aef1 | |||
| 2001ffc27c | |||
| bd2dd4035e | |||
| 7eb793f577 | |||
| b05cedb509 | |||
| cd484aa7bb | |||
| fbfb528adc | |||
| d9cba7f4cc | |||
| 7d5c5e18c6 | |||
| 2c0935a771 | |||
| 5312797b97 | |||
| 801af6b799 | |||
| b42379b519 | |||
| 8b328b92b1 | |||
| 2e6ecf8ddb | |||
| 12c7c48b20 | |||
| 732a42a073 | |||
| 5638d5c010 | |||
| 6a984ac84c | |||
| c1eb6b94ed | |||
| 85135b9267 | |||
| 670c5bac17 | |||
| 2dab1426b4 | |||
| 43004b19c3 | |||
| 4044d95aaa | |||
| c6024c06ce | |||
| e56bcb6489 | |||
| d9e0164080 | |||
| b588cd645e | |||
| 2c163d7219 | |||
| 39c53fe903 | |||
| 7b12d8f9e9 | |||
| 4649f66c00 | |||
| 9648abf4b9 | |||
| cc1246d0f5 | |||
| 726aa43a95 | |||
| 224f983ca8 | |||
| f962884341 | |||
| 6f35cc8bfa | |||
| c08c9bc216 | |||
| 239652be7c | |||
| 68c9ec0f82 | |||
| da07122997 | |||
| 5fb66dc6ee | |||
| 0c414fc8a6 | |||
| 097507a2d9 | |||
| 466b3fcead | |||
| 81dc6d1269 | |||
| b6c020d35d | |||
| dfbe97988f | |||
| cd36679a1c | |||
| 4d555bce96 | |||
| d96c6012c5 | |||
| 15793e714d | |||
| 437cb94dda | |||
| 544765e408 | |||
| 472b1f0da1 | |||
| 867b2eee40 | |||
| 5a30b15d1e | |||
| 0f2c507c30 | |||
| c545916332 | |||
| ac81f5f624 | |||
| 50ae7ab558 | |||
| a5e29ed745 | |||
| 6d29170342 | |||
| 410314022f | |||
| 815e00d389 | |||
| fbf5455f89 | |||
| 8925704555 | |||
| 462365dc97 | |||
| e73dd52973 | |||
| 881eec4e02 | |||
| bcdfc73767 | |||
| 0520aa3d40 | |||
| c562d17b78 | |||
| aee68520b3 | |||
| 88d8bf63f5 | |||
| 303887ea37 | |||
| 51d3d33175 | |||
| cdb5ea279d | |||
| 311e1b318a | |||
| 31c5b6f1db | |||
| a024f81e5d | |||
| 4089fca87c | |||
| 99533a9687 | |||
| d175a38ad1 | |||
| 28e918be18 | |||
| b4403ff959 | |||
| 8c548bad92 | |||
| 6ecad9af72 | |||
| df73f9a18f | |||
| 9b453327a8 | |||
| 071552ffd5 | |||
| 33a0b4b295 | |||
| 21bcd0780c | |||
| f6cdf2914c | |||
| 7698a62c1f | |||
| 2ae22cdb30 | |||
| 7705432820 | |||
| f150832676 | |||
| 80c9375d65 | |||
| 48ddff9e85 | |||
| 6f64fe02d5 | |||
| 61ab4d8d58 | |||
| 3bb962a266 | |||
| c286dc4f5c | |||
| 9d36ded2b3 | |||
| 71686405e0 | |||
| 34c4a9c508 | |||
| effafd3e91 | |||
| 5a61bdf2b0 | |||
| d21fcfd1c6 | |||
| fff9a27362 | |||
| ad7872a0e3 | |||
| f3ea2ccc21 | |||
| e959a9e795 | |||
| 3fe5eac56d | |||
| 67191be78d | |||
| 00cfb67b64 | |||
| 35aa8f5a94 | |||
| f44972b8b3 | |||
| 94675a3011 | |||
| 7112fbee7e | |||
| ff13633962 | |||
| cb93e34de0 | |||
| 883968f53e | |||
| d6d4b579c9 | |||
| 0e83d84360 | |||
| 63a6b3bdba | |||
| aafa7e112a | |||
| 804eb7aa5a | |||
| eeba641732 | |||
| 932ea6cb1d | |||
| dd4724e374 | |||
| e652c9956e | |||
| d11767776e | |||
| daefa58c0c | |||
| 7fe7299e7c | |||
| 0af9c6e8b0 | |||
| b9c2113d43 | |||
| 4fd23de9b6 | |||
| 3b372ebe86 | |||
| d14d149a3b | |||
| 44acf7dace | |||
| da7efdb1a8 | |||
| 444f39f9ff | |||
| fd9c26f016 | |||
| 7ef9f5cd65 | |||
| d3321b3c57 | |||
| bbe546008f | |||
| 5ec91e2d20 | |||
| fbe4df0251 | |||
| e5c690eb89 | |||
| aeedd114a6 | |||
| dfa5e0e005 | |||
| 5911d370e5 | |||
| baf769c462 | |||
| 33e8e0890b | |||
| e2e82edefb | |||
| da1b5c6953 | |||
| 629725e262 | |||
| 6ba4c0091b | |||
| 99d5261aab | |||
| 97487cf0c4 | |||
| 8436f2e2bb | |||
| 310e436163 | |||
| b64477fd7e | |||
| 782da43114 | |||
| 37854b693b | |||
| 7360b72c7b | |||
| 6f68f268c0 | |||
| 983587aeb7 | |||
| ee415d2e4a | |||
| 0c075d7fe4 | |||
| eec3653c6b | |||
| 5ac2a24611 | |||
| 144683d7b3 | |||
| 9c917a9119 | |||
| dc48b84191 | |||
| 8555d31ddf | |||
| cb0dde2a80 | |||
| 5f5b1f751b | |||
| 24c5dad929 | |||
| f0046fcd57 | |||
| 3c3e415175 | |||
| 00d3355f43 | |||
| 907a14faff | |||
| 4348e89f99 | |||
| 7a24cc54f8 | |||
| 80f6e3c272 | |||
| edb1297c4a | |||
| 1ee157f943 | |||
| 1b2981b06e | |||
| 7203fefd33 | |||
| d808b2dd19 | |||
| ee34a1e361 | |||
| 1766f91697 | |||
| b3aa28d085 | |||
| a605d7af11 | |||
| 19b1a33c48 | |||
| 04aa511448 | |||
| 8dc3d4466b | |||
| 0716a58ff0 | |||
| 60052081b4 | |||
| f11d49b264 | |||
| 103dae6d08 | |||
| 821ed7b25e | |||
| 87f83b6f30 | |||
| ace81d797e | |||
| 57ca2c7c6d | |||
| 8360d9e045 | |||
| 560ffbbb6a | |||
| 72314606f3 | |||
| db009b69dd | |||
| 3ed99dc0ce | |||
| 762a7c99d5 | |||
| 4e62156b70 | |||
| cc49536755 | |||
| 54b844dc3b | |||
| 1e8ba13f66 | |||
| 93011cee9c | |||
| a474a5c73c | |||
| 17b98ca99d | |||
| 281eedb71e | |||
| 1ee533591c | |||
| b87e1df140 | |||
| f88239a13e | |||
| 68476cbc00 | |||
| f2c1f64f02 | |||
| a7209184c8 | |||
| ba59e29499 | |||
| f94196d865 | |||
| bb5a9f9737 | |||
| 4bc5cf7c64 | |||
| 639d14452b | |||
| e7413fb741 | |||
| c0e720498d | |||
| 383c3b4be6 | |||
| e9b202f5c8 | |||
| bc3005a6a4 | |||
| 8cf19e0594 | |||
| b137b57dbc | |||
| 5dff8927da | |||
| 197e79dd07 | |||
| 6262aca761 | |||
| c156ae704b | |||
| a67979ec40 | |||
| 54bfc11620 | |||
| d33c2cd3a2 | |||
| 3a5f428fb6 | |||
| 0331152569 | |||
| 1b7e854f5f | |||
| 12a945d863 |
@@ -3,9 +3,7 @@ _mkgmtime
|
||||
_sh_denyno
|
||||
_sh_denyrd
|
||||
_sh_denyrw
|
||||
_spawnv
|
||||
aarch64
|
||||
abcdefgh
|
||||
advapi32
|
||||
armv8
|
||||
autogen
|
||||
@@ -17,31 +15,21 @@ boost_asio_has_std_string_view
|
||||
bugprone
|
||||
cflags
|
||||
chrono
|
||||
clsid
|
||||
cmake_current_source_dir
|
||||
cmdc
|
||||
coinit_apartmentthreaded
|
||||
comdlg32
|
||||
conin$
|
||||
cppcoreguidelines
|
||||
cppdbg
|
||||
cppflags
|
||||
cpphttplib
|
||||
cpptrace
|
||||
cppvsdbg
|
||||
create_notraverse
|
||||
crypto_aead_xchacha20poly1305_ietf_npubbytes
|
||||
cspan
|
||||
cstdint
|
||||
curl_zstd
|
||||
curle_couldnt_resolve_host
|
||||
curlopt_aws_sigv4
|
||||
cxxflags
|
||||
cxxstd
|
||||
d_largefile64_source
|
||||
d_largefile_source
|
||||
d_ndebug
|
||||
dacl_security_information
|
||||
dbackward_shared
|
||||
dbghelp
|
||||
dboost_root
|
||||
@@ -60,7 +48,6 @@ dcurl_staticlib
|
||||
dcurl_use_libpsl
|
||||
dcurl_use_libssh2
|
||||
dcurl_zlib
|
||||
dcurl_zstd
|
||||
ddebug
|
||||
decmult_gen_prec_bits
|
||||
decmult_window_size
|
||||
@@ -93,7 +80,6 @@ dspdlog_fmt_external
|
||||
dthreads_prefer_pthread_flag
|
||||
dunw_local_only
|
||||
duse_libidn2
|
||||
duse_nghttp2
|
||||
duuid_build_tests
|
||||
dwith_benchmark
|
||||
dwith_gflags
|
||||
@@ -105,21 +91,14 @@ endforeach
|
||||
endfunction
|
||||
eventlib
|
||||
expect_streq
|
||||
expect_strne
|
||||
falloc_fl_keep_size
|
||||
fallocate
|
||||
fallocate_impl
|
||||
fext
|
||||
fgetattr
|
||||
fgetattr_impl
|
||||
filebase
|
||||
flac_version
|
||||
flag_nopath
|
||||
flarge
|
||||
folderid
|
||||
fontconfig_version
|
||||
foob
|
||||
fooba
|
||||
freetype2_version
|
||||
fsetattr_x
|
||||
fusermount
|
||||
@@ -131,26 +110,19 @@ googletest
|
||||
gpath
|
||||
gtest_version
|
||||
has_setxattr
|
||||
hkey
|
||||
hresult
|
||||
httpapi
|
||||
httplib
|
||||
hwnd
|
||||
icudata
|
||||
icui18n
|
||||
icuuc
|
||||
inproc
|
||||
iostreams
|
||||
iphlpapi
|
||||
ipstream
|
||||
jthread
|
||||
libbitcoin
|
||||
libbitcoinsystem
|
||||
libcurl
|
||||
libdsm
|
||||
libevent
|
||||
libexample
|
||||
libexpat
|
||||
libfuse3
|
||||
libgmock
|
||||
libgtest
|
||||
@@ -163,91 +135,57 @@ libuuid
|
||||
libuuid_include_dirs
|
||||
libvlc
|
||||
linkflags
|
||||
llabsll
|
||||
localappdata
|
||||
lpbyte
|
||||
lpthread
|
||||
lptr
|
||||
lpwstr
|
||||
markdownlint
|
||||
mbig
|
||||
minio
|
||||
msvc
|
||||
msvcr120
|
||||
msys2
|
||||
mtune
|
||||
musl-libc
|
||||
mwindows
|
||||
nana
|
||||
ncrypt
|
||||
nlohmann
|
||||
nlohmann_json
|
||||
nmakeprg
|
||||
noappledouble
|
||||
nohup
|
||||
nominmax
|
||||
ntstatus
|
||||
nullptr
|
||||
nuspell_version
|
||||
oleaut32
|
||||
openal_version
|
||||
openssldir
|
||||
osascript
|
||||
osxfuse
|
||||
pistream
|
||||
pkgconfig
|
||||
plarge_integer
|
||||
plex
|
||||
posix
|
||||
println
|
||||
project_enable_fontconfig
|
||||
project_enable_gtkmm
|
||||
project_enable_libdsm
|
||||
project_enable_nana
|
||||
project_macos_icns_name
|
||||
propgrid
|
||||
psecurity_descriptor
|
||||
pthreads
|
||||
pugi
|
||||
pugixml_project
|
||||
puint32
|
||||
pvoid
|
||||
pwhash
|
||||
pwstr
|
||||
rdrw
|
||||
remote_winfsp
|
||||
renterd
|
||||
richtext
|
||||
rocksdb_library
|
||||
rpcrt4
|
||||
runas
|
||||
s_igid
|
||||
s_isvtx
|
||||
s_iuid
|
||||
sddl_revision_1
|
||||
secp256k1
|
||||
secur32
|
||||
see_mask_nocloseprocess
|
||||
sfml_project
|
||||
shellexecuteinfoa
|
||||
shlwapi
|
||||
sigchld
|
||||
skynet
|
||||
source_subdir
|
||||
spdlog
|
||||
spdlog_project
|
||||
st_ctim
|
||||
startf_useshowwindow
|
||||
startupinfoa
|
||||
static-libgcc
|
||||
static-libstdc++
|
||||
stbuf
|
||||
stduuid_project
|
||||
strequal
|
||||
sw_shownoactivate
|
||||
ularge_integer
|
||||
uring
|
||||
url
|
||||
userenv
|
||||
utimens_impl
|
||||
utimensat
|
||||
@@ -263,7 +201,6 @@ wextra
|
||||
wfloat
|
||||
wformat=2
|
||||
winfsp
|
||||
winfsp_drive
|
||||
winhttp
|
||||
wininet
|
||||
winspool
|
||||
|
||||
5
.gitattributes
vendored
@@ -1,5 +0,0 @@
|
||||
*.msi filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.gz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tar.xz filter=lfs diff=lfs merge=lfs -text
|
||||
*.tgz filter=lfs diff=lfs merge=lfs -text
|
||||
*.zip filter=lfs diff=lfs merge=lfs -text
|
||||
13
.gitignore
vendored
@@ -1,16 +1,13 @@
|
||||
.DS_Store
|
||||
.cache/
|
||||
.vs/
|
||||
Info.plist
|
||||
build*/
|
||||
compile_commands.json
|
||||
cspell.json
|
||||
deps/
|
||||
.vs/
|
||||
support/Dockerfile
|
||||
dist/
|
||||
override.sh
|
||||
repertory.iss
|
||||
deps/
|
||||
scripts/cleanup.cmd
|
||||
scripts/cleanup.sh
|
||||
support/Dockerfile
|
||||
version.cpp
|
||||
version.rc
|
||||
version.cpp
|
||||
override.sh
|
||||
|
||||
@@ -5,88 +5,57 @@ pipeline {
|
||||
|
||||
environment {
|
||||
DEVELOPER_PRIVATE_KEY = "/.ci/repertory/cert/developer.priv"
|
||||
DEVELOPER_PUBLIC_KEY = "/.ci/repertory/cert/developer.pub"
|
||||
PROJECT_TEST_CONFIG_DIR = "/.ci/repertory/test"
|
||||
DEVELOPER_PUBLIC_KEY = "/.ci/repertory/cert/developer.pub"
|
||||
PROJECT_TEST_DIR = "/.ci/repertory/test"
|
||||
}
|
||||
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
skipDefaultCheckout()
|
||||
timestamps()
|
||||
retry(2)
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build • Test • Deliver') {
|
||||
stage('linux_x86_64') {
|
||||
agent any
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
script {
|
||||
int maxAttempts = 6
|
||||
int baseDelay = 10
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
checkout scm
|
||||
break
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('linux_x86_64') {
|
||||
steps {
|
||||
script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh' } }
|
||||
}
|
||||
steps {
|
||||
retry(2) {
|
||||
sleep time: 5, unit: 'SECONDS'
|
||||
sh 'scripts/make_unix.sh'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('mingw64') {
|
||||
steps {
|
||||
script { retryWithBackoff(2, 5) { sh 'scripts/make_win32.sh' } }
|
||||
}
|
||||
}
|
||||
stage('mingw64') {
|
||||
agent any
|
||||
|
||||
stage('linux_aarch64') {
|
||||
steps {
|
||||
script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } }
|
||||
}
|
||||
steps {
|
||||
retry(2) {
|
||||
sleep time: 5, unit: 'SECONDS'
|
||||
sh 'scripts/make_win32.sh'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('linux_x86_64_test') {
|
||||
steps {
|
||||
script { retryWithBackoff(2, 5) { sh 'scripts/run_tests.sh' } }
|
||||
}
|
||||
}
|
||||
stage('linux_aarch64') {
|
||||
agent any
|
||||
|
||||
stage('deliver') {
|
||||
steps {
|
||||
script {
|
||||
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory "" "" "" "" 1 1' }
|
||||
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory "" aarch64' }
|
||||
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/repertory' }
|
||||
}
|
||||
}
|
||||
steps {
|
||||
retry(2) {
|
||||
sleep time: 5, unit: 'SECONDS'
|
||||
sh 'scripts/make_unix.sh aarch64'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('deliver') {
|
||||
agent any
|
||||
|
||||
steps {
|
||||
sh 'scripts/deliver.sh /mnt/repertory "" "" "" "" 1 1'
|
||||
sh 'scripts/deliver.sh /mnt/repertory "" aarch64'
|
||||
sh 'scripts/deliver.sh /mnt/repertory'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
body()
|
||||
return
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
#!groovy
|
||||
|
||||
pipeline {
|
||||
agent none
|
||||
|
||||
environment {
|
||||
DEVELOPER_PRIVATE_KEY = "${env.HOME}/.ci/repertory/cert/developer.priv"
|
||||
DEVELOPER_PUBLIC_KEY = "${env.HOME}/.ci/repertory/cert/developer.pub"
|
||||
PROJECT_TEST_CONFIG_DIR = "${env.HOME}/.ci/repertory/test"
|
||||
}
|
||||
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
skipDefaultCheckout()
|
||||
timestamps()
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build • Test • Deliver') {
|
||||
agent any
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
script {
|
||||
int maxAttempts = 6
|
||||
int baseDelay = 10
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
checkout scm
|
||||
break
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('darwin_aarch64') {
|
||||
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } } }
|
||||
}
|
||||
|
||||
stage('darwin_x86_64') {
|
||||
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh x86_64' } } }
|
||||
}
|
||||
|
||||
stage('darwin_aarch64_test') {
|
||||
steps { script { retryWithBackoff(2, 5) { sh 'scripts/run_tests.sh aarch64' } } }
|
||||
}
|
||||
|
||||
stage('deliver') {
|
||||
steps {
|
||||
script {
|
||||
retryWithBackoff(3, 10) { sh "scripts/deliver.sh ${env.HOME}/mnt/repertory '' aarch64" }
|
||||
retryWithBackoff(3, 10) { sh "scripts/deliver.sh ${env.HOME}/mnt/repertory '' x86_64" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
body()
|
||||
return
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
#!groovy
|
||||
|
||||
pipeline {
|
||||
agent none
|
||||
|
||||
environment {
|
||||
PROJECT_TEST_CONFIG_DIR = "c:\\.ci\\repertory\\test"
|
||||
}
|
||||
|
||||
options {
|
||||
disableConcurrentBuilds()
|
||||
skipDefaultCheckout()
|
||||
timestamps()
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('Build • Test') {
|
||||
agent any
|
||||
stages {
|
||||
stage('Checkout') {
|
||||
steps {
|
||||
script {
|
||||
int maxAttempts = 6
|
||||
int baseDelay = 10
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
checkout scm
|
||||
break
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelay * (1 << (attempt - 1))
|
||||
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage('msys2') {
|
||||
steps {
|
||||
script { retryWithBackoff(2, 5) { bat 'scripts\\make_win32.cmd' } }
|
||||
}
|
||||
}
|
||||
|
||||
// stage('msys2_test') {
|
||||
// steps {
|
||||
// script { retryWithBackoff(2, 5) { bat 'scripts\\run_tests.cmd' } }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
|
||||
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
|
||||
try {
|
||||
body()
|
||||
return
|
||||
} catch (err) {
|
||||
if (attempt == maxAttempts) { throw err }
|
||||
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
|
||||
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
|
||||
sleep time: waitSec, unit: 'SECONDS'
|
||||
}
|
||||
}
|
||||
}
|
||||
7
.nvimrc
@@ -18,14 +18,14 @@ if vim.env.NV_DARCULA_ENABLE_DAP then
|
||||
|
||||
local externalConsole = gos.is_windows
|
||||
local type = "cppdbg"
|
||||
local cwd = gpath.create_path("./dist/debug/shared/linux/x86_64/repertory/")
|
||||
local cwd = gpath.create_path("./build")
|
||||
dap.configurations.cpp = {
|
||||
{
|
||||
name = "Mount",
|
||||
type = type,
|
||||
request = "launch",
|
||||
program = function()
|
||||
return gpath.create_path(cwd, "bin/repertory")
|
||||
return gpath.create_path(cwd, "repertory")
|
||||
end,
|
||||
cwd = cwd,
|
||||
stopAtEntry = true,
|
||||
@@ -36,9 +36,8 @@ if vim.env.NV_DARCULA_ENABLE_DAP then
|
||||
type = type,
|
||||
request = "launch",
|
||||
program = function()
|
||||
return gpath.create_path(cwd, "bin/repertory_test")
|
||||
return gpath.create_path(cwd, "repertory_tests")
|
||||
end,
|
||||
args={"--gtest_filter=utils_db*"},
|
||||
cwd = cwd,
|
||||
stopAtEntry = true,
|
||||
externalConsole=externalConsole,
|
||||
|
||||
36
.vimspector.json
Normal file
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"configurations": {
|
||||
"UnixDebug": {
|
||||
"adapter": "vscode-cpptools",
|
||||
"configuration": {
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/build/debug/repertory",
|
||||
"args": ["-f", "/home/sgraves/mnt"],
|
||||
"cwd": "${workspaceRoot}/build/debug",
|
||||
"environment": [],
|
||||
"externalConsole": true,
|
||||
"MIMode": "gdb",
|
||||
"stopAtEntry": true,
|
||||
"logging": {
|
||||
"engineLogging": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"UnixDebugTest": {
|
||||
"adapter": "vscode-cpptools",
|
||||
"configuration": {
|
||||
"request": "launch",
|
||||
"program": "${workspaceRoot}/build/debug/unittests",
|
||||
"args": ["--gtest_filter=file_manager.can_close_after_download_timeout"],
|
||||
"cwd": "${workspaceRoot}/build",
|
||||
"environment": [],
|
||||
"externalConsole": true,
|
||||
"MIMode": "gdb",
|
||||
"stopAtEntry": true,
|
||||
"logging": {
|
||||
"engineLogging": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
189
CHANGELOG.md
@@ -1,202 +1,23 @@
|
||||
# Changelog
|
||||
|
||||
## v2.1.0-rc.2
|
||||
|
||||
### Issues
|
||||
|
||||
* \#21 [unit test] Complete WinFSP unit tests
|
||||
* \#65 [bug] Mount state is not being removed after unmount on Windows
|
||||
* \#66 [bug] UI fails to install plist if LaunchAgents directory does not exist
|
||||
|
||||
### Changes from v2.0.7-release
|
||||
|
||||
* Fixed Windows setup icon location
|
||||
|
||||
---
|
||||
|
||||
## v2.1.0-rc
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* Mount state has been moved into the configuration directory
|
||||
* Unmount all active mounts prior to upgrade
|
||||
* Remote mounts must be upgraded to v2.1.0+ to support new authentication scheme
|
||||
* Protocol handshake added for DoS protection
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#12 [unit test] Complete all providers unit tests
|
||||
* \#22 [unit test] Complete FUSE unit tests
|
||||
* \#33 Complete initial v2.0 documentation
|
||||
* \#34 Add macOS support
|
||||
* \#38 Pinning a file should automatically initiate a download to cache
|
||||
* \#51 [ui] UI console window should close after launch
|
||||
* \#52 [ui] Add auto-mount on first launch functionality
|
||||
* \#53 Create Windows installer
|
||||
* \#54 Remove 'default' as initial bucket name for Sia
|
||||
* \#58 Create macOS bundle for simplified installation
|
||||
* \#59 [bug] [ui] UI is hanging after launching repertory mount in background
|
||||
* \#60 Implement secure key via KDF for transparent data encryption/decryption
|
||||
* \#61 [ui] UI theme should match repertory blue
|
||||
|
||||
### Changes from v2.0.7-release
|
||||
|
||||
* Added check version support to remote mounts
|
||||
* Fixed directory item count bug on S3 provider
|
||||
* Fixed handling of `FALLOC_FL_KEEP_SIZE` on Linux
|
||||
* Fixed intermittent client hang on remote mount server disconnect
|
||||
* Implemented POSIX-compliant `unlink()` with FUSE `hard_remove`
|
||||
* Open handles remain valid after `unlink()`
|
||||
* Refactored CLI messages and error handling to use common methods
|
||||
* Enhanced remote mount client thread mapping
|
||||
* Threads are now mapped 1-1 from client to server instead of being tied to a fixed-size thread pool
|
||||
|
||||
---
|
||||
|
||||
## v2.0.7-release
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#55 [bug] UI is unable to launch `repertory.exe` on Windows when absolute path contains spaces
|
||||
* \#57 [bug] Directory entries . and .. are incorrectly being reported as files in Linux remote mounts
|
||||
|
||||
---
|
||||
|
||||
## v2.0.6-release
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#42 [bug] Remote mount directory listing on Windows connected to Linux is failing
|
||||
* \#43 [bug] Directories are not importing properly for Sia
|
||||
* \#44 [bug] Windows-to-Linux remote mount ignores `CREATE_NEW`
|
||||
* \#45 [bug] Windows-to-Linux remote mount is not handling attempts to remove a non-empty directory properly
|
||||
* \#46 [bug] Changes to maximum cache size should be updated live
|
||||
* \#47 [bug] Windows-to-Linux remote mount is allowing directory rename when directory is not empty
|
||||
* \#48 [bug] Windows-to-Linux remote mount overlapped I/O is not detecting EOF for read operations
|
||||
* \#49 [ui] Implement provider test button
|
||||
|
||||
### Changes from v2.0.5-rc
|
||||
|
||||
* Added request retry on `libcurl` error code `CURLE_COULDNT_RESOLVE_HOST`
|
||||
* Added `libcurl` DNS caching
|
||||
* Drive letters in UI should always be lowercase
|
||||
* Fixed WinFSP directory rename for non-empty directories
|
||||
* Fixed segfault in UI due to incorrect `SIGCHLD` handling
|
||||
* Migrated to v2 error handling
|
||||
* Upgraded WinFSP to v2.1 (2025)
|
||||
|
||||
---
|
||||
|
||||
## v2.0.5-rc
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#39 Create management portal in Flutter
|
||||
|
||||
### Changes from v2.0.4-rc
|
||||
|
||||
* Continue documentation updates
|
||||
* Fixed `-status` command erasing active mount information
|
||||
* Fixed overlapping HTTP REST API port's
|
||||
* Refactored/fixed instance locking
|
||||
* Removed passwords and secret key values from API calls
|
||||
* Renamed setting `ApiAuth` to `ApiPassword`
|
||||
* Require `--name,-na` option for encryption provider
|
||||
|
||||
---
|
||||
|
||||
## v2.0.4-rc
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* `renterd` v2.0.0+ is now required. Prior versions will fail to mount.
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#35 [bug] Low frequency check is set to '0' instead of 1 hour by default
|
||||
* \#36 [bug] Max cache size bytes is set to '0' by default
|
||||
|
||||
### Changes from v2.0.3-rc
|
||||
|
||||
* Added Sia API version check prior to mounting
|
||||
* Added back `-cv` (check version) CLI option
|
||||
* Continue documentation updates
|
||||
* Fixed setting `ApiAuth` via `set_value_by_name`
|
||||
* Fixed setting `HostConfig.ApiUser` via `set_value_by_name`
|
||||
* Fixed setting `HostConfig.Path` via `set_value_by_name`
|
||||
* Fixed setting `HostConfig.Protocol` via `set_value_by_name`
|
||||
* Improved ring buffer read-ahead
|
||||
* Integrated `renterd` version 2.0.0
|
||||
* Prefer using local cache file when opening files
|
||||
* Refactored `app_config` unit tests
|
||||
* Refactored polling to be more accurate on scheduling tasks
|
||||
|
||||
---
|
||||
|
||||
## v2.0.3-rc
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#28 \[bug\] Address slow directory responses in S3 mounts for deeply nested directories
|
||||
* \#29 \[bug\] S3 error responses are not being logged
|
||||
* \#30 \[bug\] Sia provider error responses are not logged
|
||||
* \#31 \[bug\] S3 provider should limit max key size to 1024
|
||||
|
||||
### Changes from v2.0.2-rc
|
||||
|
||||
* Always use direct for read-only providers
|
||||
* Fixed externally removed files not being processed during cleanup
|
||||
* Fixed http headers not being added for requests
|
||||
* Fixed incorrect `stat` values for remote mounts
|
||||
* Fixed invalid directory nullptr error on remote mounts
|
||||
* Fixed memory leak in event system
|
||||
* Refactored application shutdown
|
||||
* Refactored event system
|
||||
* Updated build system to Alpine 3.21.0
|
||||
* Updated build system to MinGW-w64 12.0.0
|
||||
* Updated copyright to 2018-2025
|
||||
|
||||
---
|
||||
|
||||
## v2.0.2-rc
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### BREAKING CHANGES
|
||||
|
||||
* Refactored `config.json` - will need to verify configuration settings prior to mounting
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Issues
|
||||
|
||||
* \#14 \[Unit Test\] SQLite mini-ORM unit tests and cleanup
|
||||
* \#12 \[Unit Test\] Complete all providers unit tests
|
||||
* \#14 \[Unit Test \] SQLite mini-ORM unit tests and cleanup
|
||||
* \#16 Add support for bucket name in Sia provider
|
||||
* \#17 Update to common c++ build system
|
||||
* A single 64-bit Linux Jenkins server is used to build all Linux and Windows versions
|
||||
* All dependency sources are now included
|
||||
* MSVC is no longer supported
|
||||
* MSYS2 is required for building Windows binaries on Windows
|
||||
* MSYS2 is required for building Windows binaries Windows
|
||||
* OS X support is temporarily disabled
|
||||
* \#19 \[bug\] Rename file is broken for files that are existing
|
||||
* \#23 \[bug\] Incorrect file size displayed while upload is pending
|
||||
* \#24 RocksDB implementations should be transactional
|
||||
* \#25 Writes should block when maximum cache size is reached
|
||||
* \#26 Complete ring buffer and direct download support
|
||||
|
||||
### Changes from v2.0.1-rc
|
||||
|
||||
* Ability to choose between RocksDB and SQLite databases
|
||||
* Added direct reads and implemented download fallback
|
||||
* Corrected file times on S3 and Sia providers
|
||||
* Corrected handling of `chown()` and `chmod()`
|
||||
* Fixed erroneous download of chunks after resize
|
||||
|
||||
---
|
||||
|
||||
## v2.0.1-rc
|
||||
|
||||
@@ -220,8 +41,6 @@
|
||||
* Updated `curl` to v8.4.0
|
||||
* Updated `libsodium` to v1.0.19
|
||||
|
||||
---
|
||||
|
||||
## v2.0.0-rc
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
@@ -266,5 +85,3 @@
|
||||
* Supports re-upload after mount restart for incomplete uploads
|
||||
* NOTE: Uploads for all providers are full file (no resume support)
|
||||
* Multipart upload support is planned for S3
|
||||
|
||||
---
|
||||
|
||||
@@ -3,10 +3,6 @@ cmake_minimum_required(VERSION 3.27)
|
||||
cmake_policy(SET CMP0135 NEW)
|
||||
cmake_policy(SET CMP0144 NEW)
|
||||
|
||||
if (NOT PROJECT_INTERFACE)
|
||||
message(FATAL_ERROR "Project must be compiled via 'make_win32.cmd'/'make_win32.sh' or 'make_unix.sh' build scripts. Invoking 'cmake' directly is not supported.")
|
||||
endif()
|
||||
|
||||
project(${PROJECT_NAME}
|
||||
DESCRIPTION ${PROJECT_DESC}
|
||||
HOMEPAGE_URL ${PROJECT_URL}
|
||||
@@ -51,10 +47,6 @@ if(PROJECT_IS_ARM64)
|
||||
add_definitions(-DPROJECT_IS_ARM64)
|
||||
endif()
|
||||
|
||||
if(PROJECT_IS_DARWIN)
|
||||
add_definitions(-DPROJECT_IS_DARWIN)
|
||||
endif()
|
||||
|
||||
if(PROJECT_IS_MINGW)
|
||||
option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF)
|
||||
if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
|
||||
@@ -62,10 +54,6 @@ if(PROJECT_IS_MINGW)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (PROJECT_ENABLE_V2_ERRORS)
|
||||
add_definitions(-DPROJECT_ENABLE_V2_ERRORS)
|
||||
endif()
|
||||
|
||||
include(cmake/settings.cmake)
|
||||
|
||||
include(cmake/flags.cmake)
|
||||
@@ -119,26 +107,10 @@ if(PROJECT_BUILD)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
|
||||
@ONLY
|
||||
)
|
||||
|
||||
if (PROJECT_IS_MINGW AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in")
|
||||
configure_file(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in
|
||||
${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss
|
||||
@ONLY
|
||||
)
|
||||
endif()
|
||||
|
||||
if (PROJECT_IS_DARWIN AND EXISTS "${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist.in")
|
||||
configure_file(
|
||||
${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist.in
|
||||
${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist
|
||||
@ONLY
|
||||
)
|
||||
endif()
|
||||
|
||||
find_package(ICU REQUIRED COMPONENTS data i18n io uc)
|
||||
else()
|
||||
message(STATUS "-=[CMake Settings]=-")
|
||||
message(STATUS " C standard: ${CMAKE_C_STANDARD}")
|
||||
message(STATUS " C++ standard: ${CMAKE_CXX_STANDARD}")
|
||||
message(STATUS " CPU architecture: ${PROJECT_MARCH}")
|
||||
if(PROJECT_ENABLE_FUSE)
|
||||
message(STATUS " FUSE version: ${PROJECT_FUSE}")
|
||||
@@ -155,8 +127,6 @@ endif()
|
||||
DEPENDS ${PROJECT_DEPENDENCIES}
|
||||
COMMAND cd build && cmake
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
-DCMAKE_C_STANDARD=${CMAKE_C_STANDARD}
|
||||
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
|
||||
-DCMAKE_GENERATOR=${CMAKE_GENERATOR}
|
||||
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
|
||||
-DPROJECT_3RD_PARTY_DIR=${PROJECT_3RD_PARTY_DIR}
|
||||
@@ -169,7 +139,6 @@ endif()
|
||||
-DPROJECT_COPYRIGHT=${PROJECT_COPYRIGHT}
|
||||
-DPROJECT_DESC=${PROJECT_DESC}
|
||||
-DPROJECT_DIST_DIR=${PROJECT_DIST_DIR}
|
||||
-DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS}
|
||||
-DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES}
|
||||
-DPROJECT_ENABLE_BOOST=${PROJECT_ENABLE_BOOST}
|
||||
-DPROJECT_ENABLE_CPP_HTTPLIB=${PROJECT_ENABLE_CPP_HTTPLIB}
|
||||
@@ -179,7 +148,6 @@ endif()
|
||||
-DPROJECT_ENABLE_LIBSODIUM=${PROJECT_ENABLE_LIBSODIUM}
|
||||
-DPROJECT_ENABLE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
|
||||
-DPROJECT_ENABLE_PUGIXML=${PROJECT_ENABLE_PUGIXML}
|
||||
-DPROJECT_ENABLE_ROCKSDB=${PROJECT_ENABLE_ROCKSDB}
|
||||
-DPROJECT_ENABLE_SPDLOG=${PROJECT_ENABLE_SPDLOG}
|
||||
-DPROJECT_ENABLE_SQLITE=${PROJECT_ENABLE_SQLITE}
|
||||
-DPROJECT_ENABLE_STDUUID=${PROJECT_ENABLE_STDUUID}
|
||||
@@ -189,15 +157,11 @@ endif()
|
||||
-DPROJECT_FUSE=${PROJECT_FUSE}
|
||||
-DPROJECT_FUSE_INCLUDE_DIRS=${PROJECT_FUSE_INCLUDE_DIRS}
|
||||
-DPROJECT_GIT_REV=${PROJECT_GIT_REV}
|
||||
-DPROJECT_INTERFACE=1
|
||||
-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE}
|
||||
-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64}
|
||||
-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN}
|
||||
-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW}
|
||||
-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX}
|
||||
-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION}
|
||||
-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID}
|
||||
-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME}
|
||||
-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION}
|
||||
-DPROJECT_NAME=${PROJECT_NAME}
|
||||
-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Repertory MIT License
|
||||
### Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
### Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
||||
869
README.md
@@ -1,804 +1,75 @@
|
||||
# Repertory
|
||||
> /rĕp′ər-tôr″ē/
|
||||
> noun
|
||||
> *A place, such as a storehouse, where a stock of things is kept; a repository*
|
||||
|
||||
Repertory allows you to mount **S3** and **Sia** storage as local drives using:
|
||||
|
||||
- **FUSE** (Linux/macOS)
|
||||
- **WinFSP** (Windows)
|
||||
|
||||
It supports:
|
||||
|
||||
- Local mounts
|
||||
- Remote encrypted mounts between systems
|
||||
- Optional file name and data encryption using `XChaCha20-Poly1305` and `Argon2id` for key generation
|
||||
|
||||
---
|
||||
|
||||
## 📖 Contents
|
||||
|
||||
1. [Quick Start (Sia Example)](#-quick-start-sia-example)
|
||||
2. [Details & Features](#-details-and-features)
|
||||
3. [Minimum Requirements](#-minimum-requirements)
|
||||
- [Supported Operating Systems](#supported-operating-systems)
|
||||
4. [Data Directories](#-data-directories)
|
||||
5. [GUI](#-gui)
|
||||
6. [Usage](#-usage)
|
||||
- [Important Options](#important-options)
|
||||
- [Unmounting](#unmounting)
|
||||
7. [Sia Setup](#-sia-setup)
|
||||
- [Sia Initial Configuration](#sia-initial-configuration)
|
||||
- [Sia Mounting](#sia-mounting)
|
||||
- [Sia Configuration File](#sia-configuration-file)
|
||||
8. [S3 Setup](#-s3-setup)
|
||||
- [S3 Initial Configuration](#s3-initial-configuration)
|
||||
- [S3 Mounting](#s3-mounting)
|
||||
- [S3 Configuration File](#s3-configuration-file)
|
||||
9. [Remote Mounting](#-remote-mounting)
|
||||
- [Server Setup](#server-setup)
|
||||
- [Client Setup](#client-setup)
|
||||
- [Remote Mount Configuration File](#remote-mount-configuration-file)
|
||||
10. [Compiling from Source](#-compiling)
|
||||
- [Linux Compilation](#linux-compilation)
|
||||
- [macOS Compilation](#macos-compilation)
|
||||
- [Windows Compilation](#windows-compilation)
|
||||
11. [Credits](#-credits)
|
||||
12. [Developer Public Key](#-developer-public-key)
|
||||
13. [Consult the Wiki for additional information](https://git.fifthgrid.com/BlockStorage/repertory/wiki)
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start (Sia Example)
|
||||
|
||||
> 💡 Want to mount S3 instead?
|
||||
> Skip ahead to [S3 Setup](#-s3-setup) — the process is almost identical.
|
||||
|
||||
This example mounts a Sia bucket from a running [renterd](https://github.com/SiaFoundation/renterd) instance.
|
||||
|
||||
---
|
||||
|
||||
### 1. Install dependencies
|
||||
|
||||
#### Linux
|
||||
|
||||
``` shell
|
||||
sudo apt install fuse3 # Debian/Ubuntu
|
||||
# or
|
||||
sudo dnf install fuse3 # Fedora
|
||||
```
|
||||
|
||||
#### macOS
|
||||
|
||||
- Install [macFUSE 5.0.7](https://github.com/macfuse/macfuse/releases/download/macfuse-5.0.7/macfuse-5.0.7.dmg)
|
||||
|
||||
#### Windows
|
||||
|
||||
- Install [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi)
|
||||
|
||||
---
|
||||
|
||||
### 2. Configure
|
||||
|
||||
Replace placeholders with your actual values:
|
||||
|
||||
``` shell
|
||||
repertory --name mybucket -set HostConfig.ApiPassword "<renterd api password>"
|
||||
repertory --name mybucket -set SiaConfig.Bucket "<bucket name>"
|
||||
```
|
||||
|
||||
Optional:
|
||||
|
||||
``` shell
|
||||
# If renterd is not running locally
|
||||
repertory --name mybucket -set HostConfig.HostNameOrIp "<hostname or IP>"
|
||||
|
||||
# If renterd uses a non-default port (default 9980)
|
||||
repertory --name mybucket -set HostConfig.ApiPort <port>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Mount
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Linux
|
||||
|
||||
``` shell
|
||||
repertory --name mybucket /mnt/mybucket
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### macOS
|
||||
|
||||
``` shell
|
||||
repertory --name mybucket /Volumes/mybucket
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Windows
|
||||
|
||||
``` shell
|
||||
repertory --name mybucket t:
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. Unmount
|
||||
|
||||
``` shell
|
||||
repertory --name mybucket --unmount
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✨ Details and Features
|
||||
|
||||
- **Optimized for [Plex Media Server](https://www.plex.tv/).**
|
||||
- Remote mounting of `repertory` instances between Linux, macOS, and/or Windows.
|
||||
- Securely share your mounts over TCP/IP via `XChaCha20-Poly1305` with other systems on your network or over the internet.
|
||||
- Cross-platform support (Linux, macOS, and Windows).
|
||||
- Optionally encrypt file names and file data via `XChaCha20-Poly1305` in S3 mounts.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Minimum Requirements
|
||||
|
||||
- **Sia:** [renterd](https://github.com/SiaFoundation/renterd/releases) v2.0.0+ for Sia support
|
||||
- **Linux:** requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support
|
||||
- **macOS:** requires:
|
||||
- [macFUSE 5.0.7](https://github.com/macfuse/macfuse/releases/download/macfuse-5.0.7/macfuse-5.0.7.dmg)
|
||||
- **Windows:** requires:
|
||||
- [WinFSP 2025](https://github.com/winfsp/winfsp/releases/download/v2.1/winfsp-2.1.25156.msi)
|
||||
|
||||
### Supported Operating Systems
|
||||
|
||||
Only **64-bit operating systems** are supported:
|
||||
|
||||
- Linux `arm64/aarch64`
|
||||
- Linux `x86_64`
|
||||
- macOS `arm64/aarch64`
|
||||
- macOS `x86_64`
|
||||
- Windows `x86_64` 10, 11
|
||||
|
||||
---
|
||||
|
||||
## 📂 Data Directories
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Linux
|
||||
|
||||
``` shell
|
||||
# Mounts
|
||||
~/.local/repertory2/encrypt
|
||||
~/.local/repertory2/s3
|
||||
~/.local/repertory2/sia
|
||||
|
||||
# UI
|
||||
~/.local/repertory2
|
||||
```
|
||||
|
||||
### macOS
|
||||
|
||||
``` shell
|
||||
# Mounts
|
||||
~/Library/Application Support/repertory2/encrypt
|
||||
~/Library/Application Support/repertory2/s3
|
||||
~/Library/Application Support/repertory2/sia
|
||||
|
||||
# UI
|
||||
~/Library/Application Support/repertory2
|
||||
```
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
### Windows
|
||||
|
||||
``` cmd
|
||||
:: Mounts
|
||||
%LOCALAPPDATA%\repertory2\encrypt
|
||||
%LOCALAPPDATA%\repertory2\s3
|
||||
%LOCALAPPDATA%\repertory2\sia
|
||||
|
||||
:: UI
|
||||
%LOCALAPPDATA%\repertory2
|
||||
```
|
||||
|
||||
**IMPORTANT:**
|
||||
It is highly recommended to **exclude** these folders from any anti-virus/anti-malware applications as severe performance issues may arise. Excluding the mounted drive letter is also highly recommended.
|
||||
|
||||
---
|
||||
|
||||
## 🖥 GUI
|
||||
|
||||
As of `v2.0.6-release`, mounts can be managed using the **Repertory Management Portal**.
|
||||
|
||||
Launch the portal:
|
||||
|
||||
``` shell
|
||||
repertory -ui
|
||||
```
|
||||
|
||||
### ⚠️ Security tip
|
||||
|
||||
- Change the default UI credentials on first launch (`ui.json`) or via the portal
|
||||
- Default username: `repertory`
|
||||
- Default password: `repertory`
|
||||
|
||||
After first launch, `ui.json` will be created in the appropriate data directory (see [Data Directories](#-data-directories)). Modify this file directly or use the portal to change the default credentials.
|
||||
|
||||
### Screenshots
|
||||
|
||||
#### Login screen
|
||||
|
||||

|
||||
|
||||
#### Home screen
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## 🛠 Usage
|
||||
|
||||
### Important Options
|
||||
|
||||
- `--help`
|
||||
Display all mount utility options.
|
||||
|
||||
- `-f`
|
||||
Keep process in foreground on Linux.
|
||||
|
||||
- `--name, -na [name]`
|
||||
Identifies a unique configuration name to support multiple mounts.
|
||||
The `--name` option can be set to any valid value allowed as a file name for your filesystem.
|
||||
**The `--name` option is required.**
|
||||
|
||||
- `-dc`
|
||||
Display mount configuration.
|
||||
For Sia, the `--name` option is required.
|
||||
For S3, the `-s3` and `--name` options are required.
|
||||
|
||||
### Unmounting
|
||||
|
||||
#### Remote
|
||||
|
||||
``` shell
|
||||
repertory -rm 192.168.0.1:20000 --unmount
|
||||
```
|
||||
|
||||
#### S3
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' --unmount
|
||||
```
|
||||
|
||||
#### Sia
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' --unmount
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 Security Best Practices
|
||||
|
||||
When enabling **encryption tokens** for S3 or remote mounts:
|
||||
|
||||
- Use a **long, random string**.
|
||||
- Store it **offline** (password manager and an offline backup).
|
||||
- Losing it means **permanent data loss**.
|
||||
|
||||
---
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
<a id="sia-setup"></a>
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
<a id="-sia-setup"></a>
|
||||
## ☁️ Sia Setup
|
||||
|
||||
### Sia Initial Configuration
|
||||
|
||||
**Required steps:**
|
||||
|
||||
- Set the appropriate bucket name and `renterd` API password in `repertory` configuration:
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -set HostConfig.ApiPassword '<my password>'
|
||||
repertory --name '<my config name>' -set SiaConfig.Bucket '<my bucket name>'
|
||||
```
|
||||
|
||||
**Optional steps:**
|
||||
|
||||
- Set a user name used during `renterd` basic authentication:
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -set HostConfig.ApiUser '<my user>'
|
||||
```
|
||||
|
||||
- Set a custom agent string (default `Sia-Agent`):
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -set HostConfig.AgentString '<my agent>'
|
||||
```
|
||||
|
||||
- Set the host name or IP of the `renterd` instance (default `localhost`):
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -set HostConfig.HostNameOrIp '<my host name>'
|
||||
```
|
||||
|
||||
- Set the `renterd` API port (default `9980`):
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -set HostConfig.ApiPort 9981
|
||||
```
|
||||
|
||||
**Verify/view all configuration options:**
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' -dc
|
||||
# Example:
|
||||
repertory --name my_bucket -dc
|
||||
```
|
||||
|
||||
### Sia Mounting
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Linux
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' /mnt/location
|
||||
# Example:
|
||||
repertory --name my_bucket /mnt/location
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### macOS
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' /Volumes/mybucket
|
||||
# Example:
|
||||
repertory --name my_bucket /Volumes/mybucket
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Windows
|
||||
|
||||
``` shell
|
||||
repertory --name '<my config name>' t:
|
||||
# Example:
|
||||
repertory --name my_bucket t:
|
||||
```
|
||||
|
||||
### Sia Configuration File
|
||||
|
||||
```json
|
||||
{
|
||||
"ApiPassword": "<random generated rpc password>",
|
||||
"ApiPort": 10000,
|
||||
"ApiUser": "repertory",
|
||||
"DatabaseType": "rocksdb",
|
||||
"DownloadTimeoutSeconds": 30,
|
||||
"EnableDownloadTimeout": true,
|
||||
"EnableDriveEvents": false,
|
||||
"EventLevel": "info",
|
||||
"EvictionDelayMinutes": 1,
|
||||
"EvictionUseAccessedTime": false,
|
||||
"HighFreqIntervalSeconds": 30,
|
||||
"HostConfig": {
|
||||
"AgentString": "Sia-Agent",
|
||||
"ApiPassword": "<renterd api password>",
|
||||
"ApiPort": 9980,
|
||||
"ApiUser": "",
|
||||
"HostNameOrIp": "localhost",
|
||||
"Path": "",
|
||||
"Protocol": "http",
|
||||
"TimeoutMs": 60000
|
||||
},
|
||||
"LowFreqIntervalSeconds": 3600,
|
||||
"MaxCacheSizeBytes": 21474836480,
|
||||
"MaxUploadCount": 5,
|
||||
"MedFreqIntervalSeconds": 120,
|
||||
"OnlineCheckRetrySeconds": 60,
|
||||
"PreferredDownloadType": "default",
|
||||
"RemoteMount": {
|
||||
"ApiPort": 20000,
|
||||
"ClientPoolSize": 20,
|
||||
"Enable": false,
|
||||
"EncryptionToken": ""
|
||||
},
|
||||
"RetryReadCount": 6,
|
||||
"RingBufferFileSize": 512,
|
||||
"SiaConfig": {
|
||||
"Bucket": "my_bucket"
|
||||
},
|
||||
"TaskWaitMs": 100,
|
||||
"Version": 1
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🪣 S3 Setup
|
||||
|
||||
### S3 Initial Configuration
|
||||
|
||||
**Required steps:**
|
||||
|
||||
- Set the appropriate base URL:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.URL '<my url>'
|
||||
# Example:
|
||||
repertory -s3 --name minio -set S3Config.URL 'http://localhost:9000'
|
||||
```
|
||||
|
||||
- Set the appropriate bucket name:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.Bucket '<my bucket name>'
|
||||
```
|
||||
|
||||
- Set the appropriate access key:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.AccessKey '<my access key>'
|
||||
```
|
||||
|
||||
- Set the appropriate secret key:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.SecretKey '<my secret key>'
|
||||
```
|
||||
|
||||
- For Sia and most local S3 gateway instances, enable path style URLs:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.UsePathStyle true
|
||||
```
|
||||
|
||||
**Optional steps:**
|
||||
|
||||
- Set an appropriate region. Default is `any`:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.Region '<my region>'
|
||||
```
|
||||
|
||||
- Enable encrypted file names and file data. Set a strong, random encryption token and store it securely:
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set S3Config.EncryptionToken '<my strong password>'
|
||||
```
|
||||
|
||||
**Verify/view all configuration options:**
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -dc
|
||||
# Example:
|
||||
repertory -s3 --name minio -dc
|
||||
```
|
||||
|
||||
### S3 Mounting
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Linux
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' /mnt/location
|
||||
# Example:
|
||||
repertory -s3 --name minio /mnt/location
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### macOS
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' /Volumes/minio
|
||||
# Example:
|
||||
repertory -s3 --name minio /Volumes/minio
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
#### Windows
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' t:
|
||||
# Example:
|
||||
repertory -s3 --name minio t:
|
||||
```
|
||||
|
||||
### S3 Configuration File
|
||||
|
||||
```json
|
||||
{
|
||||
"ApiPassword": "<random generated rpc password>",
|
||||
"ApiPort": 10100,
|
||||
"ApiUser": "repertory",
|
||||
"DatabaseType": "rocksdb",
|
||||
"DownloadTimeoutSeconds": 30,
|
||||
"EnableDownloadTimeout": true,
|
||||
"EnableDriveEvents": false,
|
||||
"EventLevel": "info",
|
||||
"EvictionDelayMinutes": 1,
|
||||
"EvictionUseAccessedTime": false,
|
||||
"HighFreqIntervalSeconds": 30,
|
||||
"LowFreqIntervalSeconds": 3600,
|
||||
"MaxCacheSizeBytes": 21474836480,
|
||||
"MaxUploadCount": 5,
|
||||
"MedFreqIntervalSeconds": 120,
|
||||
"OnlineCheckRetrySeconds": 60,
|
||||
"PreferredDownloadType": "default",
|
||||
"RemoteMount": {
|
||||
"ApiPort": 20100,
|
||||
"ClientPoolSize": 20,
|
||||
"Enable": false,
|
||||
"EncryptionToken": ""
|
||||
},
|
||||
"RetryReadCount": 6,
|
||||
"RingBufferFileSize": 512,
|
||||
"S3Config": {
|
||||
"AccessKey": "<my access key>",
|
||||
"Bucket": "<my bucket name>",
|
||||
"EncryptionToken": "",
|
||||
"Region": "any",
|
||||
"SecretKey": "<my secret key>",
|
||||
"TimeoutMs": 60000,
|
||||
"URL": "http://localhost:9000",
|
||||
"UsePathStyle": true,
|
||||
"UseRegionInURL": false
|
||||
},
|
||||
"TaskWaitMs": 100,
|
||||
"Version": 1
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 Remote Mounting
|
||||
|
||||
`repertory` allows local mounts to be shared with other computers on your network or over the internet. This option is referred to as **remote mounting**.
|
||||
|
||||
### Server Setup
|
||||
|
||||
The following steps must be performed on the mount you wish to share with other systems. Changes to configuration will not take effect while a mount is active, so it is recommended to unmount beforehand.
|
||||
|
||||
**Required steps:**
|
||||
|
||||
- Enable remote mount:
|
||||
|
||||
- **Sia**
|
||||
|
||||
``` shell
|
||||
repertory -set RemoteMount.Enable true
|
||||
repertory --name '<my config name>' -set RemoteMount.Enable true
|
||||
```
|
||||
|
||||
- **S3**
|
||||
|
||||
``` shell
|
||||
repertory -set RemoteMount.Enable true
|
||||
repertory -s3 --name '<my config name>' -set RemoteMount.Enable true
|
||||
```
|
||||
|
||||
- Set a secure encryption token:
|
||||
|
||||
- **Sia**
|
||||
|
||||
``` shell
|
||||
repertory -set RemoteMount.EncryptionToken '<my secure password>'
|
||||
repertory --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'
|
||||
```
|
||||
|
||||
- **S3**
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set RemoteMount.EncryptionToken '<my secure password>'
|
||||
```
|
||||
|
||||
**Optional steps:**
|
||||
|
||||
- Change the port clients will use to connect to your mount:
|
||||
|
||||
- **Sia**
|
||||
|
||||
``` shell
|
||||
repertory -set RemoteMount.ApiPort 20000
|
||||
repertory --name '<my config name>' -set RemoteMount.ApiPort 20000
|
||||
```
|
||||
|
||||
- **S3**
|
||||
|
||||
``` shell
|
||||
repertory -s3 --name '<my config name>' -set RemoteMount.ApiPort 20000
|
||||
```
|
||||
|
||||
**IMPORTANT:**
|
||||
|
||||
Be sure to configure your firewall to allow incoming TCP connections on the port configured in `RemoteMount.ApiPort`.
|
||||
|
||||
#### Remote Mount Configuration File Section
|
||||
|
||||
```json
|
||||
{
|
||||
"RemoteMount": {
|
||||
"ApiPort": 20000,
|
||||
"ClientPoolSize": 20,
|
||||
"Enable": true,
|
||||
"EncryptionToken": "<my secure password>"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Client Setup
|
||||
|
||||
Client configuration is provider agnostic, so there's no need to specify `-s3` for S3 providers.
|
||||
|
||||
**Required steps:**
|
||||
|
||||
- Set the encryption token to the same value configured during server setup:
|
||||
|
||||
``` shell
|
||||
repertory -rm <host name or IP>:<port> -set RemoteConfig.EncryptionToken '<my secure password>'
|
||||
# Replace <host name or IP> with the host name or IP of the server
|
||||
# Replace <port> with the value of RemoteMount.ApiPort used in the server configuration
|
||||
# Example:
|
||||
repertory -rm 192.168.1.10:20000 -set RemoteConfig.EncryptionToken '<my secure password>'
|
||||
repertory -rm my.host.com:20000 -set RemoteConfig.EncryptionToken '<my secure password>'
|
||||
```
|
||||
|
||||
#### Client Remote Mounting
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
##### Linux
|
||||
|
||||
``` shell
|
||||
repertory -rm <host name or IP>:<port> /mnt/location
|
||||
# Example:
|
||||
repertory -rm 192.168.1.10:20000 /mnt/location
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
##### macOS
|
||||
|
||||
``` shell
|
||||
repertory -rm <host name or IP>:<port> /Volumes/remotemount
|
||||
# Example:
|
||||
repertory -rm 192.168.1.10:20000 /Volumes/remotemount
|
||||
```
|
||||
|
||||
<!-- markdownlint-disable-next-line -->
|
||||
##### Windows
|
||||
|
||||
``` shell
|
||||
repertory -rm <host name or IP>:<port> t:
|
||||
# Example:
|
||||
repertory -rm 192.168.1.10:20000 t:
|
||||
```
|
||||
|
||||
#### Remote Mount Configuration File
|
||||
|
||||
```json
|
||||
{
|
||||
"ApiPassword": "<random generated rpc password>",
|
||||
"ApiPort": 10010,
|
||||
"ApiUser": "repertory",
|
||||
"EnableDriveEvents": false,
|
||||
"EventLevel": "info",
|
||||
"RemoteConfig": {
|
||||
"ApiPort": 20000,
|
||||
"EncryptionToken": "<my secure password>",
|
||||
"HostNameOrIp": "192.168.1.10",
|
||||
"MaxConnections": 20,
|
||||
"ReceiveTimeoutMs": 120000,
|
||||
"SendTimeoutMs": 30000
|
||||
},
|
||||
"TaskWaitMs": 100,
|
||||
"Version": 1
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧰 Compiling
|
||||
|
||||
Successful compilation will place all required files for execution in the `dist/` directory.
|
||||
|
||||
### Linux Compilation
|
||||
|
||||
- Ensure `docker` is installed
|
||||
|
||||
- For `x86_64`:
|
||||
|
||||
``` shell
|
||||
scripts/make_unix.sh x86_64
|
||||
scripts/make_unix.sh x86_64 Release
|
||||
scripts/make_unix.sh x86_64 Debug
|
||||
```
|
||||
|
||||
- For `aarch64`:
|
||||
|
||||
``` shell
|
||||
scripts/make_unix.sh aarch64
|
||||
scripts/make_unix.sh aarch64 Release
|
||||
scripts/make_unix.sh aarch64 Debug
|
||||
```
|
||||
|
||||
### macOS Compilation
|
||||
|
||||
- Ensure `Xcode` and `CMake` are installed
|
||||
|
||||
- For `x86_64`:
|
||||
|
||||
``` shell
|
||||
scripts/make_unix.sh x86_64
|
||||
scripts/make_unix.sh x86_64 Release
|
||||
scripts/make_unix.sh x86_64 Debug
|
||||
```
|
||||
|
||||
- For `aarch64`:
|
||||
|
||||
``` shell
|
||||
scripts/make_unix.sh aarch64
|
||||
scripts/make_unix.sh aarch64 Release
|
||||
scripts/make_unix.sh aarch64 Debug
|
||||
```
|
||||
|
||||
### Windows Compilation
|
||||
|
||||
- **OFFICIAL: Cross-compiling on Linux**
|
||||
|
||||
- Ensure `docker` is installed
|
||||
|
||||
``` shell
|
||||
scripts/make_win32.sh x86_64
|
||||
scripts/make_win32.sh x86_64 Release
|
||||
scripts/make_win32.sh x86_64 Debug
|
||||
```
|
||||
|
||||
- **UNOFFICIAL: Compiling on Windows**
|
||||
|
||||
- Ensure latest [MSYS2](https://www.msys2.org/) is installed
|
||||
|
||||
``` cmd
|
||||
scripts\make_win32.cmd x86_64
|
||||
scripts\make_win32.cmd x86_64 Release
|
||||
scripts\make_win32.cmd x86_64 Debug
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📜 Credits
|
||||
|
||||
- [binutils](https://www.gnu.org/software/binutils/)
|
||||
- [boost c++ libraries](https://www.boost.org/)
|
||||
- [cpp-httplib](https://github.com/yhirose/cpp-httplib)
|
||||
- [curl](https://curl.haxx.se/)
|
||||
- [docker](https://www.docker.com/)
|
||||
- [Google Test](https://github.com/google/googletest)
|
||||
- [ICU](https://icu.unicode.org/)
|
||||
- [JSON for Modern C++](https://github.com/nlohmann/json)
|
||||
- [libexpat](https://github.com/libexpat/libexpat)
|
||||
- [libfuse](https://github.com/libfuse/libfuse)
|
||||
- [libsodium](https://doc.libsodium.org/)
|
||||
- [macFUSE](https://macfuse.github.io/)
|
||||
- [mingw-w64](https://www.mingw-w64.org/)
|
||||
- [MSYS2](https://www.msys2.org)
|
||||
- [OpenSSL](https://www.openssl.org/)
|
||||
- [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/)
|
||||
- [pugixml](https://pugixml.org/)
|
||||
- [RocksDB](https://rocksdb.org)
|
||||
- [ScPrime](https://scpri.me/)
|
||||
- [Sia Decentralized Cloud Storage](https://sia.tech/)
|
||||
- [spdlog](https://github.com/gabime/spdlog)
|
||||
- [SQLite](https://www.sqlite.org)
|
||||
- [stduuid](https://github.com/mariusbancila/stduuid)
|
||||
- [Storj](https://www.storj.io/)
|
||||
- [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp)
|
||||
- [zlib](https://zlib.net/)
|
||||
|
||||
---
|
||||
|
||||
## 🔑 Developer Public Key
|
||||
Repertory allows you to mount AWS S3 and Sia via FUSE on Linux ~~/OS X~~ or via WinFSP
|
||||
on Windows.
|
||||
|
||||
## Details and Features
|
||||
|
||||
* Optimized for [Plex Media Server](https://www.plex.tv/)
|
||||
* Single application to mount AWS S3 and/or Sia
|
||||
* Only 1 Sia mount and 1 S3 mount (per bucket) per user is supported.
|
||||
* Remote mounting of Repertory instances on Linux ~~, OS X~~ and Windows
|
||||
* Securely share your mounts over TCP/IP (`XChaCha20-Poly1305` stream cipher)
|
||||
* Cross-platform support (Linux 64-bit, Linux arm64/aarch64, ~~OS X,~~ Windows 64-bit)
|
||||
|
||||
## Minimum Requirements
|
||||
|
||||
* [Sia renterd](https://github.com/SiaFoundation/renterd/releases) v0.4.0+ for Sia support
|
||||
* Only 64-bit operating systems are supported
|
||||
* By default, Linux requires `fusermount3`; otherwise, `repertory` must be manually compiled with `libfuse2` support
|
||||
* ~~OS X requires the following dependency to be installed:~~
|
||||
* ~~[FUSE for macOS v4.5.0](https://github.com/osxfuse/osxfuse/releases/download/macfuse-4.5.0/macfuse-4.5.0.dmg)~~
|
||||
* Windows requires the following dependencies to be installed:
|
||||
* [WinFSP 2023](https://github.com/winfsp/winfsp/releases/download/v2.0/winfsp-2.0.23075.msi)
|
||||
|
||||
## Supported Operating Systems
|
||||
|
||||
* Linux `arm64/aarch64`
|
||||
* Linux `amd64`
|
||||
* ~~OS X Mojave and above~~
|
||||
* Windows 64-bit 10, 11
|
||||
|
||||
## Compiling
|
||||
|
||||
* Successful compilation will result in all required files being placed in the `dist/` directory
|
||||
* Linux
|
||||
* Ensure `docker` is installed
|
||||
* For x86_64:
|
||||
* Release: `scripts/make_unix.sh x86_64`
|
||||
* Debug: `scripts/make_unix.sh x86_64 debug`
|
||||
* For aarch64:
|
||||
* Release: `scripts/make_unix.sh aarch64`
|
||||
* Debug: `scripts/make_unix.sh aarch64 debug`
|
||||
* Windows
|
||||
* RECOMMENDED: Cross-compiling on Linux
|
||||
* Ensure `docker` is installed
|
||||
* Release: `scripts/make_win32.sh`
|
||||
* Debug: `scripts/make_win32.sh debug`
|
||||
* Compiling on Windows
|
||||
* Ensure latest [MSYS2](https://www.msys2.org/) is installed
|
||||
* Release: `scripts/make_win32.cmd`
|
||||
* Debug: `scripts/make_win32.cmd debug`
|
||||
|
||||
## Credits
|
||||
|
||||
* [boost c++ libraries](https://www.boost.org/)
|
||||
* [cpp-httplib](https://github.com/yhirose/cpp-httplib)
|
||||
* [curl](https://curl.haxx.se/)
|
||||
* ~~[FUSE for macOS](https://osxfuse.github.io/)~~
|
||||
* [Google Test](https://github.com/google/googletest)
|
||||
* [JSON for Modern C++](https://github.com/nlohmann/json)
|
||||
* [libfuse](https://github.com/libfuse/libfuse)
|
||||
* [libsodium](https://doc.libsodium.org/)
|
||||
* [OpenSSL](https://www.openssl.org/)
|
||||
* [ScPrime](https://scpri.me/)
|
||||
* [Sia Decentralized Cloud Storage](https://sia.tech/)
|
||||
* [SQLite](https://www.sqlite.org)
|
||||
* [stduuid](https://github.com/mariusbancila/stduuid)
|
||||
* [Storj](https://storj.io/)
|
||||
* [WinFSP - FUSE for Windows](https://github.com/billziss-gh/winfsp)
|
||||
* [zlib](https://zlib.net/)
|
||||
|
||||
## Developer Public Key
|
||||
|
||||
```text
|
||||
-----BEGIN PUBLIC KEY-----
|
||||
|
||||
|
Before Width: | Height: | Size: 262 B |
|
Before Width: | Height: | Size: 298 B |
|
Before Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 820 B |
|
Before Width: | Height: | Size: 202 B |
|
Before Width: | Height: | Size: 281 B |
|
Before Width: | Height: | Size: 820 B |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 281 B |
|
Before Width: | Height: | Size: 361 B |
|
Before Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 361 B |
|
Before Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
BIN
assets/home.png
|
Before Width: | Height: | Size: 165 KiB |
BIN
assets/icon.icns
BIN
assets/icon.ico
|
Before Width: | Height: | Size: 370 KiB |
BIN
assets/login.png
|
Before Width: | Height: | Size: 221 KiB |
@@ -35,9 +35,13 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
||||
-Wcast-align
|
||||
-Wconversion
|
||||
-Wdouble-promotion
|
||||
-Wduplicated-branches
|
||||
-Wduplicated-cond
|
||||
-Wextra
|
||||
-Wformat=2
|
||||
-Wlogical-op
|
||||
-Wmisleading-indentation
|
||||
-Wno-useless-cast
|
||||
-Wnon-virtual-dtor
|
||||
-Wnull-dereference
|
||||
-Wold-style-cast
|
||||
@@ -48,19 +52,6 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
||||
-Wunused
|
||||
)
|
||||
|
||||
if (PROJECT_ENABLE_LIBBITCOIN_SYSTEM AND PROJECT_IS_DARWIN)
|
||||
list(APPEND PROJECT_CXXFLAGS_LIST -Wno-enum-constexpr-conversion)
|
||||
endif()
|
||||
|
||||
if (NOT PROJECT_IS_DARWIN)
|
||||
list(APPEND PROJECT_CXXFLAGS_LIST
|
||||
-Wduplicated-branches
|
||||
-Wduplicated-cond
|
||||
-Wlogical-op
|
||||
-Wno-useless-cast
|
||||
)
|
||||
endif()
|
||||
|
||||
list(APPEND PROJECT_CFLAGS_LIST
|
||||
${PROJECT_COMMON_FLAG_LIST}
|
||||
-std=c${CMAKE_C_STANDARD}
|
||||
@@ -71,7 +62,7 @@ list(APPEND PROJECT_CXXFLAGS_LIST
|
||||
-std=gnu++${CMAKE_CXX_STANDARD}
|
||||
)
|
||||
|
||||
if(NOT PROJECT_IS_DARWIN AND PROJECT_STATIC_LINK)
|
||||
if(PROJECT_STATIC_LINK)
|
||||
list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS
|
||||
-static-libgcc
|
||||
-static-libstdc++
|
||||
@@ -98,11 +89,7 @@ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_L
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}")
|
||||
|
||||
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility ${PROJECT_COMMON_FLAG_LIST}")
|
||||
if (NOT PROJECT_IS_DARWIN)
|
||||
set(EXTERNAL_CMAKE_CXX_FLAGS "-fext-numeric-literals ${EXTERNAL_CMAKE_CXX_FLAGS}")
|
||||
endif()
|
||||
|
||||
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility -fext-numeric-literals ${PROJECT_COMMON_FLAG_LIST}")
|
||||
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
|
||||
-DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
|
||||
-DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE}
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
if (PROJECT_MACOS_ICNS_NAME)
|
||||
set(PROJECT_MACOS_ICNS_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/assets/${PROJECT_MACOS_ICNS_NAME}")
|
||||
endif()
|
||||
|
||||
function(set_common_target_options name)
|
||||
target_compile_definitions(${name} PUBLIC
|
||||
${PROJECT_DEFINITIONS}
|
||||
@@ -16,17 +12,6 @@ function(set_common_target_options name)
|
||||
${PROJECT_EXTERNAL_BUILD_ROOT}/lib
|
||||
)
|
||||
|
||||
if (PROJECT_STATIC_LINK)
|
||||
target_compile_definitions(${name} PRIVATE U_STATIC_IMPLEMENTATION)
|
||||
endif()
|
||||
|
||||
target_link_libraries(${name} PRIVATE
|
||||
ICU::io
|
||||
ICU::i18n
|
||||
ICU::uc
|
||||
ICU::data
|
||||
)
|
||||
|
||||
target_include_directories(${name} AFTER PUBLIC
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include
|
||||
${name}_INCLUDES
|
||||
@@ -46,31 +31,11 @@ function(add_project_executable2 name dependencies libraries headers sources is_
|
||||
list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC})
|
||||
endif()
|
||||
|
||||
if (PROJECT_IS_DARWIN AND PROJECT_MACOS_ICNS_SOURCE AND "${name}" STREQUAL "${PROJECT_NAME}")
|
||||
set_source_files_properties(${PROJECT_MACOS_ICNS_SOURCE} PROPERTIES
|
||||
MACOSX_PACKAGE_LOCATION "Resources"
|
||||
)
|
||||
|
||||
add_executable(${name}
|
||||
MACOSX_BUNDLE
|
||||
${headers}
|
||||
${sources}
|
||||
${PROJECT_MACOS_ICNS_SOURCE}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
||||
)
|
||||
|
||||
set_target_properties(${name} PROPERTIES
|
||||
MACOSX_BUNDLE TRUE
|
||||
MACOSX_BUNDLE_ICON_FILE "${PROJECT_MACOS_ICNS_NAME}"
|
||||
RESOURCE "${PROJECT_MACOS_ICNS_SOURCE}"
|
||||
)
|
||||
else()
|
||||
add_executable(${name}
|
||||
${headers}
|
||||
${sources}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
||||
)
|
||||
endif()
|
||||
add_executable(${name}
|
||||
${headers}
|
||||
${sources}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
|
||||
)
|
||||
|
||||
foreach(dependency ${dependencies})
|
||||
set_common_target_options(${dependency})
|
||||
|
||||
@@ -1,22 +1,41 @@
|
||||
set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237)
|
||||
set(BINUTILS_HASH ae9a5789e23459e59606e6714723f2d3ffc31c03174191ef0d015bdf06007450)
|
||||
set(BOOST2_HASH 7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca)
|
||||
set(BOOST_HASH 9de758db755e8330a01d995b0a24d09798048400ac25c03fc5ea9be364b13c93)
|
||||
set(CPP_HTTPLIB_HASH a66f908f50ccb119769adce44fe1eac75f81b6ffab7c4ac0211bb663ffeb2688)
|
||||
set(CURL_HASH d4d9a5001b491f5726efe9b50bc4aad03029506e73c9261272e809c64b05e814)
|
||||
set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb)
|
||||
set(GCC_HASH 7294d65cc1a0558cb815af0ca8c7763d86f7a31199794ede3f630c0d1b0a5723)
|
||||
set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c)
|
||||
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
|
||||
set(INNOSETUP_HASH fa73bf47a4da250d185d07561c2bfda387e5e20db77e4570004cf6a133cc10b1)
|
||||
set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187)
|
||||
set(BOOST_HASH be0d91732d5b0cc6fbb275c7939974457e79b54d6f07ce2e3dfdd68bef883b0b)
|
||||
set(CLI11_HASH f2d893a65c3b1324c50d4e682c0cdc021dd0477ae2c048544f39eed6654b699a)
|
||||
set(CPP_HTTPLIB_HASH c1742fc7179aaae2a67ad9bba0740b7e9ffaf4f5e62feef53101ecdef1478716)
|
||||
set(CURL_HASH d714818f6ac41ae9154850158fed44b7a87650a6d52f83d3bcb9aa527be354d7)
|
||||
set(CXXOPTS_HASH 841f49f2e045b9c6365997c2a8fbf76e6f215042dda4511a5bb04bc5ebc7f88a)
|
||||
set(EXPAT_HASH fbd032683370d761ba68dba2566d3280a154f5290634172d60a79b24d366d9dc)
|
||||
set(FLAC_HASH 0a4bb82a30609b606650d538a804a7b40205366ce8fc98871b0ecf3fbb0611ee)
|
||||
set(FMT_HASH 6cb1e6d37bdcb756dbbe59be438790db409cdb4868c66e888d5df9f13f7c027f)
|
||||
set(FONTCONFIG_HASH f5f359d6332861bd497570848fcb42520964a9e83d5e3abe397b6b6db9bcaaf4)
|
||||
set(FREETYPE2_HASH 5c3a8e78f7b24c20b25b54ee575d6daa40007a5f4eea2845861c3409b3021747)
|
||||
set(GCC_HASH 7d376d445f93126dc545e2c0086d0f647c3094aae081cdb78f42ce2bc25e7293)
|
||||
set(GTEST_HASH 7b42b4d6ed48810c5362c265a17faebe90dc2373c885e5216439d37927f02926)
|
||||
set(ICU_HASH 925e6b4b8cf8856e0ac214f6f34e30dee63b7bb7a50460ab4603950eff48f89e)
|
||||
set(JSON_HASH 0d8ef5af7f9794e3263480193c491549b2ba6cc74bb018906202ada498a79406)
|
||||
set(LIBDSM_HASH 747c4563d6291303d9b085c9e7dc96ac44f91871dcac3e20480fdcc066eee88a)
|
||||
set(LIBEVENT_HASH 7180a979aaa7000e1264da484f712d403fcf7679b1e9212c4e3d09f5c93efc24)
|
||||
set(LIBICONV_HASH 8f74213b56238c85a50a5329f77e06198771e70dd9a739779f4c02f65d971313)
|
||||
set(LIBJPEG_TURBO_HASH a649205a90e39a548863a3614a9576a3fb4465f8e8e66d54999f127957c25b21)
|
||||
set(LIBPNG_HASH fecc95b46cf05e8e3fc8a414750e0ba5aad00d89e9fdf175e94ff041caf1a03a)
|
||||
set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1)
|
||||
set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf)
|
||||
set(OPENSSL_HASH b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9)
|
||||
set(LIBTASN_HASH 1613f0ac1cf484d6ec0ce3b8c06d56263cc7242f1c23b30d82d23de345a63f7a)
|
||||
set(MINGW_HASH 3f66bce069ee8bed7439a1a13da7cb91a5e67ea6170f21317ac7f5794625ee10)
|
||||
set(NANA_HASH 56f7b1ed006c750fccf8ef15ab1e83f96751f2dfdcb68d93e5f712a6c9b58bcb)
|
||||
set(NUSPELL_HASH 5d4baa1daf833a18dc06ae0af0571d9574cc849d47daff6b9ce11dac0a5ded6a)
|
||||
set(OGG_HASH 0eb4b4b9420a0f51db142ba3f9c64b333f826532dc0f48c6410ae51f4799b664)
|
||||
set(OPENAL_HASH dfddf3a1f61059853c625b7bb03de8433b455f2f79f89548cbcbd5edca3d4a4a)
|
||||
set(OPENSSL_HASH 777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e)
|
||||
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
|
||||
set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a)
|
||||
set(ROCKSDB_HASH 7ec942baab802b2845188d02bc5d4e42c29236e61bcbc08f5b3a6bdd92290c22)
|
||||
set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67)
|
||||
set(SQLITE_HASH 1d3049dd0f830a025a53105fc79fd2ab9431aea99e137809d064d8ee8356b032)
|
||||
set(PUGIXML_HASH 2f10e276870c64b1db6809050a75e11a897a8d7456c4be5c6b2e35a11168a015)
|
||||
set(ROCKSDB_HASH b20780586d3df4a3c5bcbde341a2c1946b03d18237960bda5bc5e9538f42af40)
|
||||
set(SDL_HASH 254a767aa486fa6308d4473159c1f23c794610be775d63e98084111d96814b85)
|
||||
set(SECP256K1_HASH 61583939f1f25b92e6401e5b819e399da02562de663873df3056993b40148701)
|
||||
set(SFML_HASH 82535db9e57105d4f3a8aedabd138631defaedc593cab589c924b7d7a11ffb9d)
|
||||
set(SPDLOG_HASH 1586508029a7d0670dfcb2d97575dcdc242d3868a259742b69f100801ab4e16b)
|
||||
set(SQLITE_HASH 77823cb110929c2bcb0f5d48e4833b5c59a8a6e40cdea3936b99e199dbbe5784)
|
||||
set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3)
|
||||
set(WINFSP_HASH 073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a)
|
||||
set(VORBIS_HASH 270c76933d0934e42c5ee0a54a36280e2d87af1de3cc3e584806357e237afd13)
|
||||
set(WXWIDGETS_HASH 0ad86a3ad3e2e519b6a705248fc9226e3a09bbf069c6c692a02acf7c2d1c6b51)
|
||||
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)
|
||||
|
||||
@@ -4,24 +4,19 @@ set(Boost_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK})
|
||||
if (PROJECT_IS_DARWIN)
|
||||
set(ZLIB_USE_STATIC_LIBS OFF)
|
||||
else()
|
||||
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
endif()
|
||||
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK})
|
||||
set(ICU_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
|
||||
|
||||
include(cmake/libraries/icu.cmake)
|
||||
include(cmake/libraries/openssl.cmake)
|
||||
|
||||
include(cmake/libraries/boost.cmake)
|
||||
|
||||
include(cmake/libraries/cpp_httplib.cmake)
|
||||
include(cmake/libraries/curl.cmake)
|
||||
include(cmake/libraries/fuse.cmake)
|
||||
include(cmake/libraries/json.cmake)
|
||||
include(cmake/libraries/libsodium.cmake)
|
||||
include(cmake/libraries/pugixml.cmake)
|
||||
include(cmake/libraries/rocksdb.cmake)
|
||||
include(cmake/libraries/spdlog.cmake)
|
||||
include(cmake/libraries/sqlite.cmake)
|
||||
include(cmake/libraries/stduuid.cmake)
|
||||
@@ -63,7 +58,7 @@ if(PROJECT_BUILD)
|
||||
winspool
|
||||
ws2_32
|
||||
)
|
||||
elseif(NOT PROJECT_IS_DARWIN)
|
||||
else()
|
||||
link_libraries(
|
||||
uring
|
||||
)
|
||||
|
||||
@@ -39,14 +39,6 @@ if(PROJECT_ENABLE_BOOST)
|
||||
wserialization
|
||||
)
|
||||
else()
|
||||
if(PROJECT_IS_DARWIN)
|
||||
set(CMAKE_HAVE_THREADS_LIBRARY 1)
|
||||
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
|
||||
set(CMAKE_USE_PTHREADS_INIT 1)
|
||||
set(CMAKE_USE_WIN32_THREADS_INIT 0)
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
endif()
|
||||
|
||||
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION}
|
||||
REQUIRED
|
||||
COMPONENTS
|
||||
@@ -62,6 +54,7 @@ if(PROJECT_ENABLE_BOOST)
|
||||
random
|
||||
regex
|
||||
serialization
|
||||
system
|
||||
thread
|
||||
wserialization
|
||||
)
|
||||
@@ -94,28 +87,29 @@ if(PROJECT_ENABLE_BOOST)
|
||||
set(BOOST_LINK "static,shared")
|
||||
endif()
|
||||
|
||||
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
|
||||
set(BOOST_CXX_STANDARD 14)
|
||||
set(BOOST_OPTIONS cxxflags=-Wno-enum-constexpr-conversion)
|
||||
else()
|
||||
set(BOOST_CXX_STANDARD ${CMAKE_CXX_STANDARD})
|
||||
set(BOOST_OPTIONS define=BOOST_ASIO_HAS_STD_STRING_VIEW)
|
||||
endif()
|
||||
|
||||
set(BOOST_BUILD_ARGS
|
||||
--openssldir=$ENV{OPENSSL_ROOT_DIR}
|
||||
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
|
||||
address-model=64
|
||||
architecture=${BOOST_ARCH}
|
||||
cxxstd=20
|
||||
cxxstd-dialect=gnu
|
||||
cxxstd=${BOOST_CXX_STANDARD}
|
||||
cxxflags=-std=gnu++${CMAKE_CXX_STANDARD}
|
||||
cxxstd=${CMAKE_CXX_STANDARD}
|
||||
define=BOOST_ASIO_HAS_STD_STRING_VIEW
|
||||
define=BOOST_SYSTEM_NO_DEPRECATED
|
||||
link=${BOOST_LINK}
|
||||
linkflags=-std=gnu++${CMAKE_CXX_STANDARD}
|
||||
threading=multi
|
||||
variant=${BOOST_BUILD_TYPE_LOWER}
|
||||
${BOOST_OPTIONS}
|
||||
)
|
||||
|
||||
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
|
||||
set(BOOST_URL_HASH SHA256=${BOOST2_HASH})
|
||||
else()
|
||||
set(BOOST_URL_HASH SHA256=${BOOST_HASH})
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(boost_project
|
||||
PREFIX external
|
||||
URL ${PROJECT_3RD_PARTY_DIR}/boost_${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_PATCH_VERSION}.tar.gz
|
||||
@@ -126,23 +120,17 @@ if(PROJECT_ENABLE_BOOST)
|
||||
--with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread
|
||||
BUILD_COMMAND
|
||||
./b2
|
||||
-sNO_BZIP2=1
|
||||
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||
-j1
|
||||
${BOOST_BUILD_ARGS}
|
||||
INSTALL_COMMAND
|
||||
./b2
|
||||
-sNO_BZIP2=1
|
||||
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||
-j1
|
||||
${BOOST_BUILD_ARGS}
|
||||
install
|
||||
)
|
||||
|
||||
list(APPEND PROJECT_DEPENDENCIES boost_project)
|
||||
|
||||
if(PROJECT_IS_DARWIN OR PROJECT_REQUIRE_ALPINE)
|
||||
add_dependencies(boost_project icu_project)
|
||||
endif()
|
||||
|
||||
if (NOT CMAKE_HOST_WIN32)
|
||||
add_dependencies(boost_project openssl_project)
|
||||
endif()
|
||||
|
||||
@@ -15,14 +15,10 @@ if(PROJECT_ENABLE_CPP_HTTPLIB)
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DHTTPLIB_REQUIRE_BROTLI=OFF
|
||||
-DHTTPLIB_REQUIRE_OPENSSL=ON
|
||||
-DHTTPLIB_REQUIRE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
|
||||
-DHTTPLIB_REQUIRE_ZLIB=ON
|
||||
-DHTTPLIB_REQUIRE_BROTLI=OFF
|
||||
-DHTTPLIB_TEST=OFF
|
||||
-DHTTPLIB_USE_BROTLI_IF_AVAILABLE=OFF
|
||||
-DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=ON
|
||||
-DHTTPLIB_USE_ZLIB_IF_AVAILABLE=ON
|
||||
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
|
||||
)
|
||||
|
||||
|
||||
@@ -18,18 +18,14 @@ if(PROJECT_ENABLE_CURL)
|
||||
URL ${PROJECT_3RD_PARTY_DIR}/curl-${CURL_VERSION}.tar.gz
|
||||
URL_HASH SHA256=${CURL_HASH}
|
||||
LIST_SEPARATOR |
|
||||
BUILD_COMMAND
|
||||
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_CURL_EXE=OFF
|
||||
-DBUILD_LIBCURL_DOCS=OFF
|
||||
-DBUILD_MISC_DOCS=OFF
|
||||
CMAKE_ARGS
|
||||
${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DBUILD_CURL_EXE=OFF
|
||||
-DBUILD_STATIC_CURL=ON
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DBUILD_TESTING=OFF
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DCURL_BROTLI=OFF
|
||||
-DCURL_CA_BUNDLE=./cacert.pem
|
||||
-DCURL_CA_FALLBACK=ON
|
||||
-DCURL_DISABLE_LDAP=ON
|
||||
@@ -37,13 +33,10 @@ if(PROJECT_ENABLE_CURL)
|
||||
-DCURL_USE_LIBSSH2=OFF
|
||||
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
|
||||
-DCURL_ZLIB=ON
|
||||
-DCURL_ZSTD=OFF
|
||||
-DENABLE_CURL_MANUAL=OFF
|
||||
-DENABLE_THREADED_RESOLVER=ON
|
||||
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
|
||||
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
|
||||
-DUSE_LIBIDN2=OFF
|
||||
-DUSE_NGHTTP2=OFF
|
||||
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
|
||||
)
|
||||
|
||||
|
||||
@@ -20,25 +20,17 @@ if(PROJECT_ENABLE_FUSE AND NOT PROJECT_IS_MINGW)
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
if (PROJECT_IS_DARWIN)
|
||||
find_library(OSXFUSE NO_CACHE NAMES MACFUSE OSXFUSE)
|
||||
if (NOT OSXFUSE)
|
||||
message(FATAL_ERROR "FUSE for macOS not found (https://macfuse.github.io)")
|
||||
endif ()
|
||||
set(PROJECT_FUSE fuse2)
|
||||
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
|
||||
if(LIBFUSE3_FOUND)
|
||||
set(PROJECT_FUSE fuse3)
|
||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
|
||||
else()
|
||||
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
|
||||
if(LIBFUSE3_FOUND)
|
||||
set(PROJECT_FUSE fuse3)
|
||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
|
||||
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
|
||||
if(LIBFUSE2_FOUND)
|
||||
set(PROJECT_FUSE fuse2)
|
||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
|
||||
else()
|
||||
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
|
||||
if(LIBFUSE2_FOUND)
|
||||
set(PROJECT_FUSE fuse2)
|
||||
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
|
||||
else()
|
||||
message(FATAL_ERROR "fuse library not found")
|
||||
endif()
|
||||
message(FATAL_ERROR "fuse library not found")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
if((PROJECT_IS_DARWIN OR PROJECT_REQUIRE_ALPINE) AND NOT PROJECT_IS_MINGW AND NOT PROJECT_BUILD)
|
||||
if(PROJECT_BUILD_SHARED_LIBS)
|
||||
set(ICU_ENABLE_SHARED yes)
|
||||
else()
|
||||
set(ICU_ENABLE_SHARED no)
|
||||
endif()
|
||||
|
||||
ExternalProject_Add(icu_project
|
||||
PREFIX external
|
||||
URL ${PROJECT_3RD_PARTY_DIR}/mingw64/icu-release-${ICU_VERSION}.tar.gz
|
||||
URL_HASH SHA256=${ICU_HASH}
|
||||
BUILD_IN_SOURCE 1
|
||||
LIST_SEPARATOR |
|
||||
PATCH_COMMAND chmod +x ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
|
||||
CONFIGURE_COMMAND cd icu4c/source && ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
|
||||
${PROJECT_MARCH}
|
||||
${PROJECT_EXTERNAL_BUILD_ROOT}
|
||||
${ICU_ENABLE_SHARED}
|
||||
BUILD_COMMAND cd icu4c/source && make -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||
INSTALL_COMMAND cd icu4c/source && make install
|
||||
)
|
||||
|
||||
list(APPEND PROJECT_DEPENDENCIES icu_project)
|
||||
endif()
|
||||
@@ -18,7 +18,6 @@ if(PROJECT_ENABLE_JSON)
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DJSON_BuildTests=OFF
|
||||
-DJSON_Install=ON
|
||||
-DJSON_MultipleHeaders=OFF
|
||||
|
||||
@@ -15,12 +15,6 @@ if(PROJECT_ENABLE_OPENSSL)
|
||||
elseif(NOT PROJECT_IS_MINGW)
|
||||
if(PROJECT_IS_MINGW)
|
||||
set(OPENSSL_COMPILE_TYPE mingw64)
|
||||
elseif(PROJECT_IS_DARWIN)
|
||||
if(PROJECT_IS_ARM64)
|
||||
set(OPENSSL_COMPILE_TYPE darwin64-arm64)
|
||||
else()
|
||||
set(OPENSSL_COMPILE_TYPE darwin64-x86_64)
|
||||
endif()
|
||||
elseif(PROJECT_IS_ARM64)
|
||||
set(OPENSSL_COMPILE_TYPE linux-aarch64)
|
||||
else()
|
||||
|
||||
@@ -20,7 +20,6 @@ if(PROJECT_ENABLE_PUGIXML)
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
)
|
||||
|
||||
list(APPEND PROJECT_DEPENDENCIES pugixml_project)
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
if(PROJECT_ENABLE_ROCKSDB)
|
||||
if(PROJECT_BUILD)
|
||||
add_definitions(-DPROJECT_ENABLE_ROCKSDB)
|
||||
find_library(ROCKSDB_LIBRARY NAMES librocksdb.a REQUIRED)
|
||||
link_libraries(${ROCKSDB_LIBRARY})
|
||||
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
|
||||
ExternalProject_Add(rocksdb_project
|
||||
PREFIX external
|
||||
URL ${PROJECT_3RD_PARTY_DIR}/rocksdb-${ROCKSDB_VERSION}.tar.gz
|
||||
URL_HASH SHA256=${ROCKSDB_HASH}
|
||||
LIST_SEPARATOR |
|
||||
BUILD_COMMAND
|
||||
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=OFF
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DFAIL_ON_WARNINGS=OFF
|
||||
-DPORTABLE=1
|
||||
-DROCKSDB_BUILD_SHARED=OFF
|
||||
-DROCKSDB_INSTALL_ON_WINDOWS=ON
|
||||
-DWITH_BENCHMARK=OFF
|
||||
-DWITH_BENCHMARK_TOOLS=OFF
|
||||
-DWITH_BZ2=OFF
|
||||
-DWITH_CORE_TOOLS=OFF
|
||||
-DWITH_EXAMPLES=OFF
|
||||
-DWITH_GFLAGS=OFF
|
||||
-DWITH_IOSTATS_CONTEXT=OFF
|
||||
-DWITH_PERF_CONTEXT=OFF
|
||||
-DWITH_TESTS=OFF
|
||||
-DWITH_TOOLS=OFF
|
||||
-DWITH_TRACE_TOOLS=OFF
|
||||
-DWITH_ZLIB=ON
|
||||
)
|
||||
|
||||
list(APPEND PROJECT_DEPENDENCIES rocksdb_project)
|
||||
endif()
|
||||
endif()
|
||||
@@ -15,7 +15,6 @@ if(PROJECT_ENABLE_SPDLOG)
|
||||
LIST_SEPARATOR |
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DSPDLOG_BUILD_EXAMPLE=OFF
|
||||
-DSPDLOG_FMT_EXTERNAL=OFF
|
||||
-DSPDLOG_FMT_EXTERNAL_HO=OFF
|
||||
|
||||
@@ -2,7 +2,7 @@ if(PROJECT_ENABLE_SQLITE)
|
||||
if(PROJECT_BUILD)
|
||||
add_definitions(-DPROJECT_ENABLE_SQLITE)
|
||||
if (PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX)
|
||||
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
|
||||
pkg_check_modules(SQLITE3 REQUIRED sqlite3>=${SQLITE2_VERSION})
|
||||
include_directories(SYSTEM BEFORE ${SQLITE3_INCLUDE_DIRS})
|
||||
link_libraries(${SQLITE3_LIBRARIES})
|
||||
else()
|
||||
|
||||
@@ -16,7 +16,6 @@ if(PROJECT_ENABLE_STDUUID)
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
-DUUID_BUILD_TESTS=OFF
|
||||
-DUUID_ENABLE_INSTALL=ON
|
||||
-DUUID_USING_CXX20_SPAN=ON
|
||||
|
||||
@@ -10,7 +10,6 @@ if (PROJECT_ENABLE_TESTING)
|
||||
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
|
||||
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
|
||||
-DBUILD_STATIC_LIBS=ON
|
||||
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
)
|
||||
|
||||
list(APPEND PROJECT_DEPENDENCIES gtest_project)
|
||||
|
||||
@@ -2,9 +2,9 @@ if(PROJECT_ENABLE_WINFSP AND PROJECT_IS_MINGW)
|
||||
if(PROJECT_BUILD)
|
||||
add_definitions(-DPROJECT_ENABLE_WINFSP)
|
||||
|
||||
include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/inc)
|
||||
include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/inc)
|
||||
|
||||
link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/lib)
|
||||
link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.0/lib)
|
||||
|
||||
if(PROJECT_IS_ARM64)
|
||||
link_libraries(winfsp-a64)
|
||||
|
||||
@@ -6,7 +6,6 @@ option(PROJECT_ENABLE_JSON "Enable JSON for Modern C++ library" ON)
|
||||
option(PROJECT_ENABLE_LIBSODIUM "Enable libsodium library" ON)
|
||||
option(PROJECT_ENABLE_OPENSSL "Enable OpenSSL library" ON)
|
||||
option(PROJECT_ENABLE_PUGIXML "Enable PugiXML library" ON)
|
||||
option(PROJECT_ENABLE_ROCKSDB "Enable RocksDB library" ON)
|
||||
option(PROJECT_ENABLE_SPDLOG "Enable spdlog library" ON)
|
||||
option(PROJECT_ENABLE_SQLITE "Enable SQLite" ON)
|
||||
option(PROJECT_ENABLE_STDUUID "Enable stduuid library" ON)
|
||||
|
||||
@@ -2,6 +2,10 @@ if(MSVC)
|
||||
message(FATAL_ERROR "MSVC will not be supported")
|
||||
endif()
|
||||
|
||||
if(UNIX AND APPLE)
|
||||
message(FATAL_ERROR "Apple is not currently supported")
|
||||
endif()
|
||||
|
||||
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
||||
message(FATAL_ERROR "FreeBSD is not currently supported")
|
||||
endif()
|
||||
@@ -9,15 +13,3 @@ endif()
|
||||
if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
|
||||
message(FATAL_ERROR "Project requires Alpine Linux to build")
|
||||
endif()
|
||||
|
||||
if (PROJECT_IS_DARWIN)
|
||||
if (PROJECT_IS_ARM64)
|
||||
set(CMAKE_OSX_ARCHITECTURES "arm64")
|
||||
else()
|
||||
set(CMAKE_OSX_ARCHITECTURES "x86_64")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (PROJECT_IS_DARWIN AND NOT PROJECT_MACOS_BUNDLE_ID)
|
||||
message(FATAL_ERROR "'PROJECT_MACOS_BUNDLE_ID' is not set in 'config.sh'")
|
||||
endif()
|
||||
|
||||
@@ -4,7 +4,7 @@ set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 23)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
@@ -1,30 +1,27 @@
|
||||
set(BINUTILS_VERSION 2.44)
|
||||
set(BINUTILS_VERSION 2.41)
|
||||
set(BOOST2_MAJOR_VERSION 1)
|
||||
set(BOOST2_MINOR_VERSION 76)
|
||||
set(BOOST2_PATCH_VERSION 0)
|
||||
set(BOOST_MAJOR_VERSION 1)
|
||||
set(BOOST_MINOR_VERSION 89)
|
||||
set(BOOST_MINOR_VERSION 85)
|
||||
set(BOOST_PATCH_VERSION 0)
|
||||
set(CPP_HTTPLIB_VERSION 0.26.0)
|
||||
set(CURL2_VERSION 8_16_0)
|
||||
set(CURL_VERSION 8.16.0)
|
||||
set(EXPAT2_VERSION 2_7_1)
|
||||
set(EXPAT_VERSION 2.7.1)
|
||||
set(GCC_VERSION 15.2.0)
|
||||
set(GTEST_VERSION 1.17.0)
|
||||
set(ICU_VERSION 76-1)
|
||||
set(INNOSETUP_VERSION 6.5.4)
|
||||
set(JSON_VERSION 3.12.0)
|
||||
set(CPP_HTTPLIB_VERSION 0.16.3)
|
||||
set(CURL2_VERSION 8_9_1)
|
||||
set(CURL_VERSION 8.9.1)
|
||||
set(EXPAT2_VERSION 2_6_2)
|
||||
set(EXPAT_VERSION 2.6.2)
|
||||
set(GCC_VERSION 14.2.0)
|
||||
set(GTEST_VERSION 1.15.2)
|
||||
set(ICU_VERSION 75-1)
|
||||
set(JSON_VERSION 3.11.3)
|
||||
set(LIBSODIUM_VERSION 1.0.20)
|
||||
set(MINGW_VERSION 13.0.0)
|
||||
set(OPENSSL_VERSION 3.6.0)
|
||||
set(MESA_VERSION 23.3.3)
|
||||
set(MINGW_VERSION 11.0.1)
|
||||
set(OPENSSL_VERSION 3.3.1)
|
||||
set(PKG_CONFIG_VERSION 0.29.2)
|
||||
set(PUGIXML_VERSION 1.15)
|
||||
set(ROCKSDB_VERSION 10.5.1)
|
||||
set(SPDLOG_VERSION 1.15.3)
|
||||
set(SQLITE2_VERSION 3.50.4)
|
||||
set(SQLITE_VERSION 3500400)
|
||||
set(PUGIXML_VERSION 1.14)
|
||||
set(SPDLOG_VERSION 1.14.1)
|
||||
set(SQLITE2_VERSION 3.46.1)
|
||||
set(SQLITE_VERSION 3460100)
|
||||
set(STDUUID_VERSION 1.2.3)
|
||||
set(WINFSP2_VERSION 2.1)
|
||||
set(WINFSP_VERSION 2.1.25156)
|
||||
set(ZLIB_VERSION 1.3.1)
|
||||
|
||||
17
config.sh
@@ -5,26 +5,20 @@ PROJECT_NAME="repertory"
|
||||
PROJECT_COMPANY_NAME="https://git.fifthgrid.com/blockstorage"
|
||||
PROJECT_URL="${PROJECT_COMPANY_NAME}/repertory"
|
||||
|
||||
PROJECT_COPYRIGHT="Copyright <2018-2025> <MIT License> <${PROJECT_URL}>"
|
||||
PROJECT_COPYRIGHT="Copyright <2018-2024> <MIT License> <${PROJECT_URL}>"
|
||||
PROJECT_DESC="Mount utility for Sia and S3"
|
||||
|
||||
PROJECT_MACOS_BUNDLE_ID="com.fifthgrid.blockstorage.repertory"
|
||||
PROJECT_MACOS_ICNS_NAME="icon.icns"
|
||||
|
||||
PROJECT_MAJOR_VERSION=2
|
||||
PROJECT_MINOR_VERSION=1
|
||||
PROJECT_REVISION_VERSION=0
|
||||
PROJECT_RELEASE_NUM=1
|
||||
PROJECT_RELEASE_ITER=rc.2
|
||||
PROJECT_MINOR_VERSION=0
|
||||
PROJECT_REVISION_VERSION=2
|
||||
PROJECT_RELEASE_NUM=0
|
||||
PROJECT_RELEASE_ITER=rc
|
||||
|
||||
PROJECT_APP_LIST=(${PROJECT_NAME})
|
||||
|
||||
PROJECT_PRIVATE_KEY=${DEVELOPER_PRIVATE_KEY}
|
||||
PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY}
|
||||
|
||||
PROJECT_FLUTTER_BASE_HREF="/ui/"
|
||||
|
||||
PROJECT_ENABLE_V2_ERRORS=ON
|
||||
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
|
||||
|
||||
PROJECT_ENABLE_BACKWARD_CPP=OFF
|
||||
@@ -36,7 +30,6 @@ PROJECT_ENABLE_JSON=ON
|
||||
PROJECT_ENABLE_LIBSODIUM=ON
|
||||
PROJECT_ENABLE_OPENSSL=ON
|
||||
PROJECT_ENABLE_PUGIXML=ON
|
||||
PROJECT_ENABLE_ROCKSDB=ON
|
||||
PROJECT_ENABLE_SPDLOG=ON
|
||||
PROJECT_ENABLE_SQLITE=ON
|
||||
PROJECT_ENABLE_STDUUID=ON
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
#comment
|
||||
FROM arm64v8/alpine:3.23
|
||||
FROM arm64v8/alpine:3.20.3
|
||||
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
|
||||
CMD bash
|
||||
|
||||
RUN apk update
|
||||
RUN apk upgrade
|
||||
RUN apk add \
|
||||
7zip \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
@@ -32,7 +30,10 @@ RUN apk add \
|
||||
gflags \
|
||||
gflags-dev \
|
||||
git \
|
||||
git-lfs \
|
||||
gtkmm3-dev \
|
||||
icu-dev \
|
||||
icu-libs \
|
||||
icu-static \
|
||||
libogg-dev \
|
||||
libogg-static \
|
||||
libtool \
|
||||
@@ -68,6 +69,7 @@ RUN apk add \
|
||||
tcl \
|
||||
tcl-dev \
|
||||
texinfo \
|
||||
vlc-dev \
|
||||
wget \
|
||||
xz \
|
||||
xz-dev \
|
||||
@@ -80,6 +82,3 @@ RUN apk add \
|
||||
zstd-libs \
|
||||
zstd-static \
|
||||
xz-static
|
||||
|
||||
RUN ln -sf /usr/bin/aclocal-1.18 /usr/bin/aclocal-1.16
|
||||
RUN ln -sf /usr/bin/automake-1.18 /usr/bin/automake-1.16
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
#comment
|
||||
FROM --platform=linux/amd64 alpine:3.23
|
||||
FROM alpine:3.20.3
|
||||
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
|
||||
CMD bash
|
||||
|
||||
RUN apk update
|
||||
RUN apk upgrade
|
||||
RUN apk add \
|
||||
7zip \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
@@ -32,7 +30,9 @@ RUN apk add \
|
||||
gflags \
|
||||
gflags-dev \
|
||||
git \
|
||||
git-lfs \
|
||||
icu-dev \
|
||||
icu-libs \
|
||||
icu-static \
|
||||
libogg-dev \
|
||||
libogg-static \
|
||||
libtool \
|
||||
@@ -80,6 +80,3 @@ RUN apk add \
|
||||
zstd-libs \
|
||||
zstd-static \
|
||||
xz-static
|
||||
|
||||
RUN ln -sf /usr/bin/aclocal-1.18 /usr/bin/aclocal-1.16
|
||||
RUN ln -sf /usr/bin/automake-1.18 /usr/bin/automake-1.16
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
#comment
|
||||
FROM debian:latest
|
||||
|
||||
ARG UID=0
|
||||
ARG GID=0
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y \
|
||||
bash \
|
||||
curl \
|
||||
fonts-droid-fallback \
|
||||
gdb \
|
||||
git \
|
||||
lib32stdc++6-x32-cross \
|
||||
libglu1-mesa \
|
||||
libstdc++6 \
|
||||
python3 \
|
||||
unzip \
|
||||
wget
|
||||
RUN apt-get clean
|
||||
|
||||
RUN git clone https://github.com/flutter/flutter.git /flutter
|
||||
RUN git config --system --add safe.directory /flutter
|
||||
|
||||
ENV PATH="/flutter/bin:/flutter/bin/cache/dart-sdk/bin:${PATH}"
|
||||
|
||||
RUN flutter doctor -v
|
||||
RUN flutter channel master
|
||||
RUN flutter upgrade
|
||||
RUN flutter --disable-analytics
|
||||
|
||||
RUN flutter config --no-analytics
|
||||
RUN flutter config --enable-web
|
||||
RUN flutter config --no-cli-animations
|
||||
|
||||
RUN mkdir /nonexistent
|
||||
RUN chown -R $UID:$GID /nonexistent
|
||||
|
||||
RUN mkdir /.config
|
||||
RUN chown -R $UID:$GID /.config
|
||||
|
||||
RUN mkdir /.dart-tool
|
||||
RUN chown -R $UID:$GID /.dart-tool
|
||||
|
||||
RUN mkdir /.pub-cache
|
||||
RUN chown -R $UID:$GID /.pub-cache
|
||||
|
||||
RUN chown -R $UID:$GID /flutter
|
||||
@@ -1,26 +1,23 @@
|
||||
#comment
|
||||
FROM --platform=linux/amd64 alpine:3.23
|
||||
FROM alpine:3.20.3
|
||||
|
||||
RUN apk update
|
||||
RUN apk upgrade
|
||||
RUN apk add \
|
||||
7zip \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
binutils \
|
||||
bison \
|
||||
bzip2 \
|
||||
clang21-extra-tools \
|
||||
clang17-extra-tools \
|
||||
cmake \
|
||||
curl \
|
||||
file \
|
||||
flex \
|
||||
g++ \
|
||||
gcc \
|
||||
gettext \
|
||||
git \
|
||||
git-lfs \
|
||||
gmp \
|
||||
gmp-dev \
|
||||
gperf \
|
||||
@@ -45,7 +42,6 @@ RUN apk add \
|
||||
ruby \
|
||||
texinfo \
|
||||
unzip \
|
||||
xvfb \
|
||||
wget \
|
||||
wine \
|
||||
xz \
|
||||
@@ -64,10 +60,7 @@ ENV MY_MINGW_PREFIX=${MINGW_PREFIX}
|
||||
ARG NUM_JOBS=2
|
||||
ENV MY_NUM_JOBS=${NUM_JOBS}
|
||||
|
||||
ARG C_STANDARD=11
|
||||
ENV MY_C_STANDARD=${C_STANDARD}
|
||||
|
||||
ARG CXX_STANDARD=23
|
||||
ARG CXX_STANDARD=20
|
||||
ENV MY_CXX_STANDARD=${CXX_STANDARD}
|
||||
|
||||
ARG TOOLCHAIN_FILE_CMAKE=/cmake_toolchain.cmake
|
||||
@@ -108,39 +101,6 @@ RUN echo -e \
|
||||
"system = 'windows'\n"\
|
||||
> ${MY_TOOLCHAIN_FILE_MESON}
|
||||
|
||||
RUN mkdir -p /opt/bin;echo -e \
|
||||
"#!/bin/sh\n"\
|
||||
"COUNT=0\n"\
|
||||
"echo \"Start waiting on \$@\"\n"\
|
||||
"while pgrep \"\$@\" > /dev/null; do \n"\
|
||||
" echo \"waiting ...\"\n"\
|
||||
" sleep 1;\n"\
|
||||
" COUNT=\$((COUNT+1))\n"\
|
||||
" if [ \$COUNT -eq 60 ]; then\n"\
|
||||
" exit 3;\n"\
|
||||
" fi\n"\
|
||||
"done\n"\
|
||||
"echo \"\$@ completed\"\n"\
|
||||
> /opt/bin/waitonprocess && \
|
||||
chmod +x /opt/bin/waitonprocess && \
|
||||
cat /opt/bin/waitonprocess
|
||||
|
||||
RUN echo -e \
|
||||
"#!/bin/sh\n"\
|
||||
"Xvfb \$DISPLAY &\n"\
|
||||
"tokill=\$!\n"\
|
||||
"wine wineboot --init\n"\
|
||||
"waitonprocess wineserver\n"\
|
||||
"\"\$@\"\n"\
|
||||
"retval=\$?\n"\
|
||||
"kill -15 \$tokill\n"\
|
||||
"wine wineboot --shutdown\n"\
|
||||
"return \$retval\n"\
|
||||
> /opt/bin/wine-x11-run && \
|
||||
chmod +x /opt/bin/wine-x11-run && \
|
||||
cat /opt/bin/wine-x11-run
|
||||
|
||||
ENV PATH="/opt/bin:${PATH}"
|
||||
SHELL [ "/bin/bash", "-c" ]
|
||||
|
||||
RUN mkdir -p \
|
||||
@@ -263,7 +223,6 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./pkg-config-${MY_PKG_CONFIG_VERSION}.
|
||||
&& tar xvzf /3rd_party/mingw64/pkg-config-${MY_PKG_CONFIG_VERSION}.tar.gz \
|
||||
&& cd pkg-config-${MY_PKG_CONFIG_VERSION} \
|
||||
&& ./configure \
|
||||
CFLAGS='-std=gnu11' \
|
||||
--disable-nls \
|
||||
--disable-shared \
|
||||
--prefix=/usr/local \
|
||||
@@ -278,7 +237,7 @@ RUN python3 -m pip install --break-system-packages -U mako
|
||||
RUN python3 -m pip install --break-system-packages -U meson
|
||||
RUN python3 -m pip install --break-system-packages -U packaging
|
||||
|
||||
ENV CXXFLAGS="-std=gnu++${MY_CXX_STANDARD}"
|
||||
ENV CXXFLAGS="-std=gnu++20"
|
||||
ENV LDFLAGS="-L${MY_MINGW_DIR}/lib -L${MY_MINGW_DIR}/lib64"
|
||||
ENV PATH="${MY_MINGW_DIR}/bin:/usr/local/bin:${PATH}"
|
||||
ENV PKG_CONFIG_PATH="${MY_MINGW_DIR}/lib/pkgconfig:${MY_MINGW_DIR}/lib64/pkgconfig"
|
||||
@@ -391,9 +350,9 @@ RUN cd /3rd_party/mingw64 && sha256sum -c ./expat-${MY_EXPAT_VERSION}.tar.gz.sha
|
||||
|
||||
ARG FONTCONFIG_VERSION
|
||||
ENV MY_FONTCONFIG_VERSION=${FONTCONFIG_VERSION}
|
||||
RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz" ]; then \
|
||||
cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz.sha256 && cd - \
|
||||
&& tar xvJf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.xz \
|
||||
RUN if [ -f "/3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz" ]; then \
|
||||
cd /3rd_party && sha256sum -c ./fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz.sha256 && cd - \
|
||||
&& tar xvzf /3rd_party/fontconfig-${MY_FONTCONFIG_VERSION}.tar.gz \
|
||||
&& cd fontconfig-${MY_FONTCONFIG_VERSION} \
|
||||
&& meson setup \
|
||||
--cross-file ${MY_TOOLCHAIN_FILE_MESON} \
|
||||
@@ -495,7 +454,7 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST2_MAJOR_VERSION}_${MY_BOOST2_MINOR_VERSI
|
||||
&& ./bootstrap.sh \
|
||||
--with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread \
|
||||
address-model=64 \
|
||||
cxxstd=20 \
|
||||
cxxstd=${MY_CXX_STANDARD} \
|
||||
cxxstd-dialect=gnu \
|
||||
architecture=x86 \
|
||||
link=static,shared \
|
||||
@@ -509,7 +468,7 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST2_MAJOR_VERSION}_${MY_BOOST2_MINOR_VERSI
|
||||
--prefix=${MY_MINGW_DIR} \
|
||||
-j${MY_NUM_JOBS} \
|
||||
address-model=64 \
|
||||
cxxstd=20 \
|
||||
cxxstd=${MY_CXX_STANDARD} \
|
||||
cxxstd-dialect=gnu \
|
||||
architecture=x86 \
|
||||
link=static,shared \
|
||||
@@ -552,8 +511,8 @@ RUN if [ -f "/3rd_party/boost_${MY_BOOST_MAJOR_VERSION}_${MY_BOOST_MINOR_VERSION
|
||||
-j${MY_NUM_JOBS} \
|
||||
address-model=64 \
|
||||
architecture=x86 \
|
||||
cxxstd=${MY_CXX_STANDARD} \
|
||||
cxxstd-dialect=gnu \
|
||||
cxxstd=${MY_CXX_STANDARD} \
|
||||
cxxstd-dialect=gnu \
|
||||
link=static,shared \
|
||||
target-os=windows \
|
||||
threading=multi \
|
||||
@@ -613,8 +572,8 @@ RUN if [ -f "/3rd_party/flac-${MY_FLAC_VERSION}.tar.gz" ]; then \
|
||||
&& cd build \
|
||||
&& cmake .. \
|
||||
-DBUILD_DOCS=OFF \
|
||||
-DBUILD_EXAMPLES=OFF \
|
||||
-DBUILD_PROGRAMS=OFF \
|
||||
-DBUILD_EXAMPLES=ON \
|
||||
-DBUILD_PROGRAMS=ON \
|
||||
-DBUILD_SHARED_LIBS=ON \
|
||||
-DBUILD_STATIC_LIBS=ON \
|
||||
-DBUILD_TESTING=OFF \
|
||||
@@ -645,7 +604,6 @@ RUN if [ -f "/3rd_party/SFML-${MY_SFML_VERSION}.tar.gz" ]; then \
|
||||
-DBUILD_STATIC_LIBS=ON \
|
||||
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
||||
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
|
||||
-DCMAKE_SYSTEM_PROCESSOR=AMD64 \
|
||||
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
|
||||
&& make -j${MY_NUM_JOBS} \
|
||||
&& make install \
|
||||
@@ -712,15 +670,12 @@ RUN if [ -f "/3rd_party/curl-${MY_CURL_VERSION}.tar.gz" ]; then \
|
||||
&& cd build \
|
||||
&& cmake .. \
|
||||
-DBUILD_CURL_EXE=ON \
|
||||
-DBUILD_LIBCURL_DOCS=OFF \
|
||||
-DBUILD_MISC_DOCS=OFF \
|
||||
-DBUILD_SHARED_LIBS=OFF \
|
||||
-DBUILD_STATIC_LIBS=ON \
|
||||
-DBUILD_TESTING=OFF \
|
||||
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
||||
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
|
||||
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
|
||||
-DCURL_BROTLI=OFF \
|
||||
-DCURL_CA_BUNDLE=./cacert.pem \
|
||||
-DCURL_CA_FALLBACK=ON \
|
||||
-DCURL_DISABLE_LDAP=ON \
|
||||
@@ -728,7 +683,6 @@ RUN if [ -f "/3rd_party/curl-${MY_CURL_VERSION}.tar.gz" ]; then \
|
||||
-DCURL_USE_LIBSSH2=OFF \
|
||||
-DCURL_USE_OPENSSL=ON \
|
||||
-DCURL_ZLIB=ON \
|
||||
-DENABLE_CURL_MANUAL=OFF \
|
||||
-DENABLE_THREADED_RESOLVER=ON \
|
||||
-DOPENSSL_USE_STATIC_LIBS=ON \
|
||||
-DUSE_LIBIDN2=OFF \
|
||||
@@ -751,15 +705,11 @@ RUN if [ -f "/3rd_party/cpp-httplib-${MY_CPP_HTTPLIB_VERSION}.tar.gz" ]; then \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
||||
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
|
||||
-DCMAKE_SYSTEM_VERSION="10.0.0" \
|
||||
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
|
||||
-DHTTPLIB_REQUIRE_BROTLI=OFF \
|
||||
-DHTTPLIB_REQUIRE_OPENSSL=ON \
|
||||
-DHTTPLIB_REQUIRE_ZLIB=ON \
|
||||
-DHTTPLIB_TEST=OFF \
|
||||
-DHTTPLIB_USE_BROTLI_IF_AVAILABLE=OFF \
|
||||
-DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=YES \
|
||||
-DHTTPLIB_USE_ZLIB_IF_AVAILABLE=ON \
|
||||
&& make -j${MY_NUM_JOBS} \
|
||||
&& make install \
|
||||
&& cd ${MY_WORKDIR} \
|
||||
@@ -840,9 +790,7 @@ RUN if [ -f "/3rd_party/libevent-${MY_LIBEVENT_VERSION}-stable.tar.gz" ]; then \
|
||||
&& cmake .. \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_CXX_STANDARD=${MY_CXX_STANDARD} \
|
||||
-DCMAKE_C_FLAGS="-include winsock2.h -include ws2tcpip.h -include iphlpapi.h" \
|
||||
-DCMAKE_INSTALL_PREFIX=${MY_MINGW_DIR} \
|
||||
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
|
||||
-DCMAKE_TOOLCHAIN_FILE=${MY_TOOLCHAIN_FILE_CMAKE} \
|
||||
-DEVENT__DISABLE_OPENSSL=ON \
|
||||
-DEVENT__DISABLE_SAMPLES=ON \
|
||||
@@ -931,7 +879,6 @@ RUN if [ -f "/3rd_party/rocksdb-${MY_ROCKSDB_VERSION}.tar.gz" ]; then \
|
||||
-DROCKSDB_INSTALL_ON_WINDOWS=ON \
|
||||
-DWITH_BENCHMARK=OFF \
|
||||
-DWITH_BENCHMARK_TOOLS=OFF \
|
||||
-DWITH_BZ2=OFF \
|
||||
-DWITH_CORE_TOOLS=OFF \
|
||||
-DWITH_EXAMPLES=OFF \
|
||||
-DWITH_GFLAGS=OFF \
|
||||
@@ -1163,33 +1110,6 @@ RUN if [ -f "/3rd_party/libdsm-${MY_LIBDSM_VERSION}.tar.gz" ]; then \
|
||||
&& rm -r libdsm-${MY_LIBDSM_VERSION} \
|
||||
; fi
|
||||
|
||||
ENV DISPLAY=:90
|
||||
ENV WINEDEBUG=-all,err+all
|
||||
|
||||
ARG INNOSETUP_VERSION
|
||||
ENV MY_INNOSETUP_VERSION=${INNOSETUP_VERSION}
|
||||
RUN rm -rf /root/.wine; \
|
||||
wine64 reg add 'HKEY_CURRENT_USER\Software\Wine' /v ShowDotFiles /d Y \
|
||||
&& while [ ! -f /root/.wine/user.reg ]; do sleep 1; done; \
|
||||
wine-x11-run wine64 /3rd_party/mingw64/innosetup-${MY_INNOSETUP_VERSION}.exe /SP- /VERYSILENT /ALLUSERS /SUPPRESSMSGBOXES /DOWNLOADISCRYPT=1
|
||||
|
||||
ARG UID=1000
|
||||
ARG GID=1000
|
||||
ARG USERNAME=myuser
|
||||
|
||||
RUN delgroup scanner || echo "no scanner group found"
|
||||
|
||||
RUN addgroup -g $GID $USERNAME && \
|
||||
adduser -D -u $UID -G $USERNAME -h /home/$USERNAME $USERNAME
|
||||
|
||||
RUN rsync -av --progress /root/.wine/ /home/$USERNAME/.wine/ && \
|
||||
chown -R $UID:$GID -R /home/$USERNAME/.wine/
|
||||
|
||||
RUN (cp ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \
|
||||
RUN (mv ${MY_MINGW_DIR}/lib/*.dll ${MY_MINGW_DIR}/bin || echo "no dll's found") \
|
||||
&& chmod 0777 -R ${MY_MINGW_DIR} \
|
||||
&& rm -rf /3rd_party \
|
||||
&& rm -rf /root/.wine
|
||||
|
||||
USER $USERNAME
|
||||
WORKDIR /home/$USERNAME
|
||||
|
||||
&& rm -rf /3rd_party
|
||||
|
||||
@@ -3,12 +3,8 @@
|
||||
CURRENT_DIR=$(dirname "$0")
|
||||
CURRENT_DIR=$(realpath ${CURRENT_DIR})
|
||||
|
||||
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_input/ \
|
||||
${PROJECT_BUILD_DIR}/build/test_input/
|
||||
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_config/ \
|
||||
${PROJECT_BUILD_DIR}/build/test_config/
|
||||
|
||||
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_input/ \
|
||||
${PROJECT_DIST_DIR}/test_input/
|
||||
|
||||
rsync -av --progress ${CURRENT_DIR}/assets/icon.ico ${PROJECT_DIST_DIR}/icon.ico
|
||||
|
||||
rsync -av --progress ${CURRENT_DIR}/assets/blue/logo.iconset/icon_128x128.png ${PROJECT_DIST_DIR}/repertory.png
|
||||
rsync -av --progress ${CURRENT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/test_config/ \
|
||||
${PROJECT_DIST_DIR}/test_config/
|
||||
|
||||
@@ -3,10 +3,5 @@ set(CMAKE_CXX_FLAGS "-include common.hpp ${CMAKE_CXX_FLAGS}")
|
||||
add_project_library(lib${PROJECT_NAME} "" "" "${PROJECT_ADDITIONAL_SOURCES}")
|
||||
|
||||
add_project_executable(${PROJECT_NAME} lib${PROJECT_NAME} lib${PROJECT_NAME})
|
||||
if (PROJECT_IS_DARWIN AND EXISTS "${CMAKE_SOURCE_DIR}/${PROJECT_NAME}/Info.plist")
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/Info.plist
|
||||
)
|
||||
endif()
|
||||
|
||||
add_project_test_executable(${PROJECT_NAME}_test lib${PROJECT_NAME} lib${PROJECT_NAME})
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>@PROJECT_NAME@</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>@PROJECT_MACOS_BUNDLE_ID@</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>@PROJECT_NAME@</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@-@PROJECT_RELEASE_ITER@_@PROJECT_GIT_REV@</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>@PROJECT_MAJOR_VERSION@.@PROJECT_MINOR_VERSION@.@PROJECT_REVISION_VERSION@.@PROJECT_RELEASE_NUM@</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>LSUIElement</key>
|
||||
<true />
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>@PROJECT_MACOS_ICNS_NAME@</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -1,421 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
# No `-e` (we tolerate benign non-zero returns); keep -Euo
|
||||
set -Euo pipefail
|
||||
|
||||
LOG_DIR="/tmp"
|
||||
LOG_FILE="${LOG_DIR}/Install-$(date +%Y%m%d-%H%M%S).log"
|
||||
exec > >(tee -a "$LOG_FILE") 2>&1
|
||||
echo "Logging to: $LOG_FILE"
|
||||
|
||||
TARGET_DIR="/Applications"
|
||||
APP_NAME="repertory.app"
|
||||
|
||||
# Embedded at pack time (from CFBundleIdentifier prefix)
|
||||
LABEL_PREFIX="__LABEL_PREFIX__"
|
||||
UI_LABEL="${LABEL_PREFIX}.ui"
|
||||
|
||||
staged=""
|
||||
backup=""
|
||||
snapfile=""
|
||||
skip_ui_launch=0
|
||||
|
||||
log() { printf "[%(%H:%M:%S)T] %s\n" -1 "$*"; }
|
||||
warn() { log "WARN: $*"; }
|
||||
die() {
|
||||
log "ERROR: $*"
|
||||
exit 2
|
||||
}
|
||||
|
||||
here="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
# Locate source app on the DMG (supports hidden payload dirs)
|
||||
src_app="${here}/${APP_NAME}"
|
||||
if [[ ! -d "$src_app" ]]; then
|
||||
src_app="$(/usr/bin/find "$here" -type d -name "$APP_NAME" -print -quit 2>/dev/null || true)"
|
||||
fi
|
||||
[[ -d "$src_app" ]] || die "Could not find ${APP_NAME} on this disk image."
|
||||
|
||||
app_basename="$(basename "$src_app")"
|
||||
dest_app="${TARGET_DIR}/${APP_NAME}"
|
||||
|
||||
bundle_id_of() { /usr/bin/defaults read "$1/Contents/Info" CFBundleIdentifier 2>/dev/null || true; }
|
||||
bundle_exec_of() { /usr/bin/defaults read "$1/Contents/Info" CFBundleExecutable 2>/dev/null || echo "${app_basename%.app}"; }
|
||||
bundle_version_of() {
|
||||
/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "$1/Contents/Info.plist" 2>/dev/null ||
|
||||
/usr/bin/defaults read "$1/Contents/Info" CFBundleShortVersionString 2>/dev/null || echo "(unknown)"
|
||||
}
|
||||
bundle_build_of() {
|
||||
/usr/libexec/PlistBuddy -c 'Print :CFBundleVersion' "$1/Contents/Info.plist" 2>/dev/null ||
|
||||
/usr/bin/defaults read "$1/Contents/Info" CFBundleVersion 2>/dev/null || echo "(unknown)"
|
||||
}
|
||||
|
||||
# Require /Applications; prompt for sudo if needed; abort if cannot elevate
|
||||
USE_SUDO=0
|
||||
SUDO=""
|
||||
ensure_target_writable() {
|
||||
if mkdir -p "${TARGET_DIR}/.repertory_install_test.$$" 2>/dev/null; then
|
||||
rmdir "${TARGET_DIR}/.repertory_install_test.$$" 2>/dev/null || true
|
||||
USE_SUDO=0
|
||||
SUDO=""
|
||||
return 0
|
||||
fi
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
log "Elevating privileges to write to ${TARGET_DIR}…"
|
||||
sudo -v || die "Administrator privileges required to install into ${TARGET_DIR}."
|
||||
USE_SUDO=1
|
||||
SUDO="sudo"
|
||||
return 0
|
||||
fi
|
||||
die "Cannot write to ${TARGET_DIR} and sudo is unavailable."
|
||||
}
|
||||
|
||||
# ----- STRICT LABEL PREFIX GATE (fail if invalid) -----
|
||||
_is_valid_label_prefix() {
|
||||
local p="${1:-}"
|
||||
[[ -n "$p" ]] && [[ "$p" != "__LABEL_PREFIX__" ]] && [[ "$p" =~ ^[A-Za-z0-9._-]+$ ]] && [[ "$p" == *.* ]]
|
||||
}
|
||||
if ! _is_valid_label_prefix "${LABEL_PREFIX:-}"; then
|
||||
die "Invalid LABEL_PREFIX in installer (value: \"${LABEL_PREFIX:-}\"). Rebuild the DMG so the installer contains a valid reverse-DNS prefix."
|
||||
fi
|
||||
|
||||
# ----- LaunchServices helpers -----
|
||||
ls_prune_bundle_id() {
|
||||
local bundle_id="$1" keep_path="$2"
|
||||
[[ -z "$bundle_id" ]] && return 0
|
||||
local search_roots=("/Applications" "$HOME/Applications" "/Volumes")
|
||||
if [[ -n "${here:-}" && "$here" == /Volumes/* ]]; then search_roots+=("$here"); fi
|
||||
local candidates=""
|
||||
for root in "${search_roots[@]}"; do
|
||||
[[ -d "$root" ]] || continue
|
||||
candidates+=$'\n'"$(/usr/bin/mdfind -onlyin "$root" "kMDItemCFBundleIdentifier == '${bundle_id}'" 2>/dev/null || true)"
|
||||
done
|
||||
# Include backups adjacent to keep_path (quote-safe)
|
||||
local parent_dir="${keep_path%/*.app}"
|
||||
candidates+=$'\n'$(/bin/ls -1d "${parent_dir}/"*.bak 2>/dev/null || true)
|
||||
local LSREG="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
|
||||
printf "%s\n" "$candidates" | /usr/bin/awk 'NF' | /usr/bin/sort -u | while IFS= read -r p; do
|
||||
[[ -z "$p" || ! -d "$p" || "$p" == "$keep_path" ]] && continue
|
||||
log "Unregistering older LS entry for ${bundle_id}: $p"
|
||||
"$LSREG" -u "$p" >/dev/null 2>&1 || true
|
||||
done
|
||||
}
|
||||
|
||||
# ----- FUSE unmount (no process killing here) -----
|
||||
is_mounted() { /sbin/mount | /usr/bin/awk '{print $3}' | /usr/bin/grep -Fx "${1:-}" >/dev/null 2>&1; }
|
||||
_list_repertory_fuse_mounts() { /sbin/mount | /usr/bin/grep -Ei 'macfuse|osxfuse' | /usr/bin/awk '{print $3}' | /usr/bin/grep -i "repertory" || true; }
|
||||
_unmount_one() {
|
||||
local mnt="${1:-}"
|
||||
[[ -n "$mnt" ]] || return 0
|
||||
/usr/sbin/diskutil unmount "$mnt" >/dev/null 2>&1 || /sbin/umount "$mnt" >/dev/null 2>&1 || true
|
||||
if is_mounted "$mnt"; then
|
||||
/usr/sbin/diskutil unmount force "$mnt" >/dev/null 2>&1 || /sbin/umount -f "$mnt" >/dev/null 2>&1 || true
|
||||
fi
|
||||
for _ in {1..20}; do
|
||||
is_mounted "$mnt" || return 0
|
||||
sleep 0.25
|
||||
done
|
||||
return 1
|
||||
}
|
||||
unmount_existing_repertory_volumes() {
|
||||
# Hard-fail on the first unmount problem.
|
||||
while IFS= read -r mnt; do
|
||||
[[ -z "$mnt" ]] && continue
|
||||
log "Unmounting FUSE mount: $mnt"
|
||||
if ! _unmount_one "$mnt"; then
|
||||
warn "Failed to unmount $mnt"
|
||||
return 1
|
||||
fi
|
||||
done < <(_list_repertory_fuse_mounts)
|
||||
sync || true
|
||||
sleep 0.3
|
||||
return 0
|
||||
}
|
||||
|
||||
# ----- user LaunchAgents (by LABEL_PREFIX only) -----
|
||||
get_plist_label() { /usr/bin/defaults read "$1" Label 2>/dev/null || /usr/libexec/PlistBuddy -c "Print :Label" "$1" 2>/dev/null || basename "$1" .plist; }
|
||||
|
||||
# Return the executable path a LaunchAgent runs (ProgramArguments[0] or Program).
|
||||
# Echoes empty string if neither is present.
|
||||
get_plist_exec_path() {
|
||||
local plist="$1" arg0=""
|
||||
# Prefer ProgramArguments[0]
|
||||
arg0="$(/usr/libexec/PlistBuddy -c 'Print :ProgramArguments:0' "$plist" 2>/dev/null || true)"
|
||||
if [[ -z "$arg0" ]]; then
|
||||
# Fallback to Program (older style)
|
||||
arg0="$(/usr/libexec/PlistBuddy -c 'Print :Program' "$plist" 2>/dev/null || true)"
|
||||
fi
|
||||
printf '%s\n' "$arg0"
|
||||
}
|
||||
|
||||
snapshot_launchagents_user() {
|
||||
local user_agents="$HOME/Library/LaunchAgents"
|
||||
snapfile="$(/usr/bin/mktemp "/tmp/repertory_launchagents.XXXXXX")" || snapfile=""
|
||||
if [[ -z "$snapfile" ]]; then
|
||||
warn "Could not create temporary snapshot file; skipping LaunchAgent restart snapshot."
|
||||
return 0
|
||||
fi
|
||||
[[ -d "$user_agents" ]] || return 0
|
||||
|
||||
# We collect non-UI first, then UI last, to preserve restart order later.
|
||||
local tmp_nonui tmp_ui
|
||||
tmp_nonui="$(/usr/bin/mktemp "/tmp/repertory_launchagents.nonui.XXXXXX")" || tmp_nonui=""
|
||||
tmp_ui="$(/usr/bin/mktemp "/tmp/repertory_launchagents.ui.XXXXXX")" || tmp_ui=""
|
||||
|
||||
/usr/bin/find "$user_agents" -maxdepth 1 -type f -name "${LABEL_PREFIX}"'*.plist' -print 2>/dev/null |
|
||||
while IFS= read -r plist; do
|
||||
[[ -z "$plist" ]] && continue
|
||||
|
||||
# Label must match the prefix
|
||||
local label
|
||||
label="$(get_plist_label "$plist")"
|
||||
[[ -n "$label" && "$label" == "${LABEL_PREFIX}"* ]] || continue
|
||||
|
||||
# Executable must point into the *installed* app path
|
||||
local exec_path
|
||||
exec_path="$(get_plist_exec_path "$plist")"
|
||||
[[ -n "$exec_path" ]] || continue
|
||||
# Normalize: only accept absolute paths under $dest_app (e.g. .../repertory.app/Contents/...)
|
||||
if [[ "$exec_path" != "$dest_app/"* ]]; then
|
||||
# Not one of ours; skip
|
||||
continue
|
||||
fi
|
||||
|
||||
# Defer UI label to the end
|
||||
if [[ "$label" == "$UI_LABEL" ]]; then
|
||||
[[ -n "$tmp_ui" ]] && printf "%s\t%s\n" "$plist" "$label" >>"$tmp_ui"
|
||||
else
|
||||
[[ -n "$tmp_nonui" ]] && printf "%s\t%s\n" "$plist" "$label" >>"$tmp_nonui"
|
||||
fi
|
||||
done
|
||||
|
||||
# Stitch together: non-UI first, then UI
|
||||
[[ -s "$tmp_nonui" ]] && /bin/cat "$tmp_nonui" >>"$snapfile"
|
||||
[[ -s "$tmp_ui" ]] && /bin/cat "$tmp_ui" >>"$snapfile"
|
||||
|
||||
[[ -n "$tmp_nonui" ]] && /bin/rm -f "$tmp_nonui" 2>/dev/null || true
|
||||
[[ -n "$tmp_ui" ]] && /bin/rm -f "$tmp_ui" 2>/dev/null || true
|
||||
|
||||
log "Snapshot contains $(/usr/bin/wc -l <"$snapfile" 2>/dev/null || echo 0) LaunchAgent(s)."
|
||||
}
|
||||
|
||||
unload_launchd_helpers_user() {
|
||||
local uid user_agents
|
||||
uid="$(id -u)"
|
||||
user_agents="$HOME/Library/LaunchAgents"
|
||||
[[ -d "$user_agents" ]] || return 0
|
||||
|
||||
while IFS= read -r plist; do
|
||||
[[ -z "$plist" ]] && continue
|
||||
local base label
|
||||
base="$(basename "$plist")"
|
||||
[[ "$base" == "${LABEL_PREFIX}"* ]] || continue
|
||||
label="$(get_plist_label "$plist")"
|
||||
[[ -n "$label" && "$label" == "${LABEL_PREFIX}"* ]] || continue
|
||||
log "Booting out user label ${label} (${plist})"
|
||||
/bin/launchctl bootout "gui/${uid}" "$plist" 2>/dev/null ||
|
||||
/bin/launchctl bootout "gui/${uid}" "$label" 2>/dev/null ||
|
||||
/bin/launchctl remove "$label" 2>/dev/null || true
|
||||
done < <(/usr/bin/find "$user_agents" -maxdepth 1 -type f -name "${LABEL_PREFIX}"'*.plist' -print 2>/dev/null)
|
||||
|
||||
/bin/launchctl list 2>/dev/null | /usr/bin/awk -v pre="$LABEL_PREFIX" 'NF>=3 && index($3, pre)==1 {print $3}' |
|
||||
while read -r lbl; do
|
||||
[[ -z "$lbl" ]] && continue
|
||||
log "Booting out leftover user label: $lbl"
|
||||
/bin/launchctl bootout "gui/${uid}" "$lbl" 2>/dev/null || /bin/launchctl remove "$lbl" 2>/dev/null || true
|
||||
done
|
||||
}
|
||||
|
||||
restart_launchagents_from_snapshot() {
|
||||
[[ -n "${snapfile:-}" && -f "${snapfile}" ]] || return 0
|
||||
|
||||
local uid count=0 ui_seen=0
|
||||
uid="$(id -u)"
|
||||
|
||||
# Pass 1: restart all non-UI agents first
|
||||
while IFS=$'\t' read -r plist label; do
|
||||
[[ -n "$plist" && -n "$label" ]] || continue
|
||||
[[ -f "$plist" ]] || continue
|
||||
[[ "$label" == "$UI_LABEL" ]] && continue
|
||||
|
||||
log "Re-starting LaunchAgent: ${label}"
|
||||
/bin/launchctl bootstrap "gui/${uid}" "$plist" 2>/dev/null || true
|
||||
/bin/launchctl kickstart -k "gui/${uid}/${label}" 2>/dev/null || true
|
||||
((count++)) || true
|
||||
done <"$snapfile"
|
||||
|
||||
# Give helpers a moment to settle (e.g., automounts)
|
||||
sleep 0.3
|
||||
|
||||
# Pass 2: restart the UI agent last (if present in the snapshot)
|
||||
while IFS=$'\t' read -r plist label; do
|
||||
[[ -n "$plist" && -n "$label" ]] || continue
|
||||
[[ -f "$plist" ]] || continue
|
||||
[[ "$label" == "$UI_LABEL" ]] || continue
|
||||
|
||||
log "Re-starting UI LaunchAgent last: ${label}"
|
||||
/bin/launchctl bootstrap "gui/${uid}" "$plist" 2>/dev/null || true
|
||||
/bin/launchctl kickstart -k "gui/${uid}/${label}" 2>/dev/null || true
|
||||
ui_seen=1
|
||||
((count++)) || true
|
||||
done <"$snapfile"
|
||||
|
||||
log "Re-started ${count} LaunchAgent(s) with prefix ${LABEL_PREFIX}." || true
|
||||
|
||||
if ((ui_seen)); then
|
||||
# If the UI label is active, skip manual open(1).
|
||||
if /bin/launchctl list | /usr/bin/awk '{print $3}' | /usr/bin/grep -Fxq "$UI_LABEL"; then
|
||||
log "UI LaunchAgent (${UI_LABEL}) active after restart; skipping manual UI launch."
|
||||
skip_ui_launch=1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# ----- quarantine helper -----
|
||||
remove_quarantine() {
|
||||
local path="${1:-}"
|
||||
if [[ "${USE_SUDO:-0}" == "1" ]]; then
|
||||
sudo /usr/bin/xattr -dr com.apple.quarantine "$path" 2>/dev/null || true
|
||||
else
|
||||
/usr/bin/xattr -dr com.apple.quarantine "$path" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
# ----- process helpers -----
|
||||
kill_repertory_processes() {
|
||||
local exec_name="$1"
|
||||
/usr/bin/pkill -TERM -f "$dest_app" >/dev/null 2>&1 || true
|
||||
/usr/bin/pkill -TERM -x "$exec_name" >/dev/null 2>&1 || true
|
||||
for _ in {1..20}; do
|
||||
/usr/bin/pgrep -af "$dest_app" >/dev/null 2>&1 || /usr/bin/pgrep -x "$exec_name" >/dev/null 2>&1 || break
|
||||
sleep 0.1
|
||||
done
|
||||
/usr/bin/pkill -KILL -f "$dest_app" >/dev/null 2>&1 || true
|
||||
/usr/bin/pkill -KILL -x "$exec_name" >/dev/null 2>&1 || true
|
||||
}
|
||||
|
||||
# ----- visibility helper -----
|
||||
unhide_path() {
|
||||
local path="$1"
|
||||
/usr/bin/chflags -R nohidden "$path" 2>/dev/null || true
|
||||
/usr/bin/xattr -d -r com.apple.FinderInfo "$path" 2>/dev/null || true
|
||||
}
|
||||
|
||||
# ----- stage / validate / activate / post-activate -----
|
||||
stage_new_app() {
|
||||
staged="${dest_app}.new-$$"
|
||||
log "Staging new app → $staged"
|
||||
$SUDO /usr/bin/ditto "$src_app" "$staged" || die "ditto to stage failed"
|
||||
remove_quarantine "$staged"
|
||||
}
|
||||
|
||||
validate_staged_app() {
|
||||
[[ -f "$staged/Contents/Info.plist" ]] || {
|
||||
$SUDO /bin/rm -rf "$staged"
|
||||
die "staged app missing Info.plist"
|
||||
}
|
||||
local exe_name_staged
|
||||
exe_name_staged="$(/usr/bin/defaults read "$staged/Contents/Info" CFBundleExecutable 2>/dev/null || echo "${app_basename%.app}")"
|
||||
[[ -x "$staged/Contents/MacOS/$exe_name_staged" ]] || {
|
||||
$SUDO /bin/rm -rf "$staged"
|
||||
die "staged app missing main executable"
|
||||
}
|
||||
}
|
||||
|
||||
activate_staged_app() {
|
||||
if [[ -d "$dest_app" ]]; then
|
||||
backup="${dest_app}.$(date +%Y%m%d%H%M%S).bak"
|
||||
log "Moving existing app to backup: $backup"
|
||||
$SUDO /bin/mv "$dest_app" "$backup" || {
|
||||
$SUDO /bin/rm -rf "$staged"
|
||||
die "failed to move existing app out of the way"
|
||||
}
|
||||
fi
|
||||
log "Activating new app → $dest_app"
|
||||
if ! $SUDO /bin/mv "$staged" "$dest_app"; then
|
||||
warn "Activation failed; attempting rollback…"
|
||||
[[ -n "$backup" && -d "$backup" ]] && $SUDO /bin/mv "$backup" "$dest_app" || true
|
||||
$SUDO /bin/rm -rf "$staged" || true
|
||||
die "install activation failed"
|
||||
fi
|
||||
}
|
||||
|
||||
post_activate_cleanup() {
|
||||
log "Clearing quarantine on installed app…"
|
||||
remove_quarantine "$dest_app"
|
||||
log "Clearing hidden flags on installed app…"
|
||||
unhide_path "$dest_app"
|
||||
|
||||
local LSREG="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
|
||||
[[ -x "$LSREG" ]] && "$LSREG" -f "$dest_app" >/dev/null 2>&1 || true
|
||||
local BID
|
||||
BID="$(bundle_id_of "$dest_app")"
|
||||
ls_prune_bundle_id "$BID" "$dest_app"
|
||||
|
||||
log "Installed ${app_basename}: version=$(bundle_version_of "$dest_app") build=$(bundle_build_of "$dest_app")"
|
||||
}
|
||||
|
||||
launch_ui() {
|
||||
log "Launching the new app…"
|
||||
/usr/bin/open -n "$dest_app" || warn "open -n by path failed; not falling back to -b to avoid launching a stale copy."
|
||||
}
|
||||
|
||||
remove_backup() {
|
||||
[[ -n "$backup" && -d "$backup" ]] && {
|
||||
log "Removing backup: $backup"
|
||||
$SUDO /bin/rm -rf "$backup" || warn "Could not remove backup (safe to delete manually): $backup"
|
||||
}
|
||||
log "Done."
|
||||
}
|
||||
|
||||
cleanup_staged() {
|
||||
if [[ -n "${staged:-}" && -d "${staged}" ]]; then
|
||||
log "Cleaning up staged folder: ${staged}"
|
||||
if [[ "${USE_SUDO:-0}" == "1" ]]; then
|
||||
sudo /bin/rm -rf "${staged}" 2>/dev/null || true
|
||||
else
|
||||
/bin/rm -rf "${staged}" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
if [[ -n "${snapfile:-}" && -f "${snapfile}" ]]; then
|
||||
/bin/rm -f "${snapfile}" 2>/dev/null || true
|
||||
fi
|
||||
}
|
||||
|
||||
main() {
|
||||
ensure_target_writable
|
||||
|
||||
local exec_name
|
||||
exec_name="$(bundle_exec_of "$src_app")"
|
||||
|
||||
# 1) Snapshot agents we'll restart later
|
||||
snapshot_launchagents_user
|
||||
|
||||
# 2) Hard-fail if any FUSE unmount fails
|
||||
unmount_existing_repertory_volumes || die "One or more FUSE mounts resisted unmount."
|
||||
|
||||
# 3) Stop user LaunchAgents (do NOT delete plists)
|
||||
unload_launchd_helpers_user
|
||||
|
||||
# 4) Kill any remaining repertory processes
|
||||
kill_repertory_processes "$exec_name"
|
||||
|
||||
# 5) Stage → validate → activate → post-activate
|
||||
stage_new_app
|
||||
validate_staged_app
|
||||
activate_staged_app
|
||||
post_activate_cleanup
|
||||
|
||||
# 6) Re-start previously-running LaunchAgents (so automount helpers come up)
|
||||
restart_launchagents_from_snapshot
|
||||
|
||||
# 7) If UI LaunchAgent came back, skip manual launch
|
||||
if ((!skip_ui_launch)); then
|
||||
launch_ui
|
||||
fi
|
||||
|
||||
# 8) Remove backup now that everything is good
|
||||
remove_backup
|
||||
}
|
||||
|
||||
trap 'rc=$?; cleanup_staged; if (( rc != 0 )); then echo "Installer failed with code $rc. See $LOG_FILE"; fi' EXIT
|
||||
main "$@"
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,245 +19,440 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_APP_CONFIG_HPP_
|
||||
#define REPERTORY_INCLUDE_APP_CONFIG_HPP_
|
||||
#ifndef INCLUDE_APP_CONFIG_HPP_
|
||||
#define INCLUDE_APP_CONFIG_HPP_
|
||||
|
||||
#include "types/remote.hpp"
|
||||
#include "events/event_system.hpp"
|
||||
#include "events/events.hpp"
|
||||
#include "types/repertory.hpp"
|
||||
#include "utils/error_utils.hpp"
|
||||
|
||||
namespace repertory {
|
||||
class app_config final {
|
||||
private:
|
||||
static stop_type stop_requested;
|
||||
public:
|
||||
[[nodiscard]] static auto
|
||||
default_agent_name(const provider_type &prov) -> std::string;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
default_api_port(const provider_type &prov) -> std::uint16_t;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
default_data_directory(const provider_type &prov) -> std::string;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
default_remote_port(const provider_type &prov) -> std::uint16_t;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
default_rpc_port(const provider_type &prov) -> std::uint16_t;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
get_provider_display_name(const provider_type &prov) -> std::string;
|
||||
|
||||
[[nodiscard]] static auto
|
||||
get_provider_name(const provider_type &prov) -> std::string;
|
||||
|
||||
public:
|
||||
[[nodiscard]] static auto default_agent_name(provider_type prov)
|
||||
-> std::string;
|
||||
|
||||
[[nodiscard]] static auto default_api_port(provider_type prov)
|
||||
-> std::uint16_t;
|
||||
|
||||
[[nodiscard]] static auto default_data_directory(provider_type prov)
|
||||
-> std::string;
|
||||
|
||||
[[nodiscard]] static auto default_remote_api_port(provider_type prov)
|
||||
-> std::uint16_t;
|
||||
|
||||
[[nodiscard]] static auto get_provider_display_name(provider_type prov)
|
||||
-> std::string;
|
||||
|
||||
[[nodiscard]] static auto get_provider_name(provider_type prov)
|
||||
-> std::string;
|
||||
|
||||
[[nodiscard]] static auto get_root_data_directory() -> std::string;
|
||||
|
||||
public:
|
||||
[[nodiscard]] static auto get_stop_requested() -> bool;
|
||||
|
||||
static void set_stop_requested();
|
||||
|
||||
public:
|
||||
app_config(provider_type prov, std::string_view data_directory);
|
||||
|
||||
app_config() = delete;
|
||||
app_config(app_config &&) = delete;
|
||||
app_config(const app_config &) = delete;
|
||||
app_config(const provider_type &prov, std::string_view data_directory = "");
|
||||
|
||||
~app_config() { save(); }
|
||||
|
||||
auto operator=(const app_config &) -> app_config & = delete;
|
||||
auto operator=(app_config &&) -> app_config & = delete;
|
||||
|
||||
private:
|
||||
provider_type prov_;
|
||||
utils::atomic<std::string> api_password_;
|
||||
std::atomic<std::uint16_t> api_port_;
|
||||
utils::atomic<std::string> api_user_;
|
||||
std::string cache_directory_;
|
||||
std::atomic<bool> config_changed_;
|
||||
std::string api_auth_;
|
||||
std::uint16_t api_port_;
|
||||
std::string api_user_;
|
||||
bool config_changed_;
|
||||
std::string data_directory_;
|
||||
std::atomic<database_type> db_type_{database_type::rocksdb};
|
||||
std::atomic<std::uint8_t> download_timeout_secs_;
|
||||
std::atomic<bool> enable_download_timeout_;
|
||||
std::atomic<bool> enable_drive_events_;
|
||||
std::uint8_t download_timeout_secs_;
|
||||
bool enable_chunk_downloader_timeout_;
|
||||
bool enable_comm_duration_events_;
|
||||
bool enable_drive_events_;
|
||||
bool enable_max_cache_size_;
|
||||
#if defined(_WIN32)
|
||||
std::atomic<bool> enable_mount_manager_;
|
||||
#endif // defined(_WIN32)
|
||||
std::atomic<event_level> event_level_;
|
||||
std::atomic<std::uint32_t> eviction_delay_mins_;
|
||||
std::atomic<bool> eviction_uses_accessed_time_;
|
||||
std::atomic<std::uint16_t> high_freq_interval_secs_;
|
||||
std::string log_directory_;
|
||||
std::atomic<std::uint16_t> low_freq_interval_secs_;
|
||||
std::atomic<std::uint64_t> max_cache_size_bytes_;
|
||||
std::atomic<std::uint8_t> max_upload_count_;
|
||||
std::atomic<std::uint16_t> med_freq_interval_secs_;
|
||||
std::atomic<std::uint16_t> online_check_retry_secs_;
|
||||
std::atomic<download_type> preferred_download_type_;
|
||||
std::atomic<std::uint16_t> retry_read_count_;
|
||||
std::atomic<std::uint16_t> ring_buffer_file_size_;
|
||||
std::atomic<std::uint16_t> task_wait_ms_;
|
||||
|
||||
private:
|
||||
utils::atomic<encrypt_config> encrypt_config_;
|
||||
utils::atomic<host_config> host_config_;
|
||||
mutable std::recursive_mutex read_write_mutex_;
|
||||
utils::atomic<remote::remote_config> remote_config_;
|
||||
utils::atomic<remote::remote_mount> remote_mount_;
|
||||
utils::atomic<s3_config> s3_config_;
|
||||
utils::atomic<sia_config> sia_config_;
|
||||
std::unordered_map<std::string, std::function<std::string()>>
|
||||
value_get_lookup_;
|
||||
std::unordered_map<std::string, std::function<std::string(std::string_view)>>
|
||||
value_set_lookup_;
|
||||
bool enable_mount_manager_;
|
||||
#endif
|
||||
bool enable_remote_mount_;
|
||||
encrypt_config encrypt_config_;
|
||||
event_level event_level_;
|
||||
std::uint32_t eviction_delay_mins_;
|
||||
bool eviction_uses_accessed_time_;
|
||||
std::uint8_t high_freq_interval_secs_;
|
||||
bool is_remote_mount_;
|
||||
std::uint32_t low_freq_interval_secs_;
|
||||
std::uint64_t max_cache_size_bytes_;
|
||||
std::uint8_t max_upload_count_;
|
||||
std::uint8_t min_download_timeout_secs_;
|
||||
std::uint16_t online_check_retry_secs_;
|
||||
std::uint16_t orphaned_file_retention_days_;
|
||||
std::string preferred_download_type_;
|
||||
std::uint8_t read_ahead_count_;
|
||||
std::uint8_t remote_client_pool_size_;
|
||||
std::string remote_host_name_or_ip_;
|
||||
std::uint8_t remote_max_connections_;
|
||||
std::uint16_t remote_port_;
|
||||
std::uint16_t remote_receive_timeout_secs_;
|
||||
std::uint16_t remote_send_timeout_secs_;
|
||||
std::string remote_token_;
|
||||
std::uint16_t retry_read_count_;
|
||||
std::uint16_t ring_buffer_file_size_;
|
||||
std::string cache_directory_;
|
||||
host_config hc_;
|
||||
s3_config s3_config_;
|
||||
sia_config sia_config_{"default"};
|
||||
std::uint64_t version_{REPERTORY_CONFIG_VERSION};
|
||||
std::string log_directory_;
|
||||
mutable std::recursive_mutex read_write_mutex_;
|
||||
mutable std::recursive_mutex remote_mount_mutex_;
|
||||
|
||||
private:
|
||||
[[nodiscard]] auto load() -> bool;
|
||||
|
||||
template <typename dest, typename source>
|
||||
auto set_value(dest &dst, const source &src) -> bool;
|
||||
template <typename dest>
|
||||
auto get_value(const json &json_document, const std::string &name, dest &dst,
|
||||
bool &success_flag) -> bool {
|
||||
constexpr const auto *function_name =
|
||||
static_cast<const char *>(__FUNCTION__);
|
||||
|
||||
auto set_value(utils::atomic<std::string> &dst, std::string_view src) -> bool;
|
||||
auto ret = false;
|
||||
try {
|
||||
if (json_document.find(name) != json_document.end()) {
|
||||
dst = json_document[name].get<dest>();
|
||||
ret = true;
|
||||
} else {
|
||||
success_flag = false;
|
||||
}
|
||||
} catch (const json::exception &ex) {
|
||||
utils::error::raise_error(function_name, ex, "exception occurred");
|
||||
success_flag = false;
|
||||
ret = false;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <typename dest, typename source>
|
||||
auto set_value(dest &dst, const source &src) -> bool {
|
||||
auto ret = false;
|
||||
recur_mutex_lock lock(read_write_mutex_);
|
||||
if (dst != src) {
|
||||
dst = src;
|
||||
config_changed_ = true;
|
||||
save();
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public:
|
||||
[[nodiscard]] auto get_api_password() const -> std::string;
|
||||
[[nodiscard]] auto get_api_auth() const -> std::string { return api_auth_; }
|
||||
|
||||
[[nodiscard]] auto get_api_port() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_api_port() const -> std::uint16_t { return api_port_; }
|
||||
|
||||
[[nodiscard]] auto get_api_user() const -> std::string;
|
||||
[[nodiscard]] auto get_api_user() const -> std::string { return api_user_; }
|
||||
|
||||
[[nodiscard]] auto get_cache_directory() const -> std::string;
|
||||
[[nodiscard]] auto get_cache_directory() const -> std::string {
|
||||
return cache_directory_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_chunk_downloader_timeout_secs() const -> std::uint8_t {
|
||||
return std::max(min_download_timeout_secs_, download_timeout_secs_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_config_file_path() const -> std::string;
|
||||
|
||||
[[nodiscard]] auto get_database_type() const -> database_type;
|
||||
[[nodiscard]] auto get_data_directory() const -> std::string {
|
||||
return data_directory_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_data_directory() const -> std::string;
|
||||
[[nodiscard]] auto get_enable_chunk_download_timeout() const -> bool {
|
||||
return enable_chunk_downloader_timeout_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_download_timeout_secs() const -> std::uint8_t;
|
||||
[[nodiscard]] auto get_enable_comm_duration_events() const -> bool {
|
||||
return enable_comm_duration_events_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_enable_download_timeout() const -> bool;
|
||||
[[nodiscard]] auto get_enable_drive_events() const -> bool {
|
||||
return enable_drive_events_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_enable_drive_events() const -> bool;
|
||||
|
||||
[[nodiscard]] auto get_encrypt_config() const -> encrypt_config;
|
||||
[[nodiscard]] auto get_encrypt_config() const -> encrypt_config {
|
||||
return encrypt_config_;
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
[[nodiscard]] auto get_enable_mount_manager() const -> bool;
|
||||
#endif // defined(_WIN32)
|
||||
[[nodiscard]] auto get_enable_mount_manager() const -> bool {
|
||||
return enable_mount_manager_;
|
||||
}
|
||||
#endif
|
||||
|
||||
[[nodiscard]] auto get_event_level() const -> event_level;
|
||||
[[nodiscard]] auto get_enable_max_cache_size() const -> bool {
|
||||
return enable_max_cache_size_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_eviction_delay_mins() const -> std::uint32_t;
|
||||
[[nodiscard]] auto get_enable_remote_mount() const -> bool {
|
||||
return enable_remote_mount_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_eviction_uses_accessed_time() const -> bool;
|
||||
[[nodiscard]] auto get_event_level() const -> event_level {
|
||||
return event_level_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_high_frequency_interval_secs() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_eviction_delay_mins() const -> std::uint32_t {
|
||||
return eviction_delay_mins_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_host_config() const -> host_config;
|
||||
[[nodiscard]] auto get_eviction_uses_accessed_time() const -> bool {
|
||||
return eviction_uses_accessed_time_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_high_frequency_interval_secs() const -> std::uint8_t {
|
||||
return std::max(static_cast<std::uint8_t>(1U), high_freq_interval_secs_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_host_config() const -> host_config { return hc_; }
|
||||
|
||||
[[nodiscard]] auto get_is_remote_mount() const -> bool {
|
||||
return is_remote_mount_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_json() const -> json;
|
||||
|
||||
[[nodiscard]] auto get_log_directory() const -> std::string;
|
||||
[[nodiscard]] auto get_log_directory() const -> std::string {
|
||||
return log_directory_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_low_frequency_interval_secs() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_low_frequency_interval_secs() const -> std::uint32_t {
|
||||
return std::max(1U, low_freq_interval_secs_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_max_cache_size_bytes() const -> std::uint64_t;
|
||||
|
||||
[[nodiscard]] auto get_max_upload_count() const -> std::uint8_t;
|
||||
[[nodiscard]] auto get_max_upload_count() const -> std::uint8_t {
|
||||
return std::max(std::uint8_t(1U), max_upload_count_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_med_frequency_interval_secs() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_online_check_retry_secs() const -> std::uint16_t {
|
||||
return std::max(std::uint16_t(15U), online_check_retry_secs_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_online_check_retry_secs() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_orphaned_file_retention_days() const -> std::uint16_t {
|
||||
return std::min(static_cast<std::uint16_t>(31U),
|
||||
std::max(static_cast<std::uint16_t>(1U),
|
||||
orphaned_file_retention_days_));
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_preferred_download_type() const -> download_type;
|
||||
[[nodiscard]] auto get_preferred_download_type() const -> download_type {
|
||||
return download_type_from_string(preferred_download_type_,
|
||||
download_type::fallback);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_provider_type() const -> provider_type;
|
||||
[[nodiscard]] auto get_provider_type() const -> provider_type {
|
||||
return prov_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_remote_config() const -> remote::remote_config;
|
||||
[[nodiscard]] auto get_read_ahead_count() const -> std::uint8_t {
|
||||
return std::max(static_cast<std::uint8_t>(1U), read_ahead_count_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_remote_mount() const -> remote::remote_mount;
|
||||
[[nodiscard]] auto get_remote_client_pool_size() const -> std::uint8_t {
|
||||
return std::max(static_cast<std::uint8_t>(5U), remote_client_pool_size_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_retry_read_count() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_remote_host_name_or_ip() const -> std::string {
|
||||
return remote_host_name_or_ip_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_ring_buffer_file_size() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_remote_max_connections() const -> std::uint8_t {
|
||||
return std::max(static_cast<std::uint8_t>(1U), remote_max_connections_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_s3_config() const -> s3_config;
|
||||
[[nodiscard]] auto get_remote_port() const -> std::uint16_t {
|
||||
return remote_port_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_sia_config() const -> sia_config;
|
||||
[[nodiscard]] auto get_remote_receive_timeout_secs() const -> std::uint16_t {
|
||||
return remote_receive_timeout_secs_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_task_wait_ms() const -> std::uint16_t;
|
||||
[[nodiscard]] auto get_remote_send_timeout_secs() const -> std::uint16_t {
|
||||
return remote_send_timeout_secs_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_value_by_name(std::string_view name) const
|
||||
-> std::string;
|
||||
[[nodiscard]] auto get_remote_token() const -> std::string {
|
||||
return remote_token_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_raw_value_by_name(std::string_view name) const
|
||||
-> std::string;
|
||||
[[nodiscard]] auto get_retry_read_count() const -> std::uint16_t {
|
||||
return std::max(std::uint16_t(2), retry_read_count_);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_version() const -> std::uint64_t;
|
||||
[[nodiscard]] auto get_ring_buffer_file_size() const -> std::uint16_t {
|
||||
return std::max(
|
||||
static_cast<std::uint16_t>(64U),
|
||||
std::min(static_cast<std::uint16_t>(1024U), ring_buffer_file_size_));
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_s3_config() const -> s3_config { return s3_config_; }
|
||||
|
||||
[[nodiscard]] auto get_sia_config() const -> sia_config {
|
||||
return sia_config_;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto get_value_by_name(const std::string &name) -> std::string;
|
||||
|
||||
[[nodiscard]] auto get_version() const -> std::uint64_t { return version_; }
|
||||
|
||||
void save();
|
||||
|
||||
void set_api_password(std::string_view value);
|
||||
void set_api_auth(const std::string &api_auth) {
|
||||
set_value(api_auth_, api_auth);
|
||||
}
|
||||
|
||||
void set_api_port(std::uint16_t value);
|
||||
void set_api_port(std::uint16_t api_port) { set_value(api_port_, api_port); }
|
||||
|
||||
void set_api_user(std::string_view value);
|
||||
void set_api_user(const std::string &api_user) {
|
||||
set_value(api_user_, api_user);
|
||||
}
|
||||
|
||||
void set_download_timeout_secs(std::uint8_t value);
|
||||
void set_chunk_downloader_timeout_secs(
|
||||
std::uint8_t chunk_downloader_timeout_secs) {
|
||||
set_value(download_timeout_secs_, chunk_downloader_timeout_secs);
|
||||
}
|
||||
|
||||
void set_database_type(const database_type &value);
|
||||
void
|
||||
set_enable_chunk_downloader_timeout(bool enable_chunk_downloader_timeout) {
|
||||
set_value(enable_chunk_downloader_timeout_,
|
||||
enable_chunk_downloader_timeout);
|
||||
}
|
||||
|
||||
void set_enable_download_timeout(bool value);
|
||||
void set_enable_comm_duration_events(bool enable_comm_duration_events) {
|
||||
set_value(enable_comm_duration_events_, enable_comm_duration_events);
|
||||
}
|
||||
|
||||
void set_enable_drive_events(bool value);
|
||||
void set_enable_drive_events(bool enable_drive_events) {
|
||||
set_value(enable_drive_events_, enable_drive_events);
|
||||
}
|
||||
|
||||
void set_enable_max_cache_size(bool enable_max_cache_size) {
|
||||
set_value(enable_max_cache_size_, enable_max_cache_size);
|
||||
}
|
||||
|
||||
#if defined(_WIN32)
|
||||
void set_enable_mount_manager(bool value);
|
||||
#endif // defined(_WIN32)
|
||||
void set_enable_mount_manager(bool enable_mount_manager) {
|
||||
set_value(enable_mount_manager_, enable_mount_manager);
|
||||
}
|
||||
#endif
|
||||
|
||||
void set_event_level(const event_level &value);
|
||||
void set_enable_remote_mount(bool enable_remote_mount);
|
||||
|
||||
void set_encrypt_config(encrypt_config value);
|
||||
void set_event_level(const event_level &level) {
|
||||
if (set_value(event_level_, level)) {
|
||||
event_system::instance().raise<event_level_changed>(
|
||||
event_level_to_string(level));
|
||||
}
|
||||
}
|
||||
|
||||
void set_eviction_delay_mins(std::uint32_t value);
|
||||
void set_eviction_delay_mins(std::uint32_t eviction_delay_mins) {
|
||||
set_value(eviction_delay_mins_, eviction_delay_mins);
|
||||
}
|
||||
|
||||
void set_eviction_uses_accessed_time(bool value);
|
||||
void set_eviction_uses_accessed_time(bool eviction_uses_accessed_time) {
|
||||
set_value(eviction_uses_accessed_time_, eviction_uses_accessed_time);
|
||||
}
|
||||
|
||||
void set_high_frequency_interval_secs(std::uint16_t value);
|
||||
void
|
||||
set_high_frequency_interval_secs(std::uint8_t high_frequency_interval_secs) {
|
||||
set_value(high_freq_interval_secs_, high_frequency_interval_secs);
|
||||
}
|
||||
|
||||
void set_host_config(host_config value);
|
||||
#if defined(PROJECT_TESTING)
|
||||
void set_host_config(host_config hc) {
|
||||
config_changed_ = true;
|
||||
hc_ = std::move(hc);
|
||||
save();
|
||||
}
|
||||
|
||||
void set_low_frequency_interval_secs(std::uint16_t value);
|
||||
void set_s3_config(s3_config s3) {
|
||||
config_changed_ = true;
|
||||
s3_config_ = std::move(s3);
|
||||
save();
|
||||
}
|
||||
#endif
|
||||
|
||||
void set_max_cache_size_bytes(std::uint64_t value);
|
||||
void set_is_remote_mount(bool is_remote_mount);
|
||||
|
||||
void set_max_upload_count(std::uint8_t value);
|
||||
void
|
||||
set_low_frequency_interval_secs(std::uint32_t low_frequency_interval_secs) {
|
||||
set_value(low_freq_interval_secs_, low_frequency_interval_secs);
|
||||
}
|
||||
|
||||
void set_med_frequency_interval_secs(std::uint16_t value);
|
||||
void set_max_cache_size_bytes(std::uint64_t max_cache_size_bytes) {
|
||||
set_value(max_cache_size_bytes_, max_cache_size_bytes);
|
||||
}
|
||||
|
||||
void set_online_check_retry_secs(std::uint16_t value);
|
||||
void set_max_upload_count(std::uint8_t max_upload_count) {
|
||||
set_value(max_upload_count_, max_upload_count);
|
||||
}
|
||||
|
||||
void set_preferred_download_type(const download_type &value);
|
||||
void set_online_check_retry_secs(std::uint16_t online_check_retry_secs) {
|
||||
set_value(online_check_retry_secs_, online_check_retry_secs);
|
||||
}
|
||||
|
||||
void set_remote_config(remote::remote_config value);
|
||||
void
|
||||
set_orphaned_file_retention_days(std::uint16_t orphaned_file_retention_days) {
|
||||
set_value(orphaned_file_retention_days_, orphaned_file_retention_days);
|
||||
}
|
||||
|
||||
void set_remote_mount(remote::remote_mount value);
|
||||
void set_preferred_download_type(const download_type &dt) {
|
||||
set_value(preferred_download_type_, download_type_to_string(dt));
|
||||
}
|
||||
|
||||
void set_retry_read_count(std::uint16_t value);
|
||||
void set_read_ahead_count(std::uint8_t read_ahead_count) {
|
||||
set_value(read_ahead_count_, read_ahead_count);
|
||||
}
|
||||
|
||||
void set_ring_buffer_file_size(std::uint16_t value);
|
||||
void set_remote_client_pool_size(std::uint8_t remote_client_pool_size) {
|
||||
set_value(remote_client_pool_size_, remote_client_pool_size);
|
||||
}
|
||||
|
||||
void set_s3_config(s3_config value);
|
||||
void set_ring_buffer_file_size(std::uint16_t ring_buffer_file_size) {
|
||||
set_value(ring_buffer_file_size_, ring_buffer_file_size);
|
||||
}
|
||||
|
||||
void set_sia_config(sia_config value);
|
||||
void set_remote_host_name_or_ip(const std::string &remote_host_name_or_ip) {
|
||||
set_value(remote_host_name_or_ip_, remote_host_name_or_ip);
|
||||
}
|
||||
|
||||
void set_task_wait_ms(std::uint16_t value);
|
||||
void set_remote_max_connections(std::uint8_t remote_max_connections) {
|
||||
set_value(remote_max_connections_, remote_max_connections);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto set_value_by_name(std::string_view name,
|
||||
std::string_view value) -> std::string;
|
||||
void set_remote_port(std::uint16_t remote_port) {
|
||||
set_value(remote_port_, remote_port);
|
||||
}
|
||||
|
||||
void
|
||||
set_remote_receive_timeout_secs(std::uint16_t remote_receive_timeout_secs) {
|
||||
set_value(remote_receive_timeout_secs_, remote_receive_timeout_secs);
|
||||
}
|
||||
|
||||
void set_remote_send_timeout_secs(std::uint16_t remote_send_timeout_secs) {
|
||||
set_value(remote_send_timeout_secs_, remote_send_timeout_secs);
|
||||
}
|
||||
|
||||
void set_remote_token(const std::string &remote_token) {
|
||||
set_value(remote_token_, remote_token);
|
||||
}
|
||||
|
||||
void set_retry_read_count(std::uint16_t retry_read_count) {
|
||||
set_value(retry_read_count_, retry_read_count);
|
||||
}
|
||||
|
||||
[[nodiscard]] auto set_value_by_name(const std::string &name,
|
||||
const std::string &value) -> std::string;
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_APP_CONFIG_HPP_
|
||||
#endif // INCLUDE_APP_CONFIG_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,15 +19,13 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
|
||||
#include "app_config.hpp"
|
||||
#include "comm/curl/curl_shared.hpp"
|
||||
#include "comm/curl/multi_request.hpp"
|
||||
#include "comm/i_http_comm.hpp"
|
||||
#include "events/event_system.hpp"
|
||||
#include "events/types/curl_error.hpp"
|
||||
#include "events/events.hpp"
|
||||
#include "utils/encryption.hpp"
|
||||
|
||||
namespace repertory {
|
||||
@@ -43,40 +41,42 @@ private:
|
||||
using write_callback = size_t (*)(char *, size_t, size_t, void *);
|
||||
|
||||
struct read_write_info final {
|
||||
data_buffer data;
|
||||
stop_type_callback stop_requested_cb;
|
||||
data_buffer data{};
|
||||
stop_type &stop_requested;
|
||||
};
|
||||
|
||||
static const write_callback write_data;
|
||||
static const write_callback write_headers;
|
||||
static constexpr std::uint8_t retry_request_count{5U};
|
||||
|
||||
private:
|
||||
std::optional<host_config> host_config_;
|
||||
std::optional<s3_config> s3_config_;
|
||||
|
||||
private:
|
||||
bool use_s3_path_style_{false};
|
||||
|
||||
public:
|
||||
[[nodiscard]] static auto create_curl() -> CURL *;
|
||||
|
||||
[[nodiscard]] static auto reset_curl(CURL *curl_handle) -> CURL *;
|
||||
|
||||
public:
|
||||
[[nodiscard]] static auto construct_url(CURL *curl,
|
||||
std::string_view relative_path,
|
||||
const host_config &cfg)
|
||||
-> std::string;
|
||||
[[nodiscard]] static auto
|
||||
construct_url(CURL *curl, const std::string &relative_path,
|
||||
const host_config &cfg) -> std::string;
|
||||
|
||||
[[nodiscard]] static auto create_host_config(const s3_config &cfg)
|
||||
-> host_config;
|
||||
[[nodiscard]] static auto
|
||||
create_host_config(const s3_config &cfg,
|
||||
bool use_s3_path_style) -> host_config;
|
||||
|
||||
[[nodiscard]] static auto url_encode(CURL *curl, std::string_view data,
|
||||
[[nodiscard]] static auto url_encode(CURL *curl, const std::string &data,
|
||||
bool allow_slash) -> std::string;
|
||||
|
||||
template <typename request_type>
|
||||
[[nodiscard]] static auto
|
||||
make_encrypted_request(const host_config &cfg, const request_type &request,
|
||||
long &response_code, stop_type &stop_requested)
|
||||
-> bool {
|
||||
long &response_code,
|
||||
stop_type &stop_requested) -> bool {
|
||||
response_code = 0;
|
||||
|
||||
if (not request.decryption_token.has_value() ||
|
||||
@@ -93,19 +93,19 @@ public:
|
||||
}
|
||||
|
||||
data_buffer data{};
|
||||
const auto key = utils::encryption::generate_key<utils::hash::hash_256_t>(
|
||||
request.decryption_token.value());
|
||||
const auto key =
|
||||
utils::encryption::generate_key<utils::encryption::hash_256_t>(
|
||||
request.decryption_token.value());
|
||||
if (not utils::encryption::read_encrypted_range(
|
||||
request.range.value(), key,
|
||||
[&](data_buffer &buffer, std::uint64_t start_offset,
|
||||
[&](data_buffer &ct, std::uint64_t start_offset,
|
||||
std::uint64_t end_offset) -> bool {
|
||||
auto encrypted_request = request;
|
||||
encrypted_request.decryption_token = std::nullopt;
|
||||
encrypted_request.range = {{start_offset, end_offset}};
|
||||
encrypted_request.response_handler =
|
||||
[&buffer](const auto &encrypted_data,
|
||||
long /*response_code*/) {
|
||||
buffer = encrypted_data;
|
||||
[&ct](const auto &encrypted_data, long /*response_code*/) {
|
||||
ct = encrypted_data;
|
||||
};
|
||||
encrypted_request.total_size = std::nullopt;
|
||||
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (response_code != http_error_codes::ok) {
|
||||
if (response_code != 200) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -135,155 +135,107 @@ public:
|
||||
[[nodiscard]] static auto
|
||||
make_request(const host_config &cfg, const request_type &request,
|
||||
long &response_code, stop_type &stop_requested) -> bool {
|
||||
REPERTORY_USES_FUNCTION_NAME();
|
||||
|
||||
CURLcode curl_code{};
|
||||
const auto do_request = [&]() -> bool {
|
||||
if (request.decryption_token.has_value() &&
|
||||
not request.decryption_token.value().empty()) {
|
||||
return make_encrypted_request(cfg, request, response_code,
|
||||
stop_requested);
|
||||
}
|
||||
|
||||
response_code = 0;
|
||||
|
||||
auto *curl = create_curl();
|
||||
if (not request.set_method(curl, stop_requested)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (not cfg.agent_string.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str());
|
||||
}
|
||||
|
||||
if (request.allow_timeout && cfg.timeout_ms) {
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms);
|
||||
}
|
||||
|
||||
std::string range_list{};
|
||||
if (request.range.has_value()) {
|
||||
range_list = std::to_string(request.range.value().begin) + '-' +
|
||||
std::to_string(request.range.value().end);
|
||||
curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str());
|
||||
}
|
||||
|
||||
if (request.response_headers.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA,
|
||||
&request.response_headers.value());
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers);
|
||||
}
|
||||
|
||||
read_write_info write_info{
|
||||
{},
|
||||
[&stop_requested]() -> bool {
|
||||
return stop_requested || app_config::get_stop_requested();
|
||||
},
|
||||
};
|
||||
if (request.response_handler.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
|
||||
}
|
||||
|
||||
std::string parameters{};
|
||||
for (const auto ¶m : request.query) {
|
||||
parameters += (parameters.empty() ? '?' : '&') + param.first + '=' +
|
||||
url_encode(curl, param.second, false);
|
||||
}
|
||||
|
||||
if (not cfg.api_password.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str());
|
||||
} else if (not cfg.api_user.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str());
|
||||
}
|
||||
|
||||
if (request.aws_service.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_AWS_SIGV4,
|
||||
request.aws_service.value().c_str());
|
||||
}
|
||||
|
||||
curl_slist *header_list{nullptr};
|
||||
if (not request.headers.empty()) {
|
||||
for (const auto &header : request.headers) {
|
||||
header_list = curl_slist_append(
|
||||
header_list,
|
||||
fmt::format("{}: {}", header.first, header.second).c_str());
|
||||
}
|
||||
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, header_list);
|
||||
}
|
||||
|
||||
curl_shared::set_share(curl);
|
||||
|
||||
auto url = construct_url(curl, request.get_path(), cfg) + parameters;
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||
|
||||
multi_request curl_request(curl, stop_requested);
|
||||
|
||||
curl_code = CURLE_OK;
|
||||
curl_request.get_result(curl_code, response_code);
|
||||
|
||||
if (header_list != nullptr) {
|
||||
curl_slist_free_all(header_list);
|
||||
}
|
||||
|
||||
if (curl_code != CURLE_OK) {
|
||||
event_system::instance().raise<curl_error>(curl_code, function_name,
|
||||
request.get_type(), url);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (request.response_handler.has_value()) {
|
||||
request.response_handler.value()(write_info.data, response_code);
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
bool ret{false};
|
||||
for (std::uint8_t retry = 0U; !ret && retry < retry_request_count;
|
||||
++retry) {
|
||||
ret = do_request();
|
||||
if (ret) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (curl_code == CURLE_COULDNT_RESOLVE_HOST) {
|
||||
std::this_thread::sleep_for(1s);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
if (request.decryption_token.has_value() &&
|
||||
not request.decryption_token.value().empty()) {
|
||||
return make_encrypted_request(cfg, request, response_code,
|
||||
stop_requested);
|
||||
}
|
||||
|
||||
return ret;
|
||||
response_code = 0;
|
||||
|
||||
auto *curl = create_curl();
|
||||
if (not request.set_method(curl, stop_requested)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (not cfg.agent_string.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERAGENT, cfg.agent_string.c_str());
|
||||
}
|
||||
|
||||
if (request.allow_timeout && cfg.timeout_ms) {
|
||||
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, cfg.timeout_ms);
|
||||
}
|
||||
|
||||
std::string range_list{};
|
||||
if (request.range.has_value()) {
|
||||
range_list = std::to_string(request.range.value().begin) + '-' +
|
||||
std::to_string(request.range.value().end);
|
||||
curl_easy_setopt(curl, CURLOPT_RANGE, range_list.c_str());
|
||||
}
|
||||
|
||||
if (request.response_headers.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERDATA,
|
||||
&request.response_headers.value());
|
||||
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_headers);
|
||||
}
|
||||
|
||||
read_write_info write_info{{}, stop_requested};
|
||||
if (request.response_handler.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &write_info);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
|
||||
}
|
||||
|
||||
std::string parameters{};
|
||||
for (const auto ¶m : request.query) {
|
||||
parameters += (parameters.empty() ? '?' : '&') + param.first + '=' +
|
||||
url_encode(curl, param.second, false);
|
||||
}
|
||||
|
||||
if (not cfg.api_password.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str());
|
||||
curl_easy_setopt(curl, CURLOPT_PASSWORD, cfg.api_password.c_str());
|
||||
} else if (not cfg.api_user.empty()) {
|
||||
curl_easy_setopt(curl, CURLOPT_USERNAME, cfg.api_user.c_str());
|
||||
}
|
||||
|
||||
if (request.aws_service.has_value()) {
|
||||
curl_easy_setopt(curl, CURLOPT_AWS_SIGV4,
|
||||
request.aws_service.value().c_str());
|
||||
}
|
||||
|
||||
auto url = construct_url(curl, request.get_path(), cfg) + parameters;
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
|
||||
|
||||
multi_request curl_request(curl, stop_requested);
|
||||
|
||||
CURLcode curl_code{};
|
||||
curl_request.get_result(curl_code, response_code);
|
||||
if (curl_code != CURLE_OK) {
|
||||
event_system::instance().raise<curl_error>(url, curl_code);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (request.response_handler.has_value()) {
|
||||
request.response_handler.value()(write_info.data, response_code);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public:
|
||||
[[nodiscard]] auto make_request(const curl::requests::http_delete &del,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
void enable_s3_path_style(bool enable) override;
|
||||
|
||||
[[nodiscard]] auto make_request(const curl::requests::http_get &get,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
[[nodiscard]] auto
|
||||
make_request(const curl::requests::http_delete &del, long &response_code,
|
||||
stop_type &stop_requested) const -> bool override;
|
||||
|
||||
[[nodiscard]] auto make_request(const curl::requests::http_head &head,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
[[nodiscard]] auto
|
||||
make_request(const curl::requests::http_get &get, long &response_code,
|
||||
stop_type &stop_requested) const -> bool override;
|
||||
|
||||
[[nodiscard]] auto make_request(const curl::requests::http_post &post_file,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
[[nodiscard]] auto
|
||||
make_request(const curl::requests::http_head &head, long &response_code,
|
||||
stop_type &stop_requested) const -> bool override;
|
||||
|
||||
[[nodiscard]] auto make_request(const curl::requests::http_put_file &put_file,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
[[nodiscard]] auto
|
||||
make_request(const curl::requests::http_post &post_file, long &response_code,
|
||||
stop_type &stop_requested) const -> bool override;
|
||||
|
||||
[[nodiscard]] auto
|
||||
make_request(const curl::requests::http_put_file &put_file,
|
||||
long &response_code,
|
||||
stop_type &stop_requested) const -> bool override;
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_COMM_HPP_
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_CURL_SHARED_HPP_
|
||||
|
||||
namespace repertory {
|
||||
class curl_shared final {
|
||||
private:
|
||||
struct curl_sh_deleter final {
|
||||
void operator()(CURLSH *ptr) {
|
||||
if (ptr != nullptr) {
|
||||
curl_share_cleanup(ptr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
using curl_sh_t = std::unique_ptr<CURLSH, curl_sh_deleter>;
|
||||
|
||||
public:
|
||||
curl_shared() = delete;
|
||||
curl_shared(const curl_shared &) = delete;
|
||||
curl_shared(curl_shared &&) = delete;
|
||||
~curl_shared() = delete;
|
||||
|
||||
auto operator=(const curl_shared &) -> curl_shared & = delete;
|
||||
auto operator=(curl_shared &&) -> curl_shared & = delete;
|
||||
|
||||
private:
|
||||
static curl_sh_t cache_;
|
||||
static std::recursive_mutex mtx_;
|
||||
|
||||
private:
|
||||
static void lock_callback(CURL * /* curl */, curl_lock_data /* data */,
|
||||
curl_lock_access /* access */, void * /* ptr */);
|
||||
|
||||
static void unlock_callback(CURL * /* curl */, curl_lock_data /* data */,
|
||||
curl_lock_access /* access */, void * /* ptr */);
|
||||
|
||||
public:
|
||||
static void cleanup();
|
||||
|
||||
[[nodiscard]] static auto init() -> bool;
|
||||
|
||||
static void set_share(CURL *curl);
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_DNS_CACHE_HPP_
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,8 +19,8 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
#define INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
|
||||
#include "types/repertory.hpp"
|
||||
|
||||
@@ -36,12 +36,9 @@ private:
|
||||
stop_type &stop_requested_;
|
||||
CURLM *multi_handle_;
|
||||
|
||||
private:
|
||||
[[nodiscard]] auto get_stop_requested() const -> bool;
|
||||
|
||||
public:
|
||||
void get_result(CURLcode &curl_code, long &http_code);
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_MULTI_REQUEST_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,16 +19,14 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_request_base.hpp"
|
||||
|
||||
namespace repertory::curl::requests {
|
||||
struct http_delete final : http_request_base {
|
||||
[[nodiscard]] auto get_type() const -> std::string override {
|
||||
return "delete";
|
||||
}
|
||||
~http_delete() override = default;
|
||||
|
||||
[[nodiscard]] auto set_method(CURL *curl,
|
||||
stop_type & /* stop_requested */) const
|
||||
@@ -39,4 +37,4 @@ struct http_delete final : http_request_base {
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_DELETE_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,8 +19,8 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_request_base.hpp"
|
||||
|
||||
@@ -33,8 +33,6 @@ struct http_get final : http_request_base {
|
||||
auto operator=(http_get &&) -> http_get & = default;
|
||||
~http_get() override = default;
|
||||
|
||||
[[nodiscard]] auto get_type() const -> std::string override { return "get"; }
|
||||
|
||||
[[nodiscard]] auto set_method(CURL *curl,
|
||||
stop_type & /*stop_requested*/) const
|
||||
-> bool override {
|
||||
@@ -44,4 +42,4 @@ struct http_get final : http_request_base {
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_GET_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,14 +19,14 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_request_base.hpp"
|
||||
|
||||
namespace repertory::curl::requests {
|
||||
struct http_head final : http_request_base {
|
||||
[[nodiscard]] auto get_type() const -> std::string override { return "head"; }
|
||||
~http_head() override = default;
|
||||
|
||||
[[nodiscard]] auto set_method(CURL *curl,
|
||||
stop_type & /* stop_requested */) const
|
||||
@@ -38,4 +38,4 @@ struct http_head final : http_request_base {
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_HEAD_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,24 +19,31 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_request_base.hpp"
|
||||
|
||||
namespace repertory::curl::requests {
|
||||
struct http_post final : http_request_base {
|
||||
std::optional<nlohmann::json> json;
|
||||
http_post() = default;
|
||||
http_post(const http_post &) = default;
|
||||
http_post(http_post &&) = default;
|
||||
auto operator=(const http_post &) -> http_post & = default;
|
||||
auto operator=(http_post &&) -> http_post & = default;
|
||||
|
||||
[[nodiscard]] auto get_type() const -> std::string override { return "post"; }
|
||||
~http_post() override;
|
||||
|
||||
std::optional<nlohmann::json> json;
|
||||
|
||||
[[nodiscard]] auto set_method(CURL *curl,
|
||||
stop_type & /*stop_requested*/) const
|
||||
-> bool override;
|
||||
|
||||
private:
|
||||
mutable curl_slist *headers{nullptr};
|
||||
mutable std::optional<std::string> json_str;
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_POST_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,19 +19,26 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_request_base.hpp"
|
||||
#include "utils/encrypting_reader.hpp"
|
||||
|
||||
namespace repertory::curl::requests {
|
||||
struct http_put_file final : http_request_base {
|
||||
http_put_file() = default;
|
||||
http_put_file(const http_put_file &) = default;
|
||||
http_put_file(http_put_file &&) = default;
|
||||
|
||||
auto operator=(const http_put_file &) -> http_put_file & = default;
|
||||
auto operator=(http_put_file &&) -> http_put_file & = default;
|
||||
|
||||
~http_put_file() override = default;
|
||||
|
||||
std::shared_ptr<utils::encryption::encrypting_reader> reader;
|
||||
std::string source_path;
|
||||
|
||||
[[nodiscard]] auto get_type() const -> std::string override { return "put"; }
|
||||
|
||||
[[nodiscard]] auto set_method(CURL *curl, stop_type &stop_requested) const
|
||||
-> bool override;
|
||||
|
||||
@@ -40,4 +47,4 @@ private:
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_PUT_FILE_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,14 +19,16 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
#ifndef INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
#define INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
|
||||
#include "types/repertory.hpp"
|
||||
#include "utils/file.hpp"
|
||||
|
||||
namespace repertory::curl::requests {
|
||||
using curl_response_callback =
|
||||
using read_callback = size_t (*)(char *, size_t, size_t, void *);
|
||||
|
||||
using response_callback =
|
||||
std::function<void(const data_buffer &data, long response_code)>;
|
||||
|
||||
struct read_file_info final {
|
||||
@@ -35,8 +37,19 @@ struct read_file_info final {
|
||||
std::uint64_t offset{};
|
||||
};
|
||||
|
||||
[[nodiscard]] auto curl_file_reader(char *buffer, size_t size, size_t nitems,
|
||||
void *instream) -> size_t;
|
||||
inline const auto read_file_data = static_cast<read_callback>(
|
||||
[](char *buffer, size_t size, size_t nitems, void *instream) -> size_t {
|
||||
auto *read_info = reinterpret_cast<read_file_info *>(instream);
|
||||
std::size_t bytes_read{};
|
||||
auto ret =
|
||||
read_info->file->read(reinterpret_cast<unsigned char *>(buffer),
|
||||
size * nitems, read_info->offset, &bytes_read);
|
||||
if (ret) {
|
||||
read_info->offset += bytes_read;
|
||||
}
|
||||
return ret && not read_info->stop_requested ? bytes_read
|
||||
: CURL_READFUNC_ABORT;
|
||||
});
|
||||
|
||||
struct http_request_base {
|
||||
http_request_base() = default;
|
||||
@@ -51,22 +64,19 @@ struct http_request_base {
|
||||
bool allow_timeout{};
|
||||
std::optional<std::string> aws_service;
|
||||
std::optional<std::string> decryption_token{};
|
||||
mutable http_headers headers{};
|
||||
http_headers headers{};
|
||||
std::string path{};
|
||||
http_query_parameters query{};
|
||||
std::optional<http_range> range{};
|
||||
std::optional<curl_response_callback> response_handler;
|
||||
std::optional<response_callback> response_handler;
|
||||
std::optional<http_headers> response_headers;
|
||||
std::optional<std::uint64_t> total_size{};
|
||||
|
||||
[[nodiscard]] virtual auto get_path() const -> std::string { return path; }
|
||||
|
||||
[[nodiscard]] virtual auto get_type() const -> std::string = 0;
|
||||
|
||||
[[nodiscard]] virtual auto set_method(CURL *curl,
|
||||
stop_type &stop_requested) const
|
||||
-> bool = 0;
|
||||
[[nodiscard]] virtual auto
|
||||
set_method(CURL *curl, stop_type &stop_requested) const -> bool = 0;
|
||||
};
|
||||
} // namespace repertory::curl::requests
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
#endif // INCLUDE_COMM_CURL_CURL_REQUESTS_HTTP_REQUEST_BASE_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,8 +19,8 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
#ifndef INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
#define INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
|
||||
#include "comm/curl/requests/http_delete.hpp"
|
||||
#include "comm/curl/requests/http_get.hpp"
|
||||
@@ -34,6 +34,8 @@ struct i_http_comm {
|
||||
INTERFACE_SETUP(i_http_comm);
|
||||
|
||||
public:
|
||||
virtual void enable_s3_path_style(bool enable) = 0;
|
||||
|
||||
[[nodiscard]] virtual auto
|
||||
make_request(const curl::requests::http_delete &del, long &response_code,
|
||||
stop_type &stop_requested) const -> bool = 0;
|
||||
@@ -60,4 +62,4 @@ public:
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
#endif // INCLUDE_COMM_I_HTTP_COMM_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,17 +19,14 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
#ifndef INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
#define INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
|
||||
#include "comm/packet/packet.hpp"
|
||||
#include "types/repertory.hpp"
|
||||
|
||||
namespace repertory {
|
||||
class client_pool final {
|
||||
public:
|
||||
static constexpr const std::uint16_t default_expired_seconds{120U};
|
||||
static constexpr const std::uint16_t min_expired_seconds{5U};
|
||||
|
||||
public:
|
||||
using worker_callback = std::function<packet::error_type()>;
|
||||
using worker_complete_callback =
|
||||
@@ -49,32 +46,15 @@ private:
|
||||
};
|
||||
|
||||
struct work_queue final {
|
||||
work_queue();
|
||||
~work_queue();
|
||||
|
||||
work_queue(const work_queue &) = delete;
|
||||
work_queue(work_queue &&) = delete;
|
||||
|
||||
std::deque<std::shared_ptr<work_item>> actions;
|
||||
std::atomic<std::chrono::steady_clock::time_point> modified{
|
||||
std::chrono::steady_clock::now(),
|
||||
};
|
||||
std::mutex mutex;
|
||||
std::condition_variable notify;
|
||||
stop_type shutdown{false};
|
||||
std::unique_ptr<std::thread> thread;
|
||||
|
||||
auto operator=(const work_queue &) -> work_queue & = delete;
|
||||
auto operator=(work_queue &&) -> work_queue & = delete;
|
||||
|
||||
private:
|
||||
void work_thread();
|
||||
std::deque<std::shared_ptr<work_item>> queue;
|
||||
};
|
||||
|
||||
public:
|
||||
pool() noexcept = default;
|
||||
explicit pool(std::uint8_t pool_size);
|
||||
|
||||
~pool();
|
||||
~pool() { shutdown(); }
|
||||
|
||||
public:
|
||||
pool(const pool &) = delete;
|
||||
@@ -83,20 +63,21 @@ private:
|
||||
auto operator=(pool &&) -> pool & = delete;
|
||||
|
||||
private:
|
||||
std::mutex pool_mtx_;
|
||||
std::unordered_map<std::uint64_t, std::shared_ptr<work_queue>> pool_queues_;
|
||||
std::vector<std::unique_ptr<work_queue>> pool_queues_;
|
||||
std::vector<std::thread> pool_threads_;
|
||||
bool shutdown_{false};
|
||||
std::atomic<std::uint8_t> thread_index_{};
|
||||
|
||||
public:
|
||||
void execute(std::uint64_t thread_id, worker_callback worker,
|
||||
worker_complete_callback worker_complete);
|
||||
|
||||
void remove_expired(std::uint16_t seconds);
|
||||
void execute(std::uint64_t thread_id, const worker_callback &worker,
|
||||
const worker_complete_callback &worker_complete);
|
||||
|
||||
void shutdown();
|
||||
};
|
||||
|
||||
public:
|
||||
client_pool() noexcept;
|
||||
explicit client_pool(std::uint8_t pool_size = min_pool_size)
|
||||
: pool_size_(pool_size == 0U ? min_pool_size : pool_size) {}
|
||||
|
||||
~client_pool() { shutdown(); }
|
||||
|
||||
@@ -107,26 +88,23 @@ public:
|
||||
auto operator=(client_pool &&) -> client_pool & = delete;
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, std::unique_ptr<pool>> pool_lookup_;
|
||||
std::uint8_t pool_size_;
|
||||
std::unordered_map<std::string, std::shared_ptr<pool>> pool_lookup_;
|
||||
std::mutex pool_mutex_;
|
||||
stop_type shutdown_{false};
|
||||
std::atomic<std::uint16_t> expired_seconds_{default_expired_seconds};
|
||||
bool shutdown_ = false;
|
||||
|
||||
private:
|
||||
static constexpr const auto min_pool_size = 10U;
|
||||
|
||||
public:
|
||||
[[nodiscard]] auto get_expired_seconds() const -> std::uint16_t;
|
||||
void execute(const std::string &client_id, std::uint64_t thread_id,
|
||||
const worker_callback &worker,
|
||||
const worker_complete_callback &worker_complete);
|
||||
|
||||
void execute(std::string client_id, std::uint64_t thread_id,
|
||||
worker_callback worker,
|
||||
worker_complete_callback worker_complete);
|
||||
|
||||
void remove_client(std::string client_id);
|
||||
|
||||
void remove_expired();
|
||||
|
||||
void set_expired_seconds(std::uint16_t seconds);
|
||||
void remove_client(const std::string &client_id);
|
||||
|
||||
void shutdown();
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
#endif // INCLUDE_COMM_PACKET_CLIENT_POOL_HPP_
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_PACKET_COMMON_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_PACKET_COMMON_HPP_
|
||||
|
||||
namespace repertory::comm {
|
||||
inline static constexpr std::uint32_t max_packet_bytes{32U * 1024U * 1024U};
|
||||
inline constexpr const std::uint8_t max_read_attempts{2U};
|
||||
inline constexpr const std::uint16_t packet_nonce_size{256U};
|
||||
inline constexpr const std::size_t read_write_size{131072U};
|
||||
inline constexpr const std::uint16_t server_handshake_timeout_ms{3000U};
|
||||
|
||||
struct non_blocking_guard final {
|
||||
non_blocking_guard(const non_blocking_guard &) = delete;
|
||||
non_blocking_guard(non_blocking_guard &&) = delete;
|
||||
|
||||
auto operator=(const non_blocking_guard &) -> non_blocking_guard & = delete;
|
||||
auto operator=(non_blocking_guard &&) -> non_blocking_guard & = delete;
|
||||
|
||||
explicit non_blocking_guard(boost::asio::ip::tcp::socket &sock_);
|
||||
|
||||
~non_blocking_guard();
|
||||
|
||||
private:
|
||||
bool non_blocking;
|
||||
boost::asio::ip::tcp::socket &sock;
|
||||
};
|
||||
|
||||
void apply_common_socket_properties(boost::asio::ip::tcp::socket &sock);
|
||||
|
||||
[[nodiscard]] auto is_socket_still_alive(boost::asio::ip::tcp::socket &sock)
|
||||
-> bool;
|
||||
} // namespace repertory::comm
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_PACKET_COMMON_HPP_
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,8 +19,8 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
#ifndef INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
#define INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
|
||||
#include "types/remote.hpp"
|
||||
#include "types/repertory.hpp"
|
||||
@@ -52,23 +52,23 @@ public:
|
||||
~packet() = default;
|
||||
|
||||
private:
|
||||
data_buffer buffer_{};
|
||||
std::size_t decode_offset_{0U};
|
||||
data_buffer buffer_;
|
||||
std::size_t decode_offset_ = 0U;
|
||||
|
||||
public:
|
||||
[[nodiscard]] static auto decode_json(packet &response, json &json_data)
|
||||
-> int;
|
||||
[[nodiscard]] static auto decode_json(packet &response,
|
||||
json &json_data) -> int;
|
||||
|
||||
public:
|
||||
void clear();
|
||||
|
||||
[[nodiscard]] auto current_pointer() -> unsigned char * {
|
||||
return (decode_offset_ < buffer_.size()) ? &buffer_.at(decode_offset_)
|
||||
return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_]
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
[[nodiscard]] auto current_pointer() const -> const unsigned char * {
|
||||
return (decode_offset_ < buffer_.size()) ? &buffer_.at(decode_offset_)
|
||||
return (decode_offset_ < buffer_.size()) ? &buffer_[decode_offset_]
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
@@ -200,13 +200,13 @@ public:
|
||||
|
||||
void encode_top(remote::file_info val);
|
||||
|
||||
void encrypt(std::string_view token, bool include_size = true);
|
||||
void encrypt(std::string_view token);
|
||||
|
||||
[[nodiscard]] auto get_size() const -> std::uint32_t {
|
||||
return static_cast<std::uint32_t>(buffer_.size());
|
||||
}
|
||||
|
||||
void to_buffer(data_buffer &buffer);
|
||||
void transfer_into(data_buffer &buffer);
|
||||
|
||||
public:
|
||||
auto operator=(const data_buffer &buffer) noexcept -> packet &;
|
||||
@@ -226,6 +226,8 @@ public:
|
||||
return buffer_.at(index);
|
||||
}
|
||||
};
|
||||
|
||||
using packet = packet;
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
#endif // INCLUDE_COMM_PACKET_PACKET_HPP_
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to do so, subject to the
|
||||
following conditions: The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions of the Software. THE
|
||||
SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
@@ -15,12 +19,10 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
#ifndef INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
#define INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
|
||||
#include "comm/packet/packet.hpp"
|
||||
#include "types/remote.hpp"
|
||||
#include "utils/atomic.hpp"
|
||||
|
||||
using boost::asio::ip::tcp;
|
||||
|
||||
@@ -34,7 +36,9 @@ private:
|
||||
};
|
||||
|
||||
public:
|
||||
packet_client(remote::remote_config cfg);
|
||||
packet_client(std::string host_name_or_ip, std::uint8_t max_connections,
|
||||
std::uint16_t port, std::uint16_t receive_timeout,
|
||||
std::uint16_t send_timeout, std::string encryption_token);
|
||||
|
||||
~packet_client();
|
||||
|
||||
@@ -44,56 +48,49 @@ public:
|
||||
auto operator=(packet_client &&) -> packet_client & = delete;
|
||||
|
||||
private:
|
||||
remote::remote_config cfg_;
|
||||
mutable boost::asio::io_context io_context_;
|
||||
utils::atomic<std::string> unique_id_;
|
||||
boost::asio::io_context io_context_;
|
||||
std::string host_name_or_ip_;
|
||||
std::uint8_t max_connections_;
|
||||
std::uint16_t port_;
|
||||
std::uint16_t receive_timeout_;
|
||||
std::uint16_t send_timeout_;
|
||||
std::string encryption_token_;
|
||||
std::string unique_id_;
|
||||
|
||||
private:
|
||||
std::atomic<bool> allow_connections_{true};
|
||||
utils::atomic<
|
||||
boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::results_type>
|
||||
bool allow_connections_{true};
|
||||
boost::asio::ip::basic_resolver<boost::asio::ip::tcp>::results_type
|
||||
resolve_results_;
|
||||
std::mutex clients_mutex_;
|
||||
std::vector<std::shared_ptr<client>> clients_;
|
||||
std::vector<std::thread> service_threads_;
|
||||
|
||||
private:
|
||||
static void close(client &cli) noexcept;
|
||||
static void close(client &cli);
|
||||
|
||||
void close_all();
|
||||
|
||||
[[nodiscard]] auto connect(client &cli) -> bool;
|
||||
void connect(client &cli);
|
||||
|
||||
[[nodiscard]] auto get_client() -> std::shared_ptr<client>;
|
||||
|
||||
[[nodiscard]] auto handshake(client &cli, std::uint32_t &min_version) const
|
||||
-> bool;
|
||||
|
||||
void put_client(std::shared_ptr<client> &cli);
|
||||
|
||||
void read_data(client &cli, data_buffer &buffer) const;
|
||||
|
||||
[[nodiscard]] auto read_packet(client &cli, packet &response) const
|
||||
-> packet::error_type;
|
||||
[[nodiscard]] auto read_packet(client &cli,
|
||||
packet &response) -> packet::error_type;
|
||||
|
||||
void resolve();
|
||||
|
||||
void write_data(client &cli, const packet &request) const;
|
||||
|
||||
public:
|
||||
[[nodiscard]] auto check_version(std::uint32_t client_version,
|
||||
std::uint32_t &min_version) -> api_error;
|
||||
|
||||
[[nodiscard]] auto send(std::string_view method, std::uint32_t &service_flags)
|
||||
-> packet::error_type;
|
||||
[[nodiscard]] auto send(std::string_view method,
|
||||
std::uint32_t &service_flags) -> packet::error_type;
|
||||
|
||||
[[nodiscard]] auto send(std::string_view method, packet &request,
|
||||
std::uint32_t &service_flags) -> packet::error_type;
|
||||
|
||||
[[nodiscard]] auto send(std::string_view method, packet &request,
|
||||
packet &response, std::uint32_t &service_flags)
|
||||
-> packet::error_type;
|
||||
packet &response,
|
||||
std::uint32_t &service_flags) -> packet::error_type;
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
#endif // INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,11 +19,10 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
#define REPERTORY_INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
#ifndef INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
#define INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
|
||||
#include "comm/packet/client_pool.hpp"
|
||||
#include "comm/packet/common.hpp"
|
||||
#include "utils/common.hpp"
|
||||
|
||||
using namespace boost::asio;
|
||||
@@ -32,11 +31,11 @@ using boost::asio::ip::tcp;
|
||||
namespace repertory {
|
||||
class packet_server final {
|
||||
public:
|
||||
using closed_callback = std::function<void(std::string)>;
|
||||
using closed_callback = std::function<void(const std::string &)>;
|
||||
using message_complete_callback = client_pool::worker_complete_callback;
|
||||
using message_handler_callback =
|
||||
std::function<void(std::uint32_t, std::string, std::uint64_t, std::string,
|
||||
packet *, packet &, message_complete_callback)>;
|
||||
using message_handler_callback = std::function<void(
|
||||
std::uint32_t, const std::string &, std::uint64_t, const std::string &,
|
||||
packet *, packet &, message_complete_callback)>;
|
||||
|
||||
public:
|
||||
packet_server(std::uint16_t port, std::string token, std::uint8_t pool_size,
|
||||
@@ -53,8 +52,8 @@ public:
|
||||
|
||||
private:
|
||||
struct connection {
|
||||
connection(io_context &ctx, tcp::acceptor &acceptor_)
|
||||
: socket(ctx), acceptor(acceptor_) {}
|
||||
connection(boost::asio::io_service &io_service, tcp::acceptor &acceptor_)
|
||||
: socket(io_service), acceptor(acceptor_) {}
|
||||
|
||||
tcp::socket socket;
|
||||
tcp::acceptor &acceptor;
|
||||
@@ -62,25 +61,21 @@ private:
|
||||
std::string client_id;
|
||||
std::string nonce;
|
||||
|
||||
void generate_nonce() {
|
||||
nonce = utils::generate_random_string(comm::packet_nonce_size);
|
||||
}
|
||||
void generate_nonce() { nonce = utils::generate_random_string(256U); }
|
||||
};
|
||||
|
||||
private:
|
||||
std::string encryption_token_;
|
||||
closed_callback closed_;
|
||||
message_handler_callback message_handler_;
|
||||
mutable io_context io_context_;
|
||||
boost::asio::io_context io_context_;
|
||||
std::unique_ptr<std::thread> server_thread_;
|
||||
std::vector<std::thread> service_threads_;
|
||||
std::recursive_mutex connection_mutex_;
|
||||
std::unordered_map<std::string, std::uint32_t> connection_lookup_;
|
||||
|
||||
private:
|
||||
void add_client(connection &conn, std::string client_id);
|
||||
|
||||
[[nodiscard]] auto handshake(std::shared_ptr<connection> conn) const -> bool;
|
||||
void add_client(connection &conn, const std::string &client_id);
|
||||
|
||||
void initialize(const uint16_t &port, uint8_t pool_size);
|
||||
|
||||
@@ -100,4 +95,4 @@ private:
|
||||
};
|
||||
} // namespace repertory
|
||||
|
||||
#endif // REPERTORY_INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
#endif // INCLUDE_COMM_PACKET_PACKET_SERVER_HPP_
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright <2018-2025> <scott.e.graves@protonmail.com>
|
||||
Copyright <2018-2024> <scott.e.graves@protonmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -19,10 +19,10 @@
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
*/
|
||||
#ifndef REPERTORY_INCLUDE_COMMON_HPP_
|
||||
#define REPERTORY_INCLUDE_COMMON_HPP_
|
||||
#ifndef INCLUDE_COMMON_HPP_
|
||||
#define INCLUDE_COMMON_HPP_
|
||||
|
||||
#if defined(__GNUC__) && !defined(PROJECT_IS_DARWIN)
|
||||
#if defined(__GNUC__)
|
||||
// clang-format off
|
||||
#define REPERTORY_IGNORE_WARNINGS_ENABLE() \
|
||||
_Pragma("GCC diagnostic push") \
|
||||
@@ -54,13 +54,12 @@ REPERTORY_IGNORE_WARNINGS_DISABLE()
|
||||
using namespace std::chrono_literals;
|
||||
using json = nlohmann::json;
|
||||
|
||||
inline constexpr std::string_view REPERTORY{"repertory"};
|
||||
inline constexpr std::string_view REPERTORY_DATA_NAME{"repertory2"};
|
||||
inline constexpr std::wstring_view REPERTORY_W{L"repertory"};
|
||||
inline constexpr const std::string_view REPERTORY = "repertory";
|
||||
inline constexpr const std::wstring_view REPERTORY_W = L"repertory";
|
||||
|
||||
inline constexpr std::uint64_t REPERTORY_CONFIG_VERSION{5ULL};
|
||||
inline constexpr std::string_view REPERTORY_MIN_REMOTE_VERSION{"2.1.0"};
|
||||
inline constexpr std::string_view RENTERD_MIN_VERSION{"2.0.0"};
|
||||
inline constexpr const std::uint64_t REPERTORY_CONFIG_VERSION = 0ULL;
|
||||
inline constexpr const std::string_view REPERTORY_DATA_NAME = "repertory2";
|
||||
inline constexpr const std::string_view REPERTORY_MIN_REMOTE_VERSION = "2.0.0";
|
||||
|
||||
#define REPERTORY_INVALID_HANDLE INVALID_HANDLE_VALUE
|
||||
|
||||
@@ -222,27 +221,44 @@ using WCHAR = wchar_t;
|
||||
|
||||
#define MAX_PATH 260
|
||||
|
||||
#define STATUS_ACCESS_DENIED std::uint32_t{0xC0000022L}
|
||||
#define STATUS_DEVICE_BUSY std::uint32_t{0x80000011L}
|
||||
#define STATUS_DEVICE_INSUFFICIENT_RESOURCES std::uint32_t{0xC0000468L}
|
||||
#define STATUS_DIRECTORY_NOT_EMPTY std::uint32_t{0xC0000101L}
|
||||
#define STATUS_END_OF_FILE std::uint32_t{0xC0000011L}
|
||||
#define STATUS_FILE_IS_A_DIRECTORY std::uint32_t{0xC00000BAL}
|
||||
#define STATUS_FILE_TOO_LARGE std::uint32_t{0xC0000904L}
|
||||
#define STATUS_INSUFFICIENT_RESOURCES std::uint32_t{0xC000009AL}
|
||||
#define STATUS_INTERNAL_ERROR std::uint32_t{0xC00000E5L}
|
||||
#define STATUS_INVALID_ADDRESS std::uint32_t{0xC0000141L}
|
||||
#define STATUS_INVALID_HANDLE std::uint32_t{0xC0000006L}
|
||||
#define STATUS_INVALID_IMAGE_FORMAT std::uint32_t{0xC000007BL}
|
||||
#define STATUS_INVALID_PARAMETER std::uint32_t{0xC000000DL}
|
||||
#define STATUS_NOT_IMPLEMENTED std::uint32_t{0xC0000002L}
|
||||
#define STATUS_NO_MEMORY std::uint32_t{0xC0000017L}
|
||||
#define STATUS_OBJECT_NAME_COLLISION std::uint32_t{0xC0000035L}
|
||||
#define STATUS_OBJECT_NAME_EXISTS std::uint32_t{0x40000000L}
|
||||
#define STATUS_OBJECT_NAME_NOT_FOUND std::uint32_t{0xC0000034L}
|
||||
#define STATUS_OBJECT_PATH_INVALID std::uint32_t{0xC0000039L}
|
||||
#define STATUS_SUCCESS std::uint32_t{0U}
|
||||
#define STATUS_UNEXPECTED_IO_ERROR std::uint32_t{0xC00000E9L}
|
||||
#define STATUS_SUCCESS \
|
||||
std::uint32_t { 0U }
|
||||
#define STATUS_ACCESS_DENIED \
|
||||
std::uint32_t { 0xC0000022L }
|
||||
#define STATUS_DEVICE_BUSY \
|
||||
std::uint32_t { 0x80000011L }
|
||||
#define STATUS_DEVICE_INSUFFICIENT_RESOURCES \
|
||||
std::uint32_t { 0xC0000468L }
|
||||
#define STATUS_DIRECTORY_NOT_EMPTY \
|
||||
std::uint32_t { 0xC0000101L }
|
||||
#define STATUS_FILE_IS_A_DIRECTORY \
|
||||
std::uint32_t { 0xC00000BAL }
|
||||
#define STATUS_FILE_TOO_LARGE \
|
||||
std::uint32_t { 0xC0000904L }
|
||||
#define STATUS_INSUFFICIENT_RESOURCES \
|
||||
std::uint32_t { 0xC000009AL }
|
||||
#define STATUS_INTERNAL_ERROR \
|
||||
std::uint32_t { 0xC00000E5L }
|
||||
#define STATUS_INVALID_ADDRESS \
|
||||
std::uint32_t { 0xC0000141L }
|
||||
#define STATUS_INVALID_HANDLE \
|
||||
std::uint32_t { 0xC0000006L }
|
||||
#define STATUS_INVALID_IMAGE_FORMAT \
|
||||
std::uint32_t { 0xC000007BL }
|
||||
#define STATUS_INVALID_PARAMETER \
|
||||
std::uint32_t { 0xC000000DL }
|
||||
#define STATUS_NO_MEMORY \
|
||||
std::uint32_t { 0xC0000017L }
|
||||
#define STATUS_NOT_IMPLEMENTED \
|
||||
std::uint32_t { 0xC0000002L }
|
||||
#define STATUS_OBJECT_NAME_EXISTS \
|
||||
std::uint32_t { 0x40000000L }
|
||||
#define STATUS_OBJECT_NAME_NOT_FOUND \
|
||||
std::uint32_t { 0xC0000034L }
|
||||
#define STATUS_OBJECT_PATH_INVALID \
|
||||
std::uint32_t { 0xC0000039L }
|
||||
#define STATUS_UNEXPECTED_IO_ERROR \
|
||||
std::uint32_t { 0xC00000E9L }
|
||||
|
||||
#define CONVERT_STATUS_NOT_IMPLEMENTED(e) \
|
||||
((std::uint32_t(e) == STATUS_NOT_IMPLEMENTED) ? -ENOTSUP : e)
|
||||
@@ -280,8 +296,8 @@ using namespace Fsp;
|
||||
#define INTERFACE_SETUP(name) \
|
||||
public: \
|
||||
name(const name &) noexcept = delete; \
|
||||
auto operator=(const name &) noexcept -> name & = delete; \
|
||||
auto operator=(name &&) noexcept -> name & = delete; \
|
||||
name &operator=(const name &) noexcept = delete; \
|
||||
name &operator=(name &&) noexcept = delete; \
|
||||
\
|
||||
protected: \
|
||||
name() = default; \
|
||||
@@ -291,4 +307,4 @@ public: \
|
||||
virtual ~name() = default
|
||||
|
||||
#endif // __cplusplus
|
||||
#endif // REPERTORY_INCLUDE_COMMON_HPP_
|
||||
#endif // INCLUDE_COMMON_HPP_
|
||||
|
||||