JFIFXX    $.' ",#(7),01444'9=82<.342  2!!22222222222222222222222222222222222222222222222222"4 ,PG"Z_4˷kjزZ,F+_z,© zh6٨icfu#ډb_N?wQ5-~I8TK<5oIv-k_U_~bMdӜUHh?]EwQk{_}qFW7HTՑYF?_'ϔ_Ջt=||I 6έ"D/[k9Y8ds|\Ҿp6Ҵ].6znopM[mei$[soᘨ˸ nɜG-ĨUycP3.DBli;hjx7Z^NhN3u{:jx힞#M&jL P@_ P&o89@Sz6t7#Oߋ s}YfTlmrZ)'Nk۞pw\Tȯ?8`Oi{wﭹW[r Q4F׊3m&L=h3z~#\l :F,j@ ʱwQT8"kJO6֚l}R>ډK]y&p}b;N1mr$|7>e@BTM*-iHgD) Em|ؘbҗaҾt4oG*oCNrPQ@z,|?W[0:n,jWiEW$~/hp\?{(0+Y8rΟ+>S-SVN;}s?. w9˟<Mq4Wv'{)01mBVW[8/< %wT^5b)iM pgN&ݝVO~qu9 !J27$O-! :%H ـyΠM=t{!S oK8txA& j0 vF Y|y ~6@c1vOpIg4lODL Rcj_uX63?nkWyf;^*B @~a`Eu+6L.ü>}y}_O6͐:YrGXkGl^w~㒶syIu! W XN7BVO!X2wvGRfT#t/?%8^WaTGcLMI(J1~8?aT ]ASE(*E} 2#I/׍qz^t̔bYz4xt){ OH+(EA&NXTo"XC')}Jzp ~5}^+6wcQ|LpdH}(.|kc4^"Z?ȕ a<L!039C EuCFEwç ;n?*oB8bʝ'#RqfM}7]s2tcS{\icTx;\7KPʇ Z O-~c>"?PEO8@8GQgaՎ󁶠䧘_%#r>1zaebqcPѵn#L =׀t L7`VA{C:ge@w1 Xp3c3ġpM"'-@n4fGB3DJ8[JoߐgK)ƛ$ 83+ 6ʻ SkI*KZlT _`?KQKdB`s}>`*>,*@JdoF*弝O}ks]yߘc1GV<=776qPTtXԀ!9*44Tހ3XΛex46YD  BdemDa\_l,G/֌7Y](xTt^%GE4}bTڹ;Y)BQu>J/J ⮶.XԄjݳ+Ed r5_D1 o Bx΢#<W8R6@gM. drD>(otU@x=~v2 ӣdoBd3eO6㣷ݜ66YQz`S{\P~z m5{J/L1xO\ZFu>ck#&:`$ai>2ΔloF[hlEܺΠk:)` $[69kOw\|8}ބ:񶐕IA1/=2[,!.}gN#ub ~݊}34qdELc$"[qU硬g^%B zrpJru%v\h1Yne`ǥ:gpQM~^Xi `S:V29.PV?Bk AEvw%_9CQwKekPؠ\;Io d{ ߞoc1eP\ `E=@KIRYK2NPlLɀ)&eB+ь( JTx_?EZ }@ 6U뙢طzdWIn` D噥[uV"G&Ú2g}&m?ċ"Om# {ON"SXNeysQ@FnVgdX~nj]J58up~.`r\O,ư0oS _Ml4kv\JSdxSW<AeIX$Iw:Sy›R9Q[,5;@]%u@ *rolbI  +%m:͇ZVủθau,RW33 dJeTYE.Mϧ-oj3+yy^cVO9NV\nd1 !͕_)av;թMlWR1)ElP;yوÏu 3k5Pr6<⒲l!˞*u־n!l:UNW %Chx8vL'X@*)̮ˍ D-M+JUkvK+x8cY?Ԡ~3mo|u@[XeYC\Kpx8oCC&N~3-H MXsu<`~"WL$8ξ3a)|:@m\^`@ҷ)5p+6p%i)P Mngc#0AruzRL+xSS?ʮ}()#tmˇ!0}}y$6Lt;$ʳ{^6{v6ķܰgVcnn ~zx«,2u?cE+ȘH؎%Za)X>uWTzNyosFQƤ$*&LLXL)1" LeOɟ9=:tZcŽY?ӭVwv~,Yrۗ|yGaFC.+ v1fήJ]STBn5sW}y$~z'c 8  ,! pVNSNNqy8z˱A4*'2n<s^ǧ˭PJޮɏUGLJ*#i}K%,)[z21z ?Nin1?TIR#m-1lA`fT5+ܐcq՝ʐ,3f2Uեmab#ŠdQy>\)SLYw#.ʑf ,"+w~N'cO3FN<)j&,- љ֊_zSTǦw>?nU仆Ve0$CdrP m׈eXmVu L.bֹ [Դaզ*\y8Է:Ez\0KqC b̘cөQ=0YsNS.3.Oo:#v7[#߫ 5܎LEr49nCOWlG^0k%;YߝZǓ:S#|}y,/kLd TA(AI$+I3;Y*Z}|ӧOdv..#:nf>>ȶITX 8y"dR|)0=n46ⲑ+ra ~]R̲c?6(q;5% |uj~z8R=XIV=|{vGj\gcqz؋%Mߍ1y#@f^^>N#x#۹6Y~?dfPO{P4Vu1E1J *|%JN`eWuzk M6q t[ gGvWIGu_ft5j"Y:Tɐ*; e54q$C2d} _SL#mYpO.C;cHi#֩%+) ӍƲVSYźg |tj38r|V1#;.SQA[S#`n+$$I P\[@s(EDzP])8G#0B[ىXIIq<9~[Z멜Z⊔IWU&A>P~#dp]9 "cP Md?٥Ifتuk/F9c*9Ǎ:ØFzn*@|Iށ9N3{'['ͬҲ4#}!V Fu,,mTIkv C7vB6kT91*l '~ƞFlU'M ][ΩũJ_{iIn$L jOdxkza۪#EClx˘oVɞljr)/,߬hL#^Lф,íMƁe̩NBLiLq}(q6IçJ$WE$:=#(KBzђ xlx?>Պ+>W,Ly!_DŌlQ![ SJ1ƐY}b,+Loxɓ)=yoh@꥟/Iѭ=Py9 ۍYӘe+pJnϱ?V\SO%(t =?MR[Șd/ nlB7j !;ӥ/[-A>dNsLj ,ɪv=1c.SQO3UƀܽE̻9GϷD7(}Ävӌ\y_0[w <΍>a_[0+LF.޺f>oNTq;y\bՃyjH<|q-eɏ_?_9+PHp$[uxK wMwNی'$Y2=qKBP~Yul:[<F12O5=d]Ysw:ϮEj,_QXz`H1,#II dwrP˂@ZJVy$\y{}^~[:NߌUOdؾe${p>G3cĖlʌ ת[`ϱ-WdgIig2 }s ؤ(%#sS@~3XnRG~\jc3vӍLM[JBTs3}jNʖW;7ç?=XF=-=qߚ#='c7ڑWI(O+=:uxqe2zi+kuGR0&eniT^J~\jyp'dtGsO39* b#Ɋ p[BwsT>d4ۧsnvnU_~,vƜJ1s QIz)(lv8MU=;56Gs#KMP=LvyGd}VwWBF'à ?MHUg2 !p7Qjڴ=ju JnA suMeƆҔ!)'8Ϣٔޝ(Vpצ֖d=ICJǠ{qkԭ߸i@Ku|p=..*+xz[Aqġ#s2aƊRR)*HRsi~a &fMP-KL@ZXy'x{}Zm+:)) IJ-iu ܒH'L(7yGӜq j 6ߌg1go,kرtY?W,pefOQS!K۟cҒA|սj>=⬒˧L[ ߿2JaB~Ru:Q] 0H~]7ƼI(}cq 'ήETq?fabӥvr )o-Q_'ᴎoK;Vo%~OK *bf:-ťIR`B5!RB@ï u ̯e\_U_ gES3QTaxU<~c?*#]MW,[8Oax]1bC|踤Plw5V%){t<d50iXSUm:Z┵i"1^B-PhJ&)O*DcWvM)}Pܗ-q\mmζZ-l@}aE6F@&Sg@ݚM ȹ 4#p\HdYDoH"\..RBHz_/5˘6KhJRPmƶim3,#ccoqa)*PtRmk7xDE\Y閣_X<~)c[[BP6YqS0%_;Àv~| VS؇ 'O0F0\U-d@7SJ*z3nyPOm~P3|Yʉr#CSN@ ƮRN)r"C:: #qbY. 6[2K2uǦHYRQMV G$Q+.>nNHq^ qmMVD+-#*U̒ p욳u:IBmPV@Or[b= 1UE_NmyKbNOU}the`|6֮P>\2PVIDiPO;9rmAHGWS]J*_G+kP2KaZH'KxWMZ%OYDRc+o?qGhmdSoh\D|:WUAQc yTq~^H/#pCZTI1ӏT4"ČZ}`w#*,ʹ 0i課Om*da^gJ݅{le9uF#Tֲ̲ٞC"qߍ ոޑo#XZTp@ o8(jdxw],f`~|,s^f1t|m򸄭/ctr5s79Q4H1꠲BB@l9@C+wpxu£Yc9?`@#omHs2)=2.ljg9$YS%*LRY7Z,*=䷘$armoϰUW.|rufIGwtZwo~5 YյhO+=8fF)W7L9lM̘·Y֘YLf큹pRF99.A "wz=E\Z'a 2Ǚ#;'}G*l^"q+2FQ hjkŦ${ޮ-T٭cf|3#~RJt$b(R(rdx >U b&9,>%E\ Άe$'q't*אެb-|dSBOO$R+H)܎K1m`;J2Y~9Og8=vqD`K[F)k[1m޼cn]skz$@)!I x՝"v9=ZA=`Ɠi :E)`7vI}dYI_ o:obo 3Q&D&2= Ά;>hy.*ⅥSӬ+q&j|UƧ}J0WW< ۋS)jQRjƯrN)Gű4Ѷ(S)Ǣ8iW52No˓ ۍ%5brOnL;n\G=^UdI8$&h'+(cȁ߫klS^cƗjԌEꭔgFȒ@}O*;evWVYJ\]X'5ղkFb 6Ro՜mi Ni>J?lPmU}>_Z&KKqrIDՉ~q3fL:Se>E-G{L6pe,8QIhaXaUA'ʂs+טIjP-y8ۈZ?J$WP Rs]|l(ԓsƊio(S0Y 8T97.WiLc~dxcE|2!XKƘਫ਼$((6~|d9u+qd^389Y6L.I?iIq9)O/뚅OXXVZF[یgQLK1RҖr@v#XlFНyS87kF!AsM^rkpjPDyS$Nqnxҍ!Uf!ehi2m`YI9r6 TFC}/y^Η5d'9A-J>{_l+`A['յϛ#w:݅%X}&PStQ"-\縵/$ƗhXb*yBS;Wջ_mcvt?2}1;qSdd~u:2k52R~z+|HE!)Ǟl7`0<,2*Hl-x^'_TVgZA'j ^2ΪN7t?w x1fIzC-ȖK^q;-WDvT78Z hK(P:Q- 8nZ܃e貾<1YT<,"6{/ ?͟|1:#gW>$dJdB=jf[%rE^il:BxSּ1հ,=*7 fcG#q eh?27,!7x6nLC4x},GeǝtC.vS F43zz\;QYC,6~;RYS/6|25vTimlv& nRh^ejRLGf? ۉҬܦƩ|Ȱ>3!viʯ>vオX3e_1zKȗ\qHS,EW[㺨uch⍸O}a>q6n6N6qN ! 1AQaq0@"2BRb#Pr3C`Scst$4D%Td ?Na3mCwxAmqmm$4n淿t'C"wzU=D\R+wp+YT&պ@ƃ3ޯ?AﶂaŘ@-Q=9Dռѻ@MVP܅G5fY6# ?0UQ,IX(6ڵ[DIMNލc&υj\XR|,4 jThAe^db#$]wOӪ1y%LYm뭛CUƃߜ}Cy1XνmF8jI]HۺиE@Ii;r8ӭVFՇ| &?3|xBMuSGe=Ӕ#BE5GY!z_eqр/W>|-Ci߇t1ޯќdR3ug=0 5[?#͏qcfH{ ?u=??ǯ}ZzhmΔBFTWPxs}G93 )gGR<>r h$'nchPBjJҧH -N1N?~}-q!=_2hcMlvY%UE@|vM2.Y[|y"EïKZF,ɯ?,q?vM 80jx";9vk+ ֧ ȺU?%vcVmA6Qg^MA}3nl QRNl8kkn'(M7m9وq%ޟ*h$Zk"$9: ?U8Sl,,|ɒxH(ѷGn/Q4PG%Ա8N! &7;eKM749R/%lc>x;>C:th?aKXbheᜋ^$Iհ hr7%F$EFdt5+(M6tÜUU|zW=aTsTgdqPQb'm1{|YXNb P~F^F:k6"j! Ir`1&-$Bevk:y#ywI0x=D4tUPZHڠ底taP6b>xaQ# WeFŮNjpJ* mQN*I-*ȩFg3 5Vʊɮa5FO@{NX?H]31Ri_uѕ 0 F~:60p͈SqX#a5>`o&+<2D: ڝ$nP*)N|yEjF5ټeihyZ >kbHavh-#!Po=@k̆IEN@}Ll?jO߭ʞQ|A07xwt!xfI2?Z<ץTcUj]陎Ltl }5ϓ$,Omˊ;@OjEj(ا,LXLOЦ90O .anA7j4 W_ٓzWjcBy՗+EM)dNg6y1_xp$Lv:9"zpʙ$^JԼ*ϭo=xLj6Ju82AH3$ٕ@=Vv]'qEz;I˼)=ɯx /W(Vp$ mu񶤑OqˎTr㠚xsrGCbypG1ߠw e8$⿄/M{*}W]˷.CK\ުx/$WPwr |i&}{X >$-l?-zglΆ(FhvS*b߲ڡn,|)mrH[a3ר[13o_U3TC$(=)0kgP u^=4 WYCҸ:vQרXàtkm,t*^,}D* "(I9R>``[~Q]#afi6l86:,ssN6j"A4IuQ6E,GnHzSHOuk5$I4ؤQ9@CwpBGv[]uOv0I4\yQѸ~>Z8Taqޣ;za/SI:ܫ_|>=Z8:SUIJ"IY8%b8H:QO6;7ISJҌAά3>cE+&jf$eC+z;V rʺmyeaQf&6ND.:NTvm<- uǝ\MvZYNNT-A>jr!SnO 13Ns%3D@`ܟ 1^c< aɽ̲Xë#w|ycW=9I*H8p^(4՗karOcWtO\ƍR8'KIQ?5>[}yUײ -h=% qThG2)"ו3]!kB*pFDlA,eEiHfPs5H:Փ~H0DتDIhF3c2E9H5zԑʚiX=:mxghd(v׊9iSOd@0ڽ:p5h-t&Xqӕ,ie|7A2O%PEhtjY1wЃ!  ࢽMy7\a@ţJ 4ȻF@o̒?4wx)]P~u57X 9^ܩU;Iꭆ 5 eK27({|Y׎ V\"Z1 Z}(Ǝ"1S_vE30>p; ΝD%xW?W?vo^Vidr[/&>~`9Why;R ;;ɮT?r$g1KACcKl:'3 cﳯ*"t8~l)m+U,z`(>yJ?h>]vЍG*{`;y]IT ;cNUfo¾h/$|NS1S"HVT4uhǜ]v;5͠x'C\SBplh}N ABx%ޭl/Twʽ]D=Kžr㻠l4SO?=k M: cCa#ha)ѐxcsgPiG{+xQI= zԫ+ 8"kñj=|c yCF/*9жh{ ?4o kmQNx;Y4膚aw?6>e]Qr:g,i"ԩA*M7qB?ӕFhV25r[7 Y }LR}*sg+xr2U=*'WSZDW]WǞ<叓{$9Ou4y90-1'*D`c^o?(9uݐ'PI& fJݮ:wSjfP1F:X H9dԯ˝[_54 }*;@ܨ ðynT?ןd#4rGͨH1|-#MrS3G3).᧏3vz֑r$G"`j 1tx0<ƆWh6y6,œGagAyb)hDß_mü gG;evݝnQ C-*oyaMI><]obD":GA-\%LT8c)+y76oQ#*{(F⽕y=rW\p۩cA^e6KʐcVf5$'->ՉN"F"UQ@fGb~#&M=8טJNu9D[̤so~ G9TtW^g5y$bY'سǴ=U-2 #MCt(i lj@Q 5̣i*OsxKf}\M{EV{υƇ);HIfeLȣr2>WIȂ6ik 5YOxȺ>Yf5'|H+98pjn.OyjY~iw'l;s2Y:'lgꥴ)o#'SaaKZ m}`169n"xI *+ }FP"l45'ZgE8?[X7(.Q-*ތL@̲v.5[=t\+CNܛ,gSQnH}*FG16&:t4ُ"Ạ$b |#rsaT ]ӽDP7ո0y)e$ٕvIh'QEAm*HRI=: 4牢) %_iNݧl] NtGHL ɱg<1V,J~ٹ"KQ 9HS9?@kr;we݁]I!{ @G["`J:n]{cAEVʆ#U96j#Ym\qe4hB7Cdv\MNgmAyQL4uLjj9#44tl^}LnR!t±]rh6ٍ>yҏNfU  Fm@8}/ujb9he:AyծwGpΧh5l}3p468)Udc;Us/֔YX1O2uqs`hwgr~{ RmhN؎*q 42*th>#E#HvOq}6e\,Wk#Xb>p}դ3T5†6[@Py*n|'f֧>lư΂̺SU'*qp_SM 'c6m ySʨ;MrƋmKxo,GmPAG:iw9}M(^V$ǒѽ9| aJSQarB;}ٻ֢2%Uc#gNaݕ'v[OY'3L3;,p]@S{lsX'cjwk'a.}}& dP*bK=ɍ!;3ngΊUߴmt'*{,=SzfD Ako~Gaoq_mi}#mPXhύmxǍ΂巿zfQc|kc?WY$_Lvl߶c`?ljݲˏ!V6UЂ(A4y)HpZ_x>eR$/`^'3qˏ-&Q=?CFVR DfV9{8gnh(P"6[D< E~0<@`G6Hгcc cK.5DdB`?XQ2ٿyqo&+1^ DW0ꊩG#QnL3c/x 11[yxპCWCcUĨ80me4.{muI=f0QRls9f9~fǨa"@8ȁQ#cicG$Gr/$W(WV"m7[mAmboD j۳ l^kh׽ # iXnveTka^Y4BNĕ0 !01@Q"2AaPq3BR?@4QT3,㺠W[=JKϞ2r^7vc:9 EߴwS#dIxu:Hp9E! V 2;73|F9Y*ʬFDu&y؟^EAA(ɩ^GV:ݜDy`Jr29ܾ㝉[E;FzxYGUeYC v-txIsםĘqEb+P\ :>iC';k|zرny]#ǿbQw(r|ӹs[D2v-%@;8<a[\o[ϧwI!*0krs)[J9^ʜp1) "/_>o<1AEy^C`x1'ܣnps`lfQ):lb>MejH^?kl3(z:1ŠK&?Q~{ٺhy/[V|6}KbXmn[-75q94dmc^h X5G-}دBޟ |rtMV+]c?-#ڛ^ǂ}LkrOu>-Dry D?:ޞUǜ7V?瓮"#rչģVR;n/_ ؉vݶe5db9/O009G5nWJpA*r9>1.[tsFnQ V 77R]ɫ8_0<՜IFu(v4Fk3E)N:yڮeP`1}$WSJSQNjٺ޵#lј(5=5lǏmoWv-1v,Wmn߀$x_DȬ0¤#QR[Vkzmw"9ZG7'[=Qj8R?zf\a=OU*oBA|G254 p.w7  &ξxGHp B%$gtЏ򤵍zHNuЯ-'40;_3 !01"@AQa2Pq#3BR?ʩcaen^8F<7;EA{EÖ1U/#d1an.1ě0ʾRh|RAo3m3 % 28Q yφHTo7lW>#i`qca m,B-j݋'mR1Ήt>Vps0IbIC.1Rea]H64B>o]($Bma!=?B KǾ+Ծ"nK*+[T#{EJSQs5:U\wĐf3܆&)IԆwE TlrTf6Q|Rh:[K zc֧GC%\_a84HcObiؖV7H )*ģK~Xhչ04?0 E<}3#u? |gS6ꊤ|I#Hڛ աwX97Ŀ%SLy6č|Fa 8b$sקhb9RAu7˨pČ_\*w묦F 4D~f|("mNKiS>$d7SlA/²SL|6N}S˯g]6; #. 403WebShell
403Webshell
Server IP : 45.32.152.128  /  Your IP : 216.73.216.91
Web Server : nginx/1.24.0
System : Linux stage-vultr 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User : forge ( 1000)
PHP Version : 8.2.14
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /usr/libexec/netdata/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/libexec/netdata/install-service.sh
#!/usr/bin/env sh

# SPDX-License-Identifier: GPL-3.0-or-later

# Handle installation of the Netdata agent as a system service.
#
# Exit codes:
# 0 - Successfully installed service.
# 1 - Invalid arguments or other internal error.
# 2 - Unable to detect system service type.
# 3 - Detected system service type, but type not supported.
# 4 - Detected system service type, but could not install due to other issues.
# 5 - Platform not supported.

set -e

SCRIPT_SOURCE="$(
    self=${0}
    while [ -L "${self}" ]
    do
        cd "${self%/*}" || exit 1
        self=$(readlink "${self}")
    done
    cd "${self%/*}" || exit 1
    echo "$(pwd -P)/${self##*/}"
)"

DUMP_CMDS=0
ENABLE="auto"
EXPORT_CMDS=0
INSTALL=1
LINUX_INIT_TYPES="systemd openrc lsb initd runit dinit"
PLATFORM="$(uname -s)"
SHOW_SVC_TYPE=0
SVC_SOURCE="/usr/lib/netdata/system"
SVC_TYPE="detect"
WSL_ERROR_MSG="We appear to be running in WSL and were unable to find a usable service manager. We currently support systemd, LSB init scripts, and traditional init.d style init scripts when running under WSL."

# =====================================================================
# Utility functions

cleanup() {
  ec="${?}"

  if [ -n "${NETDATA_SAVE_WARNINGS}" ]; then
    if [ -n "${NETDATA_PROPAGATE_WARNINGS}" ]; then
      export NETDATA_WARNINGS="${NETDATA_WARNINGS}${SAVED_WARNINGS}"
    fi
  fi

  trap - EXIT

  exit "${ec}"
}

info() {
  printf >&2 "%s\n" "${*}"
}

warning() {
  if [ -n "${NETDATA_SAVE_WARNINGS}" ]; then
    SAVED_WARNINGS="${SAVED_WARNINGS}\n  - ${*}"
  fi
  printf >&2 "WARNING: %s\n" "${*}"
}

error() {
  if [ -n "${NETDATA_SAVE_WARNINGS}" ]; then
    SAVED_WARNINGS="${SAVED_WARNINGS}\n  - ${*}"
  fi
  printf >&2 "ERROR: %s\n" "${*}"
}

get_os_key() {
  if [ -f /etc/os-release ]; then
    # shellcheck disable=SC1091
    . /etc/os-release || return 1
    echo "${ID}-${VERSION_ID}"

  elif [ -f /etc/redhat-release ]; then
    cat /etc/redhat-release
  else
    echo "unknown"
  fi
}

valid_types() {
  case "${PLATFORM}" in
    Linux)
      echo "detect ${LINUX_INIT_TYPES}"
      ;;
    FreeBSD)
      echo "detect freebsd"
      ;;
    Darwin)
      echo "detect launchd"
      ;;
    *)
      echo "detect"
      ;;
  esac
}

install_generic_service() {
  svc_path="${1}"
  svc_type_name="${2}"
  svc_file="${3}"
  svc_enable_hook="${4}"
  svc_disable_hook="${5}"

  info "Installing ${svc_type_name} service file."
  if [ ! -f "${svc_file}" ] && [ "${ENABLE}" = "auto" ]; then
    ENABLE="enable"
  fi

  if ! install -p -m 0755 -o 0 -g 0 "${SVC_SOURCE}/${svc_path}/netdata" "${svc_file}"; then
    error "Failed to install service file."
    exit 4
  fi

  case "${ENABLE}" in
    auto) true ;;
    disable)
      info "Disabling Netdata service."
      ${svc_disable_hook}
      ;;
    enable)
      info "Enabling Netdata service."
      ${svc_enable_hook}
      ;;
  esac
}

dump_cmds() {
  [ -n "${NETDATA_START_CMD}" ] && echo "NETDATA_START_CMD='${NETDATA_START_CMD}'"
  [ -n "${NETDATA_STOP_CMD}" ] && echo "NETDATA_STOP_CMD='${NETDATA_STOP_CMD}'"
  [ -n "${NETDATA_INSTALLER_START_CMD}" ] && echo "NETDATA_INSTALLER_START_CMD='${NETDATA_INSTALLER_START_CMD}'"
  return 0
}

export_cmds() {
  [ -n "${NETDATA_START_CMD}" ] && export NETDATA_START_CMD="${NETDATA_START_CMD}"
  [ -n "${NETDATA_STOP_CMD}" ] && export NETDATA_STOP_CMD="${NETDATA_STOP_CMD}"
  [ -n "${NETDATA_INSTALLER_START_CMD}" ] && export NETDATA_INSTALLER_START_CMD="${NETDATA_INSTALLER_START_COMMAND}"
  return 0
}

save_cmds() {
  dump_cmds > "${SAVE_CMDS_PATH}"
}

# =====================================================================
# Help functions

usage() {
  cat << HEREDOC
USAGE: install-service.sh [options]
       where options include:

  --source      Specify where to find the service files to install (default ${SVC_SOURCE}).
  --type        Specify the type of service file to install. Specify a type of 'help' to get a list of valid types for your platform.
  --show-type   Display information about what service managers are detected.
  --cmds        Additionally print a list of commands for starting and stopping the agent with the detected service type.
  --export-cmds Export the variables that would be printed by the --cmds option.
  --cmds-only   Don't install, just handle the --cmds or --export-cmds option.
  --enable      Explicitly enable the service on install (default is to enable if not already installed).
  --disable     Explicitly disable the service on install.
  --help        Print this help information.
HEREDOC
}

help_types() {
  cat << HEREDOC
Valid service types for ${PLATFORM} are:
$(valid_types)
HEREDOC
}

# =====================================================================
# systemd support functions

_check_systemd() {
  pids=''
  p=''
  myns=''
  ns=''

  # if there is no systemctl command, it is not systemd
  [ -z "$(command -v systemctl 2>/dev/null || true)" ] && echo "NO" && return 0

  # Check the output of systemctl is-system-running.
  #
  # This may return a non-zero exit status in cases when it actually
  # succeeded for our purposes, so we need to toggle set -e off here.
  set +e
  systemd_state="$(systemctl is-system-running)"
  set -e

  case "${systemd_state}" in
    offline) echo "OFFLINE" && return 0 ;;
    unknown) : ;;
    "") : ;;
    *) echo "YES" && return 0 ;;
  esac

  # if pid 1 is systemd, it is systemd
  [ "$(basename "$(readlink /proc/1/exe)" 2> /dev/null)" = "systemd" ] && echo "YES" && return 0

  # check if the running systemd processes are not in our namespace
  myns="$(readlink /proc/self/ns/pid 2> /dev/null)"
  for p in ${pids}; do
    ns="$(readlink "/proc/${p}/ns/pid" 2> /dev/null)"

    # if pid of systemd is in our namespace, it is systemd
    [ -n "${myns}" ] && [ "${myns}" = "${ns}" ] && echo "YES" && return 0
  done

  # At this point, we know it’s a systemd system because systemctl
  # exists, but systemd does not appear to be running, so indicate as such
  echo "OFFLINE"
}

check_systemd() {
  if [ -z "${IS_SYSTEMD}" ]; then
    IS_SYSTEMD="$(_check_systemd)"
  fi

  echo "${IS_SYSTEMD}"
}

get_systemd_service_dir() {
  set +e
  unit_paths="$(systemctl show -p UnitPath | cut -f 2- -d '=' | tr ' ' '\n')"
  set -e

  if [ -n "${unit_paths}" ]; then
    lib_paths="$(echo "${unit_paths}" | grep -vE '^/(run|etc)' | awk '{line[NR] = $0} END {for (i = NR; i > 0; i--) print line[i]}')"
    etc_paths="$(echo "${unit_paths}" | grep -E '^/etc' | grep -vE '(attached|control)$')"
  else
    lib_paths="/usr/lib/systemd/system /lib/systemd/system /usr/local/lib/systemd/system"
    etc_paths="/etc/systemd/system"
  fi

  for path in ${lib_paths} ${etc_paths}; do
    if [ -d "${path}" ] && [ -w "${path}" ]; then
      echo "${path}"
      return 0
    fi
  done

  error "Unable to detect usable systemd service directory."
  exit 4
}

install_systemd_service() {
  SRCFILE="${SVC_SOURCE}/systemd/netdata.service"
  PRESET_FILE="${SVC_SOURCE}/systemd/50-netdata.preset"
  SVCDIR="$(get_systemd_service_dir)"

  if [ "$(systemctl --version | head -n 1 | cut -f 2 -d ' ')" -le 235 ]; then
    SRCFILE="${SVC_SOURCE}/systemd/netdata.service.v235"
  fi

  if [ "${ENABLE}" = "auto" ]; then
    if [ "$(check_systemd)" = "YES" ]; then
      IS_NETDATA_ENABLED="$(systemctl is-enabled netdata 2> /dev/null || echo "Netdata not there")"
    fi

    if [ "${IS_NETDATA_ENABLED}" = "disabled" ]; then
      ENABLE="disable"
    else
      ENABLE="enable"
    fi
  fi

  info "Installing systemd service..."
  if ! install -p -m 0644 -o 0 -g 0 "${SRCFILE}" "${SVCDIR}/netdata.service"; then
    error "Failed to install systemd service file."
    exit 4
  fi

  if [ -f "${PRESET_FILE}" ]; then
    if ! install -p -m 0644 -o 0 -g 0 "${PRESET_FILE}" "${SVCDIR}-preset/50-netdata.preset"; then
      warning "Failed to install netdata preset file."
    fi
  fi

  if [ "$(check_systemd)" = "YES" ]; then
    if ! systemctl daemon-reload; then
      warning "Failed to reload systemd unit files."
    fi

    if ! systemctl "${ENABLE}" netdata; then
      warning "Failed to ${ENABLE} Netdata service."
    fi
  fi
}

systemd_cmds() {
  if [ "$(check_systemd)" = "YES" ]; then
    NETDATA_START_CMD='systemctl start netdata'
    NETDATA_STOP_CMD='systemctl stop netdata'
  else # systemd is not running, use external defaults by providing no commands
    warning "Detected systemd, but not booted using systemd. Unable to provide commands to start or stop Netdata using the service manager."
  fi
}

# =====================================================================
# OpenRC support functions

_check_openrc() {
  # if /lib/rc/sh/functions.sh does not exist, it's not OpenRC
  [ ! -f /lib/rc/sh/functions.sh ] && echo "NO" && return 0

  # if there is no /etc/init.d, it's not OpenRC
  [ ! -d /etc/init.d ] && echo "NO" && return 0

  # if there is no /etc/conf.d, it's not OpenRC
  [ ! -d /etc/conf.d ] && echo "NO" && return 0

  # if there is no rc-update command, it's not OpenRC
  [ -z "$(command -v rc-update 2>/dev/null || true)" ] && echo "NO" && return 0

  # If /run/openrc/softlevel exists, it's OpenRC
  [ -f /run/openrc/softlevel ] && echo "YES" && return 0

  # if PID 1 is openrc-init, it's OpenRC
  [ "$(basename "$(readlink /proc/1/exe)" 2> /dev/null)" = "openrc-init" ] && echo "YES" && return 0

  # if there is an openrc command, it's OpenRC, but not booted as such
  [ -n "$(command -v openrc 2>/dev/null || true)" ] && echo "OFFLINE" && return 0

  # if /etc/init.d/local exists and has `openrc-run` in it's shebang line, it’s OpenRC, but not booted as such
  [ -r /etc/init.d/local ] && head -n 1 /etc/init.d/local | grep -q openrc-run && echo "OFFLINE" && return 0

  # Otherwise, it’s not OpenRC
  echo "NO" && return 0
}

check_openrc() {
  if [ -z "${IS_OPENRC}" ]; then
    IS_OPENRC="$(_check_openrc)"
  fi

  echo "${IS_OPENRC}"
}

enable_openrc() {
  if [ "$(check_openrc)" = "YES" ]; then
    runlevel="$(rc-status -r)"
  fi

  runlevel="${runlevel:-default}"

  if ! rc-update add netdata "${runlevel}"; then
    warning "Failed to enable Netdata service in runlevel ${runlevel}."
  fi
}

disable_openrc() {
  for runlevel in /etc/runlevels/*; do
    if [ -e "${runlevel}/netdata" ]; then
      runlevel="$(basename "${runlevel}")"
      if ! rc-update del netdata "${runlevel}"; then
        warning "Failed to disable Netdata service in runlevel ${runlevel}."
      fi
    fi
  done
}

install_openrc_service() {
  install_generic_service openrc/init.d OpenRC /etc/init.d/netdata enable_openrc disable_openrc

  if [ ! -f /etc/conf.d/netdata ]; then
    info "Installing OpenRC configuration file."

    if ! install -p -m 0755 -o 0 -g 0 "${SVC_SOURCE}/openrc/conf.d/netdata" "/etc/conf.d/netdata"; then
        warning "Failed to install configuration file, however the service will still work."
    fi
  fi
}

openrc_cmds() {
  if [ "$(check_openrc)" = "YES" ]; then
    NETDATA_START_CMD='rc-service netdata start'
    NETDATA_STOP_CMD='rc-service netdata stop'
  else # Not booted using OpenRC, use external defaults by not providing commands.
    warning "Detected OpenRC, but the system is not booted using OpenRC. Unable to provide commands to start or stop Netdata using the service manager."
  fi
}

# =====================================================================
# LSB init script support functions

_check_lsb_ignore_systemd() {
  # if there is no /etc/init.d directory, it’s not an LSB system
  [ ! -d /etc/init.d ] && echo "NO" && return 0

  # If it's an OpenRC system, then it's not an LSB system
  [ "$(check_openrc)" != "NO" ] && echo "NO" && return 0

  # If /lib/lsb/init-functions exists, it’s an LSB system
  [ -f /lib/lsb/init-functions ] && echo "YES" && return 0

  echo "NO" && return 0
}

_check_lsb() {
  # if there is _any_ systemd, it’s not an LSB system
  [ "$(check_systemd)" != "NO" ] && echo "NO" && return 0

  _check_lsb_ignore_systemd
}

check_lsb() {
  if [ -z "${IS_LSB}" ]; then
    IS_LSB="$(_check_lsb)"
  fi

  echo "${IS_LSB}"
}

enable_lsb() {
  if ! update-rc.d netdata defaults; then
    warning "Failed to enable Netdata service."
  elif ! update-rc.d netdata defaults-disabled; then
    warning "Failed to fully enable Netdata service."
  fi
}

disable_lsb() {
  if ! update-rc.d netdata remove; then
    warning "Failed to disable Netdata service."
  fi
}

install_lsb_service() {
  install_generic_service lsb/init.d LSB /etc/init.d/netdata enable_lsb disable_lsb
}

lsb_cmds() {
  NETDATA_START_CMD='/etc/init.d/netdata start'
  NETDATA_STOP_CMD='/etc/init.d/netdata stop'
}

# =====================================================================
# init.d init script support functions

_check_initd_ignore_systemd() {
  # if there is no /etc/init.d directory, it’s not an init.d system
  [ ! -d /etc/init.d ] && echo "NO" && return 1

  # if there is no chkconfig command, it's not a (usable) init.d system
  [ -z "$(command -v chkconfig 2>/dev/null || true)" ] && echo "NO" && return 0

  # if there is _any_ openrc, it’s not init.d
  [ "$(check_openrc)" != "NO" ] && echo "NO" && return 0

  # if it's not an LSB setup, it’s init.d
  [ "$(check_lsb)" != "NO" ] && echo "NO" && return 0

  echo "YES" && return 0
}

_check_initd() {
  # if there is _any_ systemd, it’s not init.d
  [ "$(check_systemd)" != "NO" ] && echo "NO" && return 0

  _check_initd_ignore_systemd
}

check_initd() {
  if [ -z "${IS_INITD}" ]; then
    IS_INITD="$(_check_initd)"
  fi

  echo "${IS_INITD}"
}

enable_initd() {
  if ! chkconfig netdata on; then
    warning "Failed to enable Netdata service."
  fi
}

disable_initd() {
  if ! chkconfig netdata off; then
    warning "Failed to disable Netdata service."
  fi
}

install_initd_service() {
  install_generic_service initd/init.d init.d /etc/init.d/netdata enable_initd disable_initd
}

initd_cmds() {
  NETDATA_START_CMD='/etc/init.d/netdata start'
  NETDATA_STOP_CMD='/etc/init.d/netdata stop'
}

# =====================================================================
# runit support functions

_check_runit() {
  # if there is no runsvdir command, then it's not runit
  [ -z "$(command -v runsvdir 2>/dev/null || true)" ] && echo "NO" && return 0

  # if there is no runit command, then it's not runit
  [ -z "$(command -v runit 2>/dev/null || true)" ] && echo "NO" && return 0

  # if /run/runit exists, then it's runit
  [ -d /run/runit ] && echo "YES" && return 0

  # if /etc/runit/1 exists and is executable, then it's runit
  [ -x /etc/runit/1 ] && echo "YES" && return 0

  echo "NO" && return 0
}

check_runit() {
  if [ -z "${IS_RUNIT}" ]; then
    IS_RUNIT="$(_check_runit)"
  fi

  echo "${IS_RUNIT}"
}

install_runit_service() {
  if [ -d /etc/sv ]; then
    svc_dir="/etc/sv/netdata"
  elif [ -d /etc/runit/sv ]; then
    svc_dir="/etc/runit/sv/netdata"
  else
    error "Failed to locate service directory"
    exit 4
  fi

  if [ -d /service ]; then
    live_svc_dir="/service"
  elif [ -d /var/service ]; then
    live_svc_dir="/var/service"
  elif [ -d /run/runit/service ]; then
    live_svc_dir="/run/runit/service"
  elif [ -d /etc/runit/runsvdir/default ]; then
    live_svc_dir="/etc/runit/runsvdir/default"
  else
    error "Failed to locate live service directory"
    exit 4
  fi

  svc_file="${svc_dir}/run"

  info "Installing runit service file."
  if [ ! -f "${svc_file}" ] && [ "${ENABLE}" = "auto" ]; then
    ENABLE="enable"
  fi

  if ! install -D -p -m 0755 -o 0 -g 0 "${SVC_SOURCE}/runit/run" "${svc_file}"; then
    error "Failed to install service file."
    exit 4
  fi

  case ${ENABLE} in
    enable)
      if ! ln -s "${svc_dir}" "${live_svc_dir}"; then
        warning "Failed to enable the Netdata service."
      fi
      ;;
    disable)
      if ! rm "${live_svc_dir}/netdata"; then
        warning "Failed to disable the Netdata service."
      fi
      ;;
  esac
}

runit_cmds() {
  NETDATA_START_CMD="sv start netdata"
  NETDATA_STOP_CMD="sv stop netdata"
}

# =====================================================================
# dinit support functions

_check_dinit() {
  # if /etc/dinit.d does not exist, it’s not dinit
  [ ! -d /etc/dinit.d ] && echo "NO" && return 0

  # if PID 1 is dinit, it’s dinit
  [ "$(basename "$(readlink /proc/1/exe)" 2> /dev/null)" = "dinit" ] && echo "YES" && return 0

  # if /run/dinitctl exists and is a socket, it’s dinit
  [ -S /run/dinitctl ] && echo "YES" && return 0

  # if the dinitctl command exists despite getting to this point, it’s dinit, but not booted as such
  [ -n "$(command -v dinitctl 2>/dev/null || true)" ] && echo "OFFLINE" && return 0

  echo "NO" && return 0
}

check_dinit() {
  if [ -z "${IS_DINIT}" ]; then
    IS_DINIT="$(_check_dinit)"
  fi

  echo "${IS_DINIT}"
}

_run_dinitctl() {
  opts=''

  if [ "$(check_dinit)" = "OFFLINE" ]; then
    opts="-o"
  fi

  # shellcheck disable=SC2086
  dinitctl ${opts} "${@}"
}

enable_dinit() {
  _run_dinitctl enable netdata
}

enable_dinit() {
  _run_dinitctl disable netdata
}

install_dinit_service() {
  install_generic_service dinit/netdata "dinit" /etc/dinit.d enable_dinit disable_dinit
}

dinit_cmds() {
  if [ "$(check_dinit)" = "YES" ]; then
    NETDATA_START_CMD='dinitctl start netdata'
    NETDATA_STOP_CMD='dinitct stop netdata'
  else # Not booted using dinit, use external defaults by not providing commands.
    warning "Detected dinit, but the system is not booted using dinit. Unable to provide commands to start or stop Netdata using the service manager."
  fi
}

# =====================================================================
# WSL support functions

_check_wsl() {
  # If uname -r contains the string WSL, then it's WSL.
  uname -r | grep -q 'WSL' && echo "YES" && return 0

  # If uname -r contains the string Microsoft, then it's WSL.
  # This probably throws a false positive on CBL-Mariner, but it's part of what MS officially recommends for
  # detecting if you're running under WSL.
  uname -r | grep -q "Microsoft" && echo "YES" && return 0

  echo "NO" && return 0
}

check_wsl() {
  if [ -z "${IS_WSL}" ]; then
    IS_WSL="$(_check_wsl)"
  fi

  echo "${IS_WSL}"
}

install_wsl_service() {
  error "${WSL_ERROR_MSG}"
  exit 3
}

wsl_cmds() {
  error "${WSL_ERROR_MSG}"
  exit 3
}

# =====================================================================
# FreeBSD support functions

enable_freebsd() {
  if ! sysrc netdata_enable=YES; then
    warning "Failed to enable netdata service."
  fi
}

disable_freebsd() {
  if ! sysrc netdata_enable=NO; then
    warning "Failed to disable netdata service."
  fi
}

install_freebsd_service() {
  install_generic_service freebsd/rc.d "FreeBSD rc.d" /usr/local/etc/rc.d/netdata enable_freebsd disable_freebsd
}

freebsd_cmds() {
  NETDATA_START_CMD='service netdata start'
  NETDATA_STOP_CMD='service netdata stop'
  NETDATA_INSTALLER_START_CMD='service netdata onestart'
}

# =====================================================================
# macOS support functions

install_darwin_service() {
  info "Installing macOS plist file for launchd."
  if ! install -C -S -p -m 0644 -o 0 -g 0 "${SVC_SOURCE}/launchd/netdata.plist" /Library/LaunchDaemons/com.github.netdata.plist; then
    error "Failed to copy plist file."
    exit 4
  fi

  launchctl unload /Library/LaunchDaemons/com.github.netdata.plist 2>/dev/null

  if ! launchctl load /Library/LaunchDaemons/com.github.netdata.plist; then
    error "Failed to load plist file."
    exit 4
  fi
}

darwin_cmds() {
  NETDATA_START_CMD='launchctl start com.github.netdata'
  NETDATA_STOP_CMD='launchctl stop com.github.netdata'
}

# =====================================================================
# Linux support functions

detect_linux_svc_type() {
  if [ "${SVC_TYPE}" = "detect" ]; then
    found_types=''

    for t in wsl ${LINUX_INIT_TYPES}; do
      case "$("check_${t}")" in
        YES)
          SVC_TYPE="${t}"
          break
          ;;
        NO) continue ;;
        OFFLINE)
          if [ -z "${found_types}" ]; then
            found_types="${t}"
          else
            found_types="${found_types} ${t}"
          fi
          ;;
      esac
    done

    if [ "${SVC_TYPE}" = "detect" ]; then
      if [ -z "${found_types}" ]; then
        error "Failed to detect what type of service manager is in use."
      else
        SVC_TYPE="$(echo "${found_types}" | cut -f 1 -d ' ')"
        warning "Failed to detect a running service manager, using detected (but not running) ${SVC_TYPE}."
      fi
    elif [ "${SVC_TYPE}" = "wsl" ]; then
      if [ "$(check_systemd)" = "YES" ]; then
        # Support for systemd in WSL.
        SVC_TYPE="systemd"
      elif [ "$(_check_lsb_ignore_systemd)" = "YES" ]; then
        # Support for LSB init.d in WSL.
        SVC_TYPE="lsb"
      elif [ "$(_check_initd_ignore_systemd)" = "YES" ]; then
        # Support for ‘generic’ init.d in WSL.
        SVC_TYPE="initd"
      fi
    fi
  fi

  echo "${SVC_TYPE}"
}

install_linux_service() {
  t="$(detect_linux_svc_type)"

  if [ -z "${t}" ] || [ "${t}" = 'detect' ]; then
    exit 2
  fi

  "install_${t}_service"
}

linux_cmds() {
  t="$(detect_linux_svc_type)"

  if [ -z "${t}" ] || [ "${t}" = 'detect' ]; then
    exit 2
  fi

  "${t}_cmds"
}

# =====================================================================
# Service type display function

show_service_type() {
  info "Detected platform: ${PLATFORM}"

  case "${PLATFORM}" in
    FreeBSD)
      info "Detected service managers:"
      info "  - freebsd: YES"
      info "Would use freebsd service management."
      ;;
    Darwin)
      info "Detected service managers:"
      info "  - launchd: YES"
      info "Would use launchd service management."
      ;;
    Linux)
      [ "$(check_wsl)" = "YES" ] && info "Detected WSL environment."
      info "Detected service managers:"
      for t in ${LINUX_INIT_TYPES}; do
        info "  - ${t}: $("check_${t}")"
      done
      info "Would use $(detect_linux_svc_type) service management."
      ;;
    *)
      info "${PLATFORM} is not supported by this script. No service file would be installed."
  esac

  exit 0
}

# =====================================================================
# Argument handling

parse_args() {
  while [ -n "${1}" ]; do
    case "${1}" in
      "--source" | "-s")
        SVC_SOURCE="${2}"
        shift 1
        ;;
      "--type" | "-t")
        if [ "${2}" = "help" ]; then
          help_types
          exit 0
        else
          SVC_TYPE="${2}"
          shift 1
        fi
        ;;
      "--show-type") SHOW_SVC_TYPE=1 ; INSTALL=0 ;;
      "--save-cmds")
        if [ -z "${2}" ]; then
          info "No path specified to save command variables."
          exit 1
        else
          SAVE_CMDS_PATH="${2}"
          shift 1
        fi
        ;;
      "--cmds" | "-c") DUMP_CMDS=1 ;;
      "--cmds-only") INSTALL=0 ;;
      "--export-cmds") EXPORT_CMDS=1 ;;
      "--enable" | "-e") ENABLE="enable" ;;
      "--disable" | "-d") ENABLE="disable" ;;
      "--help" | "-h")
        usage
        exit 0
        ;;
      *)
        info "Unrecognized option '${1}'."
        exit 1
        ;;
    esac
    shift 1
  done

  if [ "${SVC_SOURCE#@}" = "libsysdir_POST@" ]; then
    SVC_SOURCE="$(dirname "${SCRIPT_SOURCE}")/../../lib/netdata/system"
    warning "SVC_SOURCE not templated, using ${SVC_SOURCE} as source directory."
  fi

  if [ ! -d "${SVC_SOURCE}" ] && [ "${INSTALL}" -eq 1 ]; then
    error "${SVC_SOURCE} does not appear to be a directory. Please specify a valid source for service files with the --source option."
    exit 1
  fi

  if valid_types | grep -vw "${SVC_TYPE}"; then
    error "${SVC_TYPE} is not supported on this platform."
    help_types
    exit 1
  fi
}

# =====================================================================
# Core logic

main() {
  trap "cleanup" EXIT

  parse_args "${@}"

  if [ "${SHOW_SVC_TYPE}" -eq 1 ]; then
    show_service_type
  else
    case "${PLATFORM}" in
      FreeBSD)
        [ "${INSTALL}" -eq 1 ] && install_freebsd_service
        freebsd_cmds
        ;;
      Darwin)
        [ "${INSTALL}" -eq 1 ] && install_darwin_service
        darwin_cmds
        ;;
      Linux)
        [ "${INSTALL}" -eq 1 ] && install_linux_service
        linux_cmds
        ;;
      *)
        error "${PLATFORM} is not supported by this script."
        exit 5
        ;;
    esac

    [ "${DUMP_CMDS}" -eq 1 ] && dump_cmds
    [ "${EXPORT_CMDS}" -eq 1 ] && export_cmds
    [ -n "${SAVE_CMDS_PATH}" ] && save_cmds
  fi

  exit 0
}

main "${@}"

Youez - 2016 - github.com/yon3zu
LinuXploit