werk21 blog - Hier bloggt das Team von www.werk21.de über Technik & mehr. https://blog.werk21.de/de de Open multiple key database files upon KeePass2 startup https://blog.werk21.de/en/2018/09/24/open-multiple-key-database-files-upon-keepass2-startup <span>Mehrere Schlüssel-Datenbanken beim Start von KeePass2 öffnen</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Mo., 24.09.2018 - 08:39 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><a href="https://keepass.info/">KeePass2</a> hat eine Einstellung, um die letzte geöffnete Schlüssel-Datenbank beim Starten zu öffnen, aber wie kann man mehrere Schlüssel-Datenbanken automatisch öffnen? Eine Möglichkeit, das einzurichten, ist das Hinzufügen eines sog. <em>Trigger</em>s.</p> <ol> <li>Öffne <em>Tools</em> &gt; <em>Options</em> &gt; <em>Advanced</em> und überprüfe, dass die Einstellung <em>Remember and automatically open last used database on startup</em> nicht angehakt ist.</li> <li>Öffne <em>Tools</em> &gt; <em>Triggers</em> und klicke auf die Schaltfläche <em>Add</em>.</li> <li>Im Tab <em>Properties</em> gibst du einen Namen für den neuen Trigger nach deinem Gusto an.</li> <li>Im Tab <em>Events</em> klickst du auf die Schaltfäche <em>Add</em> und fügst dann einen Event <em>Application started and ready</em> hinzu.</li> <li>Im Tab <em>Actions</em> klickst du auf die Schaltfläche <em>Add</em> undf fügst eine Aktion <em>Open database file</em> hinzu. Als Wert der Einstellung <em>File/URL</em> gibst du dabei den vollständigen Pfad zu deiner Schlüssel-Datenbank-Datei an. Auch wenn du ein Kennwort verwendest, um die Datenbank-Datei zu öffnen, solltest du die <em>Password</em>-Einstellung trotzdem leer lassen, da die Einstellung unverschlüsselt gespeichert wird. Du wirst dann wie üblich beim Starten von KeePass2 nach dem Kennwort gefragt.</li> <li>Füge weitere <em>Open database file</em> Aktionen für jede zusätzliche Datenbank-Datei hinzu, die du öffnen möchtest.</li> </ol></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systeme/pc" class="label label-default" hreflang="de">PC</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/en/tags/keepass2" class="label label-default" hreflang="en">KeePass2</a> </div> Mon, 24 Sep 2018 06:19:16 +0000 patrick 145 at https://blog.werk21.de Subnetz, Zusatz-IPs oder Failover-IPs mit netplan / systemd bei Hetzner konfigurieren (Ubuntu 18.04 / Xen) https://blog.werk21.de/de/2018/07/06/subnetz-zusatz-ips-oder-failover-ips-netplan-systemd-hetzner-konfigurieren-ubuntu-1804 <span>Subnetz, Zusatz-IPs oder Failover-IPs mit netplan / systemd bei Hetzner konfigurieren (Ubuntu 18.04 / Xen)</span> <span><span lang="" about="/de/user/15" typeof="schema:Person" property="schema:name" datatype="">kelly</span></span> <span>Fr., 06.07.2018 - 08:31 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><h2>Host-Konfiguration</h2> <p>Der Server unter Ubuntu 18.04 wird vom Hetzner-Script installimage mit netplan installiert (vorher mit systemd-network).</p> <h3>Netzwerk-Konfiguration</h3> <p>Für Zusatz-IPs, Subnetze oder Fail-Over-IP-Adressen ist keine Konfiguration des Hosts-System nötig, wenn diese Adressen von den Xen-Gästen verwendet werden sollen.</p> <h3>Routed Network</h3> <p>Bei Hetzner muss xen als routed network betrieben werden. Die entsprechenden Konfigurations-Dateien <strong>/etc/xen/xl.conf </strong>sind dahingehend anzupassen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">vif<span style="color: #339933;">.</span><span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>script<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;vif-route&quot;</span> vif<span style="color: #339933;">.</span><span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>gatewaydev<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;eth0&quot;</span></pre></div> <p>Statt eth0 muss die Bezeichnung der Netzwerkkarte verwendet werden.</p> <p>Anschließend muss das Routing im System in der Datei <strong>/etc/sysctl.d/99-hetzner.conf </strong>aktiviert werden:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">net<span style="color: #339933;">.</span>ipv4<span style="color: #339933;">.</span>ip_forward<span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span></pre></div> <p>Anschließend laden der Konfigurationen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">sysctl <span style="color: #339933;">-</span>p <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>sysctl<span style="color: #339933;">.</span>conf</pre></div> <h2>Konfiguration virtueller Maschinen</h2> <p>Nach der Einrichtung mit xen-tools existiert keine funktionierende Netzwerk-Konfiguration. Über die xen-Konsole muss das Netzwerk eingerichtet werden.</p> <h3>Netzwerk</h3> <p>Netzwerk-Einstellungen in <strong>/etc/systemd/network/10-eth0.network</strong>:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>Match<span style="color: #009900;">&#93;</span> Name<span style="color: #339933;">=</span>eth0 &nbsp; <span style="color: #009900;">&#91;</span>Address<span style="color: #009900;">&#93;</span> Address<span style="color: #339933;">=</span>aaa<span style="color: #339933;">.</span>bbb<span style="color: #339933;">.</span>ccc<span style="color: #339933;">.</span>ddd Peer<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD<span style="color: #339933;">/</span><span style="color: #cc66cc;">32</span> &nbsp; <span style="color: #009900;">&#91;</span>Route<span style="color: #009900;">&#93;</span> Gateway<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD</pre></div> <ul> <li>aaa.bbb.ccc.ddd IP-Adresse der VM</li> <li>AAA.BBB.CCC.DDD IP-Adresse des Host-Systems</li> </ul> <p>Durch die Verwendung von Peer (was PointToPoint) entspricht, können alle IP-Adressen eines Subnetzes verwendet werden, da kein Routing im Subnetz benötigt wird.</p> <h4>Konfiguration laden</h4> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">systemctl enable systemd<span style="color: #339933;">-</span>networkd service systemd<span style="color: #339933;">-</span>networkd start ip route add <span style="color: #b1b100;">default</span> via AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD </pre></div> <ul> <li>AAA.BBB.CCC.DDD IP-Adresse des Host-Systems</li> </ul> <h3>Nameserver ohne systemd</h3> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">systemctl disable systemd<span style="color: #339933;">-</span>resolved<span style="color: #339933;">.</span>service systemctl stop systemd<span style="color: #339933;">-</span>resolved &nbsp; rm <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>resolv<span style="color: #339933;">.</span>conf &nbsp; cat <span style="color: #339933;">&lt;&lt;</span> EOF <span style="color: #339933;">&gt;</span> <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>resolv<span style="color: #339933;">.</span>conf nameserver 213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>98<span style="color: #339933;">.</span>98 nameserver 213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>100<span style="color: #339933;">.</span>100 nameserver 213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>99<span style="color: #339933;">.</span>99 EOF &nbsp; service postfix restart</pre></div> <h3>Nameserver mit systemd</h3> <p>In Datei <strong>/etc/systemd/resolved.conf</strong> ergänzen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">DNS<span style="color: #339933;">=</span>213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>98<span style="color: #339933;">.</span>98 213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>100<span style="color: #339933;">.</span>100 213<span style="color: #339933;">.</span>133<span style="color: #339933;">.</span>99<span style="color: #339933;">.</span>99</pre></div> <h4>Konfiguration laden</h4> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">service systemd<span style="color: #339933;">-</span>resolved restart</pre></div> <h4>Resolver-Status kontrollieren</h4> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">systemd<span style="color: #339933;">-</span>resolve <span style="color: #339933;">--</span>status</pre></div> <h3>Löschen /etc/network/interfaces</h3> <p>Die alte Konfiguration muss noch gelöscht werden, damit diese nicht später genutzt wird.</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">rm <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>network<span style="color: #339933;">/</span>interfaces</pre></div> <h3>Weitere IP-Adressen konfigurieren</h3> <p>Werden weitere IP-Adressen benötigt (z.B. eine zusätzliche Failover-IP), wird diese als weitere IP-Adresse in der Xen-Gast-Konfiguration hinterlegt:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">vif <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">'ip=aaa.bbb.ccc.ddd/32 eee.fff.ggg.hhh/32 iii.jjj.kkk.lll/32,mac=AA:AA:AA:AA:AA:AA'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#93;</span></pre></div> <p>Es empfiehlt sich, eine MAC-Adresse zu vergeben, um nach dem Neustart eines Gastes nicht mit dem arp-cache des Hosts in Konflikt zu geraten.</p> <p>Die IP-Adressen werden alle auf eth0 im Gast zur Verfügung gestellt.</p> <p>Die Konfiguration von eth0 muss entsprchend in <strong>/etc/systemd/network/10-eth0.network</strong> angepasst werden:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>Match<span style="color: #009900;">&#93;</span> Name<span style="color: #339933;">=</span>eth0 &nbsp; <span style="color: #009900;">&#91;</span>Address<span style="color: #009900;">&#93;</span> Address<span style="color: #339933;">=</span>aaa<span style="color: #339933;">.</span>bbb<span style="color: #339933;">.</span>ccc<span style="color: #339933;">.</span>ddd Peer<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD<span style="color: #339933;">/</span><span style="color: #cc66cc;">32</span> &nbsp; <span style="color: #009900;">&#91;</span>Address<span style="color: #009900;">&#93;</span> Address<span style="color: #339933;">=</span>eee<span style="color: #339933;">.</span>fff<span style="color: #339933;">.</span>ggg<span style="color: #339933;">.</span>hhh Peer<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD<span style="color: #339933;">/</span><span style="color: #cc66cc;">32</span> &nbsp; <span style="color: #009900;">&#91;</span>Address<span style="color: #009900;">&#93;</span> Address<span style="color: #339933;">=</span>iii<span style="color: #339933;">.</span>jjj<span style="color: #339933;">.</span>kkk<span style="color: #339933;">.</span>lll Peer<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD<span style="color: #339933;">/</span><span style="color: #cc66cc;">32</span> &nbsp; <span style="color: #009900;">&#91;</span>Route<span style="color: #009900;">&#93;</span> Gateway<span style="color: #339933;">=</span>AAA<span style="color: #339933;">.</span>BBB<span style="color: #339933;">.</span>CCC<span style="color: #339933;">.</span>DDD</pre></div> <ul> <li>aaa.bbb.ccc.ddd IP-Adresse der ursprünglichen IP-Adresse</li> <li>eee.fff.ggg.hhh IP-Adresse der zusätzlichen IP-Adresse</li> <li>iii.hhh.jjj.lll IP-Adresse der weiteren zusätzlichen IP-Adresse</li> <li>AAA.BBB.CCC.DDD IP-Adresse des Host-Systems</li> </ul> <p>Nicht immer funktioniert der Neustart von systemd-networkd sauber. Ein reboot des Systems liefert verlässlichere Ergebnisse.</p> <p>Aktualisiert am 2018-12-17. Die vorherige Lösung mit verschiedenen Netzwerk-Adaptern im Gast hat sich nicht bewährt.</p></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/server" class="label label-default" hreflang="de">Server</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/ubuntu" class="label label-default" hreflang="de">ubuntu</a> <a href="/en/tags/network" class="label label-default" hreflang="en">network</a> <a href="/de/tags/xen" class="label label-default" hreflang="de">xen</a> </div> Fri, 06 Jul 2018 06:31:14 +0000 kelly 141 at https://blog.werk21.de Date (range) fields and Entity Query [Update] https://blog.werk21.de/en/2018/02/05/date-range-fields-and-entity-query-update <span>Datums-Felder und Entity Query [Update]</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Mo., 05.02.2018 - 08:37 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Du wolltest immer schon mal eine <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21Query%21QueryInterface.php/function/QueryInterface%3A%3Acondition/8.4.x">condition</a> für ein Datums-Feld zu einer Drupal 8 <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal.php/function/Drupal%3A%3AentityQuery/8.4.x">entity query</a> hinzufügen? So funktioniert es zuverlässig:</p> <p>In Drupal 8.5.x oder höher:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Drupal\Core\Datetime\DrupalDateTime<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">use</span> Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Get a date string suitable for use with entity query.</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DrupalDateTime<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTimezone</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> \DateTimeZone<span style="color: #009900;">(</span>DateTimeItemInterface<span style="color: #339933;">::</span><span style="color: #004000;">STORAGE_TIMEZONE</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">(</span>DateTimeItemInterface<span style="color: #339933;">::</span><span style="color: #004000;">DATETIME_STORAGE_FORMAT</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Set the condition.</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date.value'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&gt;'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></div> <p>In Drupal 8.4.x oder niedriger:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Drupal\Core\Datetime\DrupalDateTime<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Get a date string suitable for use with entity query.</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DrupalDateTime<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTimezone</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> \DateTimeZone<span style="color: #009900;">(</span>DATETIME_STORAGE_TIMEZONE<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">(</span>DATETIME_DATETIME_STORAGE_FORMAT<span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Set the condition.</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date.value'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&gt;'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></div> <p>Der Trick ist, dass wir ein <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Datetime%21DrupalDateTime.php/class/DrupalDateTime/8.4.x">DrupalDateTime</a>-Objekt verwenden, für das wir die korrekte Zeitzone des Datums-Speichers setzen (zur Verfügung gestellt durch die Konstante  <a href="https://api.drupal.org/api/drupal/core%21modules%21datetime%21datetime.module/constant/DATETIME_STORAGE_TIMEZONE/8.4.x"><span class="geshifilter"><code class="php geshifilter-php">DATETIME_STORAGE_TIMEZONE</code></span></a>) und dann einen String im korrekten Datums-Format, das vom Datums-Speicher verwendet wird, abrufen (zur Verfügung gestellt durch die Konstante <a href="https://api.drupal.org/api/drupal/core%21modules%21datetime%21datetime.module/constant/DATETIME_DATETIME_STORAGE_FORMAT/8.4.x"><span class="geshifilter"><code class="php geshifilter-php">DATETIME_DATETIME_STORAGE_FORMAT</code></span></a>). Dadurch erhalten wir verlässliche Ergebnisse. Im obigen Beispiel wollte ich nur nach der aktuellen Zeit filtern, aber du kannst auch einen Datums-String an den <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Datetime%21DrupalDateTime.php/function/DrupalDateTime%3A%3A__construct/8.4.x">Konstruktor von DrupalDateTime</a> übergeben, wenn du ein anderes Datum verwenden möchtest.</p> <p><strong>Bitte beachte:</strong> In Drupal 8.5.x wurden die oben genannten Konstanten als <em>überholt</em> gekennzeichnet und durch entsprechende Konstanten eines neuen <a href="https://api.drupal.org/api/drupal/core%21modules%21datetime%21src%21Plugin%21Field%21FieldType%21DateTimeItemInterface.php/interface/DateTimeItemInterface/8.5.x"><span class="geshifilter"><code class="php geshifilter-php">DateTimeItemInterface</code></span></a> ersetzt. Sie werden in Drupal 9.x entfernt.</p> <p>Diese Objekte kann man mit der Methode <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21TypedData%21Type%21DateTimeInterface.php/interface/DateTimeInterface/8.4.x">getDateTime()</a> auch direkt aus Datums-Feldern von Entitäten abrufen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span> <span style="color: #009900;">(</span><span style="color: #000088;">$node</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">field_date_range</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$item</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">(</span><span style="color: #000088;">$item</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$index</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDateTime</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span></pre></div> <p>Falls du die experimentellen <em>date range</em> Felder (mit Start- und Enddatum) verwendet, musst du außerdem noch wissen, dass das Enddatum in einer Spalte namens <span class="geshifilter"><code class="php geshifilter-php">end_value</code></span> gespeichert wird.</p> <p>Ein etwas vollständigeres Beispiel, das Veranstaltungs-Inhalte in der Zukunft abruft, sieht so aus:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Drupal\Core\Datetime\DrupalDateTime<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">use</span> Drupal\Core\Language\LanguageInterface<span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// @note: In Drupal 8.5.x and later also include the following line: </span> <span style="color: #000000; font-weight: bold;">use</span> Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface<span style="color: #339933;">;</span>   <span style="color: #000088;">$storage</span> <span style="color: #339933;">=</span> \Drupal<span style="color: #339933;">::</span><span style="color: #004000;">service</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'entity_type.manager'</span><span style="color: #009900;">)</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStorage</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'node'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$storage</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getQuery</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'type'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'event'</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'status'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><a href="http://www.php.net/sort"><span style="color: #990000;">sort</span></a><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date_range.value'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ASC'</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><a href="http://www.php.net/sort"><span style="color: #990000;">sort</span></a><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date_range.end_value'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ASC'</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><a href="http://www.php.net/sort"><span style="color: #990000;">sort</span></a><span style="color: #009900;">(</span><span style="color: #0000ff;">'created'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ASC'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'langcode'</span><span style="color: #339933;">,</span> <span style="color: #009900;">[</span> \Drupal<span style="color: #339933;">::</span><span style="color: #004000;">service</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'language_manager'</span><span style="color: #009900;">)</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getCurrentLanguage</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">,</span> LanguageInterface<span style="color: #339933;">::</span><span style="color: #004000;">LANGCODE_NOT_APPLICABLE</span><span style="color: #339933;">,</span> LanguageInterface<span style="color: #339933;">::</span><span style="color: #004000;">LANGCODE_NOT_SPECIFIED</span><span style="color: #339933;">,</span> <span style="color: #009900;">]</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'IN'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// @note BEGIN: Code for Drupal 8.5.x and later: </span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DrupalDateTime<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTimezone</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> \DateTimeZone<span style="color: #009900;">(</span>DateTimeItemInterface<span style="color: #339933;">::</span><span style="color: #004000;">STORAGE_TIMEZONE</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">(</span>DateTimeItemInterface<span style="color: #339933;">::</span><span style="color: #004000;">DATETIME_STORAGE_FORMAT</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// @node END: Code for Drupal 8.5.x and later. </span>   <span style="color: #666666; font-style: italic;">// @note BEGIN: Code for Drupal 8.4.x and earlier:</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DrupalDateTime<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTimezone</span><span style="color: #009900;">(</span><span style="color: #000000; font-weight: bold;">new</span> \DateTimeZone<span style="color: #009900;">(</span>DATETIME_STORAGE_TIMEZONE<span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$date</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$date</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">format</span><span style="color: #009900;">(</span>DATETIME_DATETIME_STORAGE_FORMAT<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// @note END: Code for Drupal 8.4.x and earlier.</span>   <span style="color: #000088;">$and</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">andConditionGroup</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date_range.value'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&gt;'</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">notExists</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date_range.end_value'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #000088;">$or</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">orConditionGroup</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #000088;">$and</span><span style="color: #009900;">)</span> <span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'field_date_range.end_value'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$date</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&gt;'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">condition</span><span style="color: #009900;">(</span><span style="color: #000088;">$or</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #000088;">$ids</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$query</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$nodes</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$storage</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">loadMultiple</span><span style="color: #009900;">(</span><span style="color: #000088;">$ids</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></div> <p>Beachte, dass es zur Zeit <a href="https://www.drupal.org/project/drupal/issues/2580265">ein Problem in Drupal Core</a> mit verschachtelten Bedingungsgruppen für Entity Query gibt, die in diesem Beispiel verwendet werden.</p> <p><strong>Update:</strong> Dieser Beitrag wurde aktualisiert in Bezug auf Änderungen in Drupal 8.5.x (siehe <a href="https://www.drupal.org/node/2912980">Global constants in datetime.module are deprecated and DateTimeItemInterface has been introduced</a>).</p> <p> </p> </div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/date" class="label label-default" hreflang="de">date</a> <a href="/en/tags/date-range" class="label label-default" hreflang="en">date range</a> <a href="/en/tags/languagemanager" class="label label-default" hreflang="en">LanguageManager</a> <a href="/en/tags/getcurrentlanguage" class="label label-default" hreflang="en">getCurrentLanguage</a> <a href="/en/tags/languageinterface" class="label label-default" hreflang="en">LanguageInterface</a> <a href="/en/tags/drupaldatetime" class="label label-default" hreflang="en">DrupalDateTime</a> <a href="/en/tags/entity-query" class="label label-default" hreflang="en">entity query</a> <a href="/en/tags/entitytypemanager" class="label label-default" hreflang="en">EntityTypeManager</a> <a href="/en/tags/datetimeiteminterface" class="label label-default" hreflang="en">DateTimeItemInterface</a> </div> Mon, 05 Feb 2018 07:09:16 +0000 patrick 134 at https://blog.werk21.de Spectre und Meltdown https://blog.werk21.de/de/2018/01/04/spectre-und-meltdown <span>Spectre und Meltdown</span> <div class="field field--name-field-media field--type-entity-reference field--label-hidden field--item"><div> <div class="field field--name-thumbnail field--type-image field--label-hidden field--item"> <img src="/system/files/image/meltdown-spectre_0.png" width="1008" height="434" alt="Vorschaubild" title="Meltdown &amp; Spectre" loading="lazy" typeof="foaf:Image" class="img-responsive" /> </div> </div> </div> <span><span lang="" about="/de/user/15" typeof="schema:Person" property="schema:name" datatype="">kelly</span></span> <span>Do., 04.01.2018 - 22:05 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><em>Stand </em>2018-02-12 21:30 - <em>Wir beobachten die Nachrichten rund um die Exploits mit großem Interesse, da auch wir für den sicheren Betrieb von Servern verantwortlich sind. Unsere Erkenntnisse sammeln wir hier und haben uns entschieden, diese öffentlich zu machen. Die Zusammenstellung hat keinen Anspruch auf Vollständigkeit oder auf Richtigkeit. Dieses Dokument wird laufend überarbeitet (Update-Notizen finden sich am Ende), über Hinweise sind wir jederzeit dankbar. ky.</em></p> <ul> <li><a href="#exploits">Die Exploits</a></li> <li><a href="#angriffsmoeglichkeiten">Angriffsmöglichkeiten</a></li> <li><a href="#linux">Linux-Server</a></li> <li><a href="#firewalls">Firewalls</a></li> <li><a href="#updates">Updates</a></li> </ul> <h2 id="exploits">Die Exploits</h2> <p>Unter den Namen <strong>Spectre</strong> und <strong>Meltdown</strong> sind im Frühjahr 2017 <a href="https://spectreattack.com/">drei Sicherheitslücken</a> entdeckt worden, die sich bestimmte Eigenschaften der CPU zu nutze machen, um sensible Informationen aus anderen Prozessen auszulesen (Spectre) bzw. unerlaubt Informationen aus dem kompletten Hauptspeicher der physischen Maschine auszulesen (Meltdown). Neben dem Datenklau (z.B. Passworte) könnten sensible Informationen auch für die Erlangung von privilegierten lokalen Rechten verwendet werden.</p> <p>Die <strong>Fehlerbehebung ist sehr komplex</strong> bzw. nach Einschätzung vieler Expert*innen gar nicht völlig möglich, ohne die <strong>CPUs auszutauschen</strong>; daher konzentrieren sich zur Zeit alle Entwicklungen auf eine Minimierung der Risiken („Mitigation“).</p> <p>Für die Bugs sind drei international gültige <strong>Bug-Einträge</strong> (CVE - <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5753">CVE-2017-5753</a> <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5715">CVE-2017-5715</a> <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5754">CVE-2017-5754</a> ) erzeugt worden, gleichzeitig wurde vereinbart, vor dem 09.01.2018 diese Bugs nicht zu veröffentlichen („<strong>Embargo</strong>“). Dieses Embargo dient dazu, allen Beteiligten genug Zeit für die Bereitstellung von Updates einzuräumen. (Urlaubs- und ferienbedingt macht dieser Zeitpunkt Sinn - die Updates müssen ja auch zeitnah von irgendwelchen Admins* eingespielt werden.)</p> <p><strong>Leider hat das Embargo nicht gegriffen</strong>, aus Entwicklungskreisen drangen Hinweise nach außen, zuerst berichtete <a href="https://www.theregister.co.uk/2018/01/02/intel_cpu_design_flaw/">TheRegister</a> über eine derartige Lücke, woraufhin <a href="https://googleprojectzero.blogspot.de/2018/01/reading-privileged-memory-with-side.html">Google seine Erkenntnisse</a> am 3.1.18 veröffentlicht hat („Disclosure“), in den letzten Stunden haben viele weitere Anbieter nachgezogen.</p> <p><strong>Das Problem ist, dass nun diese Angriffsvektoren bekannt sind aber in vielen Fällen noch keine Updates bereit stehen.</strong> Angesichts der Tatsache, dass jegliche Hardware mit einem Prozessor von Intel, AMD oder Arm (AMD und Arm „nur“ Spectre) betroffen sind, ist das verdammt viel - PCs, Server, Smartphones, Router, Firewalls, IoT-Geräte, Embedded Hardware in Industrie oder Autos. Also eigentlich alles.</p> <p><strong>Cert Bund</strong> informiert in <a href="https://www.cert-bund.de/advisoryshort/CB-K18-0010%20UPDATE%201">CB-K18/0010</a>.</p> <h2 id="angriffsmoeglichkeiten">Angriffsmöglichkeiten</h2> <p><strong>Um diese Exploits auszunutzen</strong>, muss natürlich erst einmal der Angriffscode auf den Rechner gelangen und dort ausgeführt werden.<br /> <strong>Meltdown</strong> ist daher (bisher) kein Remote-Angriff, dafür kann mit einem erfolgreichen Angriff eines lokalen Accounts der ganze Hauptspeicher des ganzen <em>physischen</em> Servers ausgelesen werden. Mit etwas Pech finden sich dort genug Informationen, um danach das System zu übernernehmen. Unterdessen (8.1.) berichtet <a href="https://blog.fefe.de/?ts=a4ad9f54">Fefe über Hinweise</a>, dass Meltdown nicht ohne Weiteres ausgenutzt werden kann. Das bringt vielleicht etwas Zeit, bis die Kernel überarbeitet worden sind, v.a. auch in Hinblick auf künftige Performancegewinne - die aktuellen Lösungen dienen in meiner Wahrnehmnung vor allem dazu, die Lücke zuzunageln.<br /> <strong>Spectre</strong> hingegen kann auch remote verwendet werden, zum Beispiel scheint geschickt programmierter Javascriptcode (Javascript wird auf de facto jeder Webseite eingesetzt) auszureichen, damit der <a href="https://blog.mozilla.org/security/2018/01/03/mitigations-landing-new-class-timing-attack/">lokale Browser diese Lücke ausnutzt</a> und ein Angriff stattfinden kann. Theoretisch ist also ein Angriff (Ausspähen von Daten wie Passworten oder Dokumenten aus dem Browser (andere Tabs!), evtl. Installation von Schadcode) über Webseiten möglich. Microsoft, Chrome und Mozilla arbeiten bereits an Sofortmaßnahmen oder haben diese veröffentlicht (<a href="https://www.mozilla.org/en-US/security/advisories/mfsa2018-01/">Mozilla</a> <a href="https://support.google.com/faqs/answer/7622138#chrome">Chrome</a> <a href="https://blogs.windows.com/msedgedev/2018/01/03/speculative-execution-mitigations-microsoft-edge-internet-explorer/#TfomEjkbwK0QHoE8.97">Microsoft</a> <a href="https://support.apple.com/en-us/HT208394">Safari</a>).<br /> Gute Infos zu Exploits und <strong>Proof of Concepts</strong> liefern die Kolleg*en von <a href="https://entwickler.de/online/security/cpu-spectre-meltdown-579825774.html">entwickler.de</a>.</p> <p>Fatal ist die Lücke für <strong>Multiusersysteme</strong>, wie z.B. Hochschulserver. Jede/r User*in mit lokaler Kommandozeile kann theoretisch diese Lücken ausnutzen bzw. Opfer eines solchen Angriffs sein (z.B. Ausspähen von Daten wie Passworte oder E-Mails).</p> <p>Noch schlimmer wird es in der <strong>„Cloud“</strong> bzw. <strong>Virtualisierungsservern</strong>. Die dort laufenden virtuellen Systeme ("VServer") haben durch die Lücke von Meltdown die Möglichkeit, den <strong>Hauptspeicher aller anderen derzeit laufenden virtuellen Maschinen</strong> auszulesen. Alle im Hauptspeicher enthaltenen Daten all dieser virtuellen Maschinen auf der gleichen Hardware können im Klartext abgerufen und gespeichert werden. Dies sind nicht nur Dokumente, sondern auch Variablen von laufenden Programmen, in denen Daten oder Passworte abgelegt sein können.<br /> Betroffen davon sind wahrscheinlich ebenso <strong>Cloud-Dienste</strong> wie Amazon Cloud, Microsoft Azure oder Google Compute Engine - bei allen diesen Diensten teilen sich mehrere virtuelle Server die gleiche Hardware. Alle diese Dienste arbeiten bereits an Lösungen oder haben diese bereits eingespielt. Schwierig wird es für kleine Cloud-Betreiber sein, die nicht vorab über die Sicherheitslücken informiert wurden und nun einige schlaflose Nächte haben werden (die Kunden wohl auch).<br /> Betroffen sind aber auch <strong>Hostingprovider</strong>, die mit Virtualisierung arbeiten und einzelne VServer anbieten (wie Hetzner, Strato oder 1&amp;1 zum Beispiel - Hetzner informiert übrigens <a href="https://wiki.hetzner.de/index.php/Spectre_and_Meltdown">vorbildlich</a>). In den nächsten Tagen ist hier hoffentlich mit Updates zu rechnen.</p> <p>Für <strong>Windows-PCs</strong>, <strong>Apple (MacOS)</strong> und <strong>Smartphones </strong>gibt es bei <a href="https://www.n-tv.de/technik/Diese-Updates-flicken-die-Monster-Luecke-article20213503.html">n-tv eine gute Übersicht</a>. (Hoffentlich bieten viele Smartphone-Anbieter zügig Updates auch für alte Systeme an - ein riesen Sicherheitsproblem!)</p> <p><strong>Microsoft</strong> hat für <strong>Windows</strong> bereits sehr früh <a href="https://support.microsoft.com/en-us/help/4056892/windows-10-update-kb4056892">Updates geliefert und informiert</a>, weitere Updates folgten am <a href="https://support.microsoft.com/en-us/help/4073291/january-18-2018-kb4073291-os-build-16299-201">18.01.</a> und <a href="https://support.microsoft.com/en-us/help/4058258">31.01.</a>.</p> <p><strong>Apple</strong> hat sich am 5.1. auch <a href="https://support.apple.com/en-us/HT208394">geäußert</a>: Mitigations für Meltdown sind bereits veröffentlicht (iOS 11.2, macOS 10.13.2, and tvOS 11.2). Spectre: Updates für Safari (<a href="https://support.apple.com/de-de/HT208403">11.02</a>) für iOS (<a href="https://support.apple.com/de-de/HT208401">11.2.2</a>), macOS (<a href="https://support.apple.com/de-de/HT208397">10.13.2</a> und <a href="https://support.apple.com/de-de/HT208465">10.12.6 und 10.11.6</a>), für tvOS und watchOS ist anscheinend gegen Spectre noch nichts erschienen oder sie sind nicht betroffen.</p> <p><strong>Privatanwender </strong>sollten also dringend ihre PCs, Smartphones und Browser aktualisieren.</p> <h2 id="linux">Linux-Server</h2> <p>Für <strong>Linux-Server</strong> haben die Distributionen verschiedene Stände. Ein sinnvolles Update umfasst nach unserer Einschätzung ein <strong>Update des Microcodes</strong> der CPU, des Linux (<strong>Kernel</strong>) und der <strong>Virtualisierungssoftware</strong> / Hypervisor (kvm, qemu, xen, ...):</p> <p>Mit einem <strong>Update des Microcodes</strong> kann das Verhalten der CPU geändert werden ("Firmware-Update"). Die modernen CPUs bieten dafür Möglichkeiten, damit diesen Updatevorgang die Betriebssystem-Software übernimmt.<br /> <strong>Intel </strong>hat <a href="https://newsroom.intel.com/news-releases/intel-issues-updates-protect-systems-security-exploits/">am 4.1. mitgeteilt</a>, dass Updates für Prozessoren der letzten fünf Jahre bereitgestellt werden. Dieses wird in einer <a href="https://newsroom.intel.com/news/intel-offers-security-issue-update/">Mitteilung vom 09.01</a>. konkretisiert. In einem offenen Brief ("<a href="https://newsroom.intel.com/news-releases/security-first-pledge/">Security-First Pledge</a>") vom 11.01. sichert Intel die Zurverfügungstellung der Microcode-Updates bis Ende Januar vor, wobei bis zum 15.1. bereits Patches für 90% der Prozessoren aus den letzten fünf Jahren bereit gestellt werden sollen. Das hat offensichtlich nicht geklappt.<br /> Am 09.01. hat Intel neuen Microcode bereitgestellt, der aber nach einigen Tagen aufgrund diverser Probleme wieder zurückgezogen wurde (Link zur <a href="https://downloadcenter.intel.com/de/product/873/Prozessoren">Liste der Microcode-Updates</a>). <br /> Außerdem existiert ein <a href="https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00088&amp;languageid=en-fr">Intel Security Advisory</a>. Am 7.2. hat Intel eine neue Version des Microcodes an die Industrie- und OEM-Partner zur Verfügung gestellt. Wann diese als stabile Veröffentlichung frei gegeben werden bleibt abzuwarten. Eine <a href="https://newsroom.intel.com/wp-content/uploads/sites/11/2018/02/microcode-update-guidance.pdf">Liste der betroffenen Prozessoren</a> gibt es unterdessen auch.<br /> Am 12.02. hat ein Intel <a href="https://newsroom.intel.com/wp-content/uploads/sites/11/2018/02/microcode-update-guidance.pdf">dieses PDF-Dokument</a> veröffentlicht, in dem alle CPUs gelistet sind, für die es Mitigitaions geben wird, ebenso wie der Arbeitsstand dafür ist.<br /> Was mit einem Microcode-Update gerettet werden kann, bleibt abzuwarten. Wie oben beschrieben, gehen die meisten davon aus, dass nur mit neuen CPUs Abhilfe wirksam geschaffen werden kann.<br /> Links zu <a href="https://01.org/security/advisories/intel-oss-10002">Intel-OSS-10002</a> und <a href="https://01.org/security/advisories/intel-oss-10003">Intel-OSS-10003</a>.</p> <p>Für <strong>Xen</strong> existiert bisher ein <a href="https://xenbits.xen.org/xsa/advisory-254.html">Sicherheits-Advisory</a> (unterdessen Version 10 vom 2018-01-18 18:38) und eine <a href="https://blog.xenproject.org/2018/01/04/xen-project-spectremeltdown-faq/">FAQ</a> vom 4.1. und eine <a href="https://blog.xenproject.org/2018/01/22/xen-project-spectre-meltdown-faq-jan-22-update/">aktualisierte FAQ</a> vom 22.1.. Im Fokus stehen Schutzmaßnahmen gegen Meltdown ("SP3"). Betroffen sind 64-Bit PV-Gäste. Xen arbeitet an einer Lösung für die Versionen ab 4.6 und neuer, um <a href="https://de.wikipedia.org/wiki/Kernel_page-table_isolation">PTI/Kaiser</a> für Xen zu ermöglichen, die Performance wird als "fair" angegeben und der Testing-Status als "very new". Bis dahin empfiehlt Xen den <strong>Einsatz von HVM</strong>, was jedoch den Umbau der PV-Gäste erfordert und die Leistung beeinträchtigt. Um den Übergang zu erleichtern, wurde die Lösung <strong>HVM shim</strong> für alle Xen-Versionen geschaffen, um einen "PV-Gast mit Beiwagen" zu betreiben (<a href="https://xenbits.xen.org/xsa/xsa254/README.vixen">HVM shim "Vixen"</a>). Als empfohlene Lösung wird <strong>PVH</strong> vorgeschlagen, das nachträglich für Version 4.8. "als Beiwagen-Lösung" bereit gestellt wird (<strong>PVH shim "Comet"</strong> - <a href="https://xenbits.xen.org/xsa/xsa254/README.comet">Link</a>). In Version 4.10 wird <strong>PVH </strong>nativ enthalten sein wird. Für die Unterschiede der "Beiwagen-Lösungen" gibt es dieses <a href="https://xenbits.xen.org/xsa/xsa254/README.which-shim">Dokument</a>, für die Umwandlung von PV nach <em>HVM shim with "sidecar" ISO</em> gibt es dieses <a href="https://xenbits.xen.org/xsa/xsa254/pvshim-converter.pl">Script</a>.<br /> Am 24.01. wurde die <a href="https://www.xenproject.org/downloads/xen-archives/xen-project-48-series/xen-483.html">Version 4.8.3 veröffentlicht</a>, die bereits die PTI-Patches und enthält. Für alle anderen Versionen ab 4.6 und neuer sind bereits <a href="https://xenbits.xen.org/xsa/xsa254/README.pti">commits</a> angegeben, jedoch wurde noch keine Version veröffentlicht.<br /> Alle Xen-basierten Hostsysteme (bis auf 4.8) sind derzeit verwundbar. Xen hat noch ein <a href="https://wiki.xenproject.org/wiki/Respond_to_Meltdown_and_Spectre">weiteres Dokument</a> veröffentlicht, in dem Vorschläge für die praktische Sicherung erörtert werden. Klar ist, dass durch die Updates nicht alle Probleme gelöst werden können. Damit stünden für Meltdown zwei Lösungsvarianten zur Verfügung: Entweder ein sicheres Gastsystem (Kernel mit KPTI-Update und Xen-Hypervisor mit KPI-Patches) oder die Umstellung auf HVM bzw. PVH (wobei PVH erst ab xen 4.10 zur Verfügug steht und damit für Ubuntu 16.04 und auch Ubuntu 18.04 keine Lösung zu sein scheint.)<br /> Um Xen 4.10 zu nutzen, muss dieses für Ubuntu 16.04 und wahrscheinlich 18.04 aus den Quellen selbst gebaut werden (<a href="https://blog.werk21.de/en/2018/02/08/build-xen-hypervisor-410-and-xen-tools-ubuntu-1604-pvh">Howto</a>).</p> <p>Bei <strong>Opensuse</strong> existiert dieses <a href="https://bugzilla.suse.com/show_bug.cgi?id=1074562">Advisory</a>, außerdem existieren bereits <a href="https://www.suse.com/de-de/support/kb/doc/?id=7022512">diverse Updates</a> (kernel, qemu, kvm, microcode). Die haben die Zeit echt genutzt.</p> <p>Bei <strong>RedHat </strong>wurde ebenfalls ein gutes <a href="https://access.redhat.com/security/vulnerabilities/speculativeexecution">Advisory</a> veröffentlicht, ebenso zahlreiche Updates (Kernel, qemu-kvm, libvirt). Auch hier scheint die Zeit gut genutzt worden zu sein.</p> <p><strong>Ubuntu</strong> hat bisher ein <a href="https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown">Advisory</a> (inkl. Übersicht der betroffenen Kernel und Updates) sowie mehrere Updates veröffentlicht. Hier die Einträge im CVE-Tracker:</p> <ul> <li><a href="https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5753.html">CVE-2017-5753</a></li> <li><a href="https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5715.html">CVE-2017-5715</a></li> <li><a href="https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-5754.html">CVE-2017-5754</a></li> </ul> <p>xen fehlt leider jedoch völlig in den Listen der möglicherweise betroffenen Pakete. Im o.g. <a href="https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/SpectreAndMeltdown">Advisory</a> sind die Updates (v.a. Kernel-Updates) aufgelistet. Mit den Kernel-Updates sind die Systeme gegen Spectre 1, Spectre-2 (Retpoline) und Meltdown geschützt. Der Betrieb von sicheren Xen-Gästen (Meltdown!) mit ist jedoch bisher nur mit Umwandlung nach HVM möglich, da PVHVM noch nicht unterstützt wird. Auch wenn xen an updates für 4.6 arbeitet (s.o.) ist unklar, wann diese erscheinen und ob Ubuntu diese Übernimmt. Alternative: <a href="https://blog.werk21.de/en/2018/02/08/build-xen-hypervisor-410-and-xen-tools-ubuntu-1604-pvh">Xen per Hand bauen</a>.</p> <p>Bei <strong>Debian</strong> habe ich kein <a href="https://www.debian.org/security/">Security Advisory</a> gefunden, stattdessen nur <em>eine </em>Mail auf debian-user - auf debian-security oder debian-security-announce gab es keine Mail. Nicht befriedigend! Immerhin hier der CVE-Tracker:</p> <ul> <li><a href="https://security-tracker.debian.org/tracker/CVE-2017-5753">CVE-2017-5753</a></li> <li><a href="https://security-tracker.debian.org/tracker/CVE-2017-5715">CVE-2017-5715</a></li> <li><a href="https://security-tracker.debian.org/tracker/CVE-2017-5754">CVE-2017-5754</a></li> </ul> <p>Am 04.01.2018 erschien ein erstes Debian Security <a href="https://www.debian.org/security/2018/dsa-4078">Advisory DSA-4078</a> mit einem Update für CVE-2017-5754 für die stable-Version mit dem aktuellen Kernel 4.9.65-3+deb9u2 (stretch). Unterdessen (Stand 8.1.) sind ebenfalls die Kernel 3.2.96-3 (wheezy) und 4.14.12-2 (sid) verfügbar. Am 09.01. kam ist das Update für Meltdown für Jessie erscheinen (<a href="https://security-tracker.debian.org/tracker/DSA-4082-1">DSA-4082-1</a>). Gegen Spectre wurden bsiher keine Updates veröffentlicht.</p> <p>Auf <strong>BSD </strong>beruhen viele Sicherheits-Appliances, allerdings wurde BSD erst <a href="https://www.freebsd.org/news/newsflash.html#event20180104:01">Ende Dezember</a> informiert (Was soll das?!). <a href="https://lists.freebsd.org/pipermail/freebsd-security/2018-January/009651.html">A</a><a href="https://lists.freebsd.org/pipermail/freebsd-security/2018-January/009719.html">m 8.1. hat FreeBSD einen Fahrplan vorgelegt.</a> Für Updates <a href="https://www.freebsd.org/security/advisories.html">hier ab und zu einen Blick werfen</a> oder die Debatten auf der <a href="https://lists.freebsd.org/pipermail/freebsd-security/">Mailingliste bsd-security</a> verfolgen. Interessant ist noch <a href="https://github.com/lattera/articles/blob/master/infosec/Vulnerabilities/2018-01-05_Meltdown_Spectre/article.md">dieser Blog-Eintrag</a>, in dem über das Vorgehen für <a href="https://hardenedbsd.org/"><strong>Hardened-BSD</strong></a> und die Überlegung über <a href="https://reviews.llvm.org/D41723">retpoline</a> berichtet wird. Für BSD liegen seit dem 21.2. <a href="https://undeadly.org/cgi?action=article;sid=20180221201856">Patches gegen Meltdown vor</a>.</p> <p>Eine <a href="https://www.thomas-krenn.com/de/wiki/Sicherheitshinweise_zu_Meltdown_und_Spectre">Übersicht über die Linux-Updates</a> wird auch vom Serverspezialisten Thomas Krenn gepflegt.</p> <h2 id="firewalls">Firewalls</h2> <p>Der Firewallhersteller <strong>Cisco </strong>informiert in seinen <a href="https://tools.cisco.com/security/center/publicationListing.x">Advisories</a> über <a href="https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180104-cpusidechannel">CPU Side-Channel Information Disclosure Vulnerabilities</a> und betroffene Geräte. Die Liste wird regelmäßig aktualisiert und enthält unterdessen auch Datumsangaben für die Verfügbarkeit von Updates. Generell stellt Cisco klar, dass auf <strong>Hardware-Appliances</strong> in der Regel keine lokale User existieren, die Code ausführen können, so dass die Angriffsvektoren kleiner sind als auf Servern, auf die verschiedene User zugreifen können. Ähnliches gilt natürlich auch andere Appliances.</p> <p>Der Firewallhersteller <strong>Juniper </strong>informiert in diesem <a href="https://forums.juniper.net/t5/Security-Now/Meltdown-amp-Spectre-Modern-CPU-vulnerabilities/ba-p/317254">Blogbeitrag</a> über betroffene Geräte und kündigt Updates an (siehe <a href="https://kb.juniper.net/InfoCenter/index?page=content&amp;channel=SECURITY_ADVISORIES">Security Advisories</a>). Am 05.01. hat Cisco das <a href="https://kb.juniper.net/InfoCenter/index?page=content&amp;id=JSA10842&amp;cat=SIRT_1&amp;actp=LIST">Security Advisory JSA10842</a> veröffentlicht, in dem die betroffenen Geräte benannt werden und das regelmäßig aktualisiert wird. Als Mitigation wird empfohlen, nur Software aus verlässlichen Quellen einzusetzen und den Zugriff nur vertrauenswürdigen Administrator*innen zu gewähren (Äh? Und sonst darf da ja jeder ran?!).</p> <p>Der Firewallhersteller <strong>Sophos </strong>hat bereits <a href="https://community.sophos.com/kb/en-US/128053">Informationen für die Software-Version </a>veröffentlicht. Am 6.1. wurden <a href="https://community.sophos.com/kb/en-us/128053#nsg">Informationen über die Hardware-Appliances</a> ergänzt: An den Updates für die Kernel und ggf. Firmware wird gearbeitet. Dies haben alle Kund*innen auch nochmals per Mail am 9.1. erhalten. Seit dem 5.1. stellt Sophos außerdem <a href="https://community.sophos.com/kb/en-us/128053#protection">Protections</a> zum Schutz vor Threats zur Verfügung. In der Liste <a href="https://community.sophos.com/kb?TopicId=1214">Advisories</a> kann man den Stand neuer Meldungen verfolgen.</p> <p>Die Opensource-Firewall <strong>OPNsense</strong> (BSD-basiert) hat zeitnah am 03.01. per <a href="https://twitter.com/opnsense/status/948683628137140226">twitter reagiert</a> und auf BSD verwiesen, die bereits an Updates arbeiten. Einen aktuellen Stand dürfte es dann auch der <a href="https://opnsense.org/blog/">Blog-Seite</a> oder dem <a href="https://twitter.com/opnsense">twitter-channel</a> geben. Seit dem sind mehrere RCs und Versionen schienen, die jedoch noch keine Updates für Meltdown und Spectre enthalten. In den Releasenotes für OPNSense 18.1 steht der Hinweis: "Meltdown and Spectre patches are currently being worked on in FreeBSD, but there is no reliable timeline.  We will keep you up to date through the usual channels as more news become available.  Hang in there!" mit diesem <a href="https://lists.freebsd.org/pipermail/freebsd-security/2018-January/009719.html">Link</a>.</p> <p>Die ebenfalls BSD-basierende Firewall <strong>pfSense</strong> hat am 4.1. per <a href="https://twitter.com/pfsense/status/948706429325795328">twitter</a> ebenfalls auf Updates von freeBSD verwiesen, seit dem 08.01. existiert dieser <a href="https://www.netgate.com/blog/an-update-on-meltdown-and-spectre.html">Blogeintrag zum weiteren Vorgehen</a>. Link zu den <a href="https://www.pfsense.org/security/advisories/">Security Advisories</a> und <a href="https://twitter.com/pfsense">twitter-channel</a>.</p> <h2>Zum Schluss</h2> <ol> <li>Hier eine sehr gute und verständliche Zusammenfassung auf Englisch: <a href="https://www.renditioninfosec.com/files/Rendition_Infosec_Meltdown_and_Spectre.pdf">https://www.renditioninfosec.com/files/Rendition_Infosec_Meltdown_and_Spectre.pdf</a><br />  </li> <li>fefe hat wie immer Recht:<br /> <a href="https://blog.fefe.de/?ts=a4b0f03c">"Komplexität ist der Feind [von Sicherheit]."</a></li> </ol> <h2 id="updates">Updates:</h2> <ul> <li>2018-01-04 23:44 Debian veröffentlicht Kernel-Update für CVE-2017-5754.</li> <li>2018-01-05 07:30 ergänzt BSD, Cisco, Juniper, Sophos und pfsense und OPNsense.</li> <li>2018-01-05 09:00 ergänzt Informationen zu Apple.</li> <li>2018-01-05 09:45 Ergänzt qemu bei xen.</li> <li>2018-01-05 11:30 Ergänzt Intel-Announcement und Xen-FAQ.</li> <li>2018-01-05 13:00 Link zu entwickler.de ergänzt.</li> <li>2018-01-05 22:45 Ubuntu-Zeitplanung ergänzt.</li> <li>2018-01-06 13:00 Ergänzung bei Xen um "Respond to Meltdown and Spectre" und Lösungsskizzen</li> <li>2018-01-07 01:30 Richtigstellung: OPNsense hat sehr schnell via <a href="https://twitter.com/opnsense/status/948683628137140226">twitter</a> reagiert - sorry! Dank an <a href="https://twitter.com/mimu_muc/status/949723351509069825">@mimu_muc</a></li> <li>2018-01-07 01:30 Cisco-Informationen aktualisiert - Danke an an <a href="https://twitter.com/opnsense/status/949782260223488000">@opnsense</a></li> <li>2018-01-07 01:30 Infos zu Hardened-BSD übernommen - danke an <a href="https://twitter.com/lattera/status/949395374938214400">@opnsense</a> (retweet).</li> <li>2018-01-07 02:15 Link zum Debian Advisory DSA-4078-1 ergänzt.</li> <li>2018-01-07 02:15 Link zur FreeBSD-Mailingliste freebsd-security ergänzt.</li> <li>2018-01-07 02:40 Ergänzung zu Sophos-Appliances und Protections.</li> <li>2018-01-07 20:30 Juniper-Advisory JSA10842 ergänzt.</li> <li>2018-01-07 22:45 Link zu Thomas Krenn ergänzt.</li> <li>2018-01-08 09:15 Ubuntu: Verfügbarkeit der Test-Kernels ergänzt.</li> <li>2018-01-08 23:30 Weitere Debian-Kernel aktualisiert.</li> <li>2018-01-08 23:30 FreeBSD-Fahrplan ergänzt.</li> <li>2018-01-09 01:30 Neue Informationen von pfsense/netgate ergänzt.</li> <li>2018-01-09 17:30 Debian-Update für Jessie ergänzt.</li> <li>2018-01-09 18:00 Hinweis auf Fefe zu Risiken von Meltdown ergänzt.</li> <li>2018-01-10 05:30 Ubuntu stellt Kernel-Updates gegen Meltdown zur Verfügung.</li> <li>2018-01-10 20:00 Ubuntu stellt neue Kernel-Updates zur Verfügung (regression updates).</li> <li>2018-01-11 23:30 Intel-Bereich überarbeitet und aktualisiert</li> <li>2018-01-11 23:30 Link zu Intel-Microcode ergänzt.</li> <li>2018-01-11 23:30 Ubuntu stellt neuen Intel-Microcode bereit.</li> <li>2018-01-12 00:30 Ergänzt RC1 für OPNsense.</li> <li>2018-01-12 00:45 Aktualisierung Xen (v.4).</li> <li>2018-02-07 23:45 Aktualisierung Updates Microsoft inkl. Links.</li> <li>2018-02-07 23:45 Aktualisierung Updates Apple inkl. Links.</li> <li>2018-02-07 23:45 Aktualisierung Intel-Microcode inkl. Link zur Liste der betroffenen Prozessoren.</li> <li>2018-02-07 23:45 Überarbeitung des Xen-Abschnitts (v. 10) und Ergänzung Links.</li> <li>2018-02-07 23:45 Aktualisierung Ubuntu.</li> <li>2018-02-07 23:45 Aktualisierung Debian.</li> <li>2018-02-07 23:45 Aktualisierung OPNsense.</li> <li>2018-02-12 10:45 Informationen zu Intel ergänzt</li> <li>2018-02-21 23:00 Information zu Meltdown und BSD ergänzt</li> <li>2018-02-22 21:30 Informationen zu Ubuntu und Spectre-2 ergänzt.</li> </ul></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/server" class="label label-default" hreflang="de">Server</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/bug" class="label label-default" hreflang="de">bug</a> <a href="/en/tags/updates" class="label label-default" hreflang="en">Updates</a> <a href="/en/tags/spectre" class="label label-default" hreflang="en">Spectre</a> <a href="/en/tags/meltdown" class="label label-default" hreflang="en">Meltdown</a> <a href="/de/tags/xen" class="label label-default" hreflang="de">xen</a> <a href="/en/tags/firewall" class="label label-default" hreflang="en">Firewall</a> </div> Thu, 04 Jan 2018 21:05:10 +0000 kelly 132 at https://blog.werk21.de Dealing with *DEPTH TOO GREAT* in Kint https://blog.werk21.de/en/2017/12/13/dealing-depth-too-great-kint <span>*DEPTH TOO GREAT* in Kint</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Mi., 13.12.2017 - 09:46 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Wenn du <a href="https://drupal.org/project/devel">Devel</a>'s <span class="geshifilter"><code class="php geshifilter-php">dpm<span style="color: #009900;">(</span><span style="color: #009900;">)</span></code></span>mit <a href="https://github.com/kint-php/kint">Kint</a> zum Debuggen in Drupal 8 verwendest, hast du wahrscheinlich schon mal die Nachricht <span class="geshifilter"><code class="php geshifilter-php"><span style="color: #339933;">*</span>DEPTH TOO GREAT<span style="color: #339933;">*</span></code></span> gesehen, während du dich durch ein tief verschachteltes Objekt geklickt hast.</p> <p>Diese Meldung hat einen Grund: Performance. Immer alle Ebenen eines tief verschachtelten Objekts auszugeben könnte entweder auf deinem Server oder in deinem Browser dafür sorgen, dass alle Ressourcen aufgebraucht werden und dann gar nichts mehr geht. Deshalb gibt es eine Begrenzung der anzuzeigenden Ebenen. Die ist normalerweise bei <span class="geshifilter"><code class="php geshifilter-php"><span style="color: #cc66cc;">7</span></code></span> Ebenen.</p> <p>Wenn du etwas anzeigen möchtest, was tiefer verschachtelt ist, ist es am günstigsten, wenn du mit <span class="geshifilter"><code class="php geshifilter-php">dpm<span style="color: #009900;">(</span><span style="color: #009900;">)</span> </code></span>einfach ein paar Ebenen tiefer mit der Ausgabe anfängst. Aber manchmal kannst oder willst du das nocht machen. In solchen Fällen kannst du die maximal anzuzeigenden Ebenen erhöhen, indem du</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">kint_require<span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> \Kint<span style="color: #339933;">::</span><span style="color: #000088;">$maxLevels</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">8</span><span style="color: #339933;">;</span></pre></div> <p>irgendwo oberhalb deines Aufrufs von <span class="geshifilter"><code class="php geshifilter-php">dpm<span style="color: #009900;">(</span><span style="color: #009900;">)</span></code></span> einfügst. <span class="geshifilter"><code class="php geshifilter-php"><span style="color: #000088;">$maxLevels</span></code></span> ist dabei natürlich die Anzahl der Ebenen, die du gerne sehen möchtest. Wenn du weißt, was du tust, kannst du sogar</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">\Kint<span style="color: #339933;">::</span><span style="color: #000088;">$maxLevels</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span></pre></div> <p>um alle Ebenen auszugeben, egal wie tief das Objekt verschachtelt ist. Verwendung auf eigene Gefahr.</p> </div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/devel" class="label label-default" hreflang="de">Devel</a> <a href="/en/tags/kint" class="label label-default" hreflang="en">Kint</a> <a href="/en/tags/dpm" class="label label-default" hreflang="en">dpm</a> </div> Wed, 13 Dec 2017 07:58:54 +0000 patrick 129 at https://blog.werk21.de Change source id mapping of a Drupal 8 migration https://blog.werk21.de/en/2017/12/13/change-source-id-mapping-drupal-8-migration <span>Quell-Id-Zuordnung einer Migration in Drupal 8 ändern</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Mi., 13.12.2017 - 07:30 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Drupals Migrate API hält eine interne Tabelle, in der eindeutige Quell-Ids den Ziel-Ids zugeordnet werden. In der Regel passiert das mittels einer Datenbank-Tabelle, in der jew. die Feldwerte, die eine Quell-Zeile eindeutig identifizieren, und die zugehörige Id der Ziel-Entität im Drupal gespeichert sind. Die Feldnamen und -typen, die eine Quell-Zeile eindeutig identifizieren, werden vom Quell-Plugin der Migration zur Verfügung gestellt. Meistens ist das nur irgendeine Id-Spalte, aber Migrate unterstützt auch quasi beliebige Primärschlüssel mit mehreren Spalten für die Quell-Zeilen.</p> <p>Vor kurzem arbeitete ich an einer Migration, die das <span class="geshifilter"><code class="php geshifilter-php">Url</code></span> source plugin von <a href="https://drupal.org/project/migrate_plus">Migrate Plus</a> verwendet, um Dateien aus einer <span class="geshifilter"><code class="php geshifilter-php">XML</code></span>-Quelle zu importieren. Die source plugins von Migrate Plus erlauben es, die Ids, die normalerweise von<a href="https://api.drupal.org/api/drupal/core%21modules%21migrate%21src%21Plugin%21MigrateSourceInterface.php/function/MigrateSourceInterface%3A%3AgetIds/8.4.x">MigrateSourceInterface::getIds()</a> zurückgegeben werden, in der <span class="geshifilter"><code class="php geshifilter-php">YML</code></span>-Datei der Migration anzugeben. Ursprünglich verwendete ich eine einfache Id-Zuordnung wie diese:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">source<span style="color: #339933;">:</span> ids<span style="color: #339933;">:</span> id<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> integer</pre></div> <p>Später stelle ich fest, dass ich auch noch den Dateinamen ergänzen musste, damit die Zuordnung korrekt funktioniert. Meine Id-Zuordnung sah nun so aus:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"> ids<span style="color: #339933;">:</span> id<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> integer file_name<span style="color: #339933;">:</span> type<span style="color: #339933;">:</span> string</pre></div> <p>Soweit so gut. Als ich die Migration aktualisieren wollte, wurde ich von dieser Fehlermeldung begrüßt:</p> <blockquote> <p>Migration failed with source plugin exception: SQLSTATE[42S22]: Column not found: 1054 Unknown column "sourceid2" in<br /> "field list": INSERT INTO {migrate_map_example_file} (source_ids_hash, sourceid1, sourceid2, source_row_status,<br /> rollback_action, hash, last_imported) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2,<br /> :db_insert_placeholder_3, :db_insert_placeholder_4, :db_insert_placeholder_5, :db_insert_placeholder_6); Array<br /> (<br />     [:db_insert_placeholder_0] =&gt; a8d0cbb8ca5f48c73993244fd275342d84b92a2eb33300b0852ef560f70aa55d<br />     [:db_insert_placeholder_1] =&gt; 10817<br />     [:db_insert_placeholder_2] =&gt;<br />     [:db_insert_placeholder_3] =&gt; 2<br />     [:db_insert_placeholder_4] =&gt; 0<br />     [:db_insert_placeholder_5] =&gt;<br />     [:db_insert_placeholder_6] =&gt; 1513082182<br /> )  </p> </blockquote> <p>Die Lösung für dieses Problem war tatsächlich wesentlich einfacher als ich zuerst angenommen hatte. Man löscht einfach die Mapping-Tabelle für die passende Migration aus der Drupal-Datenbank:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">DROP TABLE migrate_map_example_file<span style="color: #339933;">;</span></pre></div> <p>Weniger experimentierfreudige Menschen könnten die Tabelle zunächst auch einfach nur umbenennen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><a href="http://www.php.net/rename"><span style="color: #990000;">RENAME</span></a> TABLE migrate_map_example_file TO migrate_map_example_file_backup<span style="color: #339933;">;</span></pre></div> <p>Sobald die Migration dann das nächste mal ausgeführt wird, legt Migrate einfach eine passende neue Tabelle an. Diesmal mit den neuen Spalten. Voilá.</p> </div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/migrate" class="label label-default" hreflang="de">migrate</a> <a href="/en/tags/migrateplus" class="label label-default" hreflang="en">migrate_plus</a> <a href="/en/tags/source" class="label label-default" hreflang="en">source</a> <a href="/en/tags/url" class="label label-default" hreflang="en">Url</a> <a href="/en/tags/migratesourceinterface" class="label label-default" hreflang="en">MigrateSourceInterface</a> <a href="/en/tags/getids" class="label label-default" hreflang="en">getIds</a> </div> Wed, 13 Dec 2017 05:57:34 +0000 patrick 128 at https://blog.werk21.de Change list of valid URI schemes in Drupal 8 https://blog.werk21.de/en/2017/06/06/change-list-valid-uri-schemes-drupal-8 <span>Liste valider URI-Schemata ändern in Drupal 8</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Di., 06.06.2017 - 13:45 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Falls Sie in Ihrer Drupal 8 Instanz <em>obskure</em> <a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier">URI-Schemata</a> benötigen und Sie Fehlermeldungen bezüglich ungültiger URI-Schemata erhalten, ist dieses Post für Sie gedacht.</p> <p>Nehmen wir an, ein Kunde bittet Sie, irgendwo auf der Seite einen <em>WhatsApp</em> Share Link einzufügen. Der Code dafür könnte so ähnlich aussehen:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> \Drupal\Core\Url<span style="color: #339933;">;</span> &nbsp; Url<span style="color: #339933;">:</span>fromUri<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'whatsapp://send'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">'query'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900;">&#91;</span> <span style="color: #0000ff;">'text'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Some text'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div> <p>Das sollte funktionieren, denn die URI ist genau nach Spezifikation erstellt und somit gültig. Aber anstatt der erwarteten Ausgabe erhalten wir eine Fehlermeldung (oder eine weiße Seite):</p> <blockquote><em>InvalidArgumentException</em>: The URI 'whatsapp://send' is invalid. You must use a valid URI scheme. Use base: for a path, e.g., to a Drupal file that needs the base path. Do not use this for internal paths controlled by Drupal. in <em>Drupal\Core\Utility\UnroutedUrlAssembler-&gt;assemble()</em> (line <em>64</em> of <em>core/lib/Drupal/Core/Utility/UnroutedUrlAssembler.php</em>).</blockquote> <p>Was ist denn da passiert? Drupal 8 pflegt eine Liste <em>gültiger</em> URI-Schemata, die bei der Erzeugung von URLs verwendet werden dürfen. Falls ein Schema nicht in dieser Liste von Protokollen ist, wirft Drupal diese Fehlermeldung. <span class="geshifilter"><code class="php geshifilter-php">whatsapp</code></span> ist standardmäßig nicht in dieser Liste, also erkennt Drupal die URL als ungültig.</p> <p>Das ist tatsächlich ein nettes Sicherheits-Feature, aber was, wenn wir nicht darum herum kommen, andere als die Standard-URI-Schemata zu unterstützen? Es ist ganz einfach und schnell gemacht, man muss nur wissen, wo man nachschauen muss. Die erlaubten Protokolle werden als Parameter an den Services Container übergeben. Der fragliche Parameter heißt <span class="geshifilter"><code class="php geshifilter-php">filter_protocols</code></span>. Die Standardparameter für den Services Container stehen in der Datei <span class="geshifilter"><code class="php geshifilter-php"><span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>services<span style="color: #339933;">.</span>yml</code></span> in Verzeichnis <span class="geshifilter"><code class="php geshifilter-php">sites<span style="color: #339933;">/</span><span style="color: #b1b100;">default</span></code></span> Ihrer Drupal-Installation. Es gibt möglicherweise auch eine <span class="geshifilter"><code class="php geshifilter-php">development<span style="color: #339933;">.</span>services<span style="color: #339933;">.</span>yml</code></span>-Datei mit Einstellungen nur für die Entwicklung und weitere. Falls Sie diese Standardeinstellungen ändern möchten, kopieren Sie die Datei <span class="geshifilter"><code class="php geshifilter-php"><span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>services<span style="color: #339933;">.</span>yml</code></span> nach <span class="geshifilter"><code class="php geshifilter-php">services<span style="color: #339933;">.</span>yml</code></span> und passen Sie die Einstellungen wie von Ihnen benötigt an. Um beispielsweise das <span class="geshifilter"><code class="php geshifilter-php">whatsapp</code></span> Protokoll zu unterstützen, würden Sie das zu der Liste <span class="geshifilter"><code class="php geshifilter-php">filtered_protocols</code></span> hinzufügen. Jetzt bauen Sie noch Ihren Container neu (z.B. in dem Sie <span class="geshifilter"><code class="php geshifilter-php">drush cr</code></span> auf der Kommandozeile aufrufen) und die Fehlermeldung sollte verschwunden sein.</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Allowed protocols for URL generation. </span>parameters<span style="color: #339933;">:</span> filter_protocols<span style="color: #339933;">:</span> <span style="color: #339933;">-</span> http <span style="color: #339933;">-</span> https <span style="color: #339933;">-</span> ftp <span style="color: #339933;">-</span> news <span style="color: #339933;">-</span> nntp <span style="color: #339933;">-</span> tel <span style="color: #339933;">-</span> telnet <span style="color: #339933;">-</span> mailto <span style="color: #339933;">-</span> irc <span style="color: #339933;">-</span> ssh <span style="color: #339933;">-</span> sftp <span style="color: #339933;">-</span> webcal <span style="color: #339933;">-</span> rtsp <span style="color: #339933;">-</span> whatsapp</pre></div> <p>Natürlich könnten Sie bei der Gelegenheit auch gleich andere Schemata, die Sie nicht benötigen, z.B. <span class="geshifilter"><code class="php geshifilter-php">telnet</code></span>, entfernen, um die Sicherheit zu erhöhen ;).</p></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/en/tags/servicesyml" class="label label-default" hreflang="en">services.yml</a> <a href="/en/tags/url" class="label label-default" hreflang="en">Url</a> </div> Tue, 06 Jun 2017 11:12:50 +0000 patrick 121 at https://blog.werk21.de Programmatically change views pager type or options https://blog.werk21.de/en/2017/04/21/programmatically-change-views-pager-type-or-options <span>Views Pager-Typ oder -Optionen programmatisch ändern</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Fr., 21.04.2017 - 08:56 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Nehmen wir an, wir möchten in einer Ansicht die Anzahl der ausgespielten Ergebnisse dynamisch anpassen, jenachdem welche Argumente an die Ansicht übergeben wurden. <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21ViewExecutable.php/class/ViewExecutable/8.3.x">ViewExecutable</a> stellt die Methode <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21ViewExecutable.php/function/ViewExecutable%3A%3AsetItemsPerPage/8.3.x">setItemsPerPage()</a> zur Verfügung. Auf den ersten Blick scheint das also schnell gemacht, aber der Teufel steckt – wie immer – im Detail.</p> <p>Falls wir noch kein <span class="geshifilter"><code class="php geshifilter-php">ViewExecutable</code></span>-Objekt zur Hand haben, implementieren wir am besten zunächst einen <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21views.api.php/8.3.x">Hook des Views-Moduls</a>. Das machen wir nicht wie bei anderen Hooks üblich in unserer Modul-Datei, sondern wir erstellen eine neue Datei namens <span class="geshifilter"><code class="php geshifilter-php">module_name<span style="color: #339933;">.</span>views_execution<span style="color: #339933;">.</span>inc</code></span> im Wurzel-Ordner unseres benutzerspezifischen Moduls und implementieren den Hook dort. Views lädt diese Datei dann, wenn es nötig ist, automatisch. Ein guter Hook um die Änderungen an unserem Pager vorzunehmen, ist <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21views.api.php/function/hook_views_pre_view/8.3.x">hook_views_pre_view()</a>, der genau zu Beginn der Initialisierungs-Phase einer Ansicht ausgeführt wird.</p> <p>Eine weitere hilfreiche Methode, die von <span class="geshifilter"><code class="php geshifilter-php">ViewExecutable</code></span> zur Verfügung gestellt wird, ist <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21ViewExecutable.php/function/ViewExecutable%3A%3AsetOffset/8.3.x">setOffset()</a>, die es erlaubt, das Offset anzupassen (z.B. die ersten zwei Einträge der Ergebnisse zu überspringen).</p> <p>Wichtiger Hinweis: Falls ein Pager-Plugin verwendet wird, das diese Optionen nicht verwendet, dann werden die Aufrufe dieser Methoden keine Auswirkungen haben. Falls Sie z.B. das <span class="geshifilter"><code class="php geshifilter-php">none</code></span> Pager-Plugin verwenden (also die <em>Display all results</em> Pager-Einstellung im UI), wird die Ansicht immer alle Ergebnisse anzeigen, selbst wenn Sie die Methode <span class="geshifilter"><code class="php geshifilter-php">setItemsPerPage<span style="color: #009900;">(</span><span style="color: #009900;">)</span></code></span> für diese Ansicht aufrufen. In dem Fall muss zunächst auf ein Pager-Plugin gewechselt werden, das die entsprechende Einstellung auch verwendet (z.B. <span class="geshifilter"><code class="php geshifilter-php">some</code></span>, was der Einstellung <em>Display a specified number of items</em> im UI entspricht). Um das zu tun, können wir die Pager-Option des <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21display%21DisplayPluginInterface.php/interface/DisplayPluginInterface/8.3.x">display handler</a> mit Hilfe der Methode <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21display%21DisplayPluginInterface.php/function/DisplayPluginInterface%3A%3AgetOption/8.3.x">getOption()</a> abrufen. Diese gibt uns ein Array mit den Schlüsseln type und options zurück. Der Wert von type ist ein String, der den Namen des Pager-Plugins enthält und der Wert von options ist wiederum ein Array, das die Einstellungen des Pager-Plugins enthält. Nachdem wir das Array wie von uns benötigt angepasst haben, können wir die Methode <a href="https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21display%21DisplayPluginInterface.php/function/DisplayPluginInterface%3A%3AsetOption/8.3.x">setOption()</a> verwenden um die Pager-Option zu aktualisieren. Auf diesem Weg können auch beliebige andere Pager-Einstellungen geändert werden, man muss nur das Array anpassen.</p> <p>In Code gegossen sieht das dann so aus:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>   <span style="color: #009933; font-style: italic;">/** * @file * Hook implementations for hooks provided by Views API. */</span>   <span style="color: #000000; font-weight: bold;">use</span> Drupal\views\ViewExecutable<span style="color: #339933;">;</span>   <span style="color: #009933; font-style: italic;">/** * Implements hook_views_pre_view(). */</span> <span style="color: #000000; font-weight: bold;">function</span> example_views_pre_view<span style="color: #009900;">(</span>ViewExecutable <span style="color: #000088;">$view</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">id</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'example_view'</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">current_display</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'display_id'</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #666666; font-style: italic;">// Show only three items. This assumes, that we already use a pager plugin, </span> <span style="color: #666666; font-style: italic;">// that uses this option. Otherwise it wouldn't have any effect.</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setItemsPerPage</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Skip the first 5 items. Again, this assumes, that we already use a </span> <span style="color: #666666; font-style: italic;">// pager plugin, that uses this option. Otherwise it wouldn't have any </span> <span style="color: #666666; font-style: italic;">// effect.</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOffset</span><span style="color: #009900;">(</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// If we need to change the pager type or other options of the pager, we </span> <span style="color: #666666; font-style: italic;">// need to modify the pager option of the display handler.</span> <span style="color: #000088;">$pager</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display_handler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getOption</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'pager'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// Change the pager plugin. Some will show a specified number of results.</span> <span style="color: #000088;">$pager</span><span style="color: #009900;">[</span><span style="color: #0000ff;">'type'</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'some'</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">// All options used by the plugin are available in $pager['options'].</span> <span style="color: #666666; font-style: italic;">// If you want to change them, that's fine. You just need to know the keys.</span>   <span style="color: #666666; font-style: italic;">// Update pager option of the display handler.</span> <span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display_handler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOption</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'pager'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pager</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span></pre></div></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/view" class="label label-default" hreflang="de">view</a> <a href="/en/tags/viewexecutable" class="label label-default" hreflang="en">ViewExecutable</a> <a href="/en/tags/pager" class="label label-default" hreflang="en">pager</a> <a href="/en/tags/setitemsperpage" class="label label-default" hreflang="en">setItemsPerPage</a> <a href="/en/tags/setoffset" class="label label-default" hreflang="en">setOffset</a> <a href="/en/tags/hookviewspreview" class="label label-default" hreflang="en">hook_views_pre_view</a> <a href="/en/tags/displayplugininterface" class="label label-default" hreflang="en">DisplayPluginInterface</a> <a href="/en/tags/getoption" class="label label-default" hreflang="en">getOption</a> <a href="/en/tags/setoption" class="label label-default" hreflang="en">setOption</a> </div> Fri, 21 Apr 2017 06:12:26 +0000 patrick 119 at https://blog.werk21.de Set Limit for open files for MySQL on Ubuntu 16.04 with systemd https://blog.werk21.de/en/2017/04/19/set-limit-open-files-mysql-ubuntu-1604-systemd <span>Limit für open files für MySQL auf Ubuntu 16.04 mit systemd neu setzen</span> <span><span lang="" about="/de/user/15" typeof="schema:Person" property="schema:name" datatype="">kelly</span></span> <span>Mi., 19.04.2017 - 17:59 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Um die Fehlermeldung</p> <blockquote>Out of resources when opening file './database/table.MYD' (Errcode: 24 - Too many open files)</blockquote> <p>auf Ubuntu 16.04 zu beheben, müssen die Limits erhöht und Änderungen an der systemd-Konfiguration vorgenommen werden.</p> <h2>1. Limits erhöhen</h2> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">vi <span style="color: #339933;">/</span>etc<span style="color: #339933;">/</span>security<span style="color: #339933;">/</span>limits<span style="color: #339933;">.</span>d<span style="color: #339933;">/</span><span style="color: #cc66cc;">99</span><span style="color: #339933;">-</span>openfiles<span style="color: #339933;">.</span>conf</pre></div> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#&lt;domain&gt; &lt;type&gt; &lt;item&gt; &lt;value&gt; </span><a href="http://www.php.net/mysql"><span style="color: #990000;">mysql</span></a> soft nofile <span style="color: #cc66cc;">8192</span> <a href="http://www.php.net/mysql"><span style="color: #990000;">mysql</span></a> hard nofile <span style="color: #cc66cc;">8192</span></pre></div> <p>Wenn die Limits für alle user und root neu gesetzt werden sollen, können auch diese Einstellungen verwendet werden:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#&lt;domain&gt; &lt;type&gt; &lt;item&gt; &lt;value&gt; </span><span style="color: #339933;">*</span> soft nofile <span style="color: #cc66cc;">8192</span> <span style="color: #339933;">*</span> hard nofile <span style="color: #cc66cc;">8192</span> root soft nofile <span style="color: #cc66cc;">8192</span> root hard nofile <span style="color: #cc66cc;">8192</span></pre></div> <h2>2. Anpassen der systemd-Konfiguration</h2> <p>Auf Ubuntu 16.04 werden die Dienste mit systemd gestartet. Daher müssen auch hier noch Anpassungen vorgenommen werden:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">systemctl edit <a href="http://www.php.net/mysql"><span style="color: #990000;">mysql</span></a></pre></div> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>Service<span style="color: #009900;">&#93;</span> LimitNOFILE<span style="color: #339933;">=</span><span style="color: #cc66cc;">8192</span></pre></div> <p>(Editor verlassen mit <em>:x</em>)</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;">systemctl daemon<span style="color: #339933;">-</span>reload service <a href="http://www.php.net/mysql"><span style="color: #990000;">mysql</span></a> restart</pre></div> <h2>3. Kontrollieren der MySQL-Einstellungen</h2> <p>Standardmäßig ist die MySQL-Variable open_files_limit auf 5000 gesetzt. Wenn der Wert erhöht werden muss:</p> <p>vi /etc/mysql/mysql.conf.d/xx-openfiles.cnf</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #009900;">&#91;</span>mysqld<span style="color: #009900;">&#93;</span> open_files_limit <span style="color: #339933;">=</span> <span style="color: #cc66cc;">20000</span></pre></div> <p>Alternativ kann natürlich auch diese Variable in der /etc/mysql/my.cnf im Abschnitt [mysqld] ergänzt werden.</p></div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/server" class="label label-default" hreflang="de">Server</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/mysql" class="label label-default" hreflang="de">mysql</a> <a href="/de/tags/ubuntu" class="label label-default" hreflang="de">ubuntu</a> <a href="/de/tags/server" class="label label-default" hreflang="de">server</a> <a href="/en/tags/open-files" class="label label-default" hreflang="en">open files</a> </div> Wed, 19 Apr 2017 15:42:40 +0000 kelly 118 at https://blog.werk21.de Render a single field of an entity https://blog.werk21.de/en/2017/04/03/render-single-field-entity <span>Ein einzelnes Feld einer Entität anzeigen</span> <span><span lang="" about="/de/user/8" typeof="schema:Person" property="schema:name" datatype="">patrick</span></span> <span>Mo., 03.04.2017 - 13:08 Uhr</span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Mitunter möchten Sie anstatt der vollständigen Entität nur das <em>renderable array</em> eines einzigen Feldes einer Entität anzeigen. Im folgenden Beispiel rufen wir das <em>renderable array</em> für zwei Felder einer Entität ab, <span class="geshifilter"><code class="php geshifilter-php">body</code></span> und <span class="geshifilter"><code class="php geshifilter-php">field_example</code></span>:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">use</span> Drupal\node\Entity\Node<span style="color: #339933;">;</span>   <span style="color: #000088;">$render</span> <span style="color: #339933;">=</span> <span style="color: #009900;">[</span><span style="color: #009900;">]</span><span style="color: #339933;">;</span> <span style="color: #000088;">$entity_type_manager</span> <span style="color: #339933;">=</span> \Drupal<span style="color: #339933;">::</span><span style="color: #004000;">entityTypeManager</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$entity</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entity_type_manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStorage</span><span style="color: #009900;">(</span><span style="color: #000088;">$entity_type</span><span style="color: #009900;">)</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">(</span><span style="color: #000088;">$entity_id</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$fields</span> <span style="color: #339933;">=</span> <span style="color: #009900;">[</span> <span style="color: #0000ff;">'body'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'field_example'</span> <span style="color: #009900;">]</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$entity</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$display</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entity_type_manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getStorage</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'entity_view_display'</span><span style="color: #009900;">)</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">(</span><span style="color: #000088;">$entity_type</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$entity</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bundle</span><span style="color: #009900;">(</span><span style="color: #009900;">)</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$view_mode</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #000088;">$view_builder</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">(</span><span style="color: #000088;">$fields</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$field_name</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">(</span><span style="color: #000088;">$entity</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">{</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">}</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$component</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$display</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getComponent</span><span style="color: #009900;">(</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$component</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">(</span><span style="color: #000088;">$view_builder</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">)</span> <span style="color: #009900;">{</span> <span style="color: #000088;">$view_builder</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entity_type_manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getViewBuilder</span><span style="color: #009900;">(</span><span style="color: #000088;">$entity_type</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #000088;">$render</span><span style="color: #009900;">[</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">]</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$view_builder</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">viewField</span><span style="color: #009900;">(</span><span style="color: #000088;">$entity</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">{</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">}</span><span style="color: #339933;">,</span> <span style="color: #000088;">$display</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getComponent</span><span style="color: #009900;">(</span><span style="color: #000088;">$field_name</span><span style="color: #009900;">)</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span> <span style="color: #009900;">}</span></pre></div> <p>Als erstes laden wir das Entitätsobjekt und erstellen ein <em>array</em> mit den maschinen-lesbaren Namen der Felder, die wir anzeigen wollen. Dann laden wir das <em>entity view display</em> für einen <em>view mode</em> der Entität, der die Anzeigeeinstellungen für die Felder, die wir anzeigen wollen, enthält. Außerdem benötigen wir den <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8.3.x">view builder</a> für den Entitätstyp. Dann rufen wir mittels der Methode <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21Display%21EntityDisplayInterface.php/function/EntityDisplayInterface%3A%3AgetComponent/8.2.x">getComponent()</a> die <em>display settings</em> für jedes Feld aus dem Display ab und geben es zusammen mit dem tatsächlichen Feldinhalt an die Methode <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/function/EntityViewBuilder%3A%3AviewField/8.3.x">viewField()</a> des view builders weiter. Die gibt dann das <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21theme.api.php/group/theme_render/8.3.x">renderable array</a> für das Feld zurück, das wir in einem Template ausgeben oder mittels des <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Renderer.php/class/Renderer/8.2.x">Renderer service</a> anzeigen können.</p> <p>Wenn Sie keinen passenden view mode zur Hand haben, können Sie die Anzeigeeinstellungen auch selbst erstellen und übergeben. Dabei handelt es sich im wesentlichen um Informationen, wie die Feldbezeichnung angezeigt werden soll (oder nicht), the Id des <em>field formatter</em>s, der verwendet werden soll und den Einstellungen, die dieser evt. benötigt. Schauen Sie sich die Dokumentation der Methode <span class="geshifilter"><code class="php geshifilter-php">viewField<span style="color: #009900;">(</span><span style="color: #009900;">)</span></code></span> an, die oben verlinkt ist, falls Sie das ausprobieren möchten.</p> <p>Update: Wenn nur gelegentlich ein einzelnes, bereits vorliegendes Feld gerendert werden soll, kann auch die Methode <a href="https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Field%21FieldItemList.php/function/FieldItemList%3A%3Aview/8.2.x">Drupal\Core\Field\FieldItemList::view</a> des Feldes selbst verwendet werden. z.B:</p> <div class="geshifilter"><pre class="php geshifilter-php" style="font-family:monospace;"><span style="color: #000088;">$build</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$entity</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">field_example</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #009900;">(</span><span style="color: #0000ff;">'teaser'</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></pre></div> <p>Anstelle des View Modes kann hier ebenso ein Array mit Anzeige-Optionen übergeben werden.</p> </div> <div class="field field--name-field-systems field--type-entity-reference field--label-inline"> <div class="field--label">Systeme</div> <a href="/de/systems/drupal-8" class="label label-default" hreflang="de">Drupal 8</a> </div> <div class="field field--name-field-tags field--type-entity-reference field--label-inline"> <div class="field--label">Tags</div> <a href="/de/tags/render" class="label label-default" hreflang="de">render</a> <a href="/de/tags/entity" class="label label-default" hreflang="de">entity</a> <a href="/de/tags/field" class="label label-default" hreflang="de">field</a> <a href="/en/tags/renderer" class="label label-default" hreflang="en">Renderer</a> <a href="/en/tags/view-builder" class="label label-default" hreflang="en">view builder</a> <a href="/en/tags/viewfield" class="label label-default" hreflang="en">viewField</a> <a href="/en/tags/getcomponent" class="label label-default" hreflang="en">getComponent</a> <a href="/en/tags/entityviewbuilder" class="label label-default" hreflang="en">EntityViewBuilder</a> <a href="/en/tags/entitydisplayinterface" class="label label-default" hreflang="en">EntityDisplayInterface</a> <a href="/en/tags/renderable-array" class="label label-default" hreflang="en">renderable array</a> </div> Mon, 03 Apr 2017 10:41:37 +0000 patrick 116 at https://blog.werk21.de