package Ġfr . ma if . autom ate . certificate . scheduler Ċ Ċ import Ġarrow . core . Either Ċ import Ġfr . ma if . autom ate . certificate . Certificates Ċ import Ġfr . ma if . autom ate . certificate . write . Certificate Event Ċ import Ġfr . ma if . autom ate . certificate . write . Renew Certificate Ċ import Ġfr . ma if . autom ate . certificate . write . State Ċ import Ġfr . ma if . autom ate . commons . Error Ċ import Ġfr . ma if . autom ate . commons . Interval Ċ import Ġio . reactivex . Observable Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . time . LocalDateTime ĊĊ Ċ class ĠCertificate Renew er ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpolling Interval : ĠInterval , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcertificates : ĠC ertificates Ċ ) Ġ{ ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠLOGGER : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Certificate Renew er :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġis Certificate Expired ( c : ĠState . Certificate State , Ġd : ĠLocalDateTime Ġ= ĠLocalDateTime . now ()): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġc . certificate ?. expire ?. is Before ( d . plus Days ( 3 0 )) Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Scheduler () Ġ{ ĊĠĠĠĠĠĠĠ ĠObservable . interval ( polling Interval . period , Ġpolling Interval . unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Looking Ġfor Ġcertificate Ġto Ġrenew ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Domain To Renew () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġempty List () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ domains Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domains . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (" Found Ġ${ domains . map Ġ{ Ġit . domain Ġ}} Ġto Ġrenew ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat Map Iterable Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġdomain Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain . wildcard Ġ!= Ġnull Ġ&& Ġdomain . domain Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcertificates . on Command ( Renew Certificate ( domain . domain , Ġdomain . subdomain , Ġdomain . wildcard )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Return Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Error Ġwhile Ġrenew ing Ġcertificate Ġfor Ġ${ domain . domain }", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEither . Left ( Error ( e . message )) Ġas ĠEither < Error , ĠCertificate Event > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( Either . Left ( Error (" Domain Ġ$ domain Ġinvalid ")) Ġas ĠEither < Error , ĠCertificate Event >) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġres Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . debug (" Renew Ġok Ġfor Ġ${ res . b }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Error Ġwhile Ġrenew ing Ġcertificate : Ġ${ res . a }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . error (" Error Ġwhile Ġrenew ing Ġcertificate ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Domain To Renew () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcertificates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. state () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Renew Ġ= Ġall . list (). filter Ġ{ Ġis Certificate Expired ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOGGER . info (""" Finding Ġcertificates Ġto Ġrenew Ġin Ġ${ all . list (). map Ġ{ Ġc Ġ-> Ġ( c . domain Ġto Ġc . subdomain ) Ġto Ġc . certificate ?. expire Ġ}} . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ- Now Ġis Ġ${ LocalDateTime . now () }\ n ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ- expire : Ġ${ LocalDateTime . now (). plus Days ( 3 0 )} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| ĠFound Ġ$ to Renew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Ġ""" . trim Margin ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Renew ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊ Ċ }