From b4fdbf02f088c596f33c28cc61ad117d128ad64e Mon Sep 17 00:00:00 2001 From: Fincer Date: Tue, 30 Oct 2018 01:27:33 +0200 Subject: [PATCH] Initial commit --- README.md | 68 ++++++++++++++++++++ images/wanip_email.png | Bin 0 -> 7396 bytes images/wanip_log.png | Bin 0 -> 4225 bytes wanip-checker.sh | 140 +++++++++++++++++++++++++++++++++++++++++ wanip-checker@.service | 25 ++++++++ 5 files changed, 233 insertions(+) create mode 100644 README.md create mode 100644 images/wanip_email.png create mode 100644 images/wanip_log.png create mode 100644 wanip-checker.sh create mode 100644 wanip-checker@.service diff --git a/README.md b/README.md new file mode 100644 index 0000000..a708503 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# WAN IP checker + +WAN IPv4 checker & email notifier for server environments behind dynamic DHCP. + +## About + +This repository contains a systemd service file & a simple bash script to refresh current WAN IPv4 of a server, and notify server admin for any changes in the server WAN (Internet) address. This helps in several issues: + + - Server admin is always aware of the current server IPv4 address, whether the address is dynamic or not. + + - Server admin is able to remotely connect to the server environment although the server IP may have been changed. This is possible because the admin is notified about any WAN IPv4 address changes via email by the server itself, automatically. + +In many home networks, WAN (Wide Area Network) IP addresses are dynamically allocated by a local ISP. Usually this is okay in common household/home use, but not in server use. + +In most server environments, static DHCP lease/static IP address is a mandatory requirement. However, static IPs are usually offered only for corporate environments, and not everyone wants to pay extra for such in order to establish a simple server environment in home. + +## Requirements + +- A server computer of any kind + +- Linux OS + + - systemd - service file + + - [SSMTP](https://wiki.archlinux.org/index.php/SSMTP) - email client + + - bash + + - awk + +## Contents + +- systemd **user** service file: `wanip-checker@.service` + +- bash script: `wanip-checker.sh` + +## Installation + +**1)** Insert `wanip-checker@.service` into `/usr/lib/systemd/user/` folder + + - WAN IP check interval is customizable in systemd service file. Default value is `60` (1 min) + +**2)** Insert `wanip-checker.sh` into your `/home/myuser/` folder + +**3)** Configure your email address and message form in `wanip-checker.sh` file + +**3)** Install `ssmtp`, and configure files `/etc/ssmtp/revaliases` and `/etc/ssmtp/ssmtp.conf` as described on [SSMTP Arch Wiki site](https://wiki.archlinux.org/index.php/SSMTP). + +**4)** Run + +``` +systemctl --user enable wanip-checker@myusername.service && \ +systemctl --user start wanip-checker@myusername.service && \ +systemctl --user daemon-reload + +``` + +**NOTE:** If you change the script contents, make sure to run `systemctl --user restart wanip-checker@myusername.service` afterwards. + +## Images + +When server computer discovers changes in WAN IPv4, it automatically sends an email notification for system administrators: + +![](images/wanip_email.png) + +Additionally, server computer keeps a log file which include WAN IPv4 changes and corresponding timestamps: + +![](images/wanip_log.png) diff --git a/images/wanip_email.png b/images/wanip_email.png new file mode 100644 index 0000000000000000000000000000000000000000..e0e9b1d44c5a957120e9fafcab69dab2bbec2627 GIT binary patch literal 7396 zcmds+S5%W-^yZ^T`9QEBQUfX->7gcq(gmeS?>)581VTpv1*J+80|X0FMIeM;1f&Ec zfb@haMtUd;(joKW|8_2BF6L&=S~)8_=bXKN&$IKcByV0C=xH(1bI^l8AV%%`>W@Gm zDj4wm2^|$MQ@)EH0xy6J9vW)^AqWHkf#4tz3IxIfi)Rr80)oIn5EKZ42SF%ji*N`C z4hO+eAUGZbr=0CYK|m-t2!#Tn@E{cB>?j@r!oxv$6bO$8;VD2S5CsCFz(Eugh=K=E zfB?u1qy};Uhk@OcvpQ!34uPN`5Ih7zIV%f9a5w~xg23?*IOU82SVX}gC=>*RhoC5D zP{3Y19D+wd@OTKG0x$wcArv@-f`U-+5DHKgpazlw&;TWX1*`#uf!si9AQy0$awh03 z1_lZa$HU>2Gkri=AVQ(wC_EfRIg<-e0E>7O9FK?NDS&za3fK#$px_idoC3%L`~Wb4 z(|{d-egFbc2v7sb0BC>`*a~m}g@N2aY9JTo%(=5=AO;2=g`%7p3FrgL0udgM!czcW z0l5GLu!y4IQ53*Oz-hn$fD70T7!9ZetOWc3FoDy69RL#`7*GgM1IYkr;3R+rZ~%pY z+(2r|S&Png1Is`R3<}UOz(_zJP!@>r6v|lx|F!>&;$KJ4`uVR(XHfrqKWpzlE6*7J zxpUU-e}d1D|7kdD{y(fU1^+4mse!ix&?Ue;K-0fcpt7>h0RaIA2VW4PG9lj%57tV} z1@v+j4xd(j6c!bGTDN#GTWY7M;^pO4QBjFNAf9RpDn$=BN9#!n2ns`>@`_Nq{6)Lh zS%#uk2Y2ot&B;ClD(V?iK-8 z05RZ^o)LiY|K$MfsKhn{BLDNfZ{ZIDF?F6j&Slm}+c-R16Y!sCybTkeG?NLpEsbXkWQXS8fV4{y7=DmNG|09B%ob378@s(Vsm+`cY$a;G@-SoB?Q}Ti@5qrHHePQFb`6QtHy!=Ryy<4Mq>dU3YxIP=H zum_6lnFU*aI?4_j&!biq@no(l~D&bO85KB$Do){}<$PW{n?+vz)z9WX*S*Y88qy=6p zjlbi?jC90V^$l|9hg?%MZ(2Cw-*!PRn~vCh(<60#GOMtC1DhQj7zj=%$hO2mo+yZi z^+6?rPh5iYdVN%@nd=Xqyp8YR-aQ}v{z(QWCia;V?rT0#1=g=EKxyK9$z90!^a}g# zuu*kI8rFg@djDfIc;fMG9=@V}N^{Jqiw^1LhWLP<#umHCA?n7{_*J9gV#yCq&@Z|% zj?&M*DBoS_O<+qLvT$`L2wS!N#MDMvEoCfp`Ms{Q#T_eN*cr?+`7i#h19MOM1ACmO zT*VtYCaN`2@^iFT>(Jx?dVX2=xKI0KJy!jMy)7 zQLVZfak?gk5%er913z=o;hlj*O!u%3!}&gUUMDMwz;9G;f>WVjD~4O4+L`vQoQ%`* zm{VKqK^K!%T!H7y!~clvIAY{{33m{=g?S0~z2Y3t*w~;SSG3-2d-C&RbKcwC;D9Qq zGc8nlCTU3G!CchXxg^`Gm%sP6P%G!W^Kkb-@aVRSsWR)i?>BvJilA+1@DW(NCL&Vi zk-JdNIaat{>6BRGl_iGFpBJw3=iv)k3naho8K@GuX=C(`fAvixtbg%(U+&-brFN!6 zskIkSVyJ~lSDVvR#e`|zW-ytHRQyWUJ#y$_k5ioY^QrbLyA{(tr3Xy4HztS4E~5%D z`7-q}m-5Hw-z%8)_Iy=E`f5f$K#;J?K=-$ z;Ew_@Uf;g1B3o+MLLhU&kaGmG+t<;_wTU%zg4nGL`=LtAdl+ONab?8b`EU=qh8Ru# z!zpBwd-|mPGxbU6!y-Q|jDO1;@VZIT_CfN+CSSkG4~^9vL64Dz#)h7iAHFX9mUE>g zFLVzSsZ@N8o~N$+YIXamBTnzkGmmKtYyLm0G+HMlJZBK%$k;;`w!l9kq7kiG6G;uj zwyt8R%4MLV`CI-da2SKQJ3p)hwWrvY7_@Eg$7phA&QJ4V^J&TQ5a0PlzT~A#N0wUU zsSATa*I;Q}K}wPH;A=CV)dHP#`|Gg*U-C<@!#t_?0%$cUnpv@fPFdiPC>Gfw1C#mS zb1?IjFMUjjwI&@GJ{wx8AvtIiQuOBWf5z7cmg=`l)yW_0RsB-(Go}!cQf8i2ygs-( zDPvmA_n$7@op0e#Hn04F9M5;5w|Bj+xW0YtLzhe-lJghQ&!3n}u#$>t)KwEQIZmVbZp=*>Hy=J2vVH?XAYO-m}7(I0QObxth z24a<3hohwaw3->1yBd-49lYw>Z0VQoqWlDNR7Or)oY7**=s>x31A#f{%$)ChCWbd$a5Q5qIAhp+`? zVbx~Vc12Qo_bGCEZKyRkmatX)S~#|U9`+Sk=o*s0yj5B_D4-we`{Wrhr+K;8VD9NU zJ)I(?U0w5@u(FAl!trQPBA5EGuX2gj6bo;d; zx!5KCy~UD2Q14LP55%Jsv^#|TYcr#nCG+|7gkH0IlcDgKAg2pIYYV0oI+86Zn1h+J z#zz(d1G8`#OO|KzuN)gin2cMf=5E`7nkCq$UfHPXU1UsUpU9ZBL-nYu+I{$Jy^%d_ zEQjxu+q56606fb9J6rD`?M*2fa{rXYjwI9HH@0`>2=FuUXs;jf#}>}dXKuurIsHZK zND)gsf1$A0C&0&R{S}zPT(8>~qb?>fqvC^s3rjqjkLNSs!Z7J?ORlkC$P>dg0jA4) z)sH_CQ|B)8^{n87{*;CE+viaQwSL<7TY||ZNy4VwH_3#+S`j3lxY0#FG$X6Pw8k$> za@#RRsrMJ%TQPPd9?JPSr~ckkegA!7Y4VTJca;N+hX~Ey%#be~8hp5R7uii^nj z;9MX1j*FN*?zj?4i3(JF@Zzp?LZ{Rzo`WjU9wd>ds_nP^kPb{wA9aO&vVe!6ED8H_ z{>kNJDWOF@#VmAXJbH`P*|pxA0V|j4LYx1CAjGW*DY&s0@(WGZaT3dR&YKQYaP5?p zctz_qdZ>i1@y)Zl$>Q9HQABq7#E9x=XqMU_98P+rank(sbQX*uB~_M*pcM4In~NNZ z9j)zRRWp1}6k*aE0@AcDzk|~^+0OF`KTqhq5l8h~@Q>=dor|!HIOvuE|8ySx#dptI zojf($5@)|vD$?gHnt5OCco?Cx6FYG6iA7whzqm=f9937WNI36gd()=_bT0A>7m_UT zGuqRMhaz+R1zP!H+Uxhh1p^t!ovFjC!QE-|C!Yo>z`V-*EUe>QU_6s;aqKOhsZO5g+6&Z7?&q{a)m#NSg{ycw z?>nyY7{zyq3m4}A(lJ~5p`-R+pCc+5)hwXDe6&UCE+05%w z^rkg@S>yGhz!R=UEv%&Sm$k$XYx3d-JKsKuB4J^C_^t~8l`#DNqCK){`(tDEqT1Y#ALr-5Hac~$lusm3nzV#^^yIi zm!oKJEwMB(E^KTF2I<*xPg~KAg^g~-G!)9TKY}Avz4a~L@xE;Wyy=ORDzyu@)uv6EM&;>$;KpHNbjzb<&@4d%ZFB`*~* z76s)TqMAmA!;0k%Wc05qgq03IT-IUB%S&B)on%oHziGn~dhn=FnQv%|?CKB;268(E zW??F|QCv`SQ;%c>*80Omd~YUcT&32>kg3c`y(l<=&@5DA@znJax^aMTgf&W$zGgW8 z!dfuEr-uNI*^DyQ&P53o-@~}xGHQA(@NU&_E9mGOTU%iZI=R3s45dO%rjnX*@3rO& zyq#DgEc=7p@^}S3zCdD$DPjyKVr~4g^>LS8u?+0MbUUx} z7~7vU1ak0oyc@fU%xB_LUGQNyu0}O4-G)t`2d~ywn%)a@)4j(oUP%?c;?(oNT6$Ix z7V`0w)=|)!;#GaOV5{qL{cCs~+lGFAO#2DEuN%!?8*b*+)N|1`Cmfw*tw=vA=WqAy zUY?0i@^VYKjPLQ0YSN8UtRbhsF2%kuYO__w^IPbr&0V$#+hb-C{oCI|)oK#9X52!w zCg6x@+cjnR>(UnrSE`(L-84t(gQCFJB46^Q=sCT}JL_Mm(p_F!o~EN@>5bt-rpFO| z^ba%WEq+`KL3=gO4+i<7b#+szR+A4cURJQo^;-OCi7pag|4*Vk(zr&Z>UCkYz&4df!)(^lw$!T~`+2-%Dxc&Hv;FQfc*OU4~VdDIK zR2g_#(AkyC_2MPZFeMwLbG_{y<&Yr@`A<;3UX2yM8hjZ^6g>2Lxi3c}>l3Jum6eMAAcpXldZcO4x+jBIcQXB+L)r&OVh^vrcobNk1}S%Ry?RqKzxd9V_@}6={7ncPIH0+vjHJ{}iwH$*x?i_24 z<~e3E+Oj=+qr1tE;X40 z1`F5Ke&}S}uS~h|+Q}DaV~mr4@|Ai6@K$;3&g%L1R6pSPKJCPh+^`Y2bZ3@OK#wa- z5GnMvq?(-j=|?+Vr`Ll9zgXZ}99s;+X6r1Fw-9kP1#*tArd&bx#pmjhy1{$>`q;io z)F?-g-qi!$a1L~BD9S-Ag;$B4g@B^5Ayl&_!j$AaIk-9Ww>`@8lB8i}Vl}_R1^t&` zZ2whfl^hH_i%!X&CIO9G_V-rBIxR|A1pLCroSJ)dgXyC~&nco0^zvjY*zx{96wIUs zgUqKqJ_X7p&P^Hnm9O+8W^X92>4Lc$wJ^JA-tqT{@4C72FJB~~ezsHxKbZj$|Xmt=u_N1#D; ze4FL}=o`$WW}0y({3^qxYgxZ`n6om&IDqSCYT1ui@~xq4zbYaJdq{=hrPL$kJUxTA zJ{U>vV2sd#M*T64ZKDTq-JY8UcDZUZTp=%62g+Sc(s;%{Z)6KD*4Q_M95>^cCX<*r z*c=5;2>bk(-omaW&H1`6^JV8k4PB!iSHyoV^Ups2i8)DXknS(zftEy$Trw6B3bG;h z9sMa8b)sEg0W zDvER}PcpXsL72wKhFRI~3A^+=hD$OpMG}sKGj!*!HGamFFzk2XwB^|WwP;Vi-Ipw!XGR(#{LU%5C4tSCed4e5y!%giH{)n9 zQ`S(c`YVWjr)X6M|De14b|r~l@Ag%n;^&B4h0Skya`m5R|H46fq#_uUZfqvT%=Np4 z(82y{Mk+9HwtlrA4<73V!ID^U$b9Ozw(URm3WnU8CF{m_K*}x6uX!lPC)6}CMqS(I z&8-DXdG8hc`0|)6IC-^t0{B@kjI73}&S9rRJb@S)4PT8G9j>6miuVGuN2jqu#0`Xu$5$4^6o&Huz^V|Uww_prxEs+JStv^x}T4-T13(NrUBPS;Dxz|&L6V{ zee{L)PW~RN;S$dsIpGpvi(fx09DX6D@(e=$5IL9x2w6oEl)aSXKBh%Hb4gQCt9&Uu z^9^Kf|0T9hPw{u5jPx7@y1xyU;o9lSv5P`CZB3HcLM4&RY_&U@9r_V}*TRI<`zz#i zG8k;$P%Crpixt+p(~5Xs{ku*L{k;?T=zeu~<)%Jo@!t3wxYmRQRt?wZ&2$MWCpAJw z)vo+fcE{aifv&RpUuf~8e`g$aV2XENEgb0zWSB$_lXI86c2DHlcQ<$vz+v;IToHrh z9*Jezws$jpvDFg!-QZ$LC^t0qakl#Uc!XOz&hS;0yIiEBgJ~&qANgTSaoG72Ch6iR zKi>>2o=WW3xUAXbUoz&REx(Sv(yGgkB zB*nN2WrBe`Vdi6P4O(2@l7oH^-mc@Bn~GRY%EE!G*Y-t24R6`ym@94U45!i3cjDZrzj2?;RdUqiu=EKw_g?f6fRiF6L!)Q+$-$&#%+K6HZ>UYP z$MlNxbH61FAtalmr(OZ-h4+d+o{09=SwjdE=~k1N4!Qp1P~{Dj$P;sCtBREi%$T+F zYI5EXYtGM$N=F1UDhF?Jr~F-z&wgoMBu(wS$vJw7Mq%!K(u&;+l3Q9*+Qq)rq}rF> z+f&2gak2Cxn*n}eHr9e154}6r_-+eiJJqity4g$#9Ji~~@-rNY>IXDWatCUCMGnGg zQ{Kr@Bk|$5nh$psx4|~v22yh?zr1$c$i)dx;?wc@o0;GUt3evtB={`)OM2bL-8m`6 zzz+k_+i1D%Npsm0GMKU|)R-#3V$EZp^#EjoCHxX~$CU*#_3 zhSv4M7r*1?_w;%(19DK0;ugp~&O9vIOOwDusJgyN wd#KF$DKEC%^_!*L|J>LAcXR*$#YDMOG9T20I3Hel_HU)OhMs!4s(tkT0wPKDrvLx| literal 0 HcmV?d00001 diff --git a/images/wanip_log.png b/images/wanip_log.png new file mode 100644 index 0000000000000000000000000000000000000000..3967a60c5076c0c8cc5114805fcaa6b2065c2b5e GIT binary patch literal 4225 zcmds4i91yN`#w@$H7Z+UO>a~pOFHt((3I?3l4OsGBQ#1xWY3Hx*+%JDLeZ;<%#5P4 zHW)2~H;g?}B%wrED$egSzW>GVb6qpnJo7xy{oMEcoa>s;B-z@SZr&uj34)-_=4M8A z5VVd0KHCTjf_G2Tyr&Q(2-#ZM8-oynU+}fo6;^h#!N4A_x~jFup!87DOnDpj-sS z_;LXYkmRBWmy2*QpdOF{wFrhH7#G2SJm3eQ3A%wDKtCV>6av-&43GvaK`Gz?1_NvW z4X`l2bNn=j!QrAP#y1k^17ktN<)T~+_zL6#79fdYToeO70;hoifEOqSMgz6LO5g{e z3A%wDfD;f56av-&43Gw$fEM5Z1_NvWjqz8+uLfxlgM)#M0V9DvFcw5y4C60wZT)-} zYa8Y7b8Sg{Qft2R*SlsVpW~W4{B5rZ=2KqNz+e6vExv-aNdOu=4q!{bJfLZ96r^Yx zm~o%MWHMO{`kj>1d%%OK=~v3i79d<^vXZUEAz{M^CM(Z<7f1*jMlx7A9*U5lrcVk< zMF3KC%V9Ai422;`((j|S zNe@mxpIpX#V+uDXOY+Y2OX?aJz|s+)QD1H9iSBK4bh^X6_GBed;q~ickNmB#M?G(H z`rS;;w)j0(qq21aq5DFTJkk3q^1E;$^nW5KZ#C(D4}x~_w*5)M^@}Aw?zkNJpvNrv z;tXl-*|>3li}+Kh-qF9%PM&srtN(D$(mXaW_D#61EccRl3;R#x-kOc`t-QLI?Y}1I z58j(gyf~#Ya_xpXBw}fv=5?9YzE8LH>0Td+Ao9Q8PWgUNRqU*-HJ8$FyQO-g*tx{% zgr2tca_wAg)h=GjyWJm!ds~Wie-#j4Mg%_d?%+s7UMHt@^^TN&e!*afc$tY$DP10? znQYm`vyl|1n!iuOzKQz2kyq zoN$WJo|cTVhRa50^N#mhcfWp5{d}7u)3@45@J*pqAuukK*m+W%7<|`yU#uL_WTY(ik#@f`iWv;tUHme(ULcEDo4XN z8vlILG1YKo;D@F2;W8(O7Y*y_sT~>tBeOfJLZg1;w}cb(&)ms(tMz2l{P!4KGqk}^ z&+o{-x3|7_L+$p!8yDTRSM47x(EPZAyj^EzH0G0fRxe)s+Y`j#uS-QP z$Ba%|xF7hHeb%(9JKDOg>A=3B2pb%io3i~T{N_JBH7m~{uMJJaLuNTN(L6eB6YE)L ztZYX1y?TOTZbYhyos9GMszh|;hF-4USXJXK9g@D&nH$F6ilZ&?hyO(KD(VfBTEfxc ztO}2z)vLE|`J3fFBC5Ae8vMJXW_?hP_xF}Twe}c`x;Il&*WUDAOlN)k9Jl?>kbByP z`KgyAPsvuP-awHjOjqA;>x$n_=FV$>Em>XGImSqLEAu>;71aOaRbJb1FJh~)96lhE zZg)+85NeY-~4FiH+#GddS3?V^b+gvmi{HZNvS0mt1wSb1dj!I>&T1 zY*}{LNjdz^SaAJ?(_fwVW9XodD;=Din(8$qf@jD?>n(-;CmEB@yA&OsU7Ws~^ z&!>|_e?-d|W4~4svayYXV~>gLQ>T@~TBy|XFm6WS7lLPP@l=`?{>AAYyhUM?c&zj@ zE)G7?yX?sc8BYH3b_OzxVx0>sL5#V6*>>S=vsUK$dU2JhC%04(a~;q1vl}?jVa-2Z z2H1D=)oZ(}W_y^FY$uWT=2XgyL~g=|0_?ZO#lw@H0n({*nH0skmc;Xmwu54aJa*Rn zGfzx*3iRn6q*5|H+p1>Ue^xnm9)15n%Pw+k$*q{`is(+nT=mQAf6lz~OtzoWJwG!> z&fBbmBhEHZDTupc#9N*}UL!1YT>TT}EF)(6EEJ(Hh92KFt|9VM4NrYY+wmizH>!!f z*Q>}iT}{b=sFl?pWu&u6y|a3K`Od`nUia~RheBSf>ENtY2D!NFJhl9X+fo+xPD$8w zz%d)L)c*Yi54Xi!{g-l=M~*tsb~r)f^A-nFB!gi2YEUH+J| z{b&xU$W^K0&%sOKoF0w_Zp3S&vK$TZnaHGEI2j;tHQUEYlQ8j6qKQp5I7mB{qgnZ1 z&ulb1uRJFtli#7&xt~0$Q0}qQN!$E{qgqPz)hkQy8UOv1+LTa4 zDk6vNk1jf>X}`)o*SIB|Pro=+l~6N*9V0 z$Z^?^dgMuJkE!ZT7N0dGk3DqF{1Q&aI|DM((K~D6#-|3v`U!O$Wudmtdjdn%yC`jwA%7l!$R$~=_Eg$7^3NLgiOdwL&ANeK`raeRF6cGo>kwU^1fD7o)F@X zJNTlaF7ha#J=B|0W- zdGl5X@1WXqa{Z?HONo>ZW~_A6w`@TqY@}1LUN2_FWgA-vzkBLAK?WDad&!O}I`%Q) zwYE5pmqFSoA|V(_>}qD>Qv#NEOkfT(VqYeEgq4>Q2-U7UZN-Pj6h_EQ z+xXiZum0{a><|iCL2iZ1m44lLr*dPmfj-d(FaEzv4gYR4I;nIyq$RMSWu1!9V@Z2~ zwn>s2V=8F3ylNuFt#Kfq*tB3=-rqmcORlLT-u1s3$GhIje)yQ9ry$tO*6;|KNT}0T zsax<5U04hr{5qXBnWI!TESyHk_HDbYFO*2hkNv%ZW3F_*q!ki=|9(ymU1$xiQ>t*+ z$Gew2DLvczH$H?~G)!q9$zUNq(Z{QQwy)lP6zR1u!-w>piIqOXCa_(lH6~)!W6}q1=xi}-|ByHk$;YlUYxgyeQhC#5M zKOupuD0Ud&=!M*P23g2wX`wNe@>vwtx$48!S$paaYbBP8_Inq+$P6Oj1FHFrL1Vqw zIqclWD-|}0ly{BiQ`)Cr`wLfxguL1svQS;(0)+O;Q5w2PJUI^A#W(j$p8=5Cc>jp% znQv9cRr~r!G6U-PK)g5)qY%<)Np~@s{!#3R+VuM2Zx$OIREGL@ys8WI!Dd4V86$r+ zIw;q^@m8zN%+a3i6;zPoJ3G_fvG`^&PvK?zYUx*M{t9h2oAmh6Ay$OebIGEatA6&f z3sVAVIFhH-{+jtF|AG=z!}C7TR-s+(tLC#yO`n}hJbs!yJ!X5~vq53D^l$v(oy{#@ zqp8_P&Y8?_HJ1=hgTgCNM)Z%xcM$)A3!VkGkUY}dU~akew$$WHtqeoz{ETKW&#kvG zSTVruHLcat2^t9&!H%rr?F~ literal 0 HcmV?d00001 diff --git a/wanip-checker.sh b/wanip-checker.sh new file mode 100644 index 0000000..b901550 --- /dev/null +++ b/wanip-checker.sh @@ -0,0 +1,140 @@ +#!/bin/env bash + +# WAN IP Checker - Whenever server WAN IP address changes, inform admins via email +# Copyright (C) 2018 Pekka Helenius +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +########################################################### + +# A script for remote server environments which are behind +# dynamic (non-static) DHCP. Usually these dynamic IPs are +# used in common household networks in non-corporate +# environments. + +########################################################### + +# Script requirements +# +# SSMTP + +# https://wiki.archlinux.org/index.php/SSMTP +# Relevant conf files +# /etc/ssmtp/revaliases +# /etc/ssmtp/ssmtp.conf + +# Because your email password is stored as cleartext in /etc/ssmtp/ssmtp.conf, it is important that this file +# is secure. By default, the entire /etc/ssmtp directory is accessible only by root and the mail group. +# The /usr/bin/ssmtp binary runs as the mail group and can read this file. There is no reason to add +# yourself or other users to the mail group. + +########################################################### + +# Some lines below are commented out because the timer is handled by systemd service file +# If you don't use provided systemd service file, re-enable the relevant lines below + +function checkWANIP() { + + # Command to resolve the current IPv4 WAN address + local WANIP_CURRENT="dig +short myip.opendns.com @resolver1.opendns.com" + +############################ + + # If we are connected to internet... + # There's no point to do WAN IP check if we can't establish connection to WAN/Internet at all + # In addition, do not generate any network related variables if the connection + # can't be established. Therefore, include variable defitions inside this if statement. + if [[ $(printf $(eval ${WANIP_CURRENT} &> /dev/null)$?) -eq 0 ]]; then + + # Check interval in minutes + # local CHECK_INTERVAL=5 + +############################ + + # Cache/Log directory of the script + local WANIP_DIR="$HOME" + + # Log file for checked/resolved IPv4 WAN addresses: + local WANIP_LOG="$WANIP_DIR/.ip_wan.log" + + if [[ ! -d ${WANIP_DIR} ]]; then + mkdir -p ${WANIP_DIR} + fi + + if [[ ! -f ${WANIP_LOG} ]]; then + printf 'Time\t\t\t\tWAN IPv4\n' > ${WANIP_LOG} + fi + +############################ + + # Log file timestamp format + local TIMESTAMP=$(date '+%d-%m-%Y, %X') + +############################ + + # Email to send notify to + local EMAIL_RECIPIENT="mymail@hotmail.com" + + # Email subject/title + local SUBJECT_EMAIL="WAN IP address change (Helsinki, $(tail -1 ${WANIP_LOG} | awk '{print $NF}') -> $(eval ${WANIP_CURRENT}))" + + # Email message/body contents + local MESSAGE_EMAIL="${TIMESTAMP}: WAN address of the server (Helsinki) has been changed from $(tail -1 ${WANIP_LOG} | awk '{print $NF}') to $(eval ${WANIP_CURRENT})" + + # Message to server stdout + local MESSAGE_STDOUT="$(echo ${TIMESTAMP}) - WAN address of this server has been changed from $(tail -1 ${WANIP_LOG} | awk '{print $NF}') to $(eval ${WANIP_CURRENT})" + +############################ + + # Email send command + local MAIL_SEND="echo -e \"To: ${EMAIL_RECIPIENT}\nFrom: ${EMAIL_RECIPIENT}\nSubject: ${SUBJECT_EMAIL}\n\n${MESSAGE_EMAIL}\" | sendmail -v ${EMAIL_RECIPIENT}" + + # Log write command + local LOG_WRITE="printf '%s %s\t\t%s\n' $(echo $TIMESTAMP) $(eval $WANIP_CURRENT) >> $WANIP_LOG" + +############################ + + # If the log file has no previous IPv4 entries + if [[ $(cat $WANIP_LOG | wc -l) -le 1 ]]; then + eval ${LOG_WRITE} + fi + +# local i=0 +# while true; do + +# if [[ $i -ne 0 ]]; then +# sleep $(( ${CHECK_INTERVAL} * 60 )) +# fi + +# if [[ -f $WANIP_LOG ]]; then + + # The log file must include more than just the header line + if [[ $(cat $WANIP_LOG | wc -l) -gt 1 ]]; then + + if [[ $(tail -1 $WANIP_LOG | awk '{print $NF}') != $(printf '%s' $(eval $WANIP_CURRENT)) ]]; then + + echo -e ${MESSAGE_STDOUT} + eval ${MAIL_SEND} + eval ${LOG_WRITE} + + fi + fi + fi +# let i++ +# done +} + +############################ + +checkWANIP diff --git a/wanip-checker@.service b/wanip-checker@.service new file mode 100644 index 0000000..a9ffa57 --- /dev/null +++ b/wanip-checker@.service @@ -0,0 +1,25 @@ +# Should be placed to /usr/lib/systemd/user/ + +#### +# Usage + +# systemctl --user enable wanip-checker@.service && \ +# systemctl --user start wanip-checker@.service && \ +# systemctl --user daemon-reload + +[Unit] +Description=WAN IPv4 checker & email sender for dynamic IPv4 server environments +After=network-online.target + +[Service] +ExecStart=/usr/bin/bash /home/%i/wanip-checker.sh + +# Restart (check) every 1 minute (60 seconds) +RestartSec=60 +Restart=always + +# Emailing fails if this is enabled +#NoNewPrivileges=true + +[Install] +WantedBy=default.target