Vlákno názorů k článku
Let's Encrypt nevytlačil ze státní správy komerční certifikáty od Danny - Ne, to neni chyba vedeni, kdyz ocekava ze...

  • Článek je starý, nové názory již nelze přidávat.
  • 28. 2. 2025 19:17

    Danny
    Stříbrný podporovatel

    Ne, to neni chyba vedeni, kdyz ocekava ze automatizovatelne veci nedelate rucne. Nadrazi vam neobskakuje osm signalistu, co hazi vyhybky rucne - ale ovladate z jednoho mista vsechny, dnes v podstate doslova uz na kliknuti mysi. Pradlo doma si take predpokladam neperete s mydlem na valse, ale hodite ho do automatky, nasypete prasek, pustite a jdete od toho ;-)

    To s tim certifikatem - ehm, kolik lidi se podiva, od koho ten certifikat je? Jasne, ja jsem taky svym zpusobem geek a delam divny veci... ale kdybych vlastni mame rekl, ze existuje neco jako certifikat, tak ji vybuchne hlava... :-) Aneb znovu, jsou veci, co 99% lidi proste neresi a jejich vyznam je precenovan. S tim gyrosem opatrne... :D Ono zvlast v modernich nakupnich chramech se vam to klidne prihodit muze... kdyz teda pomineme pozvolny trend uzavirani kamennych pobecek i u tech bank...

  • 28. 2. 2025 20:15

    Heron

    Ne, to neni chyba vedeni, kdyz ocekava ze automatizovatelne veci nedelate rucne.

    Je to chyba vedení, protože pokud ten IT tým nezvládá obnovovat crt (což je činnost k odpolední kávě a novinám, prostě nobrainer), tak to automaticky znamená, že nestíhá dělat mnohem podstatnější věci. Prostě pokud se tady skutečně už několik dnů bavíme o tom, že IT nezvládá jednou za rok vyměnit crt pro jednu doménu, tak se obávám, že mají mnohem větší problém, na který třeba zatím není z venku vidět. Třeba jako měnit vadné disky v poli nebo nasazovat zero day aktualizace nebo třeba ... zálohovat.

    Nadrazi vam neobskakuje osm signalistu, co hazi vyhybky rucne - ale ovladate z jednoho mista vsechny, dnes v podstate doslova uz na kliknuti mysi.

    To je sice "hezké", ale současně to vlastně vůbec nic neřeší, že jo. Ano, vyhodila se hromada lidí, nemusejí dělat fyzicky těžkou práci, máme tabulky, diplom, nositel řádu práce a polibek od Brežněva, ale já jako cestující se stejně dopředu nedozvím (třeba z jízdního řádu) ze kterého nástupiště ten vlak příští měsíc pojede, protože topologie toho nádraží se mění tak rychle, že se odjezd vlaku pro jistotu změní i během čekání. Prostě se nám nečekaně změnila topologie nádraží, to se nedalo očekávat, vůbec to není už sto let stejné.

    To s tim certifikatem - ehm, kolik lidi se podiva, od koho ten certifikat je?

    Argumentační faul argumentace uživatelem. To, že člověk nepozná, že pije vodu s arsenem fakt neznamená, že tam ten arsen má být. Důležité je, že to pozná odborník.

    S tim gyrosem opatrne... :D

    Já ho mám taky rád, jím ho častěji, než přiznávám svému lékaři, ale s bankou bych to fakt nekombinoval.

    Ono zvlast v modernich nakupnich chramech se vam to klidne prihodit muze...

    Do moderních chrámů nákupů chodím pouze přes svou mrtvolu. V podstatě tam chodím pouze z donucení - třeba tady bylo potřeba zrušit jednu pobočku pošty a přesunout jí do nákupního chrámu, teda ehm, ona se ta pobočka vlastně nezrušila, no tak ale co, stejně vám veškerou poštu světa budeme posílat do toho .... chrámu. Protože to máte dál a je to horší cestou. Racionalizace sítě poboček. Takže chodím kolem otevřené pobočky do té vzdálenější.

    Jestli tohle napadne banku, tedy zrušíme kamennou pobočku, vykašleme se na digitalizaci a to, co by šlo vyřídit klikáním (stejně jako na tom nádraží :-D) tak ... o tom napíšu blog :D

  • 28. 2. 2025 20:59

    Danny
    Stříbrný podporovatel

    Stokrat nic umori i osla. Proste kdyz zabijite cas u podobnych nicotnosti, kterych muzou byt klidne desitky, na kloudnou praci neni cas. Jedna domena... no, vetsinou jich i v mensi firme mate vic. A ono se to proste nascita.

    Zalohovani je dalsi task, co ma byt automatizovany a nikoliv spolehajici na to, ze admin u odpoledni kavicky odklikne tlacitko BACKUP. Vymena vadneho disku je neco, co zvladne - pardon - i cvicena opicka, a klidne to muze byt ten "nobrainer" - ale tady mj. take plati, ze neni dobry napad setrit za kazdou cenu na hardware a cpat tam nejlevnejsi sunty. A taky to neni cinnost, co by se delala periodicky, narozdil od tech certifikatu.

    Jestli si chcete zkusit, jake to je ridit provoz na takovem nadrazi - moznost mate, existuji programky typu Unisim. Rekl bych, ze behem par desitek minut vas ta simulace dostane do stavu, kdy sam nebudete schopny garantovat peron... nebo se vam zacnou podezrele hromadit vlaky :D To vite - zpozdeni, mimoradnosti.... a nejaky planovani peronu jde rychle tak nejak cely do zachodove misy a obratem zacnete tezce improvizovat... :D I v osobni doprave mate jednu nevyzpytatelnou promennou - a to je chovani cestujicich, co tyhle problemy proste generuje. Kazdopadne automatizace i tohle servisni cinnost dost urychluje... ono nez jste zdirigoval toho vyhybkare, co ma kam nahazet, nez vam to cely obehnul... no proste deset minut sem, deset minut tam... zadna mira. No a obcas se stane, ze vam tu veksli hodi blbe a vlak vam jede kam nema...

    Odbornik se pozna tak, ze doda argumenty dokladujici vyssi bezpecnost pri pouziti EV/OV certifikatu. Zatim tu ale nic takoveho nepadlo - a co padlo, tak je spis v rovine "placebo". Toliko k "arsenu" ;-) Bezpecnost resime hlavne pro ty (bezny) uzivatele, ne pro uspokojeni sveho libida...

  • 1. 3. 2025 8:18

    Heron

    Zalohovani je dalsi task, co ma byt automatizovany

    No samozřejmě. A pokud to zálohování selže, tak ten úřad má trochu větší problém, než jen v CA od které bere crt.

    Jestli si chcete zkusit, jake to je ridit provoz na takovem nadrazi - moznost mate, existuji programky typu Unisim.

    To ani není potřeba. Půlka rodiny pracuje u AŽD, tak vím věci, které ani vědět nechci.

    Rekl bych, ze behem par desitek minut vas ta simulace dostane do stavu, kdy sam nebudete schopny garantovat peron... nebo se vam zacnou podezrele hromadit vlaky :D

    Tohle je ve skutečnosti moc dobrej příklad. Cílem automatizace vůbec nemá být stav, kdy tam toho bude tolik, že to člověk už prostě nezvládne. A na to nádraží a koleje se fyzicky vleze pouze x vlaků, takže ani sebelepší automatizace s tím nic neudělá. To se potom prostě musí postavit nová kolej. A nasadit automatizaci s cílem nedělat žádné inovace je vlastně jen kontraproduktivní. A vzhledem k tomu, že jednotka dočasnosti je jeden furt, tak než stavět dočasná řešení, tak je vlastně lepší, když to selže s plnou parádou okamžitě.

  • 1. 3. 2025 8:35

    Danny
    Stříbrný podporovatel

    Automatizovane procesy musite hlidat stejne, jako musite hlidat tu manualni lopatu. Ono situaci, kdy pracovnik deklaruje cinnost, kterou v realu nevykonava pamatuje historie spoustu :D

    Ta automatizace vam umoznuje mj. optimalizovat "toky" v siti. Neridite provoz jen od nadrazi k nadrazi systemem, kdy si vypravci telefonicky prehazuji soupravu od stanice ke stanici. Vidite a ridite uceleny pohyb vlaku na cele trati a muzete mj. ridit jejich rychlost tak, aby se vam nejake nadrazi nepreplnilo. Kdyz mate pulku familie na AZD, tak jste jiste slysel o CDP ;-) A samozrejme to otevira dvere i do budoucna, pokud se bavime o tech inovacich, ktere by byly s vyhybkama prehazovanyma rucne z mista a s vypravcim na kazdem rohu nemyslitelne...

  • 1. 3. 2025 9:39

    Heron

    Ta automatizace vam umoznuje mj. optimalizovat "toky" v siti.

    Neříkej :-D Už když jsem vylezl z prvního semestru informatiky na pomocné škole, tak jsme si s kámošem říkali, že by se to (průchod grafem) mohlo uvést do praxe, třeba v případě nehody na silnici by se to automaticky mohlo přeroutovat, mohly by být třeba chytré značky, které by ukazovaly směr dle aktuální situace, nebo, kdyby bylo fakt nejhůř a ty značky by nešlo nainstalovat, tak by třeba dopravní policie mohla korigovat dopravu na předchozí křižovatce. Střih o 20 let později: Každá nehoda automaticky znamená kolony přes půl republiky.

    Takže CDP je moc dobrej nápad no. Třeba se někdy dožiju toho, že to k něčemu bude.

    Hele, tohle se prostě ukecat nedá. Ano, všechno co píšeš jsou skvělé nápady a ano, používají se v praxi. Ale v některých případech to fakt slouží jen na tu nálepku "podívejte se, jak jsme moderní" a za zdí to těžce hnije. Prostě někde to funguje i za situace, že se spousta věcí dělá manuálně a někde to nefunguje ani s tou automatizací.

  • 1. 3. 2025 11:45

    Danny
    Stříbrný podporovatel

    No ale v pripade statni spravy se opakovane ukazalo, ze rucni obskakovani vede k tomu, ze na nas odnekud vybafne propadly certifikat :-)

  • 1. 3. 2025 13:50

    Heron

    No ale v pripade statni spravy se opakovane ukazalo, ze rucni obskakovani vede k tomu, ze na nas odnekud vybafne propadly certifikat :-)

    Jenže tohle by se stalo i u ACME. Pokud někdo obnoví certifikát na 25 místech a hle, ono je tam ještě 26, tak jednak v tom má někdo nepořádek, ale tady s ACME je to ještě složitější, protože potom bude nutně potřeba nějaká interní automatika.

    Už jen to, že jeden crt je na více místech je samo o sobě ... sice ne nutně špatně, ale k zamyšlení nad hledáním lepšího uspořádání.

    Ona je i zábava třeba automaticky obnovovat crt od LE pro web a pro email server. Je potřeba to automaticky obnovit na třech místech. A restartovat tři služby. A už třeba s tímto některé ty acme skripty vůbec nepočítají. Takže je potřeba to dát do ansible a ten pro jistotu volat každý den. Potom někdo nepočítá s tím, že se ansible volá automaticky a zmrví playbook a už to taky nefunguje. Ona ani ta automatika není moc automatická.

    Tady uplyne ještě hodně vody než si to všechno sedne.

  • 1. 3. 2025 15:07

    Danny
    Stříbrný podporovatel

    Zvlastni, ze na podobne problemy nenarazim :-) Nevite, cim ze to je? A ted si predstavte tu hruzu... ze mj. pouzivam i DANE a mailserver mam jinde nez primar... :D S vasim pristupem bych musel kazdou chvili jeste editovat obsah DNS... :D Ne, diky... cas se da travit i lepe ;-)

  • 1. 3. 2025 15:35

    Heron

    To není můj přístup. Ale je mi jasné, že celou dobu směřuješ k tomu si takto kopnout. ;-)

    mailserver mam jinde nez primar

    Jakej primár? Mít mail server a webserver s webových mail klientem je celkem přínosné. Akorát je potřeba jeden cert dostat do nginx/apache, dovecot, postfix. A tedy restartovat tři služby. Což je v pohodě, akorát potom člověk narazí na "vlastnost" některých acme klientů, že třeba ne zcela spolehlivě provádějí všechny hook skripty. To je celý obsah sdělení. Od dob nasazení LE někdy v roce 2016 jsem se setkal s ledasčím. Od produkčních věcí očekávám trochu jinou kvalitu. Tohle není kritika CA LE, vůbec ne, jen takový povzdech nad tím, co se doporučuje jako oficiální klient apod.

  • 1. 3. 2025 18:28

    Danny
    Stříbrný podporovatel

    Mysleno, ze me primarni DNS server mi bezi jinde nez ty maily, no bylo ode mne naivni cekat, ze vam to dojde :-) Vidite, ja treba "jeden" cert menim krom postfixu a nginxu treba i pro xmpp & irc... a mj. se snazim mit obecne ty sluzby oddelene trosicku "vic", nez jen na urovni separace UID, pod kterym to bezi - a ve vysledku mit server v rezimu "devky pro vsechno" - nein, danke... z toho jsem uz vyrost :-) Ono treba i ten ten "jeden" z mych nginxu realne obsluhuje vicero domen, kazdou neprekvapive se svym certifikatem. A celkem spokojene si to zije svym bezobsluznym zivotem :-)

    V obecne rovine se rozhodne nedomnivam, ze by tooling kolem ACME byl nevhodny na produkcni nasazeni. Rozhodne je na vyssi urovni, nez nektere bastly, co vam "do produkce" dodaji nekteri komercni dodavatele :-)

  • 2. 3. 2025 10:21

    Heron

    Mysleno, ze me primarni DNS server mi bezi jinde nez ty maily, no bylo ode mne naivni cekat, ze vam to dojde :-)

    No mě to došlo, ale nebylo jasné, jak dns server souvisí s restartem služeb pro obnovu crt.

    A celkem spokojene si to zije svym bezobsluznym zivotem :-)

    To věřím. Ono je potom jen otázka, zda to nasazení automatizace náhodou neznamená počáteční konfiguraci rovnající se 100 letům manuálního provozu. Ale to si musí posoudit každý admin sám. I to, co chce vlastně dělat. Já mám prostě na automatizaci daleko vyšší nároky, protože zatím každá nadšenecká automatizace znamenala daleko větší (počáteční) konfiguraci, než manuální práce. Ale tak to je asi vždycky, reklama na ansible ve znění ušetřete si tisíce ručních příkazů tímto jedním nasazením je prostě klamavá v mnoha směrech. Ale tak to už je na jinou debatu.

    V obecne rovine se rozhodne nedomnivam, ze by tooling kolem ACME byl nevhodny na produkcni nasazeni. Rozhodne je na vyssi urovni, nez nektere bastly, co vam "do produkce" dodaji nekteri komercni dodavatele :-)

    No to je asi jako porovnávat které hovno si dám dneska k obědu. No žádné :-D

  • 2. 3. 2025 12:47

    Danny
    Stříbrný podporovatel

    No, to jsou ta magicka pismenka "DANE" - tam publikujete TLSA zaznamy do DNS, zeano... :-) A ten TLSA zaznam obsahuje informace o verejnem klici certifikatu. Ano, prohlizece se buhviproc brani a podobne metody verifikace certifikatu se brani jak cert krizi... ale treba na komunikaci mezi mailservery to funguje.

    Pocatecni konfigurace ze znamena sto let manualniho provozu? ;-) To tezko. Rozjet to na zelene louce je otazka nekolika minut. A rozhodne v souctu je ta to manualni nahravani certifikatu naopak zdlouhavejsi. Tady se nebavime o nejake nadsenecke automatizaci, ale pouzivani proverenych a davnoexistujicich reseni. Ono kdyz se podivate na instituce typu Cloudflare, tak zjistite ze to vlastne jinak ani moc nejde. Kdyby to tam delali vasi "rucni metodou"... tak to zamestna stovky tisic lidi.

  • 2. 3. 2025 16:09

    Heron

    Ono kdyz se podivate na instituce typu Cloudflare

    Jenže tohle je argumentace extrémem.

    Pokud chci provozovat stovky tisíc serverů, tak mi nic než automatizace nezbyde. Jenže potom je pohled z druhé strany (mé ;-)). Služby typu Clouflare vlastně vůbec nepotřebuju, ale hlavně, provozuju takový počet serverů, na které je automatizace minimálně stejně náročná, jako manuál.

    Prostě, jestli napíšu zfs create; bsdinstall; tak mám kontejner na dva příkazy. Stejně tak, když napíšu vim playbook; ansible-playbook, tak jsou to dva příkazy. Jenže ten ansible playbook musím nejdřív napsat, napsat všechny role a možná i moduly, řádně to otestovat apod. A v tuto chvíli už se dostávám do stavu, kdy je manual mnohem méně pracný a daleko efektivnější. Pro ten počet, který reálně spravuju. Navíc je to vrstva navíc, takže pokud aktualizace rozbije ansible*, tak jsem právě přišel o nástroj na správu stovek serverů. A ve chvíli, kdy aktalizace rozbije "bsdinstall", tak by stejně nejel ani ten ansible. Prostě vrstva navíc, která v malých počtech nic nepřinese.

    *) Nebo se rozbije ten Cloudflare. Prakticky každý den vidím chybovou hlášku z CF. V roli uživatele opravdu nebudu pátrat, na které straně je problém (a v roli admina adminovi toho serveru poradím tuhle vrstvu odstranit), ale u jiných serverů bez další mezivrstvy tyto problémy nevidím.

  • 2. 3. 2025 18:05

    Danny
    Stříbrný podporovatel

    To ale prece nejsou zadne extra extremy. Jaane, clovek asi cloudflare nepotrebuje... pokud ma kapacity na reseni nejakeho WAF a vubec nejakych aplikacnich DDoS mitigaci. Ono fakt neni prdel tohle resit... kdyz to chcete delat opravdu poradne.

    Ano, prvotni start muze byt zdanlive slozity - ale ve finale vam s tim dnes dost pomuze AI. Jasne, clovek to musi revidovat.. ale nemusi vynalezat kolo. Aneb argument pracnosti jaksi pada...

    Hlasky z CF - a ctete taky obsah? ;-) Dost casto je ta hlaska prave o tom, ze nefunguje koncovy aplikacni server. A za to CF fakt nemuze, zeano.

'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »