kanidm/docs/v1.1.0-alpha.3/rustdoc/src/score/lib.rs.html
2022-05-22 22:26:40 +00:00

1420 lines
83 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `kanidmd/score/src/lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script src="../../crates.js"></script><script defer src="../../main.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script>
<noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">&#9776;</button><a class="sidebar-logo" href="../../score/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"></h2>
</nav>
<nav class="sidebar"><a class="sidebar-logo" href="../../score/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../score/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><div class="theme-picker hidden"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="22" height="22" alt="Pick another theme!" src="../../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
<span id="5">5</span>
<span id="6">6</span>
<span id="7">7</span>
<span id="8">8</span>
<span id="9">9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<span id="89">89</span>
<span id="90">90</span>
<span id="91">91</span>
<span id="92">92</span>
<span id="93">93</span>
<span id="94">94</span>
<span id="95">95</span>
<span id="96">96</span>
<span id="97">97</span>
<span id="98">98</span>
<span id="99">99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
<span id="305">305</span>
<span id="306">306</span>
<span id="307">307</span>
<span id="308">308</span>
<span id="309">309</span>
<span id="310">310</span>
<span id="311">311</span>
<span id="312">312</span>
<span id="313">313</span>
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
<span id="317">317</span>
<span id="318">318</span>
<span id="319">319</span>
<span id="320">320</span>
<span id="321">321</span>
<span id="322">322</span>
<span id="323">323</span>
<span id="324">324</span>
<span id="325">325</span>
<span id="326">326</span>
<span id="327">327</span>
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
<span id="374">374</span>
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
<span id="389">389</span>
<span id="390">390</span>
<span id="391">391</span>
<span id="392">392</span>
<span id="393">393</span>
<span id="394">394</span>
<span id="395">395</span>
<span id="396">396</span>
<span id="397">397</span>
<span id="398">398</span>
<span id="399">399</span>
<span id="400">400</span>
<span id="401">401</span>
<span id="402">402</span>
<span id="403">403</span>
<span id="404">404</span>
<span id="405">405</span>
<span id="406">406</span>
<span id="407">407</span>
<span id="408">408</span>
<span id="409">409</span>
<span id="410">410</span>
<span id="411">411</span>
<span id="412">412</span>
<span id="413">413</span>
<span id="414">414</span>
<span id="415">415</span>
<span id="416">416</span>
<span id="417">417</span>
<span id="418">418</span>
<span id="419">419</span>
<span id="420">420</span>
<span id="421">421</span>
<span id="422">422</span>
<span id="423">423</span>
<span id="424">424</span>
<span id="425">425</span>
<span id="426">426</span>
<span id="427">427</span>
<span id="428">428</span>
<span id="429">429</span>
<span id="430">430</span>
<span id="431">431</span>
<span id="432">432</span>
<span id="433">433</span>
<span id="434">434</span>
<span id="435">435</span>
<span id="436">436</span>
<span id="437">437</span>
<span id="438">438</span>
<span id="439">439</span>
<span id="440">440</span>
<span id="441">441</span>
<span id="442">442</span>
<span id="443">443</span>
<span id="444">444</span>
<span id="445">445</span>
<span id="446">446</span>
<span id="447">447</span>
<span id="448">448</span>
<span id="449">449</span>
<span id="450">450</span>
<span id="451">451</span>
<span id="452">452</span>
<span id="453">453</span>
<span id="454">454</span>
<span id="455">455</span>
<span id="456">456</span>
<span id="457">457</span>
<span id="458">458</span>
<span id="459">459</span>
<span id="460">460</span>
<span id="461">461</span>
<span id="462">462</span>
<span id="463">463</span>
<span id="464">464</span>
<span id="465">465</span>
<span id="466">466</span>
<span id="467">467</span>
<span id="468">468</span>
<span id="469">469</span>
<span id="470">470</span>
<span id="471">471</span>
<span id="472">472</span>
<span id="473">473</span>
<span id="474">474</span>
<span id="475">475</span>
<span id="476">476</span>
<span id="477">477</span>
<span id="478">478</span>
<span id="479">479</span>
<span id="480">480</span>
<span id="481">481</span>
<span id="482">482</span>
<span id="483">483</span>
<span id="484">484</span>
<span id="485">485</span>
<span id="486">486</span>
<span id="487">487</span>
<span id="488">488</span>
<span id="489">489</span>
<span id="490">490</span>
<span id="491">491</span>
<span id="492">492</span>
<span id="493">493</span>
<span id="494">494</span>
<span id="495">495</span>
<span id="496">496</span>
<span id="497">497</span>
<span id="498">498</span>
<span id="499">499</span>
<span id="500">500</span>
<span id="501">501</span>
<span id="502">502</span>
<span id="503">503</span>
<span id="504">504</span>
<span id="505">505</span>
<span id="506">506</span>
<span id="507">507</span>
<span id="508">508</span>
<span id="509">509</span>
<span id="510">510</span>
<span id="511">511</span>
<span id="512">512</span>
<span id="513">513</span>
<span id="514">514</span>
<span id="515">515</span>
<span id="516">516</span>
<span id="517">517</span>
<span id="518">518</span>
<span id="519">519</span>
<span id="520">520</span>
<span id="521">521</span>
<span id="522">522</span>
<span id="523">523</span>
<span id="524">524</span>
<span id="525">525</span>
<span id="526">526</span>
<span id="527">527</span>
<span id="528">528</span>
<span id="529">529</span>
<span id="530">530</span>
<span id="531">531</span>
<span id="532">532</span>
<span id="533">533</span>
<span id="534">534</span>
<span id="535">535</span>
<span id="536">536</span>
<span id="537">537</span>
<span id="538">538</span>
<span id="539">539</span>
<span id="540">540</span>
<span id="541">541</span>
<span id="542">542</span>
<span id="543">543</span>
<span id="544">544</span>
<span id="545">545</span>
<span id="546">546</span>
<span id="547">547</span>
<span id="548">548</span>
<span id="549">549</span>
<span id="550">550</span>
<span id="551">551</span>
<span id="552">552</span>
<span id="553">553</span>
<span id="554">554</span>
<span id="555">555</span>
<span id="556">556</span>
<span id="557">557</span>
<span id="558">558</span>
<span id="559">559</span>
<span id="560">560</span>
<span id="561">561</span>
<span id="562">562</span>
<span id="563">563</span>
<span id="564">564</span>
<span id="565">565</span>
<span id="566">566</span>
<span id="567">567</span>
<span id="568">568</span>
<span id="569">569</span>
<span id="570">570</span>
<span id="571">571</span>
<span id="572">572</span>
<span id="573">573</span>
<span id="574">574</span>
<span id="575">575</span>
<span id="576">576</span>
<span id="577">577</span>
<span id="578">578</span>
<span id="579">579</span>
<span id="580">580</span>
<span id="581">581</span>
<span id="582">582</span>
<span id="583">583</span>
<span id="584">584</span>
<span id="585">585</span>
<span id="586">586</span>
<span id="587">587</span>
<span id="588">588</span>
<span id="589">589</span>
<span id="590">590</span>
<span id="591">591</span>
<span id="592">592</span>
<span id="593">593</span>
<span id="594">594</span>
<span id="595">595</span>
<span id="596">596</span>
<span id="597">597</span>
<span id="598">598</span>
<span id="599">599</span>
<span id="600">600</span>
<span id="601">601</span>
<span id="602">602</span>
<span id="603">603</span>
<span id="604">604</span>
<span id="605">605</span>
<span id="606">606</span>
<span id="607">607</span>
<span id="608">608</span>
<span id="609">609</span>
<span id="610">610</span>
<span id="611">611</span>
<span id="612">612</span>
<span id="613">613</span>
<span id="614">614</span>
<span id="615">615</span>
<span id="616">616</span>
<span id="617">617</span>
<span id="618">618</span>
<span id="619">619</span>
<span id="620">620</span>
<span id="621">621</span>
<span id="622">622</span>
<span id="623">623</span>
<span id="624">624</span>
<span id="625">625</span>
<span id="626">626</span>
<span id="627">627</span>
<span id="628">628</span>
<span id="629">629</span>
<span id="630">630</span>
<span id="631">631</span>
<span id="632">632</span>
<span id="633">633</span>
<span id="634">634</span>
<span id="635">635</span>
<span id="636">636</span>
<span id="637">637</span>
<span id="638">638</span>
<span id="639">639</span>
<span id="640">640</span>
<span id="641">641</span>
<span id="642">642</span>
<span id="643">643</span>
<span id="644">644</span>
<span id="645">645</span>
<span id="646">646</span>
<span id="647">647</span>
<span id="648">648</span>
<span id="649">649</span>
<span id="650">650</span>
<span id="651">651</span>
<span id="652">652</span>
<span id="653">653</span>
<span id="654">654</span>
<span id="655">655</span>
<span id="656">656</span>
<span id="657">657</span>
<span id="658">658</span>
<span id="659">659</span>
<span id="660">660</span>
<span id="661">661</span>
<span id="662">662</span>
<span id="663">663</span>
<span id="664">664</span>
<span id="665">665</span>
<span id="666">666</span>
<span id="667">667</span>
<span id="668">668</span>
<span id="669">669</span>
<span id="670">670</span>
<span id="671">671</span>
<span id="672">672</span>
<span id="673">673</span>
<span id="674">674</span>
<span id="675">675</span>
<span id="676">676</span>
<span id="677">677</span>
<span id="678">678</span>
<span id="679">679</span>
<span id="680">680</span>
<span id="681">681</span>
<span id="682">682</span>
<span id="683">683</span>
<span id="684">684</span>
<span id="685">685</span>
<span id="686">686</span>
<span id="687">687</span>
<span id="688">688</span>
<span id="689">689</span>
<span id="690">690</span>
<span id="691">691</span>
<span id="692">692</span>
<span id="693">693</span>
<span id="694">694</span>
<span id="695">695</span>
<span id="696">696</span>
<span id="697">697</span>
<span id="698">698</span>
<span id="699">699</span>
<span id="700">700</span>
<span id="701">701</span>
<span id="702">702</span>
<span id="703">703</span>
<span id="704">704</span>
<span id="705">705</span>
<span id="706">706</span>
</pre><pre class="rust"><code><span class="doccomment">//! These contain the server &quot;cores&quot;. These are able to startup the server</span>
<span class="doccomment">//! (bootstrap) to a running state and then execute tasks. This is where modules</span>
<span class="doccomment">//! are logically ordered based on their depenedncies for execution. Some of these</span>
<span class="doccomment">//! are task-only i.e. reindexing, and some of these launch the server into a</span>
<span class="doccomment">//! fully operational state (https, ldap, etc).</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! Generally, this is the &quot;entry point&quot; where the server begins to run, and</span>
<span class="doccomment">//! the entry point for all client traffic which is then directed to the</span>
<span class="doccomment">//! various `actors`.</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">warnings</span>)]</span>
<span class="attribute">#![<span class="ident">warn</span>(<span class="ident">unused_extern_crates</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::todo</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::unimplemented</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::unwrap_used</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::expect_used</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::panic</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::unreachable</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::await_holding_lock</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::needless_pass_by_value</span>)]</span>
<span class="attribute">#![<span class="ident">deny</span>(<span class="ident">clippy::trivially_copy_pass_by_ref</span>)]</span>
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">tracing</span>;
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">kanidm</span>;
<span class="kw">mod</span> <span class="ident">https</span>;
<span class="kw">mod</span> <span class="ident">ldaps</span>;
<span class="kw">use</span> <span class="ident">libc::umask</span>;
<span class="comment">// use crossbeam::channel::unbounded;</span>
<span class="kw">use</span> <span class="ident">kanidm::prelude</span>::<span class="kw-2">*</span>;
<span class="kw">use</span> <span class="ident">std::sync::Arc</span>;
<span class="kw">use</span> <span class="ident">kanidm::config::Configuration</span>;
<span class="comment">// SearchResult</span>
<span class="comment">// use self::ctx::ServerCtx;</span>
<span class="kw">use</span> <span class="ident">kanidm::actors::v1_read::QueryServerReadV1</span>;
<span class="kw">use</span> <span class="ident">kanidm::actors::v1_write::QueryServerWriteV1</span>;
<span class="kw">use</span> <span class="ident">kanidm::be</span>::{<span class="ident">Backend</span>, <span class="ident">BackendConfig</span>, <span class="ident">BackendTransaction</span>, <span class="ident">FsType</span>};
<span class="kw">use</span> <span class="ident">kanidm::crypto::setup_tls</span>;
<span class="kw">use</span> <span class="ident">kanidm::idm::server</span>::{<span class="ident">IdmServer</span>, <span class="ident">IdmServerDelayed</span>};
<span class="kw">use</span> <span class="ident">kanidm::interval::IntervalActor</span>;
<span class="kw">use</span> <span class="ident">kanidm::ldap::LdapServer</span>;
<span class="kw">use</span> <span class="ident">kanidm::schema::Schema</span>;
<span class="kw">use</span> <span class="ident">kanidm::status::StatusActor</span>;
<span class="kw">use</span> <span class="ident">kanidm::utils</span>::{<span class="ident">duration_from_epoch_now</span>, <span class="ident">touch_file_or_quit</span>};
<span class="kw">use</span> <span class="ident">kanidm_proto::v1::OperationError</span>;
<span class="kw">use</span> <span class="ident">async_std::task</span>;
<span class="kw">use</span> <span class="ident">compact_jwt::JwsSigner</span>;
<span class="comment">// === internal setup helpers</span>
<span class="kw">fn</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">schema</span>: <span class="kw-2">&amp;</span><span class="ident">Schema</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">Backend</span>, <span class="ident">OperationError</span><span class="op">&gt;</span> {
<span class="ident">setup_backend_vacuum</span>(<span class="ident">config</span>, <span class="ident">schema</span>, <span class="bool-val">false</span>)
}
<span class="kw">fn</span> <span class="ident">setup_backend_vacuum</span>(
<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>,
<span class="ident">schema</span>: <span class="kw-2">&amp;</span><span class="ident">Schema</span>,
<span class="ident">vacuum</span>: <span class="ident">bool</span>,
) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">Backend</span>, <span class="ident">OperationError</span><span class="op">&gt;</span> {
<span class="comment">// Limit the scope of the schema txn.</span>
<span class="comment">// let schema_txn = task::block_on(schema.write());</span>
<span class="kw">let</span> <span class="ident">schema_txn</span> <span class="op">=</span> <span class="ident">schema</span>.<span class="ident">write</span>();
<span class="kw">let</span> <span class="ident">idxmeta</span> <span class="op">=</span> <span class="ident">schema_txn</span>.<span class="ident">reload_idxmeta</span>();
<span class="kw">let</span> <span class="ident">pool_size</span>: <span class="ident">u32</span> <span class="op">=</span> <span class="ident">config</span>.<span class="ident">threads</span> <span class="kw">as</span> <span class="ident">u32</span>;
<span class="kw">let</span> <span class="ident">fstype</span>: <span class="ident">FsType</span> <span class="op">=</span> <span class="kw">if</span> <span class="ident">config</span>
.<span class="ident">db_fs_type</span>
.<span class="ident">as_ref</span>()
.<span class="ident">map</span>(<span class="op">|</span><span class="ident">s</span><span class="op">|</span> <span class="ident">s</span> <span class="op">==</span> <span class="string">&quot;zfs&quot;</span>)
.<span class="ident">unwrap_or</span>(<span class="bool-val">false</span>)
{
<span class="ident">FsType::Zfs</span>
} <span class="kw">else</span> {
<span class="ident">FsType::Generic</span>
};
<span class="kw">let</span> <span class="ident">cfg</span> <span class="op">=</span> <span class="ident">BackendConfig::new</span>(
<span class="ident">config</span>.<span class="ident">db_path</span>.<span class="ident">as_str</span>(),
<span class="ident">pool_size</span>,
<span class="ident">fstype</span>,
<span class="ident">config</span>.<span class="ident">db_arc_size</span>,
);
<span class="ident">Backend::new</span>(<span class="ident">cfg</span>, <span class="ident">idxmeta</span>, <span class="ident">vacuum</span>)
}
<span class="comment">// TODO #54: We could move most of the be/schema/qs setup and startup</span>
<span class="comment">// outside of this call, then pass in &quot;what we need&quot; in a cloneable</span>
<span class="comment">// form, this way we could have seperate Idm vs Qs threads, and dedicated</span>
<span class="comment">// threads for write vs read</span>
<span class="kw">fn</span> <span class="ident">setup_qs_idms</span>(
<span class="ident">be</span>: <span class="ident">Backend</span>,
<span class="ident">schema</span>: <span class="ident">Schema</span>,
<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>,
) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span>(<span class="ident">QueryServer</span>, <span class="ident">IdmServer</span>, <span class="ident">IdmServerDelayed</span>), <span class="ident">OperationError</span><span class="op">&gt;</span> {
<span class="comment">// Create a query_server implementation</span>
<span class="kw">let</span> <span class="ident">query_server</span> <span class="op">=</span> <span class="ident">QueryServer::new</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>.<span class="ident">domain</span>.<span class="ident">clone</span>());
<span class="comment">// TODO #62: Should the IDM parts be broken out to the IdmServer?</span>
<span class="comment">// What&#39;s important about this initial setup here is that it also triggers</span>
<span class="comment">// the schema and acp reload, so they are now configured correctly!</span>
<span class="comment">// Initialise the schema core.</span>
<span class="comment">//</span>
<span class="comment">// Now search for the schema itself, and validate that the system</span>
<span class="comment">// in memory matches the BE on disk, and that it&#39;s syntactically correct.</span>
<span class="comment">// Write it out if changes are needed.</span>
<span class="ident">query_server</span>.<span class="ident">initialise_helper</span>(<span class="ident">duration_from_epoch_now</span>())<span class="question-mark">?</span>;
<span class="comment">// We generate a SINGLE idms only!</span>
<span class="kw">let</span> (<span class="ident">idms</span>, <span class="ident">idms_delayed</span>) <span class="op">=</span> <span class="ident">IdmServer::new</span>(<span class="ident">query_server</span>.<span class="ident">clone</span>(), <span class="kw-2">&amp;</span><span class="ident">config</span>.<span class="ident">origin</span>)<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>((<span class="ident">query_server</span>, <span class="ident">idms</span>, <span class="ident">idms_delayed</span>))
}
<span class="kw">fn</span> <span class="ident">setup_qs</span>(
<span class="ident">be</span>: <span class="ident">Backend</span>,
<span class="ident">schema</span>: <span class="ident">Schema</span>,
<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>,
) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span><span class="ident">QueryServer</span>, <span class="ident">OperationError</span><span class="op">&gt;</span> {
<span class="comment">// Create a query_server implementation</span>
<span class="kw">let</span> <span class="ident">query_server</span> <span class="op">=</span> <span class="ident">QueryServer::new</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>.<span class="ident">domain</span>.<span class="ident">clone</span>());
<span class="comment">// TODO #62: Should the IDM parts be broken out to the IdmServer?</span>
<span class="comment">// What&#39;s important about this initial setup here is that it also triggers</span>
<span class="comment">// the schema and acp reload, so they are now configured correctly!</span>
<span class="comment">// Initialise the schema core.</span>
<span class="comment">//</span>
<span class="comment">// Now search for the schema itself, and validate that the system</span>
<span class="comment">// in memory matches the BE on disk, and that it&#39;s syntactically correct.</span>
<span class="comment">// Write it out if changes are needed.</span>
<span class="ident">query_server</span>.<span class="ident">initialise_helper</span>(<span class="ident">duration_from_epoch_now</span>())<span class="question-mark">?</span>;
<span class="prelude-val">Ok</span>(<span class="ident">query_server</span>)
}
<span class="macro">macro_rules!</span> <span class="ident">dbscan_setup_be</span> {
(
<span class="macro-nonterminal">$</span><span class="macro-nonterminal">config</span>:<span class="ident">expr</span>
) =&gt; {{
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
}
}};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dbscan_list_indexes_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="macro">dbscan_setup_be!</span>(<span class="ident">config</span>);
<span class="kw">let</span> <span class="ident">be_rotxn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">read</span>();
<span class="kw">match</span> <span class="ident">be_rotxn</span>.<span class="ident">list_indexes</span>() {
<span class="prelude-val">Ok</span>(<span class="kw-2">mut</span> <span class="ident">idx_list</span>) =&gt; {
<span class="ident">idx_list</span>.<span class="ident">sort_unstable</span>();
<span class="ident">idx_list</span>.<span class="ident">iter</span>().<span class="ident">for_each</span>(<span class="op">|</span><span class="ident">idx_name</span><span class="op">|</span> {
<span class="macro">println!</span>(<span class="string">&quot;{}&quot;</span>, <span class="ident">idx_name</span>);
})
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to retrieve index list: {:?}&quot;</span>, <span class="ident">e</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dbscan_list_id2entry_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="macro">dbscan_setup_be!</span>(<span class="ident">config</span>);
<span class="kw">let</span> <span class="ident">be_rotxn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">read</span>();
<span class="kw">match</span> <span class="ident">be_rotxn</span>.<span class="ident">list_id2entry</span>() {
<span class="prelude-val">Ok</span>(<span class="kw-2">mut</span> <span class="ident">id_list</span>) =&gt; {
<span class="ident">id_list</span>.<span class="ident">sort_unstable_by_key</span>(<span class="op">|</span><span class="ident">k</span><span class="op">|</span> <span class="ident">k</span>.<span class="number">0</span>);
<span class="ident">id_list</span>.<span class="ident">iter</span>().<span class="ident">for_each</span>(<span class="op">|</span>(<span class="ident">id</span>, <span class="ident">value</span>)<span class="op">|</span> {
<span class="macro">println!</span>(<span class="string">&quot;{:&gt;8}: {}&quot;</span>, <span class="ident">id</span>, <span class="ident">value</span>);
})
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to retrieve id2entry list: {:?}&quot;</span>, <span class="ident">e</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dbscan_list_index_analysis_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="kw">let</span> <span class="ident">_be</span> <span class="op">=</span> <span class="macro">dbscan_setup_be!</span>(<span class="ident">config</span>);
<span class="comment">// TBD in after slopes merge.</span>
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dbscan_list_index_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">index_name</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) {
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="macro">dbscan_setup_be!</span>(<span class="ident">config</span>);
<span class="kw">let</span> <span class="ident">be_rotxn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">read</span>();
<span class="kw">match</span> <span class="ident">be_rotxn</span>.<span class="ident">list_index_content</span>(<span class="ident">index_name</span>) {
<span class="prelude-val">Ok</span>(<span class="kw-2">mut</span> <span class="ident">idx_list</span>) =&gt; {
<span class="ident">idx_list</span>.<span class="ident">sort_unstable_by</span>(<span class="op">|</span><span class="ident">a</span>, <span class="ident">b</span><span class="op">|</span> <span class="ident">a</span>.<span class="number">0</span>.<span class="ident">cmp</span>(<span class="kw-2">&amp;</span><span class="ident">b</span>.<span class="number">0</span>));
<span class="ident">idx_list</span>.<span class="ident">iter</span>().<span class="ident">for_each</span>(<span class="op">|</span>(<span class="ident">key</span>, <span class="ident">value</span>)<span class="op">|</span> {
<span class="macro">println!</span>(<span class="string">&quot;{:&gt;50}: {:?}&quot;</span>, <span class="ident">key</span>, <span class="ident">value</span>);
})
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to retrieve index list: {:?}&quot;</span>, <span class="ident">e</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">dbscan_get_id2entry_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">id</span>: <span class="ident">u64</span>) {
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="macro">dbscan_setup_be!</span>(<span class="ident">config</span>);
<span class="kw">let</span> <span class="ident">be_rotxn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">read</span>();
<span class="kw">match</span> <span class="ident">be_rotxn</span>.<span class="ident">get_id2entry</span>(<span class="ident">id</span>) {
<span class="prelude-val">Ok</span>((<span class="ident">id</span>, <span class="ident">value</span>)) =&gt; <span class="macro">println!</span>(<span class="string">&quot;{:&gt;8}: {}&quot;</span>, <span class="ident">id</span>, <span class="ident">value</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to retrieve id2entry value: {:?}&quot;</span>, <span class="ident">e</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">backup_server_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">dst_path</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) {
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="kw">let</span> <span class="ident">be_ro_txn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">read</span>();
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">be_ro_txn</span>.<span class="ident">backup</span>(<span class="ident">dst_path</span>);
<span class="kw">match</span> <span class="ident">r</span> {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="macro">info!</span>(<span class="string">&quot;Backup success!&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Backup failed: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="comment">// Let the txn abort, even on success.</span>
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">restore_server_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">dst_path</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) {
<span class="ident">touch_file_or_quit</span>(<span class="ident">config</span>.<span class="ident">db_path</span>.<span class="ident">as_str</span>());
<span class="comment">// First, we provide the in-memory schema so that core attrs are indexed correctly.</span>
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup backend: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="kw">let</span> <span class="ident">be_wr_txn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">write</span>();
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">be_wr_txn</span>.<span class="ident">restore</span>(<span class="ident">dst_path</span>).<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">be_wr_txn</span>.<span class="ident">commit</span>());
<span class="kw">if</span> <span class="ident">r</span>.<span class="ident">is_err</span>() {
<span class="macro">error!</span>(<span class="string">&quot;Failed to restore database: {:?}&quot;</span>, <span class="ident">r</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
<span class="macro">info!</span>(<span class="string">&quot;Database loaded successfully&quot;</span>);
<span class="macro">info!</span>(<span class="string">&quot;Attempting to init query server ...&quot;</span>);
<span class="kw">let</span> (<span class="ident">qs</span>, <span class="ident">_idms</span>, <span class="ident">_idms_delayed</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_qs_idms</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup query server or idm server -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="macro">info!</span>(<span class="string">&quot;Success!&quot;</span>);
<span class="macro">info!</span>(<span class="string">&quot;Start reindex phase ...&quot;</span>);
<span class="kw">let</span> <span class="ident">qs_write</span> <span class="op">=</span> <span class="ident">task::block_on</span>(<span class="ident">qs</span>.<span class="ident">write_async</span>(<span class="ident">duration_from_epoch_now</span>()));
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">qs_write</span>.<span class="ident">reindex</span>().<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">qs_write</span>.<span class="ident">commit</span>());
<span class="kw">match</span> <span class="ident">r</span> {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="macro">info!</span>(<span class="string">&quot;Reindex Success!&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Restore failed: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="macro">info!</span>(<span class="string">&quot;✅ Restore Success!&quot;</span>);
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">reindex_server_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="macro">eprintln!</span>(<span class="string">&quot;Start Index Phase 1 ...&quot;</span>);
<span class="comment">// First, we provide the in-memory schema so that core attrs are indexed correctly.</span>
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="comment">// Reindex only the core schema attributes to bootstrap the process.</span>
<span class="kw">let</span> <span class="ident">be_wr_txn</span> <span class="op">=</span> <span class="ident">be</span>.<span class="ident">write</span>();
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">be_wr_txn</span>.<span class="ident">reindex</span>().<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">be_wr_txn</span>.<span class="ident">commit</span>());
<span class="comment">// Now that&#39;s done, setup a minimal qs and reindex from that.</span>
<span class="kw">if</span> <span class="ident">r</span>.<span class="ident">is_err</span>() {
<span class="macro">eprintln!</span>(<span class="string">&quot;Failed to reindex database: {:?}&quot;</span>, <span class="ident">r</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
<span class="macro">eprintln!</span>(<span class="string">&quot;Index Phase 1 Success!&quot;</span>);
<span class="macro">eprintln!</span>(<span class="string">&quot;Attempting to init query server ...&quot;</span>);
<span class="kw">let</span> (<span class="ident">qs</span>, <span class="ident">_idms</span>, <span class="ident">_idms_delayed</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_qs_idms</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup query server or idm server -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="macro">eprintln!</span>(<span class="string">&quot;Init Query Server Success!&quot;</span>);
<span class="macro">eprintln!</span>(<span class="string">&quot;Start Index Phase 2 ...&quot;</span>);
<span class="kw">let</span> <span class="ident">qs_write</span> <span class="op">=</span> <span class="ident">task::block_on</span>(<span class="ident">qs</span>.<span class="ident">write_async</span>(<span class="ident">duration_from_epoch_now</span>()));
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">qs_write</span>.<span class="ident">reindex</span>().<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">qs_write</span>.<span class="ident">commit</span>());
<span class="kw">match</span> <span class="ident">r</span> {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="macro">eprintln!</span>(<span class="string">&quot;Index Phase 2 Success!&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Reindex failed: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">vacuum_server_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="comment">// The schema doesn&#39;t matter here. Vacuum is run as part of db open to avoid</span>
<span class="comment">// locking.</span>
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">setup_backend_vacuum</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>, <span class="bool-val">true</span>);
<span class="kw">match</span> <span class="ident">r</span> {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="macro">eprintln!</span>(<span class="string">&quot;Vacuum Success!&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Vacuum failed: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">domain_rename_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="comment">// Start the backend.</span>
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="comment">// setup the qs - *with out* init of the migrations and schema.</span>
<span class="kw">let</span> <span class="ident">qs</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_qs</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup query server -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="kw">let</span> <span class="ident">new_domain_name</span> <span class="op">=</span> <span class="ident">config</span>.<span class="ident">domain</span>.<span class="ident">as_str</span>();
<span class="comment">// make sure we&#39;re actually changing the domain name...</span>
<span class="kw">match</span> <span class="ident">task::block_on</span>(<span class="ident">qs</span>.<span class="ident">read_async</span>()).<span class="ident">get_db_domain_name</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">old_domain_name</span>) =&gt; {
<span class="macro">admin_info!</span>(<span class="question-mark">?</span><span class="ident">old_domain_name</span>, <span class="question-mark">?</span><span class="ident">new_domain_name</span>);
<span class="kw">if</span> <span class="kw-2">&amp;</span><span class="ident">old_domain_name</span> <span class="op">==</span> <span class="kw-2">&amp;</span><span class="ident">new_domain_name</span> {
<span class="macro">admin_info!</span>(<span class="string">&quot;Domain name not changing, stopping.&quot;</span>);
<span class="kw">return</span>;
}
}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">admin_error!</span>(<span class="string">&quot;Failed to query domain name, quitting! -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
}
<span class="kw">let</span> <span class="ident">qs_write</span> <span class="op">=</span> <span class="ident">task::block_on</span>(<span class="ident">qs</span>.<span class="ident">write_async</span>(<span class="ident">duration_from_epoch_now</span>()));
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">qs_write</span>.<span class="ident">domain_rename</span>().<span class="ident">and_then</span>(<span class="op">|</span><span class="kw">_</span><span class="op">|</span> <span class="ident">qs_write</span>.<span class="ident">commit</span>());
<span class="kw">match</span> <span class="ident">r</span> {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="macro">info!</span>(<span class="string">&quot;Domain Rename Success!&quot;</span>),
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Domain Rename Failed - Rollback has occured: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">verify_server_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>) {
<span class="comment">// setup the qs - without initialise!</span>
<span class="kw">let</span> <span class="ident">schema_mem</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">sc</span>) =&gt; <span class="ident">sc</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="comment">// Setup the be</span>
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema_mem</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="kw">let</span> <span class="ident">server</span> <span class="op">=</span> <span class="ident">QueryServer::new</span>(<span class="ident">be</span>, <span class="ident">schema_mem</span>, <span class="ident">config</span>.<span class="ident">domain</span>.<span class="ident">clone</span>());
<span class="comment">// Run verifications.</span>
<span class="kw">let</span> <span class="ident">r</span> <span class="op">=</span> <span class="ident">server</span>.<span class="ident">verify</span>();
<span class="kw">if</span> <span class="ident">r</span>.<span class="ident">is_empty</span>() {
<span class="macro">eprintln!</span>(<span class="string">&quot;Verification passed!&quot;</span>);
<span class="ident">std::process::exit</span>(<span class="number">0</span>);
} <span class="kw">else</span> {
<span class="kw">for</span> <span class="ident">er</span> <span class="kw">in</span> <span class="ident">r</span> {
<span class="macro">error!</span>(<span class="string">&quot;{:?}&quot;</span>, <span class="ident">er</span>);
}
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
<span class="comment">// Now add IDM server verifications?</span>
}
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">recover_account_core</span>(<span class="ident">config</span>: <span class="kw-2">&amp;</span><span class="ident">Configuration</span>, <span class="ident">name</span>: <span class="kw-2">&amp;</span><span class="ident">str</span>) {
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">eprintln!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="comment">// Start the backend.</span>
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="comment">// setup the qs - *with* init of the migrations and schema.</span>
<span class="kw">let</span> (<span class="ident">_qs</span>, <span class="ident">idms</span>, <span class="ident">_idms_delayed</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_qs_idms</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup query server or idm server -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span>;
}
};
<span class="comment">// Run the password change.</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">idms_prox_write</span> <span class="op">=</span> <span class="ident">task::block_on</span>(<span class="ident">idms</span>.<span class="ident">proxy_write_async</span>(<span class="ident">duration_from_epoch_now</span>()));
<span class="kw">let</span> <span class="ident">new_pw</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">idms_prox_write</span>.<span class="ident">recover_account</span>(<span class="ident">name</span>, <span class="prelude-val">None</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">new_pw</span>) =&gt; <span class="kw">match</span> <span class="ident">idms_prox_write</span>.<span class="ident">commit</span>() {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; <span class="ident">new_pw</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;A critical error during commit occured {:?}&quot;</span>, <span class="ident">e</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
},
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Error during password reset -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="comment">// abort the txn</span>
<span class="ident">std::mem::drop</span>(<span class="ident">idms_prox_write</span>);
<span class="ident">std::process::exit</span>(<span class="number">1</span>);
}
};
<span class="macro">eprintln!</span>(<span class="string">&quot;Success - password reset to -&gt; {}&quot;</span>, <span class="ident">new_pw</span>);
}
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">create_server_core</span>(<span class="ident">config</span>: <span class="ident">Configuration</span>, <span class="ident">config_test</span>: <span class="ident">bool</span>) -&gt; <span class="prelude-ty">Result</span><span class="op">&lt;</span>(), ()<span class="op">&gt;</span> {
<span class="comment">// Until this point, we probably want to write to the log macro fns.</span>
<span class="kw">if</span> <span class="ident">config</span>.<span class="ident">integration_test_config</span>.<span class="ident">is_some</span>() {
<span class="macro">warn!</span>(<span class="string">&quot;RUNNING IN INTEGRATION TEST MODE.&quot;</span>);
<span class="macro">warn!</span>(<span class="string">&quot;IF YOU SEE THIS IN PRODUCTION YOU MUST CONTACT SUPPORT IMMEDIATELY.&quot;</span>);
}
<span class="macro">info!</span>(
<span class="string">&quot;Starting kanidm with configuration: {} {}&quot;</span>,
<span class="kw">if</span> <span class="ident">config_test</span> { <span class="string">&quot;TEST&quot;</span> } <span class="kw">else</span> { <span class="string">&quot;&quot;</span> },
<span class="ident">config</span>
);
<span class="comment">// Setup umask, so that every we touch or create is secure.</span>
<span class="kw">let</span> <span class="kw">_</span> <span class="op">=</span> <span class="kw">unsafe</span> { <span class="ident">umask</span>(<span class="number">0o0027</span>) };
<span class="comment">// Similar, create a stats task which aggregates statistics from the</span>
<span class="comment">// server as they come in.</span>
<span class="kw">let</span> <span class="ident">status_ref</span> <span class="op">=</span> <span class="ident">StatusActor::start</span>(<span class="ident">config</span>.<span class="ident">log_level</span>);
<span class="comment">// Setup TLS (if any)</span>
<span class="kw">let</span> <span class="ident">_opt_tls_params</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_tls</span>(<span class="kw-2">&amp;</span><span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">opt_tls_params</span>) =&gt; <span class="ident">opt_tls_params</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to configure TLS parameters -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="kw">let</span> <span class="ident">schema</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">Schema::new</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">s</span>) =&gt; <span class="ident">s</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup in memory schema: {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="comment">// Setup the be for the qs.</span>
<span class="kw">let</span> <span class="ident">be</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_backend</span>(<span class="kw-2">&amp;</span><span class="ident">config</span>, <span class="kw-2">&amp;</span><span class="ident">schema</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">be</span>) =&gt; <span class="ident">be</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to setup BE -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="comment">// Start the IDM server.</span>
<span class="kw">let</span> (<span class="ident">_qs</span>, <span class="ident">idms</span>, <span class="kw-2">mut</span> <span class="ident">idms_delayed</span>) <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_qs_idms</span>(<span class="ident">be</span>, <span class="ident">schema</span>, <span class="kw-2">&amp;</span><span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup query server or idm server -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="comment">// Extract any configuration from the IDMS that we may need.</span>
<span class="comment">// For now we just do this per run, but we need to extract this from the db later.</span>
<span class="kw">let</span> <span class="ident">jws_signer</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">JwsSigner::generate_hs256</span>() {
<span class="prelude-val">Ok</span>(<span class="ident">k</span>) =&gt; <span class="ident">k</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to setup jws signer -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="comment">// Any pre-start tasks here.</span>
<span class="kw">match</span> <span class="kw-2">&amp;</span><span class="ident">config</span>.<span class="ident">integration_test_config</span> {
<span class="prelude-val">Some</span>(<span class="ident">itc</span>) =&gt; {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">idms_prox_write</span> <span class="op">=</span>
<span class="ident">task::block_on</span>(<span class="ident">idms</span>.<span class="ident">proxy_write_async</span>(<span class="ident">duration_from_epoch_now</span>()));
<span class="kw">match</span> <span class="ident">idms_prox_write</span>.<span class="ident">recover_account</span>(<span class="string">&quot;admin&quot;</span>, <span class="prelude-val">Some</span>(<span class="kw-2">&amp;</span><span class="ident">itc</span>.<span class="ident">admin_password</span>)) {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(
<span class="string">&quot;Unable to configure INTERGATION TEST admin account -&gt; {:?}&quot;</span>,
<span class="ident">e</span>
);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="kw">match</span> <span class="ident">idms_prox_write</span>.<span class="ident">commit</span>() {
<span class="prelude-val">Ok</span>(<span class="kw">_</span>) =&gt; {}
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to commit INTERGATION TEST setup -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
}
}
<span class="prelude-val">None</span> =&gt; {}
}
<span class="kw">let</span> <span class="ident">ldap</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">LdapServer::new</span>(<span class="kw-2">&amp;</span><span class="ident">idms</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">l</span>) =&gt; <span class="ident">l</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Unable to start LdapServer -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="comment">// Arc the idms and ldap</span>
<span class="kw">let</span> <span class="ident">idms_arc</span> <span class="op">=</span> <span class="ident">Arc::new</span>(<span class="ident">idms</span>);
<span class="kw">let</span> <span class="ident">ldap_arc</span> <span class="op">=</span> <span class="ident">Arc::new</span>(<span class="ident">ldap</span>);
<span class="comment">// Pass it to the actor for threading.</span>
<span class="comment">// Start the read query server with the given be path: future config</span>
<span class="kw">let</span> <span class="ident">server_read_ref</span> <span class="op">=</span>
<span class="ident">QueryServerReadV1::start_static</span>(<span class="ident">config</span>.<span class="ident">log_level</span>, <span class="ident">idms_arc</span>.<span class="ident">clone</span>(), <span class="ident">ldap_arc</span>.<span class="ident">clone</span>());
<span class="comment">// Create the server async write entry point.</span>
<span class="kw">let</span> <span class="ident">server_write_ref</span> <span class="op">=</span> <span class="ident">QueryServerWriteV1::start_static</span>(<span class="ident">config</span>.<span class="ident">log_level</span>, <span class="ident">idms_arc</span>.<span class="ident">clone</span>());
<span class="ident">tokio::spawn</span>(<span class="kw">async</span> <span class="kw">move</span> {
<span class="ident">idms_delayed</span>.<span class="ident">process_all</span>(<span class="ident">server_write_ref</span>).<span class="kw">await</span>;
});
<span class="comment">// Setup timed events associated to the write thread</span>
<span class="ident">IntervalActor::start</span>(<span class="ident">server_write_ref</span>);
<span class="comment">// Setup timed events associated to the read thread</span>
<span class="kw">match</span> <span class="kw-2">&amp;</span><span class="ident">config</span>.<span class="ident">online_backup</span> {
<span class="prelude-val">Some</span>(<span class="ident">cfg</span>) =&gt; {
<span class="ident">IntervalActor::start_online_backup</span>(<span class="ident">server_read_ref</span>, <span class="ident">cfg</span>)<span class="question-mark">?</span>;
}
<span class="prelude-val">None</span> =&gt; {
<span class="macro">debug!</span>(<span class="string">&quot;Online backup not requested, skipping&quot;</span>);
}
};
<span class="comment">// If we have been requested to init LDAP, configure it now.</span>
<span class="kw">match</span> <span class="kw-2">&amp;</span><span class="ident">config</span>.<span class="ident">ldapaddress</span> {
<span class="prelude-val">Some</span>(<span class="ident">la</span>) =&gt; {
<span class="kw">let</span> <span class="ident">opt_ldap_tls_params</span> <span class="op">=</span> <span class="kw">match</span> <span class="ident">setup_tls</span>(<span class="kw-2">&amp;</span><span class="ident">config</span>) {
<span class="prelude-val">Ok</span>(<span class="ident">t</span>) =&gt; <span class="ident">t</span>,
<span class="prelude-val">Err</span>(<span class="ident">e</span>) =&gt; {
<span class="macro">error!</span>(<span class="string">&quot;Failed to configure LDAP TLS parameters -&gt; {:?}&quot;</span>, <span class="ident">e</span>);
<span class="kw">return</span> <span class="prelude-val">Err</span>(());
}
};
<span class="kw">if</span> <span class="op">!</span><span class="ident">config_test</span> {
<span class="comment">// ⚠️ only start the sockets and listeners in non-config-test modes.</span>
<span class="ident">ldaps::create_ldap_server</span>(<span class="ident">la</span>.<span class="ident">as_str</span>(), <span class="ident">opt_ldap_tls_params</span>, <span class="ident">server_read_ref</span>)
.<span class="kw">await</span><span class="question-mark">?</span>;
}
}
<span class="prelude-val">None</span> =&gt; {
<span class="macro">debug!</span>(<span class="string">&quot;LDAP not requested, skipping&quot;</span>);
}
}
<span class="comment">// TODO: Remove these when we go to auth bearer!</span>
<span class="comment">// Copy the max size</span>
<span class="kw">let</span> <span class="ident">_secure_cookies</span> <span class="op">=</span> <span class="ident">config</span>.<span class="ident">secure_cookies</span>;
<span class="comment">// domain will come from the qs now!</span>
<span class="kw">let</span> <span class="ident">cookie_key</span>: [<span class="ident">u8</span>; <span class="number">32</span>] <span class="op">=</span> <span class="ident">config</span>.<span class="ident">cookie_key</span>;
<span class="kw">if</span> <span class="ident">config_test</span> {
<span class="macro">admin_info!</span>(<span class="string">&quot;this config rocks! 🪨 &quot;</span>);
} <span class="kw">else</span> {
<span class="comment">// ⚠️ only start the sockets and listeners in non-config-test modes.</span>
<span class="ident"><span class="self">self</span>::https::create_https_server</span>(
<span class="ident">config</span>.<span class="ident">address</span>,
<span class="comment">// opt_tls_params,</span>
<span class="ident">config</span>.<span class="ident">tls_config</span>.<span class="ident">as_ref</span>(),
<span class="ident">config</span>.<span class="ident">role</span>,
<span class="kw-2">&amp;</span><span class="ident">cookie_key</span>,
<span class="ident">jws_signer</span>,
<span class="ident">status_ref</span>,
<span class="ident">server_write_ref</span>,
<span class="ident">server_read_ref</span>,
)<span class="question-mark">?</span>;
<span class="macro">admin_info!</span>(<span class="string">&quot;ready to rock! 🪨 &quot;</span>);
}
<span class="prelude-val">Ok</span>(())
}
</code></pre></div>
</section><section id="search" class="content hidden"></section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="score" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.61.0 (fe5b13d68 2022-05-18)" ></div>
</body></html>